Snowflake

Snowflake の予測機能で売上を予測したら、自前のモデルより当たった

Ryosuke Ishii

一番飯店の日ごとの売上を、Snowflake の中だけで予測してみました。使ったのは、Snowflake に最初から入っている予測の機能と、自分で作ったモデルの2つです。天気・暦・ホームページの来訪・インスタの投稿も足して、どれだけ当たるようになるかを比べました。

予測のしかた別の外れ
予測のしかた別の外れ

使ったデータ

予測するのは、営業日ごとの売上です。説明に使うデータを4種類集め、すべて Snowflake の試験用の置き場に入れました。

データ中身取り方
売上日ごとの売上(2023年1月〜)店の注文システムから
天気東京の日ごとの最高気温・降水量・日照時間気象庁「過去の気象データ」から
暦祝日・休前日・連休・GW・年末年始Snowflake Marketplace の無料データ
店の発信ホームページの来訪数・インスタの投稿数社内の集計から

暦は、Snowflake Marketplace(データを売り買いする場)で無料公開されている日本の暦のデータを使いました。取得するとそのまま表として読めるので、祝日の一覧を自分で作る手間がかかりません。

ホームページとインスタは、「前の7日間の平均」にして使いました。予測する日の当日の値は、前の日にはまだ分からないためです。

予測のしかた

2026年6月までのデータで学ばせ、7月1日〜10月29日の79営業日で答え合わせをしました。比べたのは次の5つです。

1. 同じ曜日の平均:5〜6月の同じ曜日の売上の平均。比べる相手として置いた 2. 標準の予測機能(売上だけ):Snowflake の `SNOWFLAKE.ML.FORECAST` 3. 標準の予測機能(+天気・暦) 4. 標準の予測機能(+天気・暦・ホームページ・インスタ) 5. 自前のモデル:LightGBM(決定木を何本も重ねて予測する方法)を、4と同じデータで学ばせた

標準の予測機能は、SQL だけで使えます。

CREATE SNOWFLAKE.ML.FORECAST fc_all(
  INPUT_DATA => TABLE(v_train_all),
  TIMESTAMP_COLNAME => 'TS',
  TARGET_COLNAME => 'AMT'
);
CALL fc_all!FORECAST(INPUT_DATA => TABLE(v_test_all), TIMESTAMP_COLNAME => 'TS');

自前のモデルは、Snowflake の中で Python を動かして学ばせました。LightGBM や scikit-learn は Snowflake 側に用意されているので、手元のパソコンに何も入れずに済みます。

7月以降の天気には、予報ではなく実際の値を入れています。実際に使うときは天気予報を入れることになるので、そのぶん当たり方は少し下がるはずです。

結果:標準の機能が一番よく当たった

外れは「予測と実績の差 ÷ 実績」を日ごとに出し、平均と真ん中の値を見ました。

予測のしかた平均の外れ外れの真ん中予測の合計 ÷ 実績の合計
同じ曜日の平均17.5%15.3%95.4%
標準の機能(売上だけ)18.5%14.9%97.2%
標準の機能(+天気・暦)17.0%13.9%92.8%
標準の機能(+天気・暦・HP・インスタ)16.6%14.3%91.9%
自前のモデル(LightGBM)19.3%16.8%92.0%
  • 一番よく当たったのは、標準の機能に天気・暦・ホームページ・インスタを足したもの。ただし、同じ曜日の平均との差は1ポイントほど
  • 標準の機能は、効いた順も出してくれる。上から祝日・前7日のホームページ来訪・休前日・連休・最高気温。インスタの投稿数はほとんど効かなかった
  • 自前のモデルは、同じ曜日の平均にも届かなかった

「売上だけ」で予測すると、同じ曜日の平均より外れが大きくなりました。外のデータを足して、やっと同じ曜日の平均を少し上回った、というのが正直なところです。

自前のモデルが負けた理由

