ブログ / / 公開: 2026年5月29日
Shopify の在庫切れを防ぐ需要予測の基本|SMA から始めて実績で手法を選ぶ
TL;DR
- 需要予測は「将来の販売数を当てるゲーム」ではなく 「在庫が切れる前にアラートを出す仕組み」 と理解するのが現実的。
- 最初の基準は 単純移動平均(SMA、Simple Moving Average)。履歴が溜まったら、同じ実績で複数手法をバックテストして選ぶ。
- 再注文ポイント = リードタイム期間中の予測販売数 + 安全在庫。これだけで在庫切れの大半を防げる。
- 日本の EC は お中元・お歳暮・GW・お盆 など季節係数が大きい。海外発のモデルは要調整。
- UreyukiBox は店ごとに SMA / Croston / SBA / LightGBM を日次バックテストし、明確に良い手法だけを自動採用。変更理由も「なぜこの数量か」に表示します。
- ここに書いた計算を全 SKU ぶん自動で回すのが、本サイトが運営する UreyukiBox(Shopify App Store で公開中・Free プランあり)です。
「予測」という言葉に振り回されない
需要予測 / Demand Forecasting というと、「機械学習で未来を当てる」 イメージを持つ方が多いですが、現実はもっと地味です。
実用上の需要予測は:
- 過去の販売実績から「この SKU は週に N 個売れる」というベースラインを出す
- そのベースラインに季節性・トレンドを掛け合わせる
- 再注文ポイントを設定して、在庫がそれを下回ったらアラート
この 3 ステップが基本です。ただし、突発的な需要急増(バズ・テレビ放映・季節外れの天候等)は、どの予測モデルでも捉えきれない領域です。
単純移動平均(SMA)から始める
最もシンプルかつ有効なベースライン算出方法は Simple Moving Average(単純移動平均):
過去 N 日間の販売数 / N = 1 日あたりの平均販売数
例: 過去 30 日で 60 個売れた → 1 日あたり 2 個
これだけです。難しい数式不要。
N(窓)の選び方
| 窓 | 使い分け |
|---|---|
| 7 日 | 直近の傾向に敏感、ノイズも拾いやすい。テスト・検証用 |
| 14 日 | 短期トレンド対応、日次変動を吸収 |
| 30 日 | 一般的、月次サイクルを 1 周期含む |
| 90 日 | 季節性の影響を平均化、安定だが新商品には不向き |
最初は 30 日で十分。ストア成長期は短い窓(14 日)で機敏に反応、安定期は長い窓(90 日)に切替える流れが定石。
UreyukiBox が実際に使っている手法
本格的な業務では、SMA を基準に「その店の実績で本当に良かったか」を検証してから高度な手法へ切り替えます。UreyukiBox は次の処理を稼働させています。
- 店ごとの日次バックテスト——同じ販売履歴で SMA / Croston / SBA / LightGBM を比較します。評価材料が足りない、改善が小さい、単純な直前実績に勝てない場合は現行手法を据え置き、無理に切り替えません
- たまにしか売れない商品は間欠需要向け手法も評価——SMA では窓の端で推定が跳ねやすい SKU を、Croston / SBA と同じ土俵で検証します
- 店の国の暦から引く季節係数——ストアの国コードで 51 カ国のカタログを引きます。日本は 13 イベント(お正月・バレンタイン・ホワイトデー・入学・GW・母の日・父の日・お中元・お盆・敬老の日・ハロウィン・ブラックフライデー・お歳暮)。暦はその国のタイムゾーンで切り、カタログの無い国は無補正(1.00 倍)です。時期判定に前年履歴は不要ですが、提案数量は自店舗の実績を根拠にし、根拠がなければ作りません
- 安全在庫は目標サービス率から計算(日次需要のばらつきとリードタイムのばらつきを実データから測って上乗せする。測れるだけの実績が無いときは上乗せせず、従来どおりの決定論的な発注点へ自然に縮退します=データが無いのに数字を作らない)
導入前の「在庫 0 だった日」は Shopify の注文履歴だけから復元できず、需要ゼロの日と厳密に区別できません。UreyukiBox は導入後に観測した在庫イベントを特徴量へ使いますが、過去の欠品履歴を作り直したとは扱いません。これも 精度の数値をうたわない理由のひとつです。
再注文ポイントの計算
再注文ポイント(Reorder Point、ROP)は 「これ以下になったら発注する」しきい値:
再注文ポイント = 1 日あたりの予測販売数 × リードタイム日数 + 安全在庫
例
- SKU: T シャツ
- 1 日あたりの平均販売数: 2 個(直近 30 日)
- リードタイム: 14 日(仕入先 → 入荷まで)
- 安全在庫: 7 日分 = 14 個
ROP = 2 × 14 + 14 = 42 個
→ 在庫が 42 個を下回ったら発注、42 個以下のうちに新ロット入荷で在庫切れ回避。
この計算を毎回手でやらない方法
UreyukiBox は、この式を全 SKU ぶん自動で回します。平均日販は自店舗の販売実績から、安全在庫は目標サービス率から。リードタイムは過去の入荷実績(発注 → 入荷)を仕入先ごとに集計し、未設定(NULL)の商品だけを日次処理で自動補完します。人が入力した値は上書きしません。さらに、いつもの発注間隔から「何日分まで補充するか」を提案し、こちらは利用者が採用したときだけ空欄へ反映します。発注点を下回ったらメール / Slack / LINE に通知し、発注数量を入れた発注書の下書きまで作ります。
Shopify App Store で公開中。Free プランから試せます。
安全在庫(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 / LSTM / LightGBM などの統計・機械学習モデルがあります。強力な一方で、学習データ、再学習の運用、結果の説明が必要です。モデル名で採用を決めるのではなく、次の条件を揃えます。
- 同じ評価期間で単純な SMA / naive と比較する
- 欠品で売れなかった日など、学習データの限界を残す
- 改善が小さいときは切り替えない
- 切り替えた理由を利用者に表示する
UreyukiBox が LightGBM を常に使わず、日次バックテストで明確に勝った店だけに採用するのはこのためです。
「予測」と書くか「リマインダー」と書くか
UreyukiBox は予測値を確約ではなく、販売実績に基づく発注判断の支援として扱っています。
「需要予測」と書くと:
- ユーザーが精度に過度な期待を持つ
- 当たらなかった時のクレームが「予測精度が悪い」と機能批判になる
- 法令上「データ分析」と「予測」の責任範囲が曖昧
「販売速度に基づくリマインダー」と書くと:
- 過去のペースに基づく示唆であることが明確
- ユーザー側の判断責任が明示される
- 機能としての過剰な期待を抑える
現在は「なぜこの数量か」に、採用した日販手法、リードタイム、安全在庫、季節係数、補充目標を分けて表示し、数字の出どころを確認できるようにしています。
UreyukiBox の現在の実装
| 処理 | アプローチ | データ要件 | 状況 |
|---|---|---|---|
| 基準値 | SMA(30 日) | 販売実績 | 稼働中 |
| 間欠需要 | Croston / SBA | 疎な販売履歴 | 稼働中 |
| 学習器 | LightGBM | 学習に足る販売履歴・特徴量 | 稼働中(条件を満たす店だけ評価) |
| 手法選択 | SMA / Croston / SBA / LightGBM の日次バックテスト | 比較に足る履歴 | 稼働中(明確に良い場合だけ自動採用) |
| 安全在庫 | 目標サービス率と需要・リードタイムのばらつき | 実績が足りなければ上乗せ 0 | 稼働中 |
| 季節性 | 店の国の暦(51カ国・日本は年間13イベント) | 時期判定は前年履歴不要、数量は販売実績が必要 | 稼働中 |
| リードタイム | 入荷実績から仕入先別に測定 | 根拠がある場合のみ NULL を自動補完 | 稼働中 |
| 補充日数 | 発注間隔の中央値を仕入先別に提示 | 発注間隔が 3 本以上 | 稼働中(利用者が採用) |
複雑な手法を先に選ぶのではなく、単純な基準を実績で上回ったときだけ採用します。新商品向けの提案 UI は現時点で提供しておらず、根拠のない商品に数量は作りません。
FAQ
Q. 既に Stocky を使ってきたが、UreyukiBox に移行したら予測精度はどう変わる?
A. 最初の基準は 30 日 SMA ですが、Stocky と同じ数字になるとは限りません。UreyukiBox は販売履歴を Shopify から同期し、店ごとの日次バックテストで SMA / Croston / SBA / LightGBM を比較します。十分な評価回数があり、現行手法より明確に良い場合だけ切り替え、採用理由を「なぜこの数量か」に表示します。季節係数とサービス率ベースの安全在庫も計算に加わります。
Q. 1 日あたり 0.1 個しか売れない SKU はどう扱う?
A. SMA だと窓の端で 1 個が出入りするたびに推定が跳ね、発注点が日ごとに動きます。UreyukiBox は間欠・散発型の SKU では SBA を候補にし、さらに店ごとのバックテストで SMA / Croston / SBA / LightGBM を比較します。SBA は需要を「1 回あたりの数量」と「需要が起きる間隔」に分けて平滑化し、Croston の既知の正のバイアスを補正する手法です。
Q. 仕入先のリードタイムが日によって違う場合は?
A. 最大値(保守側)を使うのが基本。例: 通常 14 日だが繁忙期は 21 日 → 21 日でセット。ROP が大きくなって資金繰り圧迫があるなら、仕入先別に係数を分ける運用にする。
Q. SMA より EMA(指数移動平均)の方が良い?
A. 直近の変動に敏感に反応させたい場合は EMA が合うこともあります。ただし、手法名だけで決めず、自店の発注リードタイム期間に対する誤差で比較するのが確実です。UreyukiBox は EMA 固定ではなく、SMA / Croston / SBA / LightGBM を同じ履歴でバックテストして店ごとに選びます。
Q. 機械学習で予測したい
A. まず SMA / naive と同じ期間でバックテストし、改善が明確かを確認してください。UreyukiBox は LightGBM も候補に含めますが、学習行と評価回数が足り、現行手法より明確に良く、naive にも勝った場合だけ自動採用します。条件を満たさなければ現行手法を据え置きます。
まとめ
需要予測は「シンプルなロジック + 運用での磨き込み」が王道です。
- SMA(30 日)でベースライン
- 安全在庫は目標サービス率と需要・リードタイムのばらつきから計算(根拠が足りなければ上乗せしない)
- 再注文ポイントを設定
- 季節性は自店舗の履歴と、必要に応じて行事カレンダーを組み合わせる
これだけで多くの問題は解決します。複雑なモデルは「SMA で困ってから」。
UreyukiBox を始める
この記事の内容を、全 SKU ぶん自動で回すのが UreyukiBox です(Shopify App Store で公開中)。
- 需要手法——販売実績で SMA / Croston / SBA / LightGBM を日次バックテストし、明確に良い手法だけを店ごとに自動採用。採用理由も表示
- 発注点——平均日販 × リードタイム + 安全在庫。実測リードタイムは未設定(NULL)だけ自動補完し、人の入力は上書きしません。安全在庫は目標サービス率から計算
- 補充日数——仕入先へのいつもの発注間隔から「何日分まで補充するか」を提示。利用者が採用したときだけ空欄へ反映
- 季節性——ストアの国の暦から係数を引きます(日本は年間13イベント=お正月からお歳暮まで。ほか米欧・アジア・中南米・中東など計51カ国)。時期判定に前年履歴は不要ですが、数量は自店舗の実績が根拠で、根拠がなければ作りません
- アラート——在庫充足量(現在庫と入荷予定を加味)が発注点以下になるとメール / Slack / LINE に通知
- なぜこの数量か——日販の手法、リードタイム、安全在庫、季節係数、補充目標の内訳を表示
- その先——発注数量を入れた発注書の下書き(インボイス対応の PDF / CSV・仕入先へメール送信)、入荷登録、在庫調整・棚卸し、実原価と粗利レポートまで同じアプリの中で
料金は Free(商品 100 点まで)/ Starter ¥2,980 / Pro ¥5,980 / Business ¥12,800(月額・税抜、有料プランは 14 日間の無料トライアルつき)。インストールはこちら。
Stocky からの乗り換えで、独立した CSV 保存と必要な API コピーを先に進めたい方は Stocky データ移行の実務ガイドもあわせてご覧ください(移行処理は無料プランのまま実行できます)。
関連記事
今日は決めない方へ
Stocky は2026年8月31日まで動きます。いま乗り換えなくても構いません。インストールリンクと3ヶ月無料キャンペーンの条件を、メールでお送りします。