
DatabricksでProphetを利用して時系列予測をしてみた
データ事業本部のueharaです。
今回は、DatabricksでProphetを利用して時系列予測をしてみたいと思います。
前提
私の手元のDatabricks環境では、既に airline_passengers
というテーブルが用意してあります。
こちらのテーブルの元になっているデータは AirPassangers という有名なデータセットで、1949〜1960年の米国の旅客機の月間搭乗者数のデータで、「年月」「乗客数」といったシンプルなカラムで構成されています。
今回の時系列予測ではこちらのデータを利用したいと思います。
やってみた
Notebookの準備
まず、新規でNotebookを作成します。
Notebookが開いたら、右側のタブの『Envirinment』から、prophet
をDependenciesに追加しておきます。
スクリプト実行
準備ができたので、まずはテーブルのデータを読み込んでみます。
# テーブルの読み込み
spark_df = spark.table("default.airline_passengers")
# 表示
spark_df.show(5)
次に、pandas DataFrameへの変換やProphetに入力するための前準備、データの可視化を行います。
import pandas as pd
import matplotlib.pyplot as plt
df = spark_df.select("*").toPandas()
# monthをDatetimeにして、カラム名をProphetに合わせ変更
df["month"] = pd.DatetimeIndex(df["month"])
df.rename(columns={"month":"ds", "passengers":"y"}, inplace=True)
# 可視化
plt.plot(df["ds"], df["y"])
plt.xlabel('month')
plt.ylabel('passengers')
plt.show()
可視化した結果は次の通りで、周期性を持ちながら右肩上がりのグラフであることが分かります。
次にProphetを利用して時系列予測をしてみます。
from prophet import Prophet
# インスタンス作成(季節性を考慮)
m = Prophet(seasonality_mode="multiplicative")
# モデルの学習
m.fit(df)
# 12ヶ月先までのデータがdsカラムに入っているDataFrameを用意する
future = m.make_future_dataframe(periods=12, freq='MS')
# 予測する
forecast = m.predict(future)
# 予測結果を可視化
fig = m.plot(forecast)
結果は次の通りで、赤枠部分が予測された部分になります。
実際に数値でデータを見ると次のようになっています。
# 結果の一部表示
forecast.tail(5)
トレンドと周期性も以下の通り確認してみます。
# トレンド性と周期性の抽出
m.plot_components(forecast)
plt.show()
結果を見ると、トレンドとしては乗客数は右肩上がりで実データと同じ傾向であることが分かります。
周期性については夏が多く、秋から冬にかけて少なくなっているという季節変動の大枠が捉えられています。
なお上記はシンプルな時系列予測でしたが、Databricksの強みを活かしSparkを利用して大規模に実施したい場合などは以下が参考になりそうです。
最後に
今回は、DatabricksでProphetを利用して時系列予測をしてみました。
参考になりましたら幸いです。