パレットのレンタル会社が出荷・返却の記録から、デポごと・パレットの種類ごとの翌月の返却の数を Python で幅を付けて見込み、洗浄の人員と回送の計画に使う
荷主への出荷の記録と各デポへの返却の入庫の記録から、デポごと・パレットの種類ごとに翌月の返却の数を Python で見込みます。中央の見込みに上下の幅を付けて出し、洗浄・修理の人員とデポのあいだの回送の計画の材料にします。
- 連携・自動化
- Python
- 対象業界
- 小売/物流/製造
- 対象部門
- 物流
- 対象業務
- 集計・分析
- 主な課題
- データ分析に時間がかかる/判断に時間がかかる/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/属人化解消/工数削減
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 各デポの担当が、基幹のシステムから受け持ちのデポの返却の入庫の記録を、前年の同じ月と直近3か月の分で書き出す
- 種類ごとに前年の同じ月の返却の数を出し、直近3か月の前年との比で伸ばす
- 荷主の出荷の動き(大口の荷主の出荷の増減、新しい荷主、契約の終了)を営業に聞き、手で足し引きする
- 本部の需給の担当が30デポ分をまとめ、全体の出荷の見込みと釣り合っているかを見て、デポの担当と調整する
- 洗浄の人員と回送の便の数を決め、各デポに伝える
- 翌月の終わりに、見込みと実際を見比べる(時間があれば)
- 自動毎月の締めの3営業日目に、基幹のシステムから前月末までの出荷・返却の入庫・回送の記録を書き出し、決まったフォルダに置く
- 自動Python が出荷の記録を、納品先から返却先のデポへの対応表で返却先のデポにつなぎ直す
- 自動デポごと・種類ごと・月ごとの特徴(過去6か月の返却先のデポ別の出荷の数、前月の返却、前年の同じ月の返却、翌月の営業日の数、荷主の契約の変更)を作る
- 自動3つの学習済みのモデルが、翌月の返却の数の中央の見込み、上側(90%点)、下側(10%点)を出す
- 自動見込みの表に、前年の同じ月・前月の実績・3か月前に出した見込みとの差を並べ、大きく動いたデポに印を付ける
- 人各デポの担当が、印の付いたデポと種類について、営業の情報から上書きする理由があれば書き込む
- 人本部の需給の担当が表をまとめ、洗浄の人員と回送の便の数を決める会議に出す
各工程の詳しい説明を読む
- 各デポの担当が、基幹のシステムから受け持ちのデポの返却の入庫の記録を、前年の同じ月と直近3か月の分で書き出す
- 種類ごとに前年の同じ月の返却の数を出し、直近3か月の前年との比で伸ばす
- 荷主の出荷の動き(大口の荷主の出荷の増減、新しい荷主、契約の終了)を営業に聞き、手で足し引きする
- 本部の需給の担当が30デポ分をまとめ、全体の出荷の見込みと釣り合っているかを見て、デポの担当と調整する
- 洗浄の人員と回送の便の数を決め、各デポに伝える
- 翌月の終わりに、見込みと実際を見比べる(時間があれば)
(a)見込み方がデポごとに違う。 2番目で「直近3か月の前年との比」を使うデポもあれば、「直近の月の数」をそのまま使うデポもあります。どちらが当たっているかを比べた記録は無く、 担当が替わると見込み方も替わります。
(b)前年の同じ月では、出荷の動きが入らない。 大口の荷主が新しい物流センターに納品先を移すと、返るデポが変わります。 前年の同じ月の数は、移る前の流れです。3番目で営業に聞いて足し引きしていますが、どの荷主のどの納品先が、どのデポに返るかを担当が覚えていないと、足し引きができません。
(c)1つの数で決めるので、外れたときの備えがない。 見込みは1つの数で、どれくらい外れうるかは書かれていません。 年末や年度末の前後で返却が大きく振れる月に、洗浄の人員が足りずに返却のパレットが検品待ちで積み上がり、デポの置き場がふさがることがあります。
(d)外れた理由が残らない。 6番目は時間があればで、外れた月に何が起きていたかが記録に残りません。 同じ外れ方を翌年もくり返します。担当が替わると、「このデポは年度末の翌月に返却が跳ねる」のような経験も一緒に消えます。 見込みの作り方が、担当の頭の中にしかありません。
- 【自動】 毎月の締めの3営業日目に、基幹のシステムから前月末までの出荷・返却の入庫・回送の記録を書き出し、決まったフォルダに置く
- 【自動】 Python が出荷の記録を、納品先から返却先のデポへの対応表で返却先のデポにつなぎ直す
- 【自動】 デポごと・種類ごと・月ごとの特徴(過去6か月の返却先のデポ別の出荷の数、前月の返却、前年の同じ月の返却、翌月の営業日の数、荷主の契約の変更)を作る
- 【自動】 3つの学習済みのモデルが、翌月の返却の数の中央の見込み、上側(90%点)、下側(10%点)を出す
- 【自動】 見込みの表に、前年の同じ月・前月の実績・3か月前に出した見込みとの差を並べ、大きく動いたデポに印を付ける
- 【人】 各デポの担当が、印の付いたデポと種類について、営業の情報から上書きする理由があれば書き込む
- 【人】 本部の需給の担当が表をまとめ、洗浄の人員と回送の便の数を決める会議に出す
2番目の対応表が、この設計の土台です。 対応表は「この納品先から返るパレットは、主にこのデポに入る」を持つ表で、過去の返却の入庫の記録から、納品先ごとに最も多く返っているデポを数えて作ります。 担当が覚えていた関係を、記録から作り直すということです。
6番目でデポの担当が見るのは、240件すべてではありません。 印の付いたものと、営業から荷主の動きの知らせがあったものだけです。残りは見込みの表で流し見ます。
7番目の会議で使う数は、中央の見込みだけではありません。 置き場に余裕の無いデポは上側の見込みに合わせて洗浄の人員を組み、置き場の広いデポは中央に合わせて組みます。どちらに合わせるかをデポごとに決めておくと、会議が見込みの数の言い合いではなく、置き場と人員の話になります。
02今回想定するシステム構成
基幹のシステム(出荷・返却の入庫・洗浄・回送の記録) + 納品先から返却先のデポへの対応表 + 荷主の契約の変更の表 │ 締めの3営業日目に、前月末までの書き出しを決まったフォルダへ ▼【トリガー】書き出しがそろったとき(毎月1回) Python(pandas) ├──▶ 出荷を返却先のデポにつなぎ直す ──▶ 対応表に無い納品先の警告 ├──▶ デポ × 種類 × 月の特徴を作る ▼ scikit-learn(HistGradientBoostingRegressor を3つ) │ 中央(poisson)/上側 90%点・下側 10%点(quantile) ▼ Python ── 前年・前月・前の見込みと並べ、大きく動いたものに印 ▼ 見込みの表(デポごと・種類ごと)+ 結果の JSON ▼ 【デポの担当が上書きの理由を書き、本部が計画に使う】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・scikit-learn の HistGradientBoostingRegressor) | R、BigQuery ML |
| 対応表 | 納品先から返却先のデポへの対応表(本部の共有フォルダの表) | - |
| 出力先 | 見込みの表(デポごと・種類ごとのシート) | 基幹のシステムの計画の画面への取り込み |
| 定時実行 | 社内のジョブ管理の仕組み | OSのタスクスケジューラ |
生成AIは使いません。 この構成で行うのは、記録をつなぎ直すこと、数を見込むこと、前の数と並べることです。荷主の出荷の記録を外部の生成AIに渡す場面を、最初から作りません。
基幹のシステムには書き戻しません。 見込みは計画の材料で、洗浄の人員と回送の便を決めるのは本部と各デポの担当です。 見込みの表が基幹のシステムの計画の数に直接入ると、担当の上書きの理由が残らなくなります。
モデルに HistGradientBoostingRegressor を選ぶのは、数を見込む損失と、幅を見込む損失を同じ道具で選べるからです。 公式の説明では、損失に 'poisson' と 'quantile' があり、'poisson' は目的の値が0以上であることを求め、内部で対数のつなぎを使います。 返却の数は0以上の数で、出荷の多いデポと少ないデポで桁が違うので、中央の見込みには 'poisson' を使います。'quantile' は quantile の値で何%点を見込むかを指定します。
03どうやって実装するのか
処理の起点を決める
毎月の締めの3営業日目、基幹のシステムの書き出しが決まったフォルダにそろった時点で動かします。 書き出しが終わったら「そろった」の印のファイルを置き、ジョブ管理の仕組みが15分ごとにその印を見に行きます。
月末ちょうどではなく、締めの3営業日目にするのは、返却の入庫の記録が遅れて入るためです。 返ってきたパレットは検品を終えてから入庫の記録になり、月末に届いたパレットの記録が翌月の1日や2日に入ることがあります。 入庫の記録は「入庫の受付の日」で月を決め、3営業日目までに入った前月の分を取り込みます。
見込む先は「翌月の1日から末日までに、そのデポに入庫の受付がある返却のパレットの数」です。 見込みを作るのは今月の20日の会議のためで、今月の残りの日の分は見込みません。 今月の返却は、会議の時点で半分以上が記録になっているので、担当がその数を見ます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 出荷の記録 | 出荷日、出したデポ、荷主、納品先のコード(荷主が届け出たもの)、パレットの種類、枚数 | 基幹のシステム |
| 返却の入庫の記録 | 入庫の受付の日、デポ、パレットの種類、枚数、返してきた運送会社・荷主のコード(わかるもの) | 基幹のシステム |
| 回送の記録 | 回送の日、出したデポ、受けたデポ、種類、枚数 | 基幹のシステム |
| 納品先から返却先のデポへの対応表 | 納品先のコード、返却先のデポ、その割合、作った月 | 本部の共有フォルダ(新しく作る) |
| 荷主の契約の変更 | 荷主、変更の種類(新規・終了・納品先の移転)、効力の月 | 営業の記録(新しく作る) |
| デポの営業日 | デポごとの翌月の営業日の数、休みの日 | 本部の共有フォルダ |
質を決めるのは、納品先のコードのそろい方です。 荷主が出荷のときに届け出る納品先のコードが空だったり、同じセンターが別のコードで届けられていたりすると、その出荷はどのデポに返るのかが分かりません。 空の割合を荷主ごとに数え、多い荷主には届け出の決まりを営業から頼みます。
回送の記録を入れるのは、学習の正解から外すためです。 回送で入ったパレットは、返却ではありません。基幹のシステムで回送の入庫と返却の入庫が同じ種類の記録になっているなら、回送の記録と突き合わせて引き算します。 ここを誤ると、回送を多く受けるデポほど返却が多いと学ぶモデルになります。
データの取得方法を決める
基幹のシステムの画面から自動で取ってくる仕組みは作りません。基幹のシステムの定時の書き出しで、決まったフォルダに置きます。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 出荷の枚数と納品先 | 出荷の記録(対応表で返却先のデポにつなぎ直す) | 過去1〜6か月の返却先のデポ別の出荷の数 |
| 返却の入庫の枚数 | 返却の入庫の記録(回送を除く) | 前月・前年の同じ月の返却と、学習の正解 |
| 回送の枚数 | 回送の記録 | 返却の入庫からの引き算 |
| 荷主の契約の変更 | 営業の記録 | 新規・終了・移転の印と、効力の月からの月数 |
| 翌月の営業日の数 | デポの営業日の表 | 月ごとの日数の違いをならす |
対応表は、毎月作り直さずに半年に1回作り直します。 過去12か月の返却の入庫で、返してきた運送会社や荷主のコードから納品先を推し量れる記録を数え、納品先ごとに、どのデポに何割が返っているかを持ちます。1つの納品先から2つのデポに分かれて返るなら、出荷を割合で分けます。作り直したときは、作った月を対応表に残します。
対応表に無い納品先の出荷は、警告として数えます。 新しく開いた物流センターへの出荷は、どこに返るかの記録がまだありません。その出荷は「返却先不明」としてデポに振らず、 本部の需給の担当がデポの担当と相談して対応表に足します。
AIへ渡す前に整形する
- 回送を除く … 返却の入庫から、同じ日・同じデポ・同じ種類の回送の入庫を引きます
- 出荷をつなぎ直す … 対応表で、出荷を返却先のデポに割り振ります。対応表に無い納品先は「返却先不明」に積みます
- 時点をそろえる … 特徴はすべて「前月末の時点」で作ります。3営業日目までに入った前月の入庫は前月に入れ、当月の入庫は入れません
- 特徴を作る … 返却先のデポ別の出荷の数(1か月前・2か月前…6か月前を別々の列で)、前月の返却、前年の同じ月の返却、前年の同じ月の翌月の返却、翌月の営業日の数、荷主の新規・終了・移転の印と効力の月からの月数、デポ、種類、月
- 新しいデポ・種類を分ける … 記録が12か月に満たないデポと種類は、モデルに渡さず「記録不足」にします
- 行を並べる … 月の順に並べ、同じ月の中はデポと種類の順にします
4番目で出荷を1か月ごとの別の列にするのは、返るまでの日数が荷主と納品先で違うからです。 飲料のように納品先ですぐ空になる荷主は1か月前の出荷が効き、倉庫で長く保管される荷物の荷主は3か月前、4か月前の出荷が効きます。 どの月の出荷がどれだけ効くかは、モデルに学ばせます。
2番目で1つの納品先を2つのデポに割合で分けた出荷は、端数が出ます。 枚数の特徴は小数のまま持ち、見込みの表に出すときだけ整数に丸めます。 途中で丸めると、小さなデポで割合の小さい出荷が毎月0枚になって消えます。
AIに処理させる
させるのは、デポごと・種類ごとに「翌月の返却の数」を3つの見込みで出すことだけです。 学習には、過去3年分の毎月末の時点の特徴と、その翌月の返却の数を使います。
| させること | やり方 |
|---|---|
| 中央の見込み | HistGradientBoostingRegressor(loss="poisson") |
| 上側の見込み(90%点) | HistGradientBoostingRegressor(loss="quantile", quantile=0.9) |
| 下側の見込み(10%点) | HistGradientBoostingRegressor(loss="quantile", quantile=0.1) |
| 学ばせ方と確かめ方 | TimeSeriesSplit で古い月で学ばせ、新しい月で確かめる |
4行目は、この記録だからそのまま使えます。 公式の説明では、TimeSeriesSplit は時間の順に並んだ記録を行の位置で分けるもので、分け目ごとの成績を比べるには記録が等しい間隔で並んでいる必要があるとされています。この記録は毎月30デポ × 8種類の240行で、月ごとの行の数が同じです。 前処理の6番目で月の順に並べ、test_size を240の倍数にすれば、分け目が月の境目に重なります。新しいデポを足して1か月の行の数が変わったら、月の境目で自分で分ける作りに替えます。
確かめ方は、見込みの種類ごとに分けます。 中央の見込みは、公式の説明のある mean_poisson_deviance で測ります。この指標は見込みの値が0より大きいことを求めます。 'poisson' の損失は対数のつなぎを使うので見込みは正の値になり、そのまま測れます。上側と下側の見込みは mean_pinball_loss で、alpha をそれぞれ0.9と0.1にして測ります。公式の説明では、alpha=0.95 のときは95%点の見込みで最も小さくなるとされ、見込んだ%点と同じ alpha で測るのが筋です。
もう一つ、確かめる月ごとに「実際の数が上側と下側のあいだに入った割合」を数えます。 10%点と90%点なら、おおむね8割が入るはずです。大きく下回るなら、幅が狭すぎて計画の材料になりません。
早めに止める見張りは、既定のままにしないでください。 公式の説明では、early_stopping の既定は 'auto' で、件数が1万件を超えるか、X_val と y_val を fit に渡すと有効になります。 3年分の240行は1万件に届かないので、何もしなければ見張りが効きません。直近の月を X_val・y_val として渡し、見張りを効かせます。
| させないこと | 理由 |
|---|---|
| 洗浄の人員の決定 | 人員はデポの担当が、見込みの幅と置き場の広さから決める |
| 回送の便を出すかの決定 | 便の数は本部が、運送会社の空きと費用で決める |
| 紛失の判定 | 返ってこないパレットの追跡は別の仕事 |
| 荷主ごとの返却の見込み | 返してきた荷主が分からない入庫が多く、正解が作れない |
指示内容を固定する
この構成は生成AIを使わないため、プロンプトはありません。 代わりに、つなぎ直し・学習・見込みの表の作り方を決める設定を、ひとつのファイルにまとめます。
【見込む先】
target: 翌月1日〜末日に、デポに入庫の受付がある返却の枚数(回送の入庫は除く)
as_of: 前月末(締めの3営業日目までに入った前月の入庫を含む)
unit: デポ × パレットの種類 × 月
【つなぎ直し】
mapping_table: 納品先 → 返却先のデポ(割合つき。半年ごとに作り直す)
on_unknown_destination: 「返却先不明」に積み、デポに振らない(推測で近いデポに寄せない)
【モデル】
median: HistGradientBoostingRegressor(loss="poisson", categorical_features="from_dtype")
upper: HistGradientBoostingRegressor(loss="quantile", quantile=0.9)
lower: HistGradientBoostingRegressor(loss="quantile", quantile=0.1)
validation: 直近2か月を X_val / y_val として fit に渡す
cv: TimeSeriesSplit(test_size=240 の倍数)。月ごとの行の数が変わったら月の境目で分ける
指標: median は mean_poisson_deviance、upper/lower は mean_pinball_loss(alpha=0.9 / 0.1)
学習期間: 直近36か月
【見込みの表】
- 中央・上側・下側を並べ、前年の同じ月・前月・3か月前に出した見込みとの差を付ける
- 上側が下側より小さくなったら、上側を中央の見込みにそろえ「幅の逆転」と付ける
- 中央の見込みが前年の同じ月から30%以上動いたら印
- 記録が12か月未満のデポ・種類は見込みを出さず「記録不足」
「推測で近いデポに寄せない」を設定に書くのは、新しい納品先の出荷を地図の上で近いデポに振りたくなるからです。 実際には、運送会社の帰りの便の都合で、近くないデポに返ることがあります。寄せた出荷が外れると、2つのデポの見込みが同時に外れます。
上側と下側を別々に学ばせると、まれに上側が下側より小さくなります。 そのまま表に出すと担当が迷うので、機械的に直して印を付けます。
出力形式を固定する
見込みの表は表で出し、同じ内容を JSON でも残します。 表は担当が読むため、JSON は翌月の振り返りのためです。
{
"as_of": "2026-09-30",
"target_month": "2026-11",
"model_version": "pallet-return-2026-09",
"mapping_version": "2026-07",
"unknown_destination_shipments": 1840,
"rows": [
{
"depot": "D-12",
"pallet_type": "P-03",
"median": 18400,
"lower_10": 16900,
"upper_90": 20600,
"last_year_same_month": 17200,
"last_month_actual": 18900,
"forecast_3_months_ago": 17800,
"flags": ["big_change | interval_inverted | insufficient_records | none"],
"override": { "value": null, "reason_code": "" }
}
]
}
mapping_version を残すのは、どの版の対応表で出荷をつなぎ直したかを後から追うためです。 対応表を作り直した月に見込みの当たり方が変わったら、それが対応表のせいか、荷主の動きのせいかを分けられます。
override は、デポの担当が上書きしたときの値と理由のコードです。 「荷主の新しいセンターが翌月から動く」「大口の荷主の出荷が止まる」のように、記録にまだ出ていない事情を選ぶ形にします。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 決まったフォルダ | 読み取り | 出荷・返却の入庫・回送の書き出しと「そろった」の印 |
| 対応表・契約の変更・営業日 | 読み取り | 共有フォルダの表 |
| 見込みの表 | 書き込み | デポごとのシートと、本部のまとめのシート |
| 基幹のシステム | 書き込まない | 見込みと上書きを書き戻さない |
見込みの表は、会議の後に固めます。 担当の上書きが入った版を、計画に使った版として日付を付けて残します。 翌月の振り返りでは、モデルの見込みと、上書きの後の数の両方を実際と比べます。
見込みを基幹のシステムに取り込みたくなったら、上書きの後の数だけを取り込みます。 モデルの見込みをそのまま入れると、担当が上書きした事情が計画の数から消えます。 取り込むかどうかは、半年ほど振り返りを回してから決めます。
人が確認する
- 返却先不明の出荷の数 … 前月より大きく増えていたら、新しい納品先がある。対応表に足してから見込みを使います
- 印の付いたデポと種類 … 前年の同じ月から大きく動いたもの、幅の逆転、記録不足。営業の情報と照らします
- 上書きの理由を書く … 上書きしたときは値と理由のコードを入れます。理由の無い上書きはしません
- 全体の釣り合い … 本部の需給の担当が、30デポの中央の見込みの合計を、全体の出荷の動きと見比べます
目標は、240件をならして1件4分です。 上の4つに入るものだけを記録と照らし、残りは見込みの表で流し見ます。
1番目を省かないでください。 返却先不明の出荷は、どのデポの見込みにも入っていません。数千枚が不明のまま会議に出ると、どこかのデポで見込みを大きく超える返却が来ます。 不明の出荷の納品先を上から10件見るだけで、多くは新しく動き始めたセンターだと分かります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 書き出しがそろわない | 見込みを作らず、本部に知らせる。そろったら動かし直す |
| 返却先不明の出荷が多い | 見込みは出すが、該当しそうなデポに「返却先不明あり」と付ける |
| デポが閉まる・新しく開く | 閉まるデポの返却を受けるデポを対応表で決め直す。新しいデポは「記録不足」 |
| 大口の荷主の契約が終わる | 契約の変更の表に入れ、効力の月からの月数を特徴に入れる |
| 災害や大きな物流の止まりがあった月 | 学習から除くか、印を付けて扱う |
| 対応表を作り直した | 新旧の対応表で前月の見込みを作り直し、差が大きいデポを担当に知らせる |
最後の行は、見込みと実際の比べ合わせのときにも効きます。 物流が止まった月の返却は、翌月にまとめて返ってきます。その2か月をそのまま学ぶと、普段の月の動きがゆがみます。
記録を残す
- 月ごとの書き出しの件数、返却先不明の出荷の数、回送として引いた枚数
- 対応表の版(いつ作り直し、どの納品先を足したか)
- モデルの版、学習・確かめに使った月、確かめた結果(中央の見込みの指標、上側と下側の指標、幅に入った割合)
- 見込みの表の JSON の全文と、会議に出した版
- デポの担当が上書きした値と理由のコード
- 翌月の実際の返却の数と、モデルの見込み・上書きの後の数との差
最後の行が、上書きが役に立っているかを知る材料になります。 上書きの後の数がモデルより当たっていれば、その理由のコードの事情を記録として足すことを考えます。外れていれば、その理由での上書きをやめる目安になります。
04実装レベルの3段階
半自動化だけでも、第4章の①は無くなり、②の大半も無くなります。 荷主の納品先がどのデポに返るかを担当が思い出す作業が、対応表で置き換わるからです。残るのは見込み方の粗さで、上書きの判断が多く残ります。 本格構成で、担当が見るのが印の付いたものと荷主の知らせだけになります。 本記事の想定はこの段階です。幅が出ることで、洗浄の人員を「上側に合わせて組む」「中央に合わせて組み、上側を超えたら応援を呼ぶ」のように、デポごとに決め方を選べるようになります。 段階を飛ばさないでください。 半自動化を3か月回すと、返却先不明の出荷が多い荷主と、回送の引き算の漏れが先に見えます。そこを直さずにモデルを作ると、記録の欠けを学んだモデルになります。
05工数削減シミュレーション
導入後 240件 × 4分 ÷ 60 = 16 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 全国に数十か所のデポを持ち、プラスチックや木のパレットを食品・飲料・日用品などの荷主に貸し出しているレンタル会社。出荷と返却の入庫の記録が基幹のシステムに日ごとに残り、2〜3年分を書き出せる場合。各デポの担当と本部の需給の担当が、翌月の返却の数を前年の同じ月と最近の出荷から表計算で見込み、洗浄の人員とデポのあいだの回送をそれで決めているが、デポごとに見込み方が違い、外れたときの理由が残っていない場合。
- デポが数か所で、パレットの種類も少なく、担当者が返却の動きを体で覚えている会社。返却の入庫の記録が紙の伝票だけで、日付とデポとパレットの種類をデータにできない場合。荷主が自社でパレットを持ち、レンタルの比率が小さい場合。なお、紛失したパレットの追跡と荷主への請求、回送の便を出すかどうかの決定は、この構成では代替できません。
07最小構成で試す方法
- 1年前の9月末の時点までの、出荷・返却の入庫・回送の記録を3デポ分用意する
- 過去12か月の返却の入庫から、その3デポに返ってくる納品先を数え、対応表を作る
- 対応表で出荷をつなぎ直し、1〜6か月前の出荷の数を表計算で並べる
- 「前年の同じ月」「直近の月」「1〜3か月前の出荷の重みつきの合計」の3通りで翌月の返却を見込み、実際と比べる
- 当時の担当の見込みと、どれが近かったかを比べる
モデルを作る前に、対応表が作れるかを確かめます。 返却の入庫の記録から納品先を推し量れる割合が低いなら、この構成の土台が無いということです。
| 出てきた内容 | 判断 |
|---|---|
| 出荷の重みつきの合計が、前年の同じ月より近かった | モデルの学習に進む |
| 対応表に乗る納品先が少ない | 返却の入庫で納品先を記録する運用が先。モデルより先 |
| 前年の同じ月が最も近かった | 荷主の動きが少ないデポ。そのデポは前年の同じ月を中央にし、幅だけを足す |
3行目のデポがあっても、構成をやめる理由にはなりません。 動きの少ないデポでは、1つの数ではなく幅を出すことが、計画の上ではいちばん効きます。3デポのうち少なくとも1つは、大きな物流センターの近くの返却の多いデポを選んでください。 荷主の納品先の移転が見込みに最も強く響くのは、そうしたデポだからです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 回送を多く受けるデポほど返却が多く出る | 回送の入庫を返却から引く |
| 新しいセンターへの出荷が近いデポに寄せられる | 「返却先不明」に積み、推測で寄せない |
| 月末の入庫が翌月に入って月がずれる | 入庫の受付の日で月を決め、締めの3営業日目まで待つ |
| 早めに止める見張りが効かない | 1万件に届かないので、直近の月を X_val・y_val で渡す |
TimeSeriesSplit の分け目が月の途中になる | 月の順に並べ、test_size を240の倍数にする。行の数が変わったら月の境目で分ける |
| 上側が下側より小さくなる | 機械的に直して「幅の逆転」と付ける |
| 幅が狭すぎる | 実際が幅に入った割合を毎月数える |
| 物流が止まった月を学ぶ | 学習から除くか、印を付ける |
| 担当の上書きの理由が残らない | 理由のコードを選ばせ、理由の無い上書きをしない |
上の3行が、この構成の失敗のほとんどです。 どれも「返却の数をどう数えるか」の問題で、モデルを入れる前から、担当の見込みを外していた原因でもあります。
下の2行は、運用が始まってから効いてきます。 幅に入った割合が8割を大きく下回る月が続くなら、学習に無い動きが起きています。モデルを疑う前に、返却先不明の出荷と回送の引き算を見直してください。 上書きの理由のコードは、選択肢を増やしすぎると選ばれなくなるので、最初は5つほどに絞ります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 荷主の名前と出荷の枚数、納品先のコード、デポごとの返却と在庫の数です。個人の情報はほとんどありませんが、荷主ごとの出荷の動きは、荷主にとって外に出したくない商売の情報です。 納品先のコードから、荷主の取引先が分かります。
- 外部へ出さない … この構成は社内のフォルダと Python の中で完結し、生成AIや外部のサービスに記録を渡しません
- 荷主の情報を混ぜて見せない … 見込みの表はデポと種類の単位で、荷主ごとの出荷の数は表に出しません。 荷主の営業の担当が別の荷主の動きを見られないようにします
- 見られる人を絞る … 各デポの担当は受け持ちのデポの分、本部は全体です
- 荷主との契約を確かめる … 出荷の記録を需給の計画に使うことが、荷主とのレンタルの契約の秘密保持の決まりの範囲かを確かめます
- 計画の決定を見込みに任せない … 洗浄の人員と回送の便は、見込みの幅と現場の事情から人が決めます
- 書き出しの置き場所を限る … 出荷の記録の書き出しは、荷主と納品先の一覧そのものです。決まったフォルダは本部とデータ分析の担当だけが読めるようにし、使い終えた月の書き出しは保存の期限を決めて消します
誤りが起きた場合のリスクは、返却が見込みを大きく超えて置き場がふさがることと、回送の便を出しすぎて費用がかさむことの2つです。 前者は上側の見込みと幅に入った割合の見守りで、後者は全体の釣り合いの確認と上書きの理由の記録で小さくします。
10まず何から始めるか
1週目:対応表を作れるかを確かめる
3デポ分の返却の入庫の記録で、返してきた先から納品先を推し量れる割合を数えます。割合が低いデポには、入庫の受付で返してきた先を記録してもらう運用を頼みます。
2週目:見込み方を比べる
第8章のとおり、1年前の記録で「前年の同じ月」「直近の月」「出荷の重みつきの合計」の3通りを比べ、当時の担当の見込みと並べます。
3週目:全デポの対応表と回送の引き算を整える
30デポ分の対応表を作り、回送の入庫と返却の入庫が分けて数えられているかを確かめます。返却先不明の出荷が多い荷主を洗い出し、営業に納品先のコードの届け出を頼みます。
4週目:半自動化の表を会議に出す
Python で毎月の書き出しをつなぎ直し、前年・前月・出荷の重みつきの合計を並べた表を作って、20日の会議に出します。担当の上書きと理由のコードを毎月残します。
2か月目以降: 3年分の記録で3つのモデルを学ばせ、TimeSeriesSplit で確かめます。半自動化の表と並べて2か月出し、中央の当たり方と、実際が幅に入った割合を比べます。 洗浄の人員を幅で組む決め方をデポごとに決めた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
HistGradientBoostingRegressor の損失に 'poisson' と 'quantile' があり、'poisson' は目的の値が0以上であることを求め対数のつなぎを使うこと。quantile で何%点を見込むかを0から1で指定すること。early_stopping の既定が 'auto' で、件数が1万件を超えるか X_val・y_val を fit に渡したときに有効になること。欠けた値をそのまま扱えること。categorical_features の既定が "from_dtype" であること(scikit-learn 1.9.1) | scikit-learn: HistGradientBoostingRegressor | 2026-10-29 |
TimeSeriesSplit が時間の順に並んだ記録を行の位置で分け、分け目ごとの成績を比べるには記録が等しい間隔で並んでいる必要があること。test_size と gap を指定できること | scikit-learn: TimeSeriesSplit | 2026-10-29 |
mean_pinball_loss が分位点の回帰の損失で、alpha の既定が0.5であり、alpha=0.95 のときは95%点の見込みで最も小さくなること | scikit-learn: mean_pinball_loss | 2026-10-29 |
mean_poisson_deviance が実際の値に0以上、見込みの値に0より大きいことを求めること | scikit-learn: mean_poisson_deviance | 2026-10-29 |
洗浄の人員と回送の便の決め方は、各デポの置き場と運送会社との取り決めに合わせて決めてください。 本記事は公開されている仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-2381)についてのご相談はこちらから。
