できるだけ簡単に時系列データの予測を行いたいと思い、pythonライブラリを探したところ、facebook(現Meta)が開発した時系列データ予測パッケージprophetがありました。
実際に厚生労働省のオープンデータで公開されている新型コロナ新規陽性者数のデータを使って予測してみました。
解析用CSVデータの用意
今回は厚生労働省オープンデータで公開されている新型コロナ新規陽性者数のデータを用いて予測していきます。
上記リンクからwebページの「新規陽性者数の推移(日別)」をクリックすると日別のCSVデータをダウンロードすることができますので、任意のホルダに保管してください。
ダウンロードしたCSVは画像のようにA列に「日付」、B列に「その日の合計」、C列以降に「各都道府県」のデータが入力されています。
python実行前の準備
prophetとplotlyをpipインストールします。
pip install prophet
pip install plotly
python実行コード
prophetの公式ページを参考にコードを作成しました。
とりあえず、デフォルトでは長期トレンドが線形(直線)ですが、非線形にしてみました。
実際の動作コードはこちら
import pandas as pd
import matplotlib.pyplot as plt
from prophet import Prophet
from prophet.plot import plot_plotly,plot_components_plotly
from tkinter import filedialog
#ファイルダイアログのデフォルトフォルダはinitialdirで指示してください
filename=filedialog.askopenfilename(initialdir='C:/okayama-covid19-predict/',filetypes=[("csv file",".csv")])
#厚生労働省オープンデータ https://www.mhlw.go.jp/stf/covid-19/open-data.html
okayama_popu=19000 #岡山県の人口の1/100
data=pd.read_csv(filename,index_col='Date')
# Prophet投入用インプットデータ作成
df = pd.DataFrame({"ds":data.index, "y":data["Okayama"]}).reset_index(drop=True)
# モデルインスタンス
#proph = Prophet() #線形トレンド デフォルト
proph = Prophet(growth='logistic')
#非線形トレンドはキャパシティ設定必要
df['cap']=okayama_popu
# モデル学習
proph.fit(df)
# 未来予測用のデータフレーム
future = proph.make_future_dataframe(periods=365)
#未来予測用データフレームにもキャパシティ設定
future['cap']=okayama_popu
# 時系列を予測
forecast = proph.predict(future)
figure = plot_plotly(proph, # 時系列モデル
forecast, # 予測結果
)
figure2=proph.plot_components(forecast)
proph.plot(forecast)
plot_components_plotly(proph,forecast)
# 出力
plt.show()
実行した結果
実行すると1年先まで予測したグラフが表示されます
個人的にはこんなに右肩上がりになってほしくないですけど・・・。
左下の虫眼鏡ボタンを使用するとグラフを拡大できます。
もう一つのウィンドウには、「週」や「年」単位での季節性(周期要因)や「長期トレンド」を表示します。
年での季節性は、第7波のピークが2022/7月~2022/9月になっているので、夏になると数値が高くなると表示されています。第8波の実績次第でどれだけ変化するかがきになるところです。
みなさんもご存じのとおり日曜日は検査数が減るので、月曜日の新規陽性者数は少ないことが週の季節性グラフで見て取れます。
個人的な感想など
prophetのライブラリを使うと、苦も無く指定した期間の時系列予測ができることができ、ほかのデータも予測してみたいと思いました。
prophetの公式ページには、変化点や自分で季節性を追加する方法も記述がありましたので、予測精度が高くなる方法があれば、記事を更新したいと思います。
「日にちが経過したときに、実際に予測したグラフと実際の値がどれだけ差異があるのか?」「さらにデータを拡充したら予測のグラフなどが変化するのか?」など、気になる点があるので、後日経過の記事も書きたいとおもいます。
pythonで時系列予測する記事は今回が初めてですが、その他のpythonを使用したコードを公開していますので、気になる記事があれば、読んでみてください。
コメント