パンプキンスパイスの時系列分析’ (Pampukin Supaisu no Jikeiretsu Bunseki)
(Pankin Supaisu no Miryokuteki na Jidai Koushou)
ごろごろとリラックスできるローファイを着て、大きめのセーターを手に取り、お気に入りの熱い飲み物を持ち、パイソンの世界へ。
北半球ではまたその季節がやってきました。リンゴやカボチャ、シナモンやナツメグ、ジンジャー、オールスパイス、クローブなど、さまざまな組み合わせで季節感を感じます。スーパーマーケットはハロウィンや感謝祭、冬の休日に備えていますが、それは私が統計モデルのスキルを活かす絶好の機会です。季節感あふれる関数指向のモデリングを楽しみましょう。完全なコードノートブックはこちらからご覧いただけます。
仮説:
米国で「パンプキンスパイス」というキーワードのGoogle検索タームの人気は、アメリカの秋の祝日や季節の料理と関連しているため、強い季節性を持つでしょう。
帰無仮説:
先週や昨年のデータを使用する方が、今週の「パンプキンスパイス」という検索キーワードの人気レベルをより予測できるでしょう。
データ:
Google Trendsからの過去5年間のデータ(取得日:2023年10月7日)[1]
反復モデリング手法:
- 直近の1週間または昨年のデータを使用して今週の予測を行う素朴なモデルを作成します。具体的には、最終的なモデルが単独で正確または不正確であるだけでは不十分です。最終的なモデルは、歴史的データを直接の予測として使用することに比べて優れる性能を発揮する必要があります。
- トレインテストスプリットにより、アルゴリズムが学習するためのデータセットと、アルゴリズムのパフォーマンスをテストするためのデータセットの2つのセットを得ます。
- 季節性分解により、データの予測可能性をざっくりと把握することができます。年間全体の傾向と季節性パターン、ノイズを分離しようとします。より小さなノイズのスケールは、アルゴリズムでデータの一部が捉えられることを意味します。
- データが定常性を持っているかどうかを判断するための一連の統計テストを実施します。データが定常でない場合は、1次の差分を取る必要があります。つまり、各時間間隔のデータは直前の時間間隔のデータとの差のみを示すようになります。これにより、データが定常になります。
- 自己相関プロットから移動平均項の推論および偏自己相関プロットから自己回帰項の推論を使用して、いくつかのSARIMAモデルを作成します。SARIMAは時系列モデリングの定番であり、ACFとPACFの推論を試し、Auto Arimaの力技アプローチを試す前に最善のパラメータ組み合わせを選択します。
- Auto Arimaを使用してみて、多くの項目を反復しながら最適な項目の組み合わせを選択します。SARIMAモデルのパラメータがパフォーマンスの良いモデルを提供するかどうかを学ぶために実験したいです。
- 季節性分解からの推測から、時間との関係性を捉える際にxが加法的か乗法的かを判断してETSモデルを試します。ETSモデルはSARIMA系列モデルよりも季節性と全体的なトレンドにより重点を置いており、時間とのパンプキンスパイスの関係を捉える際に優位性を発揮するかもしれません。
パフォーマンスプロットのKPI:
- 業界標準のMAPEスコアを使用してみてください。多くの職場で使用されており、人々にとって馴染みがあります。理解しやすいです。
- より有用性の高いRMSEスコアを使用してみてください。
- 予測結果をテストデータと比較し、パフォーマンスを視覚的に確認します。
データの視覚的確認:
上のプロットからわかるように、このデータは季節モデリングの強力なポテンシャルを示しています。毎年の後半に明確なスパイクがあり、テーパーとさらなるスパイクがあり、その後、基準値に下がります。
ただし、2021年を除いて、各年の主要なスパイクは年々大きくなっています。これはパンデミックがあることを考えると理にかなっています。人々は季節を祝うことを考えていなかったかもしれません。
Imports:
注:これらのインポートはノートブック自体では異なる形式で表示されます。ノートブックでは、インポートを多く含んだseasonal_mod.py
を使用しています。
画像は著者提供です。
私がコードノートブックを作成するために使用したライブラリです。時間系列パッケージでは、scikit-learnの代わりにstatsmodelsを選びました。私はほとんどの線形回帰問題において、statsmodelsが好きです。
コードに基づく関数ベースのアプローチ:
あなたも私と同じでしょうが、新しいモデルを作成するたびに複数行のコードを書くことはしたくありませんし、検証のためにさらにコードを追加することもしたくありません。そのため、コードをDRYに保ち、エラーを防ぐために、いくつかの関数を作成しました。
画像は著者提供です。
これらの3つの小さな関数は一緒に動作し、y_true
とy_preds
を入力としてmetrics_graph()
を実行するだけで、真のデータの青の線と予測データの赤の線、およびMAPEとRMSEが表示されます。これにより、時間と手間を節約できます。
成功のための昨年のデータをベンチマークとして使用する:
小売業の管理経験から、先週のデータと昨年のデータを今年のデータの直接予測として試してみることにしました。小売業では、例えばブラックフライデーの在庫を確保するために、前シーズンの(1単位時間前の)データを直接予測に使用することがよくあります。先週のデータは昨年のデータほどうまく機能しませんでした。
先週のデータを使って今週のデータを予測すると、MAPEスコアは18以上、RMSEは約11でした。それに対して、昨年のデータを今年のデータの直接予測に使用すると、MAPEスコアは約12、RMSEは約7でした。
したがって、私は構築したすべての統計モデルを、昨年のデータを使用した素朴なモデルと比較することにしました。このモデルは、素朴な週次モデルよりもスパイクと減少のタイミングをより正確に予測しましたが、私はまだより良い結果を得ることができると考えました。モデリングの次のステップは季節分解を行うことでした。
次の関数は、季節分解を行うために使用しました。今後のモデリングにおいて再利用可能なコードとして保持する予定です。
画像は著者提供です。
以下は、その季節分解を使用した方法を示しています。
加法モデルでは、残差には再発する年間パターンがあり、加法モデルではすべての再発パターンを完全に分解することができませんでした。年間のスパイクには乗算モデルを試す価値があるという証拠です。
乗法分解では、残差ははるかに有望でした。ランダム性が高く、非常に小規模です。これは乗法モデルがデータを最も適切に捉えることを示しています。残差が非常に小さい(1.5から-1までの範囲)ため、モデリングには非常に多くの可能性があることを意味します。
しかし、今回は特にSARIMAモデルを実行するための機能が必要で、オーダーのみを入力することができるものを求めました。季節分解が加法モデルよりも乗法モデルを推奨していたため、SARIMAモデルのc、t、およびctのバージョンもそれらのオーダーで実験してみたかったのです。パラメータtrend=にc、t、ctを使用することで、SARIMAモデルに乗数を追加することができました。
画像は著者によるものです。
AFCとPACFプロットを調べた部分や、PMD auto arimaも試した部分については説明を省略させていただきます。詳細なコードノートブックをご覧になりたい場合は、こちらをご覧ください。
私の最高のSARIMAモデル:
私の最高のSARIMAモデルは、単純なモデルよりもMAPEスコアが高く、約29対約12でしたが、単位当たりのRMSEは約7対約6で低くなりました。このモデルを使用する上での最大の問題は、2023年のスパイクを実際には予測できていないことです。2023年の8月から9月にかけて、赤い線と青い線の間にかなりの範囲があります。RMSEとMAPEについての考え方に依存して、年間単純モデルよりも好きだったり、悪かったりする理由があります。ただし、まだ終わりではありません。最終モデルは、年間単純モデルよりも明らかに優れていました。
最終モデル:
最終モデルとして、ETS(指数平滑化)モデルを使用しました。これにより、seasonalパラメータを明示的に使用して乗法アプローチを適用することができました。
あなたはおそらく「しかし、このモデルは年間単純モデルよりもMAPEスコアが高いです」と考えるかもしれません。それは正しいです、約0.3%です。ただし、私はRMSEが約4.5になり、7ではなくなったという点で、これは公正な取引だと思います。このモデルは、最高のSARIMAモデルよりも2022年12月に若干苦労していますが、2023年の秋に比べてそのスパイクの面積が少ないです。それは私がもっと気にしている部分です。このモデルをこちらで見つけることができます。
さらなる検証:
10/7/2024まで待って、昨年のデータと比較してモデルの性能を確認します。
結論:
まとめると、私は帰無仮説を反証することができ、最終的なモデルは単純な年間モデルよりも優れた性能を発揮しました。私は、パンプキンスパイスのGoogleでの人気は非常に季節的であり、予測することができることを証明しました。単純、SARMAモデル、ETSモデルの中で、ETSが時間とパンプキンスパイスの人気の関係をよりよく捉えることができました。パンプキンスパイスの人気と時間の乗算的関係は、時間以外の独立した変数もパンプキンスパイスの人気に寄与しているということを意味します。time * unknown_independent_var = pumpkin_spice_popularity
。
学んだことと今後の課題:
次のステップとして、メタのグラフAPIのいずれかのバージョンを使用して、ビジネス記事で「パンプキンスパイス」が使用されているかどうかを調べます。そのデータと私のGoogleの傾向データの相関関係がどのようになるかが気になります。また、季節分解が乗法モデルを示す場合、私はプロセスの早い段階でETSを採用します。
さらに、このプロセスの自動化に興味があります。理想的には、Google Trendsから直接CSV形式で入力し、使いやすいモデルと十分なドキュメンテーションで、非技術的なユーザーでも自分自身の予測モデルを作成しテストできるようなPythonモジュールを構築したいと考えています。ユーザーが予測が困難なデータ(つまり、単純またはランダムウォークモデルの方が適している)を選択する場合には、モジュールがユーザーに説明するようにすることを望んでいます。そのモジュールを使用してデータを収集し、未テストのデータにおける季節性の発見をショーケースすることもできるでしょう。
来年のパンプキンスパイスシーズンにそのアプリに注目してください!
[1] Google Trends、N/A (https://www.google.com/trends)
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles