UreyukiBox

ブログ /

Shopify の在庫切れを防ぐ需要予測の基本|SMA から始めて段階的に高度化する

TL;DR

  • 需要予測は「将来の販売数を当てるゲーム」ではなく 「在庫が切れる前にアラートを出す仕組み」 と理解するのが現実的。
  • 最初は 単純移動平均(SMA、Simple Moving Average) で十分。複雑な統計モデルに振り回されない。
  • 再注文ポイント = リードタイム期間中の予測販売数 + 安全在庫。これだけで在庫切れの大半を防げる。
  • 日本の EC は お中元・お歳暮・GW・お盆 など季節係数が大きい。海外発のモデルは要調整。
  • 高度化(Prophet / 機械学習)は「SMA で困ってから」考える。最初から複雑にすると保守不能。

「予測」という言葉に振り回されない

需要予測 / Demand Forecasting というと、「機械学習で未来を当てる」 イメージを持つ方が多いですが、現実はもっと地味です。

実用上の需要予測は:

  1. 過去の販売実績から「この SKU は週に N 個売れる」というベースラインを出す
  2. そのベースラインに季節性・トレンドを掛け合わせる
  3. 再注文ポイントを設定して、在庫がそれを下回ったらアラート

この 3 ステップで、在庫切れの 8 割以上は防げます。残り 2 割は突発的な需要急増(バズ・テレビ放映・季節外れの天候等)で、これは予測モデルでは捉えきれない領域。

単純移動平均(SMA)から始める

最もシンプルかつ有効なベースライン算出方法は Simple Moving Average(単純移動平均):

過去 N 日間の販売数 / N = 1 日あたりの平均販売数

例: 過去 30 日で 60 個売れた → 1 日あたり 2 個

これだけです。難しい数式不要。

N(窓)の選び方

使い分け
7 日直近の傾向に敏感、ノイズも拾いやすい。テスト・検証用
14 日短期トレンド対応、日次変動を吸収
30 日一般的、月次サイクルを 1 周期含む
90 日季節性の影響を平均化、安定だが新商品には不向き

最初は 30 日で十分。ストア成長期は短い窓(14 日)で機敏に反応、安定期は長い窓(90 日)に切替える流れが定石。

Stocky / UreyukiBox の v1 で使われる手法

実は本格的な業務でも、まずは SMA をベースに以下を加味するだけで実用十分です:

  • 欠品期間を除外(在庫 0 の日は販売数 0 になるが、需要が無かった訳ではない → 除外して計算)
  • 異常値の除外(特定日が急に 100 個売れても、それを平均に含めない)
  • 新商品の最低期間 14 日待機(データが少なすぎて予測不能)

再注文ポイントの計算

再注文ポイント(Reorder Point、ROP)は 「これ以下になったら発注する」しきい値:

再注文ポイント = 1 日あたりの予測販売数 × リードタイム日数 + 安全在庫

  • SKU: T シャツ
  • 1 日あたりの平均販売数: 2 個(直近 30 日)
  • リードタイム: 14 日(仕入先 → 入荷まで)
  • 安全在庫: 7 日分 = 14 個
ROP = 2 × 14 + 14 = 42 個

→ 在庫が 42 個を下回ったら発注、42 個以下のうちに新ロット入荷で在庫切れ回避。

安全在庫(Safety Stock)の決め方

在庫切れの確率をどこまで許容するか」で決まります。

戦略安全在庫在庫切れリスク
強気3 日分中(突発需要で切れる)
標準7 日分低(推奨)
慎重14-30 日分極低(資金繰り・倉庫負担増)

完全な数式(z 値・標準偏差ベース)もありますが、初期は「リードタイムの半分」を安全在庫にしておくのが実用的

季節性係数を掛ける

日本の EC は 1 年を通じて販売が均一ではありません。

主要な季節要因

時期影響 SKU 例倍率の目安
お正月(12 月下旬-1 月)おせち食材 / 正月飾り / 干支グッズ5-20×
バレンタイン(2 月)チョコ / ギフト3-10×
ホワイトデー(3 月)同上2-5×
入学・新生活(3-4 月)文具 / 家電 / 家具1.5-2×
GW(5 月)アウトドア / 旅行用品1.5-3×
父の日 / 母の日ギフト2-5×
お中元(7 月)ギフト食品3-10×
お盆(8 月)帰省土産 / 仏花2-5×
ハロウィン(10 月)仮装 / お菓子2-8×
ブラックフライデー / クリスマス(11-12 月)EC 全般1.5-3×
お歳暮(12 月)ギフト食品5-15×

