Loading [MathJax]/extensions/tex2jax.js

2022年8月28日日曜日

線形回帰を求める(2)

前回は散布図で、都道府県別人口と平均年収をプロットしました。 後は線形回帰分析するだけです。 線形回帰はsklearnライブラリを使用することで簡単に分析できます。
  1. from sklearn.linear_model import LinearRegression  
  2.   
  3. X = df3[['人口']]  
  4. y = df3['平均年収']  
  5.   
  6. # モデルの作成  
  7. model = LinearRegression()  
  8.   
  9. model.fit(X, y)  
  10.   
  11.   
  12. print("傾き: %f" % model.coef_)  
  13. print("切片: %f" % model.intercept_)  
  14. print()  
  15. print("決定係数: %f" % model.score(X, y))  
y = ax + b 

傾き: 0.124986 
切片: 4101341.031155 

決定係数: 0.605080


sklearnを使うだけで、簡単に単回帰分析出来ます。

predictを使い回帰直線を引きます。

人口と平均年収の関係はありそうですね。

  1. predict = model.predict(X)  
  2.   
  3. plt.plot(x, predict, color="coral")  
全コード
  1. #! /usr/bin/env python  
  2.   
  3. # -*- coding:utf-8 -*-  
  4.   
  5. #  
  6. import pandas as pd  
  7. import numpy as np  
  8. import matplotlib.pyplot as plt  
  9. import japanize_matplotlib  
  10. from sklearn.linear_model import LinearRegression  
  11.   
  12. #日本円表示を数値に  
  13. def currencyToNumber(val):  
  14.     # 万と千以下に分ける  
  15.     man, sen = val.split("万")  
  16.   
  17.     #円を取り除き,千以下を0埋め  
  18.     sen = sen.replace("円", "")  
  19.     sen = sen.zfill(4)  
  20.   
  21.     man += sen  
  22.     return int(man)  
  23.       
  24.   
  25. # 数値のカンマを取り除く  
  26. def dropComma(val):  
  27.     val = val.replace(",", "")  
  28.   
  29.     return float(val)  
  30.   
  31. data1 = "../data/prefecture1.csv"  
  32. data2 = "../data/income_pref.csv"  
  33.   
  34. df1 = pd.read_csv(data1)  
  35. df2 = pd.read_csv(data2)  
  36.   
  37. print(df1.head())  
  38. print()  
  39. print(df2.head())  
  40. print()  
  41.   
  42. df3 = pd.merge(df1, df2)  
  43.   
  44. print(df3.head())  
  45. print()  
  46.   
  47. df3['平均年収'] = df3['平均年収'].apply(currencyToNumber)  
  48. df3['人口'] = df3['人口'].apply(dropComma)  
  49.   
  50. x = df3['人口']  
  51. X = df3[['人口']]  
  52. y = df3['平均年収']  
  53.   
  54.   
  55. # モデルの作成  
  56. model = LinearRegression()  
  57.   
  58. model.fit(X, y)  
  59.   
  60.   
  61. print("傾き: %f" % model.coef_)  
  62. print("切片: %f" % model.intercept_)  
  63. print()  
  64. print("決定係数: %f" % model.score(X, y))  
  65.   
  66. pref_name = df3['都道府県']  
  67.   
  68. plt.figure(figsize=(1610))  
  69.   
  70. predict = model.predict(X)  
  71.   
  72.   
  73. plt.title("人口と平均年収のグラフ", fontsize=24)  
  74. plt.scatter(x, y)  
  75. plt.grid()  
  76.   
  77. plt.xlabel("人口(人)", fontsize=18)  
  78. plt.ylabel("平均年収(円)", fontsize=18)  
  79.   
  80. plt.plot(x, predict, color="coral")  
  81.   
  82. for i, pref in enumerate(pref_name):  
  83.     plt.annotate(pref, (x[i], y[i]))  
  84.   
  85. nums = plt.gca().get_yticks()  
  86. plt.gca().set_yticklabels(['{:,.0f}'.format(i) for i in nums])  
  87. nums = plt.gca().get_xticks()  
  88. plt.gca().set_xticklabels(['{:,.0f}'.format(i) for i in nums])  
  89.   
  90. out = "img/prefecture_data1.png"  
  91. plt.savefig(out)  
  92. plt.show()  

0 件のコメント:

コメントを投稿

Pythonで地図空間データを扱う⑤

ベースの地図が出来た所で、他のデータを被せてみます。 国土地理院の  500mメッシュ別将来推計人口データ  を使用します。 同じく神奈川県のデータ  500m_mesh_suikei_2018_shape_14.zip をダウンロードします。 ベースの地図データと同じ場所に展開...