Pythonで時系列予測モデルを構築する(Prophet)

プログラミング

Pythonにおける時系列予測モデル構築:Prophet

Prophetは、Facebook(現Meta)が開発した時系列予測ライブラリです。特に、季節性や祝日などの周期的な変動、およびトレンドの変化に対して頑健であり、ビジネスにおける需要予測やイベント予測などに広く利用されています。Pythonから容易に利用できるため、データサイエンティストやアナリストにとって強力なツールとなっています。

Prophetの基本概念

Prophetは、時系列データを以下の3つの要素の加算モデルとして捉えます。

トレンド (Trend)

時系列データ全体の長期的な増加または減少傾向を表します。Prophetでは、線形トレンドや区分線形トレンド(特定の時点からトレンドの変化率が変わる場合)をモデル化できます。変化点(changepoint)と呼ばれるトレンドの変化が生じる時点を自動的に検出する機能も備わっています。

季節性 (Seasonality)

一定期間(日、週、年など)で繰り返される周期的な変動を表します。Prophetは、フーリエ級数を用いて、年次、週次、日次の季節性を柔軟にモデル化します。ユーザーは、これらの周期性の強さを調整したり、カスタムの季節性を定義したりすることも可能です。

祝日 (Holidays)

特定の祝日やイベントが時系列データに与える影響をモデル化します。Prophetは、カスタムの祝日リストを容易に定義でき、これらのイベントが予測に与える影響を個別に学習します。

Y(t) = g(t) + s(t) + h(t) + ε(t)

ここで、

  • Y(t): 時刻 t における観測値
  • g(t): トレンド
  • s(t): 季節性
  • h(t): 祝日
  • ε(t): 誤差

Prophetのインストールと基本的な使い方

Prophetはpipを使って簡単にインストールできます。

pip install prophet

Prophetを使用するには、データをpandas DataFrame形式で準備する必要があります。DataFrameには、少なくとも2つの列が必要です。

  • ‘ds’: 日時を表す列(datetime型である必要があります)
  • ‘y’: 予測したい数値(float型またはint型)

以下に、基本的なモデル構築と予測の手順を示します。

from prophet import Prophet
import pandas as pd

# サンプルデータの作成
data = {'ds': pd.to_datetime(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05']),
        'y': [10, 12, 15, 13, 16]}
df = pd.DataFrame(data)

# Prophetモデルの初期化
model = Prophet()

# モデルの学習
model.fit(df)

# 将来の日付を作成
future = model.make_future_dataframe(periods=3)

# 予測の実行
forecast = model.predict(future)

# 予測結果の表示(一部)
print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail())

model.fit(df)でモデルが学習され、model.make_future_dataframe(periods=3)で学習データ期間の末尾から3日間分の将来の日付が生成されます。model.predict(future)でこれらの将来の日付に対する予測値(yhat)とその信頼区間(yhat_lower, yhat_upper)が得られます。

Prophetのカスタマイズオプション

Prophetは、その柔軟性から様々なカスタマイズが可能です。

トレンドの変化点 (Changepoints)

Prophetは自動的にトレンドの変化点を検出しますが、ユーザーが明示的に変化点を指定することもできます。

model = Prophet(changepoints=['2023-01-03'])

また、変化点の感度(changepoint_prior_scale)を調整することで、トレンドの変化に対するモデルの感度を制御できます。値が大きいほど、トレンドはより柔軟に変化します。

季節性の設定

デフォルトでは、週次および年次の季節性が自動的に考慮されます。日次の季節性を有効にしたり、季節性の強さを調整したりすることも可能です。

model = Prophet(daily_seasonality=True)
model.add_seasonality(name='monthly', period=30.5, fourier_order=5) # 月次季節性の追加

seasonality_prior_scaleパラメータで季節性の影響度を調整できます。

祝日とイベント

カスタムの祝日リストを定義することで、特定のイベントの影響をモデルに組み込むことができます。

holidays = pd.DataFrame({
  'holiday': 'christmas',
  'ds': pd.to_datetime(['2023-12-25']),
  'lower_window': 0,
  'upper_window': 1,
})
model = Prophet(holidays=holidays)

lower_windowupper_windowは、祝日イベントの前後に影響が及ぶ期間を指定します。

外部回帰変数 (Regressors)

予測したい変数に影響を与える可能性のある他の時系列データ(例:気温、広告費など)を外部回帰変数としてモデルに含めることができます。

df['temperature'] = [20, 22, 21, 23, 24] # 外部回帰変数
model = Prophet()
model.add_regressor('temperature')
model.fit(df)

外部回帰変数を使用する場合、将来の予測にはその回帰変数の将来の値も必要になります。

Prophetの評価と可視化

Prophetは、予測結果を可視化するための便利な関数を提供しています。

fig1 = model.plot(forecast)
fig2 = model.plot_components(forecast)

plot()は、観測値、予測値、および信頼区間をプロットします。plot_components()は、トレンド、季節性、祝日などの各コンポーネントの影響を個別に表示します。

モデルの性能を評価するために、cross_validationperformance_metricsといった機能も利用できます。これらは、過去のデータでモデルを分割し、様々な指標(MAE, MSE, RMSEなど)で性能を評価するのに役立ちます。

まとめ

Prophetは、ビジネスにおける時系列予測タスクに特化して設計されており、その直感的なAPIと強力な機能により、多くのユーザーにとって使いやすいライブラリとなっています。自動的なトレンド・季節性検出、祝日処理、そして外部回帰変数の追加といった機能は、実世界の複雑な時系列データに対する高精度な予測を可能にします。モデルのパラメータを調整することで、予測の精度をさらに向上させることができます。