前回はAnacondaのインストールからjupyter notebookが起動するところまで実施しました。今回はProphetを使った時系列データの予測をやってみたいと思います。
前回の記事はこちらから
1. データダウンロード
下記サイトより為替レート(日本円からドル)のグラフをダウンロードします。
ダウンロードしたデータは作成したDataディレクトリに保存しておきます。
2. 事前準備
ここからはJupyter notebook上での作業となります。必要となるライブラリをインポートしておきます。
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from fbprophet import Prophet
CSVデータを読み込んで6行分表示してみます。
df = pd.read_csv("./data/DEXJPUS.csv")
df.head(6)
データが読み込まれている事が分かります。また、元データの6行目の値がperiod(.)になっている事が分かります。
データの型を確認してみます。
df.dtypes
DATE/DEXJPUS列がobject型になっています。このままではprophetを使うことが出来ませんので、データクリーニングを実施します。
下記コマンドを実行して型を変更し、periodはNoneに変更します。
df["DEXJPUS"] = df["DEXJPUS"].replace(".", None)
df["DEXJPUS"] = df["DEXJPUS"].astype(np.float64)
df["DATE"] = pd.to_datetime(df["DATE"])
df.dtypes
型が変換されたことがわかります。
3. Prophet実行
prophetは日付と値から成るデータであれば実行する事が可能ですが、カラム名がそれぞれds, yにセットされている必要があります。よってDATEをds、DEXJPUSをyとします。
df["ds"] = df["DATE"]
df["y"] = df["DEXJPUS"]
実際に未来予測がどれくらい正確なのか見ていきたいと思います。Prophetでは訓練データを読み込ませる形になりますので、訓練データとテストデータを定義します。
df_train = df[df["DATE"] <= "2021-11-19"]
df_test = df[df["DATE"] >= "2021-11-20"]
train_size = len(df_train)
test_size = len(df_test)
Prophetは新しいオブジェクトをインスタンス化することでモデルを適合させます。fitメソッドを呼び出して、データフレーム(訓練データ)を渡してあげます。
m = Prophet()
m.fit(df[:train_size])
4. 予測
予測してみましょう。訓練データ日以降の60日分の予測値がどのような結果を示すのか見たいと思います。
future = m.make_future_dataframe(periods=60, freq="d")
forecast = m.predict(future)
forecast
forecastにはProphetの学習結果からトレンドや予測値の上限/下限(yhat_upper/yhat_lower)などの値を確認する事が出来ます。
予測結果をグラフ化してみます。
m.plot(forecast)
plt.plot(df[train_size:train_size+test_size].ds, df[train_size:train_size+test_size].y,".",color="red", alpha=0.6)
少しわかりずらいですが、2021-11-20 ~ 2022-02-13まで青線がProphetの予測値、赤い点は実際の値になります。おおむね、予測した値通りに推移している事が分かります。
5. その他
次回は異常検知について見ていきたいと思います。