Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

scikit-learnの回帰分析で緯度、標高から気温を予測する

scikit-learnを用いて回帰分析を行います。回帰分析は数値の予測を行う手法で、入力(説明変数)と出力(目的変数)の関係を求めて、その関係に基づいて未知の入力値に対する出力値を予測します。ここでは説明変数として緯度と標高、目的変数として2019年1月の平均気温を用いて最小二乗法による重回帰分析を行い関係式を求め、未知の地点の気温を予測します。具体的には
目的変数をy、説明変数をx1,x2とした場合
y = ax1 + bx2 + c
の式に最小二乗法によりあてはめ、線形回帰式の係数a,bと切片cを求めます。
最後に求めた線形回帰式にx1、x2(緯度、標高)を与え、未知の地点のy(気温)を予測します。

準備

気象庁のウェブサイトに掲載された過去の気象データより北海道から沖縄まで全国32ヵ所の緯度、標高、2019年1月の平均気温を取得、一覧を作成しファイル名 'temp201901.csv' でjupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。CSVファイルの中身は以下の通りです。

45.52,26,-4.2
44.12,3,-6.2
43.51,170,-7.4
40.65,890,-7.5
40.17,13,-0.3
38.9,3,2.4
39.55,407,-3.4
38.33,58,3.5
37.72,824,-4.4
36.95,3,4.3
36.05,760,-0.8
34.99,6,7
37.39,5,3.4
35.36,3775,-18.3
35.48,378,1.1
35.36,130,3.2
33.45,68,8.7
35.28,200,2.1
35.00,444,1.0
36.20,27,5.5
32.24,4,7.2
32.72,31,9.8
32.82,555,7.1
33.18,2,5.9
33.25,435,3.3
34.70,63,3.1
32.64,590,2.8
31.66,387,6.2
30.41,150,11.6
27.04,14,17.7
26.84,232,15.3
24.06,38,20.1

環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • scikit-learn 0.19.2
コード

32か所のデータを用い重回帰分析により機械学習を行います。学習モデルに以下4か所の緯度・標高を与え、気温を予測します。

    緯度 標高 気温
増毛  43.85 20  -2.7
桧枝岐 37.00 973 -4.0
本川  33.77 550 2.1
枕崎  31.27 29.5 9.6

import numpy as np
from sklearn import linear_model

data = np.loadtxt('temp201901.csv', delimiter=',',dtype=float) #学習データのCSVファイル読み込み
x1_x2 = data[:, 0:2]  # 説明変数(緯度,標高)
y = data[:, 2:3]  # 目的変数(2019年1月の平均気温)

model = linear_model.LinearRegression()  # 学習モデルとして最小二乗法を用いる
model.fit(x1_x2,y)  # 説明変数(緯度,標高) vs 目的変数(2019年1月の平均気温)で学習
print(model.coef_)  # 線形回帰式の係数の表示
print(model.intercept_)  # 線形回帰式の切片の表示
print(model.score(x1_x2,y))  # 線形回帰式の決定係数の表示

x1_x2_predict = [[43.85,20],[37.00,973],[33.77,555],[31.27,29.5]]  #予測する4か所の緯度、標高
predict_result = model.predict(x1_x2_predict)  #予測の実施
print(predict_result)  #予測結果の表示

実行結果

線形回帰式の係数と切片が a = -1.24722934、b = -0.00658533 c = 49.4216759 と求まりました。緯度が1度大きくなると1.2度気温が下がる、標高が100m上がると0.65度気温が下がるという関係のようです。
決定係数(R2)は0.955と求まりました。決定係数はデータに対する求めた回帰式の当てはまりの良さを表しており1に近いほど回帰式が実際のデータに良く当てはまっていると言えます。0.955は当てはまりが良いと言えます。
また4点の気温予測値は-5.1、-3.1、3.6、10.2度となりました。

[-1.24722934 -0.00658533]
[49.4216759]
0.9550164279460698
[[-5.40103705]
[-3.13333406]
[ 3.64788396]
[10.22654737]]

以下のサイトを参考にさせていただきました

Python でデータサイエンス>>scikit-learn で線形回帰 (単回帰分析・重回帰分析)
Scikit-learn で線形回帰

プログラミングをマスターするなら独学よりもオンラインスクールが近道!!

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村