時系列=トレンド + 周期性 + その他のうちの周期性に独自の周期性を追加していきます。
▼こちらで作ったデータ、モデルをさらにチューニングしていきます。 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)
ざっくりいってしまうと、青枠から出ているところが自己相関がありそうなところです。
- 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()
だいぶ形が近くなってきました。
今回設定した周期性の確認
周期性は、name
で指定したカラム名でpredの中に格納されています。
red._25.plot()
df['trend2'].plot()
かなり、近い形で周期性を推定しています。
現在のモデルで予測をしてみる
future = mdl.make_future_dataframe(periods=365,freq='D') future['cap'] = 6 pred = mdl.predict(future) ts.plot() pred.yhat.plot()
最初のモデルと比べると、かなり納得しやすい形になりつつあります。