パンナの学生生活

地方大学の大学生/プログラミング言語【python】を中心に紹介しています。/日々の脳内をアウトプット/麻雀とワインと日本酒が好き/将来は幸せになりたい

【データサイエンス】【python】重回帰分析で気温を予測し、予測値の分析をする。

今回は実際に重回帰分析で気温を予測し、その正解率を出してと思います。使うのは、scikit-learnです。機械学習ライブラリーの前回の講義で10年分の気温データを取得し、データの整理とそれらのデータの相関関係を調べました。前回の記事はこちらから見てください。

 

pannakotta.hatenablog.jp

 

 重回帰分析について

ソースコード

予測精度について

最後に

重回帰分析について

重回帰分析とは、簡単に説明すると、1つの目的変数を複数の説明変数で予測したものです。xを目的変数とし、yを目的変数とします。その、説明変数の係数とその関数の切片を求める方法です。


y=a_{1}x_{1}+a_{2}x_{2}+a_{3}x_{3}+........+b

ちなみに単回帰分析は一つの目的変数を一つの説明変数で予測するというものです。xを目的変数とし、yを目的変数とします。その、説明変数の係数とその関数の切片を求める方法です。


y=ax+b

今回の天気の予測は、2007年~2017年の10年間の7気温データを説明変数として、目的変数を2018年の気温データとして予測していきます。

ソースコード

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import scipy as sp
from matplotlib import pyplot 
from pandas import Series,DataFrame
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn import linear_model
import seaborn as sns
import sklearn
data1=DataFrame(pd.read_csv("assign5_temp1.csv"))

data2=data1[["2018","2007","2008","2009","2010","2011","2012","2013","2014","2015","2016","2017"]]
print("データ型確認{}\n".format(data2.dtypes))

X=data2.drop('2018',axis=1)
y=data2["2018"]
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.5,random_state=0)
#Xを説明変数、yを目的変数とする。Xとyを訓練データとテストデータに分ける。
model=LinearRegression()
model.fit(X_train,y_train)
print("決定係数(train):{:.3f}".format(model.score(X_train,y_train)))
print("決定係数(test):{:.3f}".format(model.score(X_test,y_test)))
#決定係数の表示、回帰方程式の当てはまりの良さの尺度
print("\n回帰係数\n{}".format(pd.Series(model.coef_,index=X.columns)))
print("切片:{:.3f}".format(model.intercept_))
#回帰係数と切片の表示
K=model.predict(X)
print(K)
#説明変数からの2018年の気温の予測値を表示

 下の数値が予測データとなります。データ数は365日