自店舗の販売実績で「先月比 ×N」のパターンを見つけて、来年の同月に その係数を SMA に掛ける のが基本ロジック。

簡易な実装

季節調整済み予測 = SMA × 季節係数

季節係数は前年同月の販売数 / 前々月の販売数から逆算する手もあれば、業界レポートから流用する手もある。自店舗データが 1 年分溜まってから本格導入で十分。

高度化を急がない

需要予測界には Prophet(Facebook)/ LSTM / XGBoost といった統計・機械学習モデルが揃っています。これらは強力ですが、以下の問題があります:

  1. 学習データが必要: 1 年分以上ないと意味のあるモデルが作れない
  2. 保守コスト: モデル再学習・パラメータ調整が継続発生
  3. 解釈不能: なぜこの予測が出たか説明しづらい
  4. 精度の伸びは限定的: SMA に対して 5-15% 改善程度がよくある相場

SMA でうまくいかない症状(在庫切れが頻発、過剰在庫が増える)が出てから検討すべき領域です。最初から ML を入れると保守できずに「前のシステムに戻す」が起こりがち。

「予測」と書くか「リマインダー」と書くか

UreyukiBox は 「販売速度に基づくリマインダー」 という表現を使っています。

「需要予測」と書くと:

  • ユーザーが精度に過度な期待を持つ
  • 当たらなかった時のクレームが「予測精度が悪い」と機能批判になる
  • 法令上「データ分析」と「予測」の責任範囲が曖昧

「販売速度に基づくリマインダー」と書くと:

  • 過去のペースに基づく示唆であることが明確
  • ユーザー側の判断責任が明示される
  • 機能としての過剰な期待を抑える

これは v1 設計判断として明示してます(Stocky 終了 ガイド記事も同じ表現)。

v1 → v2 の発展ロードマップ

フェーズアプローチデータ要件所要
v1(今)SMA + 7 日安全在庫 + 手動季節係数30 日以上の販売実績即座
v1.x+ 自動異常値除外 + 欠品日除外60 日以上+1 ヶ月
v2+ 季節係数自動算出(前年比)1 年分+6 ヶ月
v2.x+ Prophet / 統計モデル選択肢1 年分 + 検証期間+1 年
v3+ ML(LSTM 等)、SKU クラスタリング2 年以上機械学習エンジニア要

多くの店舗は v1 + v1.x で困らないのが実態。v2 以降は「v1 で困った人向けの追加機能」として位置付けるのが健全。

FAQ

Q. 既に Stocky を使ってきたが、UreyukiBox に移行したら予測精度はどう変わる?

A. UreyukiBox の v1 は Stocky と同等の SMA ベースです。販売実績データを移行すれば、Stocky で見ていた数字とほぼ一致するはず。差別化は「日本シーズナリティ自動係数」(v1.x で導入予定)から先で出ます。

Q. 1 日あたり 0.1 個しか売れない SKU はどう扱う?

A. SMA は丸めの誤差で「再注文ポイント = 0」になる罠あり。UreyukiBox では 販売頻度が低い SKU は別ロジック(過去 90 日の合計売上 × バッファ)で再注文ポイントを算出します。

Q. 仕入先のリードタイムが日によって違う場合は?

A. 最大値(保守側)を使うのが基本。例: 通常 14 日だが繁忙期は 21 日 → 21 日でセット。ROP が大きくなって資金繰り圧迫があるなら、仕入先別に係数を分ける運用にする。

Q. SMA より EMA(指数移動平均)の方が良い?

A. 直近の変動に敏感に反応させたい場合は EMA の方が優れます。ただし運用上の差は小さいので、最初は SMA、必要なら EMA に切り替えで十分。UreyukiBox v1 は SMA、v1.x で EMA を選択肢として追加予定。

Q. 機械学習で予測したい

A. 機械学習エンジニア(社内 or 外注)が居なければ やめておくのが安全。モデル運用は「学習・評価・パラメータ調整・再学習」の継続コストが大きい。SMA でルール化してから、本当に必要なら専門家に相談。

まとめ

需要予測は「シンプルなロジック + 運用での磨き込み」が王道です。

  1. SMA(30 日)でベースライン
  2. 安全在庫 = リードタイム / 2
  3. 再注文ポイントを設定
  4. 季節性は 自店舗データ で 1 年分溜めてから

これだけで多くの問題は解決します。複雑なモデルは「SMA で困ってから」。

UreyukiBox は v1 でこのシンプル路線を採用し、ローンチ後にデータが溜まる順で機能を追加していく予定です(精度クレーム回避、保守コスト最小化)。


関連記事