翌週の出荷量を予測して物流センターの日別の必要人員を決める
WMSの出荷実績と、荷主から届く販促の連絡、祝日の並びを入力に、翌週の日別の出荷件数を時系列予測で見込み、工程ごとに必要な人数を上振れ・下振れの幅つきで計算します。計画担当の作業は、実績を集めて勘で件数を置くことから、出てきた人数の幅を見て派遣の発注数を決めることに変わります。
- 利用ツール
- ChatGPT/Claude/Gemini/Google Vertex AI/Python
- 対象業界
- EC/小売/物流
- 対象部門
- 物流
- 対象業務
- データ入力・転記/集計・分析
- 主な課題
- 人手が足りない/判断に時間がかかる/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/属人化解消/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 水曜の午後、WMSから前週と前年同週の出荷実績を荷主別・日別にCSVで出す
- Excelの集計表に貼り、曜日をそろえて並べる
- 荷主から届いた販促のメールと共有スプレッドシートを読み、翌週にかかる施策を拾う
- 祝日・連休の位置と、週間の天気予報を見る
- 前年比や経験上の倍率を掛けて、日別・荷主別の見込み件数を決める
- 見込み件数を工程ごとの標準生産性で割り、必要人時と人数を出す
- 固定シフトで足りない人数を派遣の発注数として決め、木曜正午までに発注する
- 自動毎晩、WMSの受信記録・出荷実績・作業実績を BigQuery に取り込む
- 自動販促連絡が届くたびに、生成AIが期間・対象・見込み規模を取り出す
- 人計画担当が原文と見比べ、規模が書かれていない施策は荷主に問い合わせる
- 自動水曜の朝、モデルを作り直し、翌週の日別・荷主別の件数と予測区間を出す
- 自動稼働日の出荷件数に換算し、工程別の必要人数を3通りで計算する
- 自動生成AIが、前週・前年同週との差を説明する文章の下書きを作る
- 人計画担当が人数と説明文を見て、天候などを加味して人数を決め、派遣を発注する
- 自動翌週、実績と予測を突き合わせ、誤差率と人員の過不足を記録する
各工程の詳しい説明を読む
- 水曜の午後、WMSから前週と前年同週の出荷実績を荷主別・日別にCSVで出す
- Excelの集計表に貼り、曜日をそろえて並べる
- 荷主から届いた販促のメールと共有スプレッドシートを読み、翌週にかかる施策を拾う
- 祝日・連休の位置と、週間の天気予報を見る
- 前年比や経験上の倍率を掛けて、日別・荷主別の見込み件数を決める
- 見込み件数を工程ごとの標準生産性で割り、必要人時と人数を出す
- 固定シフトで足りない人数を派遣の発注数として決め、木曜正午までに発注する
問題は4つあります。
(a)見込みが担当者の経験に依存している。 「連休明けは1.4倍」といった倍率が頭の中にあり、担当者が休むと決められません。
(b)販促の連絡がそろっていない。 本文、添付の表、スプレッドシートと荷主ごとに形が違い、規模が書かれていないことも多くあります。拾い漏れた施策の日に人が足りなくなります。
(c)生産性の数字が古い。 「1人時あたり何件」は年1回見直す標準値で、商品構成の変化が反映されません。
(d)見込みと実績を突き合わせていない。 人が余った日・足りなかった日の原因が分かりません。
- 【自動】 毎晩、WMSの受信記録・出荷実績・作業実績を BigQuery に取り込む
- 【自動】 販促連絡が届くたびに、生成AIが期間・対象・見込み規模を取り出す
- 【人】 計画担当が原文と見比べ、規模が書かれていない施策は荷主に問い合わせる
- 【自動】 水曜の朝、モデルを作り直し、翌週の日別・荷主別の件数と予測区間を出す
- 【自動】 稼働日の出荷件数に換算し、工程別の必要人数を3通りで計算する
- 【自動】 生成AIが、前週・前年同週との差を説明する文章の下書きを作る
- 【人】 計画担当が人数と説明文を見て、天候などを加味して人数を決め、派遣を発注する
- 【自動】 翌週、実績と予測を突き合わせ、誤差率と人員の過不足を記録する
自動化されるのは「集める」「予測する」「計算する」「記録する」です。人数と発注数を決めるのは人です。
02今回想定するシステム構成
WMS(受信記録・出荷実績・作業実績) 荷主の販促連絡(メール等) │ CSV(毎晩) ▼ ▼ Gemini API ── 期間・対象・規模を取り出す BigQuery(暦日×拠点×荷主の受信件数)◀── 販促の列 ──【人】確認 ▼【トリガー】毎週水曜 7:00(Python) BigQuery ML(ARIMA_PLUS_XREG) ├─ ML.FORECAST ─────── 予測値と予測区間 └─ ML.EXPLAIN_FORECAST ── 曜日・祝日・販促の寄与 ▼ Python:稼働日の件数へ換算 → 工程別の必要人数(予測値/上限/下限) ├──▶ Gemini API ── 前週・前年との差の説明文 ▼ 人員計画表 ──【人】人数と派遣発注数を決める → 翌週:実績と突き合わせて記録
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理エンジン | BigQuery ML(ARIMA_PLUS_XREG)を Python から実行 | Forecasting on Gemini Enterprise Agent Platform(旧 Vertex AI Forecasting) |
| 実行環境 | Python(換算と必要人数の計算) | ― |
| 生成AI | Gemini API | Claude API、OpenAI API |
| 人員計画表 | Google スプレッドシート | Excel |
BigQuery ML を軸にする理由。 実績を置いた場所で、学習と予測をSQLで書けます。ARIMA_PLUS_XREG は ARIMA_PLUS に線形の外部要因(販促の有無など)を加えたモデルで、欠けた日の補間、急な山と谷の除去、水準の段差、祝日の効果、曜日などの季節性を扱い、TIME_SERIES_ID_COL で拠点×荷主の系列をまとめて予測できます。まずこれで始め、第8章の検証で誤差が下がらない場合に代替候補と比べます。
03どうやって実装するのか
処理の起点を決める
| 時点 | 処理 |
|---|---|
| 販促連絡の受信のたび | 【自動】項目を取り出し、確認待ちに入れる |
| 火曜 17:00 | 翌週分の販促情報の確認を締める |
| 水曜 7:00(定時) | 【自動】モデルの作り直し、予測、人数計算、説明文 |
| 水曜 日中〜木曜 正午 | 【人】人数を決め、派遣会社へ発注する |
水曜の処理は、前日までの実績が取り込まれたことを確認してから始めます。 途中の日が欠けると、前後の値から補われた件数で学習されます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 出荷指示の受信記録 | 受信日時、拠点、荷主コード、件数 | WMS |
| 作業実績 | 工程、荷主コード、処理件数、作業時間 | WMS、勤怠システム |
| 販促予定 | 期間、対象、施策の種類、見込み規模 | 荷主のメール、共有スプレッドシート |
| 稼働カレンダーと祝日 | 出荷休みの日、棚卸日、日本の祝日 | 社内、BigQuery ML の祝日データ |
天気は入れません(理由は前処理)。
データの取得方法を決める
実績: WMSから毎晩CSVで出し、Python から BigQuery の表へ読み込みます。販促予定: 荷主には専用の共有アドレスへ送ってもらいます。メールの取得方法は環境によって違うため個別に決めます。
生産性: 作業実績から、工程別・荷主別の「1人時あたりの処理件数」を直近8週の中央値で出し、毎週更新します。平均でなく中央値にするのは、障害の日などの極端な値を避けるためです。
祝日: HOLIDAY_REGION = 'JP' で日本の祝日の効果を扱います。含まれる日は公開テーブル bigquery-public-data.ml_datasets.holidays_and_events_for_forecasting で確認でき、足りない休みは custom_holiday で追加できます(日次データの場合)。
AIへ渡す前に整形する
- 「暦日×拠点×荷主」の表にする … 予測する数値は、稼働日の出荷件数ではなく暦日ごとの受信件数にします。土日祝も注文は届くので行が欠けません。このモデルは欠けた日を前後から直線で補うため、出荷休みの行を抜くと、実在しない出荷があった日として学習されます
- 販促の列を作る … 人が確認した予定から、
promo_flag(施策がある日は1)、promo_scale(記載された倍率から1を引いた値)、preorder_ship(予約商品の一斉出荷日)を作ります - 空欄を0で埋める … 特徴量の空欄は列全体の平均で埋められ、ほかの荷主の値が混ざります。施策のない日は必ず0にします
- 予測時点で値が分からない要因は入れない … このモデルは予測する日の特徴量の値を渡して予測します。10日後の天気は分からないので、人の補正に回します
- 期間と外れ値を整える … 直近2〜3年分で足りるとされているため学習は直近3年までにし、棚卸日や障害の日は生産性の計算から外します
AIに処理させる
| 処理 | 内容 | 使うもの |
|---|---|---|
| 販促連絡の項目化 | 期間・対象・施策の種類・見込み規模を取り出す | 生成AI |
| 受信件数の予測 | 暦日×拠点×荷主の件数と、予測区間を出す | ARIMA_PLUS_XREG |
| 予測の内訳 | 曜日・祝日・販促・傾向の寄与を出す | ML.EXPLAIN_FORECAST |
| 換算と人数計算 | 受信件数を出荷日に割り付け、工程別の人数を3通り出す | プログラム |
| 差の説明文 | 前週・前年同週との差を、内訳の数値から文章にする | 生成AI |
出荷件数を生成AIに予測させないでください。 時系列モデルは予測値と予測区間を返し、内訳も確認できます。生成AIに件数を聞くと、根拠を確かめられない数値が計画に入ります。
ML.FORECAST の予測値は予測区間の上限と下限の平均で、区間の広さは confidence_level(既定0.95)で決まります。人員計画では0.8から始め、第8章で実績が区間の外に出た割合を見て調整します。 ML.EXPLAIN_FORECAST は、予測を傾向・週の季節性・祝日の効果・特徴量ごとの寄与(重み×値)に分けて返します。説明文の材料はこの数値です。
換算と人数は次の式で計算します。生産性は荷主ごとに違うため、荷主別に人時を出してから合計します。
稼働日Dの出荷件数 = 前の稼働日の締め後の受信 + 間の出荷休みの日の受信 + D日の締めまでの受信
(締め前後の割合は、荷主別・曜日別の直近8週の実績から出す)
必要人時(工程ごと)= 予測出荷件数 ÷ 1人時あたりの処理件数
必要人数(工程ごと)= 必要人時 ÷ 1人あたりの実働時間(切り上げ)
計算例です(実働7.5時間)。予測値9,600件なら、ピッキング(150件/人時)は64.0人時で9人、梱包(110件/人時)は87.3人時で12人、出荷(400件/人時)は24.0人時で4人、合わせて25人です。上限11,200件では28人、下限8,300件では22人です。この3通りを人に渡します。
指示内容を固定する
荷主から届いた販促・セールの連絡から、出荷の予測に使う項目を取り出してください。
【厳守事項】
- 本文に書かれていることだけを取り出してください。
- 期間、対象、見込み規模のうち、書かれていない項目は null にしてください。
「例年並み」「大型」などの表現から数値を推測しないでください。
- 規模に数値(「通常の2倍」など)がある場合だけ、scale_value に倍率を入れてください。
- 年のない日付は受信日より後で最も近い日とし、year_inferred を true にしてください。
- 施策が複数あれば分け、根拠の原文を source_quote に引用してください。
【荷主コード】{shipper_id} 【受信日】{received_date} 【本文】{mail_body}
「表現から数値を推測しない」の1行が重要です。 「大型セール」に生成AIが「2倍程度」と補うと、その倍率がそのまま予測に入ります。説明文の指示では、「与えられた数値だけを使う」「理由は内訳に数値がある項目からだけ書き、天候など内訳にない理由を書かない」「人数の増減の判断を書かない」を守らせます。
出力形式を固定する
{"shipper_id": "S03",
"campaigns": [
{"type": "sale | coupon | free_shipping | preorder_ship | other",
"start_date": "2026-09-24", "end_date": "2026-09-27",
"year_inferred": false, "target": "秋物アウター全品",
"scale_value": 2.0, "source_quote": ""}
]}
Gemini API の構造化出力では、選択肢(enum)、日付の形式、null を許す型、数値の最小・最大を指定できます。ただし公式ドキュメントも、値の妥当性はアプリ側で検証するよう求めています。 開始日が終了日より後といった値は、プログラムで弾いて人へ回します。
システムへ連携する
Python から BigQuery へSQLを送り(client.query_and_wait())、モデルを作り直して予測を受け取ります。
CREATE OR REPLACE MODEL `wh.orders_xreg`
OPTIONS (MODEL_TYPE = 'ARIMA_PLUS_XREG', TIME_SERIES_TIMESTAMP_COL = 'order_date',
TIME_SERIES_DATA_COL = 'orders', TIME_SERIES_ID_COL = ['site_id', 'shipper_id'],
DATA_FREQUENCY = 'DAILY', HOLIDAY_REGION = 'JP', HORIZON = 14) AS
SELECT order_date, site_id, shipper_id, orders, promo_flag, promo_scale, preorder_ship
FROM `wh.daily_orders` WHERE order_date >= DATE '2023-09-09';
SELECT * FROM ML.FORECAST(MODEL `wh.orders_xreg`,
STRUCT(14 AS horizon, 0.8 AS confidence_level),
(SELECT * FROM `wh.future_promo`)); -- 予測する日の販促の列を渡す
予測は CREATE MODEL の実行時に行われ、ML.FORECAST は結果を取り出すだけです。 人員計画表には、日付・拠点・工程ごとに予測件数と3通りの人数、説明文、注意(未確認の販促など)を書き出します。派遣発注数の欄は空欄にし、計画担当が記入します。
人が確認する
人が行うのは3つです。運用が安定しても変えません。
- 販促情報の確認 … 原文と見比べ、規模が null の施策は荷主に問い合わせます。確認前の情報は予測に使いません
- 人数の決定 … 3通りの人数に、天候や社員の応援の余力を加味して決めます
- 派遣発注数の確定 … 発注は契約と費用が伴い、来てもらう人の予定にも関わります。自動で確定させたり、派遣会社へ自動で送ったりしないでください
幅の使い方は先に決めます。例:「派遣は予測値で発注し、上限との差は社員の応援で吸収する。大型セールの初日だけは上限で発注する」。ルールを決めずに幅だけ渡すと、担当者ごとに判断が割れ、属人化が戻ります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 前日までの実績の取り込みが失敗した | 学習を止めて通知する |
| 販促の規模が書かれていない、締めまでに確認できない | null のまま人へ回し、予測に入れずに注意欄へ出す |
| 新しい荷主で実績が1年未満 | 祝日の効果を学習できない。荷主の見込み件数を人が入力する |
| 台風・大雪の予報、過去に例のない施策 | 計画担当が補正し、理由を記録する |
| 実績が予測区間の外に出る日が続く | 信頼水準、学習期間、販促の列を見直す |
記録を残す
- モデルを作り直した日時と学習期間、予測値・上限・下限
- 取り出した販促情報と、人が直した内容
- 決めた人数、補正の理由、派遣の発注数
- 実績の出荷件数と、実績から逆算した必要人数(実績件数 ÷ 生産性)
最後の項目がこの構成の中心です。 発注した人数との差を日別に残すと、人が余った日・足りなかった日が数字で分かります。
04実装レベルの3段階
半自動化で、55分が20分になる想定です。 本格構成で得られるのは工数より記録です。予測のずれと過不足が毎週残り、発注のルールを数字で見直せます。
05工数削減シミュレーション
導入後 44件 × 20分 ÷ 60 = 14.7 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 複数の荷主の出荷を扱い、派遣やパートの手配を週単位で前もって決めている物流センター。日別の出荷実績が2年分以上WMSに残っていて、荷主から販促やセールの予定が事前に届くこと。
- 出荷件数が毎日ほぼ一定で、固定シフトだけで回せている場合。出荷実績が1年分に満たない場合(祝日の効果を学習できない)。荷主の販促予定が事前にまったく共有されない場合。
07最小構成で試す方法
仕組みを作る前に、過去8週で当て直してください。
- WMSから、過去3年分の暦日×拠点×荷主の受信件数と、過去の販促予定を集める
- 比べる相手として、単純な見込み(前年同曜日の件数 × 直近4週の前年比)を作る
- BigQuery のコンソールで、8週前の火曜までのデータでモデルを作って翌週を予測し、1週ずつずらして8回行う
- 稼働日別の誤差率(予測と実績の差 ÷ 実績)を平均し、実績が予測区間の外に出た日の割合も数える
- 同じ8週で、発注した人数と実績から逆算した必要人数を比べ、過不足の人時を出す
1週ずつ区切るのは、水曜の時点で分かっていたデータだけで予測する状況を再現するためです。 学習した期間の中で精度を測ると、実運用より良い数字が出ます。
| 結果 | 判断 |
|---|---|
| 単純な見込みより誤差率が小さい | 人数計算まで進める価値がある |
| 同程度 | 販促の日だけ誤差が大きければ、取り出しか列の作り方が原因 |
| 単純な見込みより悪い | 出荷休みの行や取り込みの欠けを疑う。手法より先にデータを直す |
5番の過不足人時が、人が余る・足りないことによる人件費の効果を測る材料です。 この記事では金額を置いていないため、自社の8週分で測ってください。販促連絡の取り出しは、Google AI Studio に過去の連絡20通を貼って正解率を数えるだけで試せます(第13章)。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 出荷休みの行を抜いて学習した | 欠けた日は補われる。暦日の受信件数で予測し、出荷日への割り付けはプログラムで行う |
| 天気を特徴量に入れた | 予測する日の特徴量の値が要る。事前に分からない要因は人の補正に回す |
| 過去のセール日の山が均されていた | 急な山と谷の除去は既定で有効。spikes_and_dips 列を確認し、値があれば販促の列の付け漏れを疑う |
| 翌週も ML.FORECAST だけ実行した | 予測は CREATE MODEL の実行時に行われる。毎週作り直す |
| 荷主別の上限を足したら人数が多すぎた | 全荷主が同時に上振れする前提になる。区間の外に出た割合を見て confidence_level を調整する |
| 生成AIが販促規模の倍率を補った | null を許す出力形式にし、推測の禁止と原文の引用を必須にする |
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 荷主ごとの出荷件数の推移、未公開のセール計画、工程別の作業実績、派遣の発注数。出荷件数は荷主の売上の動きそのもので、セール計画とあわせて荷主から預かっている情報です。
- 荷主との契約を確認する … 委託契約の秘密保持条項で、外部のクラウドサービスや生成AIで処理してよいかを確認します。3PLでは自社の規程だけでは決められません
- 生成AIへ渡す範囲を絞る … 予測と人数計算は BigQuery とプログラムで完結します。生成AIに渡すのは販促連絡の本文と集計値だけにし、荷主名はコードに置き換え、署名欄の個人名は前処理で除きます
- 無料枠を使わない … Gemini API の規約では、無料で使った場合は入力と出力が製品の改善に使われ、人が読むこともあるため、機密情報を送らないよう書かれています。課金が有効な Cloud プロジェクト経由で使います
- 作業者ごとの数字を持ち込まない … 生産性は工程・荷主単位に集計して使います
- 自動実行してよい範囲 … 予測、人数計算、説明文の下書きまでです。派遣の発注数の確定と発注は人が行います
リスクは、人手不足による出荷遅延、過剰な手配による人件費、未公開のセール情報の漏えいです。前の2つは人の判断と記録で、最後は契約の確認と渡す範囲の絞り込みで防ぎます。
10まず何から始めるか
1週目:データと契約を確認する
WMSから「出荷指示の受信日時」と「工程別の作業実績」を出せるか、2年分以上あるかを確認します。受信日時が出せなければ、暦日の表が作れません。 荷主との契約で外部サービスでの処理が認められているかも確認します。
2週目:過去8週で当て直す
第8章の手順で、単純な見込みとの誤差率の違いと、発注人数と必要人数の差を数えます。この差で取り組む価値が決まります。
3週目:販促連絡の取り出しを試す
過去の連絡20通で正解率と、規模が書かれていない連絡の割合を数えます。半分以上に規模がなければ、荷主に書式をお願いするほうが先です。
2か月目以降: 人の見込みと並べて4週間運用し、予測・人の決定・実績を毎週記録します。そのうえで発注のルールを決めます。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 外部要因を加えた時系列モデルであること。欠けた日の直線補間、急な山と谷の除去(既定で有効)、段差・祝日・季節性の扱い。TIME_SERIES_ID_COL、HOLIDAY_REGION の JP 指定(1年を超える日次・週次に適用)、custom_holiday、特徴量の欠損が列全体の平均で埋まること、直近2〜3年で足りること、課金に候補モデル数が効くこと | BigQuery: CREATE MODEL for ARIMA_PLUS_XREG | 2026-09-14 |
| 予測値が予測区間の上下限の平均であること。confidence_level の既定0.95。予測期間の特徴量を渡すこと。予測が CREATE MODEL の実行時に行われること | BigQuery: ML.FORECAST | 2026-09-14 |
| 予測を傾向・週の季節性・祝日・特徴量ごとの寄与に分解すること。spikes_and_dips 列があること | BigQuery: ML.EXPLAIN_FORECAST | 2026-09-14 |
| Python のライブラリの query_and_wait でクエリを実行できること | BigQuery: API client libraries | 2026-09-14 |
| 構造化出力で enum、format、null を許す型、数値の最小・最大を指定できること。値はアプリ側で検証するよう求めていること | Gemini API: Structured outputs | 2026-09-14 |
| 無料の利用では入力と出力が製品の改善に使われ人が読むこともあり、課金が有効な Cloud プロジェクト経由では使われないこと | Gemini API Additional Terms of Service | 2026-09-14 |
| Vertex AI Forecasting が Forecasting on Gemini Enterprise Agent Platform に名称変更されたこと。予測時に値が分かる要因と分からない要因を列で指定でき、分位点を返せること | Agent Platform: Train a forecast model / name changes | 2026-09-14 |
WMSから取得できる項目と方法は製品によって異なります。この部分は利用環境に応じた個別確認が必要です。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で構築・検証したものではありません。工数の数値はモデル条件による試算で、予測の精度に関する記述は自社データでの実測を前提としています。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0048)についてのご相談はこちらから。
