TPTブログ

テックポート株式会社のブログです。 技術情報や製品・サービス情報、 また未経験社員がデータサイエンティストを 目指す奮闘記など、更新していきます。

▲豊田市の3月の平均気温を予測してみよう

f:id:TBT_matsu:20200302115754p:plain
こんにちは
テービーテックの村松です

現在のDSIT豊田校3期は時系列データを取り扱っている最中です
講義内であまりにも簡単に未来予測をするライブラリを教わったので今回はそちらをご紹介

Prophet

「Prophet」はFacebookが提供している機械学習ライブラリで簡単にそれっぽい時系列解析ができます
PythonとRに対応しているそうです
今回はPythonで進めていきます

今回の目標

今回は講義で紹介されたProphetを使って豊田市の3月の日別の平均気温を予測してみようと思います

準備

データセットの作成

気象庁|過去の気象データ・ダウンロード」から豊田市の過去10年分のデータ拝借
【余談】大学生時代に気象庁とe-Statの統計データには度々お世話になった思い出があるのですが、卒業したら二度とまみえることはなかろうと思っていました。思わぬ再会に地味に感動しております。
【手順】
f:id:TBT_matsu:20200224170211p:plain
①まずは地点を選びます
②今回は愛知県の
③豊田市を選択
f:id:TBT_matsu:20200224170230p:plain
④次に項目を選びます
⑤⑥今回は「日別値」の「平均気温」「最高気温」「最低気温」「降水量」「日照時間」を選んでみました
f:id:TBT_matsu:20200224170249p:plain
⑦次はダウンロードする期間を選択します(2010-01-01~2020-02-29)
⑧一回にダウンロードできるデータ量には上限がありますので注意
⑨⑩今回は5年ごと2回に分けてダウンロードしました


読み込んだデータを全てくっつけて、
いらないところを削除して、
出来上がりましたデータがこちら(上部10件を表示しています)
f:id:TBT_matsu:20200302100449p:plain

Prophetではdatetimeのカラム名を「ds」、
分析したい数値を「y」とするお決まりごとがあるので変換しておきました
今回の「y」は「平均気温」です

ぶっちゃけ実装するよりもcsvファイルを読み込むことに一番手間取りました・・・
書き出すと長くなるので次回に回します
まずはサクッと結果を出してみましょう

Prophet実装

では、出来上がったデータをProphetに突っ込んでみましょう

#モジュールのインポート
from fbprophet import Prophet
#モデルの構築
model = Prophet()
#学習
model.fit(df)

めちゃくちゃシンプル・・・
細かい調整などは限界があるそうですが、今回はまずデフォルトで行きます

学習したデータは2010年1月1日から2020年2月29日まで
ここから今月の平均気温を予測します

#3月分を予測
future = model.make_future_dataframe(periods=31)
forecast = model.predict(future)

結果

それでは結果をプロットしてみましょう

model.plot(forecast);

f:id:TBT_matsu:20200302100907p:plain

・・・うーん
今年の冬がとても暖かかったことはよくわかりますね
しかし3月の予測が10年分表示されると埋もれてわかりづらいので、直近1年分くらいに変えましょう

model.plot(forecast)
plt.xlim(future.ds.iloc[-365-90], future.ds.iloc[-1]);

f:id:TBT_matsu:20200302100949p:plain

黒い点:実測点
青い線:予測値
薄い青の範囲:80%信頼区間
となっております
黒い点が途切れた以降が3月の予測ですね
ふむ、それっぽく出てますね
昨年より出だしが高めなのでそのまま高く上がっていっている感じですが・・・

・・・
やっぱり3月の予測よりも、今冬の暖かさに目が行ってしまう・・・
うん、暖冬でしたね、ということで

周期性とトレンドも確認できます

model.plot_components(forecast);

f:id:TBT_matsu:20200302103840p:plain

以上、とっても簡単なProphet実装でした
お手軽でしたね

折角予測をしたので3月の終わりにでも答え合わせをしてみましょうかね
忘れていなければ・・・
では、本日はここまで