標準の予測機能も、中身は決定木を重ねる方法です。Snowflake の公式ドキュメントでは、売上の増え減り(差分)や過去の売上の値も材料にして予測する作りだと説明されています。

今回の自前のモデルには、過去の売上の値を材料として入れていません。使ったのは曜日・月・天気・暦・ホームページ・インスタだけです。その結果、最高気温を2番目に強く効かせ、7〜8月を1割近く低く見積もりました。売上の流れを材料に持たないぶん、天気に頼りすぎたと考えています。

自前のモデルは、過去の売上を材料に足したり設定を変えたりすれば、点数が上がるかもしれません。ただ、答え合わせの79日を見ながら変えると、その79日に合わせ込んだだけになります。今回は最初に決めた形のまま、変えていません。標準の機能は、こうした作り込みをしなくても、ここまで当たるということです。

当たらなかった月

月ごとに「予測の合計 ÷ 実績の合計」を見ると、7〜9月は予測によって 91〜110% でした。一方、10月はどの予測も 83〜89% で、実績を1割以上下回りました。

月ごとの 予測÷実績
月ごとの 予測÷実績

まず疑ったのは、テレビや雑誌への出演です。店のホームページに載っている出演の一覧(2023年以降の11件)について、出演の前後で売上を比べました。

  • 出演から7日間の売上が、ふだんの上下の幅を超えて伸びたのは、テレビの4件
  • 雑誌の掲載では、目立った伸びは無かった
  • 答え合わせの期間(7〜10月)には、一覧に載った出演が無かった

10月の上振れは、一覧に載っている出来事では説明できませんでした。説明の列に無い出来事があると、どの予測も外れます。予測の点数を上げるより先に、「何が起きた日か」を記録しておくことのほうが大事だと分かりました。

もう1つ、気になる食い違いがあります。雨の日の売上は、同じ曜日で比べると5〜10%低くなっていました。ところが、標準の機能が出した効き目では、雨はほとんど効いていないことになっています。気温や季節と重なっている可能性があり、まだ確かめていません。

答え合わせの画面

5つの予測と実績は、1つの表にまとめ、Streamlit in Snowflake(Snowflake の中で動く画面の仕組み)で画面にしました。外れの表、日ごとの実績と予測の線、月ごとの比が並びます。

Snowsight で開いた答え合わせの画面(縦軸の売上の金額は伏せています)
Snowsight で開いた答え合わせの画面(縦軸の売上の金額は伏せています)

上の表が予測のしかた別の外れ、真ん中の線が日ごとの実績(薄い赤)と予測、下が月ごとの「予測 ÷ 実績」です。「並べる予測」で線を選び直せます。線で見ると、どの予測も実績の大きな山(週末や祝日)を低めに出していることが分かります。

データを Snowflake の外に出さずに、画面まで作れます。見る人には、画面を開く許可を1つ渡すだけです。

まとめ

  • Snowflake の標準の予測機能は、SQL だけで使え、効いた順も出してくれる。日ごとの売上では、自前の LightGBM より当たった
  • 外のデータを足すと当たり方は良くなったが、同じ曜日の平均との差は小さい。予測を作るときは、まず単純な予測と比べる
  • 大きく外れた月は、説明の列に無い出来事が原因になりやすい。出演や行事などの出来事を、日付つきで記録しておく

※ 天気のデータは、気象庁「過去の気象データ」(https://www.data.jma.go.jp/stats/etrn/)を加工して使いました。

ABOUT ME
石井 亮介(りょうさん)
石井 亮介(りょうさん)
データパレード 代表取締役
㈱データパレードの代表取締役で、高田馬場の町中華「一番飯店」のChief Data Officerも務めています。BIツールのセールスエンジニア・システムエンジニア・カスタマーサクセス歴15年。大学のデータサイエンス教育で講師も担当してきました。現在は自社業務のほとんどをAIに移管し、AI10部署と50を超える自動処理が24時間動く「AI経営」を実践中。その実践知をこのブログで発信しています。
記事URLをコピーしました