はじめに
前回の記事「店舗商品の需要予測」では、Kaggleの商品の販売データセットを用いて、Prophetを使った時系列分析手法で、今後の商品の販売数を予測した。今回は、スコア改善を試みた。
解決したい社会課題
店舗における過去の商品の販売データが存在するが、これらのデータを上手く利用できない場合が多い。
これらのデータから、売れ筋商品などの商品在庫を適切なタイミングで適切な量だけ持つことができるようにすれば、商品の売れ残りの発生による商品の廃棄を防ぎ、このようなリスクを低減できる。
すなわち、効率的な経営を目指すことができる。
分析するデータ
Kaggleの店舗商品の需要予測における課題 Store Item Demand Forecasting Challengeのデータセットを用いて分析結果をまとめる。
実行環境
パソコン:Windows11
開発環境:Google Colaboratory
言語:Python
ライブラリ:Pandas、Numpy、Matplotlib
分析の流れ
- 課題把握とゴールの設定
- 必要なライブラリのインポート
- データの準備
- 予測モデルの学習
- 予測
- 予測の評価
- 設定したゴールの回答
今回は、4からとする。(1~3は前回の記事を参照してください)
分析の過程
4. 予測モデルの学習(改善)
周期性変動が徐々に拡大する予測モデルを構築する
Prophetをインスタンス化するときに、引数にseasonality_mode='multiplicative'を設定することによって、周期性変動が徐々に拡大する予測モデルを構築する。
さらに、cutoffsを4か月毎に変更して、テストのパターンを7に増やして実施してみた。
# インスタンス化する [周期性変動が徐々に拡大する予測モデルを構築]
model = Prophet(seasonality_mode='multiplicative')
# fitメソッドで学習
model.fit(df)
# cutoffsを'2014-12-31', '2015-04-30', '2015-08-31', '2015-12-31', '2016-04-30', '2016-08-31', '2016-12-31'
cutoffs = pd.to_datetime(['2014-12-31', '2015-04-30', '2015-08-31', '2015-12-31', '2016-04-30', '2016-08-31', '2016-12-31'])
# テストパターンを作成する
df_cv = cross_validation(model, horizon = '365 days', cutoffs=cutoffs)
# 評価指標を月単位で算出する
df_p = performance_metrics(df_cv, monthly=True)
# 1か月間隔・毎月初日・向こう2年(730日)の枠組みで予測
future = model.make_future_dataframe(periods=730, freq='D')
# 予測を行う
forecast = model.predict(future)
# 出力された予測値や、不確実性区間を確認
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']]
# これらの値をグラフ上に可視化
fig_forecast = model.plot(forecast)
[不確実性区間に予測値が含まれている割合(coverage)]

[比較]


結果
seasonality_mode='multiplicative'を使用し、cutoffsを4か月毎に変更することで、rmseが5.0を下回るまでに改善した。
まとめ
今回、seasonality_mode='multiplicative' を採用したことで、トレンドの拡大に伴い増大する季節変動を的確に捉えられるようになり、予測精度(RMSE)が実質的に向上した。
また、cutoffs を4ヶ月間隔に設定して検証回数を増やしたことで、特定の時期の偏りに影響されないモデルの汎化性能をより客観的に評価することが可能となった。
時系列のデータ分析を実施してみて、興味関心をもてたように思った。今回のような売上を予測するだけでなく、システムの異常検知の予測などの分野についても分析をやっていきたいと思う。

