PythonでProphetをつかいたい(4:周期性に独自のものを追加)

時系列=トレンド + 周期性 + その他のうちの周期性に独自の周期性を追加していきます。

▼こちらで作ったデータ、モデルをさらにチューニングしていきます。 esu-ko.hatenablog.com

前回は、曜日の影響を確認しました。

現状のモデルでは、長いトレンドと、短期七日の周期性はとらえていますが、その他の周期性が把握できていません。

新しい季節性の追加

まず、acf,pacfを見て周期にあたりをつけます。

import statsmodels.api as sm

sm.graphics.tsa.plot_acf(mdl_df['y'], lags=50)
sm.graphics.tsa.plot_pacf(mdl_df['y'], lags=50)

f:id:esu-ko:20200913171511p:plain f:id:esu-ko:20200913171523p:plain

ざっくりいってしまうと、青枠から出ているところが自己相関がありそうなところです。

  • 10以下のところはありそう => トレンドと曜日(7日)
  • 25前後と、50あたりがありそう=>25の倍数

後者を追加します。

周期性の追加方法

Prophetではadd_seasonalityで周期性を追加できます。

mdl = Prophet(
    yearly_seasonality=False,
    weekly_seasonality=True,
    daily_seasonality=False,
    growth = 'logistic',
    changepoint_prior_scale=0.3,
    seasonality_mode='multiplicative'
)
#fitの前に記載
#名前、周期、大体の範囲、トレンドの影響を受けるか(今回はうけない)
mdl.add_seasonality(name = '_25',period=25,fourier_order=10,mode='additive')
mdl.fit(
    mdl_df
)
future = mdl.make_future_dataframe(periods=0,freq='D')
future['cap'] = 6
pred  = mdl.predict(future)

#可視化
ts.plot()
pred.yhat.plot()

f:id:esu-ko:20200913171702p:plain

だいぶ形が近くなってきました。

今回設定した周期性の確認

周期性は、nameで指定したカラム名でpredの中に格納されています。

red._25.plot()
df['trend2'].plot()

f:id:esu-ko:20200913171825p:plain

かなり、近い形で周期性を推定しています。

現在のモデルで予測をしてみる

future = mdl.make_future_dataframe(periods=365,freq='D')
future['cap'] = 6
pred  = mdl.predict(future)

ts.plot()
pred.yhat.plot()

f:id:esu-ko:20200913171937p:plain

最初のモデルと比べると、かなり納得しやすい形になりつつあります。