Claudeで需要予測を作りMAPEで手法を比べる手順 — 出荷実績CSVから
過去の出荷実績CSVから、移動平均・指数平滑・季節ナイーブの予測をClaudeに作らせ、直近6か月を伏せてMAPEで比べる手順です。季節性があるデータで手法の順位がどう変わるかを数字で示します。
出荷実績のCSVがあれば、需要予測の手法比べはClaudeのコード実行に任せられます。コツは、予測を作らせる前に「どの月を伏せて、どの指標で採点するか」を人が決めておくことです。決めないまま頼むと、過去に当てはまりのよい手法がそのまま「最良」と報告されます。
この記事では、季節性のある36か月の出荷データを使い、移動平均・指数平滑・季節ナイーブの3手法を、直近6か月を伏せたうえでMAPE(平均絶対パーセント誤差)で比べます。依頼文、結果の読み方、MAPEが壊れる場面までを順に示します。
需要予測をClaudeに任せる前提と使える環境
Claudeは、計算やデータ分析が必要な依頼でコードを書いて実行します。単純な四則演算や換算では実行しません。予測の比較は集計と誤差計算が何十行も続くので、「コードを実行して」と明示しておくと確実です。
使い方は2通りあります。
需要予測を回す2つの経路
claude.aiでCSVを添付する
コード実行とファイル作成の機能で動きます。Free・Pro・Maxでは設定の「Code execution and file creation」を有効にします。Team・Enterpriseでは組織の既定で有効で、オーナーが無効にもできます。
APIのコード実行ツールを使う
Files APIにCSVを上げ、container_upload で参照し、コード実行ツールを付けて呼び出します。月次の予測更新をスクリプト化したいときの経路です。
ファイルの上限は、claude.aiのコード実行では1ファイル30MBです。受注明細を数年分そのまま渡すと超えることがあります。先に品目×月で集計しておくほうが、アップロードも速く、Claudeが集計でつまずく余地も減ります。
利用量の面では、この機能も契約プランの上限から消費されます。通常のチャットよりファイル作成のほうが多く消費する、と案内されています。
準備: 予測用CSVの形と匿名化
次の4列があれば足ります。品目が多いときは、まず出荷額の大きい数品目で手順を確かめてから広げます。
| 列 | 内容 | 例 |
|---|---|---|
| month | 内容月初日 | 例2024-01-01 |
| item | 内容品目コード | 例A001 |
| shipped | 内容出荷数 | 例120 |
| note | 内容欠品・キャンペーン等の注記 | 例欠品あり |
note 列は省略できますが、あると効きます。欠品で出荷が落ちた月は「需要が減った月」ではなく「売れなかった月」で、そのまま学習させると予測が低めに寄ります。取引先名や単価は予測に要らないので、CSVから外してから渡します。
ステップ1: 直近6か月を伏せて採点の約束を先に決める
予測手法の比較で最初にやるのは、検証用の期間を切ることです。36か月あれば、最初の30か月で学習し、最後の6か月を答え合わせに使います。
添付のCSV(月次の出荷数、36か月分)で需要予測の手法を比べます。
コードを実行して、次の手順で進めてください。
1. 最初の30か月を学習期間、最後の6か月を検証期間にする
2. 学習期間だけを使い、検証期間の6か月を予測する
- 3か月移動平均
- 指数平滑(平滑化係数0.3)
- 季節ナイーブ(前年同月の実績を使う)
3. 検証期間の実績と比べ、手法ごとにMAPEを出す
4. 月ごとの予測値・実績・誤差率を表で出す
5. 検証期間のデータを予測に使っていないことを最後に明記する5番目の一文は保険です。Claudeが検証期間のデータを学習に混ぜていたら、報告の時点で食い違いが見つかります。
ステップ2: 結果を表で受け取り、手法の順位を読む
ここからは、手法による差が出る様子を数字で示します。次の36か月分は、季節性(7月が高く、12月が最も高い)と緩やかな増加を持たせた架空の出荷数です。実在の企業のデータではありません。
2024年 120 115 130 128 140 155 170 165 150 135 145 200
2025年 128 122 138 135 150 165 182 176 160 144 155 214
2026年 135 129 146 142 158 174 | 191 185 168 151 163 225
^ 7月以降の6か月が検証期間学習期間は2026年6月までの30か月、検証期間は同年7〜12月です。この条件で3手法の予測値を平易なPythonで計算し、MAPEを出すと次のようになります(予測値は小数第1位で丸めています)。
| 手法 | 7月〜12月の予測 | MAPE |
|---|---|---|
| 3か月移動平均 | 7月〜12月の予測158.0(6か月とも同じ) | MAPE12.6% |
| 指数平滑(係数0.3) | 7月〜12月の予測157.8(6か月とも同じ) | MAPE12.6% |
| 季節ナイーブ(前年同月) | 7月〜12月の予測182・176・160・144・155・214 | MAPE4.8% |
移動平均と指数平滑の予測が6か月とも同じ値になるのは、手法が悪いのではなく仕組みの結果です。どちらも直近の水準を1つの数字にまとめるので、先の月まで一定の値を返します。季節の山と谷は予測に現れません。
季節ナイーブは、前年の同じ月の実績をそのまま持ってくるだけの単純な手法です。それでもこのデータでは、水準を平らにならす2手法より誤差が3分の1ほどになりました。
この結果から読めること
- 季節性が強いデータでは、凝った平滑より「前年同月」が勝つことがある
- 移動平均の窓を12か月に伸ばしても、予測は平らなまま(MAPE 12.0%)
- 季節ナイーブは増加傾向を拾えず、全月が少し低く出る
最後の点を直すには、前年同月の値に成長率を掛けます。直近12か月の合計を、その前の12か月の合計で割ると約1.062です。これを前年同月の実績に掛けると、MAPEは1.1%まで下がります。ここまで来ると、残る誤差の大半は需要のぶれそのものです。
この「成長率つき季節ナイーブ」は、Claudeに頼むときは次の追加依頼で作れます。
季節ナイーブの予測値に、直近12か月と直前12か月の出荷合計の比を
掛けた手法を追加し、同じ検証期間のMAPEを出してください。ステップ3: 出てきた数字を自分で検算する
Claudeの報告を受け取るときは、MAPEの式を自分の手元でも確かめます。1つの手法だけでも検算すると、集計の取り違えに気づけます。
actual = [191, 185, 168, 151, 163, 225]
forecast = [182, 176, 160, 144, 155, 214]
mape = sum(abs((a - f) / a) for a, f in zip(actual, forecast)) / len(actual) * 100
print(round(mape, 1)) # 4.8見る点は3つです。
- 検証期間の実績が、元のCSVの最後の6か月と一致しているか
- 予測値が学習期間のデータだけから作られているか(Claudeにコードを表示させる)
- 誤差が分母にした実績で割られているか(予測値で割ると値が変わる)
コードの表示は、依頼文に「実行したPythonコードを最後に全文載せて」と足すだけで済みます。
MAPEが使えない場面と代わりの指標
MAPEは実績で割る指標なので、出荷が0の月があると計算できません。0に近い月があると、わずかなずれが数百パーセントの誤差になり、全体の平均を押し上げます。
出荷の少ない品目や、受注生産で月によって0になる品目では、MAPEをそのまま信用しません。その場合は、次のどちらかに寄せます。
| 状況 | 使う指標 | 考え方 |
|---|---|---|
| 0の月が混ざる | 使う指標WAPE(絶対誤差の合計÷実績の合計) | 考え方月ごとに割らず、全体で割る |
| 品目間で比べたい | 使う指標品目ごとにMAPEを出し、出荷額で重み付け | 考え方少量品目の暴れを抑える |
依頼文には「実績が0の月はMAPEの計算から除き、除いた月数を報告して」と書いておきます。除外を黙ってやられると、良い数字に見えるだけの比較になります。
手法の選び方と、Claudeに任せる範囲の線引き
比較の結果をどう使うかは、人が決める部分です。
- 検証期間が6か月しかないので、1回の結果で手法を確定しない。月をずらして2〜3回検証し、順位が変わらないか見る
- 季節性が弱い品目は、移動平均が勝つこともある。品目の性質ごとに手法を分ける
- 予測が当たることと、発注量を決めることは別。在庫の持ち方は安全在庫と発注点の計算手順に続けて考える
Claudeには、計算と表の出力、コードの説明を任せられます。キャンペーンや新製品の投入のような、データに現れない予定を需要に織り込む判断は、現場の知見を持つ人が入れます。そうした予定は、note 列や依頼文で数値として渡すと、予測に反映させやすくなります。
営業案件ベースの見込みを作るなら、売上予測をExcelで作る手順が近い使い方です。店舗のPOSデータを週次で眺める場合はPOS売上CSVの週次レビューも参考になります。
APIで毎月回すときの設定と上限
月次の予測更新を自動化するなら、CSVをFiles APIに上げ、コード実行ツールを付けてMessages APIを呼びます。
curl --fail-with-body -sS https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-opus-5-5",
"max_tokens": 4096,
"messages": [{"role": "user", "content": [
{"type": "text", "text": "添付CSVで需要予測を比べ、MAPEを出して"},
{"type": "container_upload", "file_id": "'"$FILE_ID"'"}
]}],
"tools": [{"type": "code_execution_20250825",
"name": "code_execution"}]
}'FILE_ID は事前にFiles APIで受け取ったIDです。
実行環境の制約は、予測の手法選びにも関わります。
| 項目 | 内容 |
|---|---|
| Python | 内容3.11 |
| メモリ・CPU・ディスク | 内容5GiB・1CPU・5GiB |
| ネットワーク | 内容外部接続なし |
| 入っているライブラリ | 内容pandas・numpy・scipy・scikit-learn・statsmodels・matplotlibなど |
ネットワークがないので、実行時に追加のパッケージは入れられません。statsmodelsは入っているため、指数平滑の本格的な版(季節成分つきのホルト・ウィンターズ法)は、追加の準備なしに頼めます。一方、外部の予測専用パッケージを前提にしたコードは動きません。
課金は実行時間で計り、1組織あたり月1,550時間までは無料で、超えた分は1コンテナあたり1時間0.05ドルです。実行時間は最低5分で計算され、ファイルを付けた場合はツールが呼ばれなくても課金対象になります。月に1回、数品目を回す程度なら、無料枠を意識する必要はほとんどありません。
コンテナは作成から30日で期限切れになります。翌月に前月のコンテナを使い回す設計にはせず、毎回、新しいコンテナで回すほうが安全です。
よくあるつまずき
落とし穴
検証期間のデータが学習に混ざり、誤差が小さく出る
「予測して、実績と比べて」とだけ頼むと、全期間のデータで当てはめて誤差を測ることがあります。依頼文で学習期間と検証期間を月で指定し、最後に「検証期間は学習に使っていない」と書かせます。
落とし穴
移動平均の予測が全部同じ値で、使えないと感じる
移動平均は先の月までずっと同じ値を返す手法です。次月だけの予測なら使えますが、6か月先を並べるなら季節ナイーブや季節成分つきの手法と比べます。
落とし穴
欠品月をそのまま学習してしまう
欠品で出荷が落ちた月は、需要ではなく供給の制約です。note 列で印を付け、「欠品月は前後の月の平均で置き換えて」と指定するか、検証から除きます。
まとめ
季節性のある出荷データでは、移動平均や指数平滑より、前年同月を使う単純な手法が勝つことがあります。上の架空データでは、MAPEが12.6%から4.8%に下がり、成長率を掛けると1.1%でした。
Claudeに頼むときは、学習期間と検証期間、使う指標、0の月の扱いを先に書きます。出てきたMAPEは1手法だけでも手元で検算します。順位は月をずらして2〜3回確かめてから、発注量の判断に使います。