【第50回PYTHON講座】Sklearnで線形回帰 東京の気温予想

PYTHON

みなさん、こんにちは。
今回はSklearnで線形回帰の2回目です。

東京の過去の気温データを使って、気温予想をしてみます。

プログラムの内容

東京の過去の7月の平均気温データから線形回帰して、2021年の7月の平均気温を予想してみます。2021年7月は過ぎているので、実際の気温と予想された気温が比較出来ます。

気温データは気象庁のデータからダウンロードしたものになります。1875年から2020年までの7月の気温データを用います。

LibreOffice Calc 表計算データの読み取り

過去のデータを、Libreofficeの表計算ソフト Calcのファイルに保存します。

PYTHONでLibreOffice Calcの表計算データを読み取るには、ライブラリ『odfpy』が必要になります。

インストールされていなければ、下記のコマンドを実行してインストールして下さい。

pip install odfpy

エクセルファイルに貼り付ける場合は、odfのライブラリは不要になります。

プログラムコード

import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression

file = "C:/Labo/tokyo-temp.ods"

df = pd.read_excel(file, engine="odf", sheet_name='Sheet1', header=1)

np_year = df.iloc[:, [0]].values
np_temp = df.iloc[:, [1]].values

reg = LinearRegression().fit(np_year, np_temp)

print(reg.predict(np.array([[2021]])))
1~3行目 ライブラリをインポート

pandasはLibreCalcのデータを読み取る際に使用します。

numpyはSklearnのデータの受け渡しで使用します。

LinearRegressionは線形回帰の関数になります。

5行目 データファイルの定義

データファイルの保存場所を定義します。

7行目 データファイルの読み込み
df = pd.read_excel(file, engine="odf", sheet_name='Sheet1', header=1)

LibreOfficeの場合、 engine=”odf” というオプションが付き、エクセルファイルの場合は付きません。なので、LibreOfficeだからといって、これ以外の特別なことはありません。

sheet_name=’Sheet1′ はシート名”Sheet1”のデータから読み取るということです。記述していなければ、最初のシートのデータ読み込まれます。

header=1 は1行目がヘッダー(タイトル)になっているということで、2行目からデータということになります。

これで、pandas形式のデータフレームにデータが格納されました。

10,11行目 Numpy形式の配列に変換
np_year = df.iloc[:, [0]].values
np_temp = df.iloc[:, [1]].values

前回もお伝えしましたが、Sklearnのデータの受け渡しはNumpy配列になります。

pandasのデータフレームからNumpy配列 np.arrayに変換します。

np_yearには年、np_tempには気温のデータが入ります。

13行目 線形回帰直線の計算
reg = LinearRegression().fit(np_year, np_temp)

線形回帰の計算をします。

15行目 2021年の気温予想 
print(reg.predict(np.array([[2021]])))
>>[[26.27086207]]

2021年の気温を出力します。この場合もnp.arrayでデータを入力します。

予想結果は26.27となります。実際は25.9度なので、少し差がありますね。

2050年で計算すると、26.75度となり、年数が経つにつれて気温が高くなってくるというのは分かります。

まとめ

いかだったでしょうか。

今回はSklearnと東京の過去の気温データを使い、線形回帰での気温予想の方法を紹介しました。

データ量が多いと予想値に信頼性が出てきます。是非、その他いろいろなデータを使って予想して下さいね。

役に立った!」と思れましたら、下のSNSボタンで記事のシェアをしていただけると嬉しいです!

コメント

タイトルとURLをコピーしました