[ 3.870521    4.22613244  4.35346116  4.06021005  3.54201976  4.47881628
  3.66137512  4.13818639  3.51178742  2.61530929  2.19479034  1.78812311
  1.54611373  1.46574991  1.04176796  1.47762866  1.3731758   1.89278373
  2.47943568  2.72209344  2.6001476   3.16071232  2.80813023  1.25805903
  2.16877967  2.02601257  1.9356686   2.0500648   1.97369468  2.92190638
  2.498863    1.84997711  3.08112886  3.28403439  1.71911256  1.11563541
  1.871768    1.93700705  0.8633924   1.02089027  1.72662474  1.91477831
  2.39922582  2.1325071   2.92190327  2.7530011   2.42515867  1.77634443
  1.21386026  1.66255399  2.79582828  2.6930197   3.81354741  4.50963944
  3.26109773  3.22168638  3.94774347  3.83088187  3.94510377  4.54333797
  4.72229101  4.12474651  4.31544902  4.85579566  5.26039673  4.9947067
  5.2512229   5.42043217  3.66103462  4.45413154  5.29893675  6.27424833
  5.96018587  5.76314222  7.1863267   8.36159553  8.94025455  8.40793384
  7.38492936  6.64279043  7.76116517  7.48998588  7.61589386  7.71180902
  7.00756232  7.61319097  8.20485326  9.38662999  9.87431238  8.54098212
  8.30914494  9.6697589  11.70744734  9.59904153  8.85690209  8.75557809
  9.50975945 10.15894612 11.38746301 11.3682864  10.23016891 10.24901297
 10.8614511  11.22530732 11.07577522 13.44511429 12.74029407 12.49467956
 11.72188992 12.55649563 13.02492653 12.37874937 13.48514621 13.35386043
 13.32826211 14.89754534 14.44057477 14.51667266 15.80923573 17.64188945
 18.16452407 18.53557164 18.74376054 17.46225783 16.6107457  16.08640791
 16.57846208 16.68359233 14.84432357 14.59443221 14.33152959 15.46770332
 16.25185415 17.22134791 17.66469429 16.30130769 15.34065055 16.54316968
 18.69963808 18.58436748 18.25104998 18.54515098 18.32100793 19.55064458
 19.34585459 19.18351235 19.12617073 20.42237804 20.32096797 20.94886424
 19.13366174 19.19287226 19.48838728 20.74004694 21.00419525 20.56021438
 20.17934007 20.96734007 21.57787831 20.96825127 21.45536925 21.94972279
 21.40076639 20.66332738 20.30262378 21.06113703 21.12701812 21.34641078
 21.67017792 22.08911115 22.80526285 22.24628785 22.23191589 21.28649245
 20.99258011 21.81190585 22.8828339  23.434881   22.95641131 22.542582
 23.47805549 22.91930245 23.63546497 24.1124517  24.02053104 24.61414282
 24.83009477 23.67043604 24.10421754 24.30900677 24.85133378 25.6157912
 25.64921939 25.54707555 25.34937694 25.92154823 25.76103289 27.23346884
 25.74133663 25.43458177 26.00344003 26.90376569 27.73194479 26.98623374
 26.72536459 26.59613871 28.06689558 27.5660826  27.00335165 27.01311403
 28.25719928 28.87392616 28.34154795 28.54837951 28.86734893 29.03715563
 29.15815028 28.75507011 28.16099668 26.50746713 26.31943175 26.97988972
 26.69772157 26.94982142 27.19827503 26.46027933 26.99665741 26.64745869
 26.02893416 27.06244669 27.72805566 27.96645087 26.88504927 27.36128994
 26.32982929 26.13958056 25.94597272 25.84443909 25.55521898 26.65066553
 26.46193711 25.21721168 25.79836548 26.21645716 26.87531921 26.19949252
 25.75046744 25.7509156  24.72432827 24.21207553 24.82357164 24.69631137
 24.61361872 23.78658809 23.45477444 22.94183024 23.33049371 23.12148702
 23.31257301 23.28619191 24.27264397 22.65154008 22.01631208 20.89010518
 21.444387   20.77600222 21.15497761 20.61701116 20.88596638 20.76486586
 20.76661273 20.02152343 20.28085756 20.41619976 20.22168447 20.64194969
 19.85549244 18.66114592 18.90362378 18.81829547 18.52571921 19.26709665
 19.23607608 18.13016557 17.08553288 16.46488356 16.8472194  16.57446924
 16.47721209 17.46074519 17.11129876 16.79455691 16.94235803 17.14357423
 16.08503359 15.85240287 15.89765281 15.23025487 16.05587917 14.83088058
 13.785434   13.87863317 12.78124264 12.91376694 13.21889755 13.39197883
 13.15138844 12.38015808 13.13225259 14.27337478 12.82059725 12.71186834
 12.86896803 12.105209   11.39581379 12.67138024 11.77174978 10.88960906
 11.18898789 10.78845315 10.46463111  9.86617549  8.2684794   8.07272183
  8.89597712  9.90987114  9.75168862  8.44894961  7.95273035  8.58378489
  8.89041726  9.23526204  9.82694093  9.3668313   8.69074663  6.94052954
  8.13976205  8.55676016  7.42552343  4.96790195  3.93652799  4.5599358
  5.50006154  6.44243289  7.28968862  6.17249384  5.11088842  4.39346719
  4.81402086  5.87505403  4.55305247  4.65151547  4.51706745  4.98637429
  5.45093034  5.12228532  4.584958    4.7103008   4.11641598  2.06103886
  2.31737143  3.30782188  4.49520462  4.93592718  3.56841603]

 予測精度について

予測した決定係数と回帰係数と切片は以下の通りになります。

決定係数(train):0.922
決定係数(test):0.916

回帰係数
2007   -0.126166
2008    0.288299
2009    0.128451
2010   -0.020193
2011    0.037523
2012    0.195344
2013    0.020601
2014    0.285419
2015    0.076821
2016    0.048763
2017    0.093599
dtype: float64
切片:0.105

予測したpredict 2018と正解データ2018年の気温データの相関係数とp値は以下のようになります。

s=sp.stats.pearsonr(K,data2["2018"])
print("(相関係数,P値):{}".format(s))
#出力
(相関係数,P値):(0.9597455070958658, 2.802060654306793e-202)
plt.plot(K,data4["2018"],'o')
plt.xlabel("predict 2018(℃)")
plt.ylabel("2018(℃)")
plt.savefig("cor_temper",dpi=300)

 

f:id:panNakotta:20200224182726p:plain

predict 2018と正解データの相関

最後に

今回は2018年の気温を重回帰分析で行っていきました。scikit-learnは便利ですね。今回まだ詳しいデータの表示の仕方や、グラフのプロットなど詳しく説明していないので、また機会があれば説明していきたいと思います。

ツイッターで随時質問など受け付けています。何かあればいつでも質問してください。

今後も発信していきたいと考えています。最後までご覧いただきありがとうございます。