今回は時系列予測モデルProphetをExploratoryで使いこなして実践した内容を公開したいと思います。一緒に50年ほど時計の針を進めてみましょう。
Prophet時系列予測モデルの革新
時系列予測モデルを扱うには、定期的な時間間隔(テンポ)の入力データが扱いやすいのが通例です。月次データであれば、毎月の数値データのデータセットです。ただし、日次データになると急に予測モデルでの扱いが難しくなります。株式市場などのビジネスデータは土・日・祝日の休日や、数年に一度のレベルで起こるサーキットブレーカーの発動などのイレギュラーなイベントがあり、テンポがずれた時系列データとなってしまい、予測精度を保つのが急に難しくなります。
しかしウェブ企業は365日営業しているので、日レベルの時系列予測の需要はとても高いです。
そんな中、2018年のはじめごろFacebook社のProphet時系列予測モデルが素晴らしいと聞き、試してみたところ、驚きました。
よく使われる日次データの予測が非常に頼もしく、営業数値などを扱っている部署では月内着地予想などを作りやすいと思いました。
また、チェンジ・ポイントでトレンドの変化点などもつかみ取りやすいです。
https://facebook.github.io/prophet/
Prophetの今までの課題とExploratoryでの扱いやすさ
ProhetはRやPythonで動きますが、インストールに手間取ったり(Stanを入れるときやlibrary間の依存関係の解消)、入力データのカラム名に命名規則(ds, yなど役割ごとに決められたカラム名にしなければならない)があったり、そもそもRやPythonでプログラミングに抵抗がある人がいると思います。
TableauにてPythonやRと連携できるようになったので、2018年の秋ごろ、この連携ならノンプログラミングを希望するユーザにとって良いと思い、実際に試してみました。
連携をするためには、ものすごく設定が多く、コマンドや前処理をかなり書かなければいけないので、人を選ぶやり方です。なお、Tableauで実装されているのは指数平滑化法(Exponential Smoothing)で1940年~1957年ごろに作られた手法です。この手法が今でも汎用的に真っ先に試されるものですが、月次データで3年以上の履歴データが最低限必要で、ビジネスでは適用範囲が限られます。
2019年にExploratoryで標準メニューに入りました。試してみたら数クリックで予測が終わり、とても使いやすく驚いています。Prophetの命名規則に縛られることもなく快適です。
使い方の例
ExploratoryでのProphetの使い方は、コチラの動画が分かりやすいです。時系列予測の基礎知識に関する説明も含まれています
この記事では、 Prophet公式にあるアメフトのPeyton Manning選手のWikiへのアクセスログを対数化したものを例に、Prophetの使い方を見てみます。
このデータは2007/12/10~2016/1/20までの2,906日分のアクセスログ(対数化済み)です。なんとなく周期的な変動と、たまに突発的なスパイクがあるのが見て取れます。
その際、Exploratoryに読み込ませたのは上記の2列のデータです。
- ds: アクセスログの年月日
- y: アクセスログ(対数化済み)
実行手順
「アナリティクス」タブから「時系列予測(Prophet)」を選びます。
変数やパラメタを設定する画面が出るので
- 日付/時間の列にdsを設定(今回は時間粒度が年月日なので”DAY”を選択)
- 数値データの列にyを設定(データはSUMのままにしておく。変更しても一つのデータなので特に変化はない)
- 詳細情報を設定する場合は歯車マークで設定
分析結果
実行ボタンを押すと下記6種類のプロットとデータタブが自動で出力されます。
予測結果
「予測結果」タブで過去実績とProphetによる予測値のグラフが出力されます
- 青線: 実績データy
- オレンジ: 予測データ
過去実績期間があるのは、バックテストで予測数値を過去方向に伸ばしているものです。これにより過去データに足して、それっぽい予測値が出ているのが見て取れます。また、予測期間に対しても、職人が手で作りそうな形状の予測値ができています。
トレンド
「トレンド」タブにて、Prophetの予測によるトレンド成分が出力されます
緑の曲線がトレンド線で、緑の縦棒がトレンド変化点の変化の大きさです。2012年まで上昇トレンドにありましたが、それ以降は下降気味です。これはManning選手が2012年年3月7日に解雇されるまでインディアナポリス・コルツに在籍し、同年3月20日にデンバーブロンコスと契約するタイミングで、トレンドが変化していることを捉えています。
年周期
「年周期」タブにて、1年の中での周期性を確認します
1月下旬にピークがあるのは2月上旬に開催されるアメフトのスーパーボールの時期に合致します。それ以降はオフシーズンですので、季節性は低く、秋ごろ以降季節性が高くなっていく様子を捉えております
週周期
「週周期」タブにて週内の周期性を見ます
月曜日がピークで、土曜日に向け周期性の成分が下降しています。これは直感と合わず、季節性の分解に失敗している可能性があります。恐らく、何かのイベント効果などのデータが必要かもしれません。今は飛ばしてしまいます
効果
「効果」タブにてトレンドや季節性の影響を比較します
バックテストの結果として
- Trend成分で予測の大半は成り立っており
- Yearly Seasonality(月効果)成分でギザギザの形状の大半を説明し、
- Weekly Seasonality(曜日効果)成分で微調整をしている
変数重要度
「変数重要度」タブで変数間(トレンドを除く)の重要度を把握する
Yearlyが0.6弱で、Weeklyが0.2弱。残りはイレギュラーな成分なのかもしれないが、詳細は要調査
データ
「データ」タブには元データとProphetによって出力された値、信頼区間の範囲、各種成分が表示されます
まとめ
上記ではProphetが簡単に使えて、時系列予測の情報を得ることができることを示しました。
それ以外のこと
ここから、さらに知りたいことの例として、こんなことが挙げられます。
- 予測精度の表示
- 年月日より粗い時間粒度(月や週)での実行結果
- ダミー変数(外部予測変数)の利用(スーパーボールの日フラグ、オフシーズン・フラグ)
- 祝日効果の利用
- チェンジポイントの活用
- 欠損値の効果
- 多種データの処理(一つのデータセットに多くの種類の予測対象があり、それらをループして予測。例えば、店舗ごとの予測値を出力し、それを全体で集約した全体予測値を算出)
是非、これらについても、考察しながら試してみてください。