配送の実績記録から配送先・時間帯・曜日ごとの所要時間を予測し、翌日の配車計画の到着予定に入れる
過去の配送の実績記録から、配送先・時間帯・曜日ごとの走行時間と作業時間を見込み、翌日の配車計画の便ごとに到着予定を積み上げます。指定時間に遅れそうな配送先と、拘束時間が長くなりそうな便を前日のうちに配車担当へ返します。
- 連携・自動化
- Python
- 対象業界
- 小売/物流/製造/飲食
- 対象部門
- 物流
- 対象業務
- 書類作成/集計・分析
- 主な課題
- 判断に時間がかかる/属人化している/期限・対応漏れが起きる
- AIで行う処理
- 予測
- 主な効果
- 判断支援/属人化解消/工数削減
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 16時に翌日の受注が締まり、配車システムに便と配送先が並ぶ
- 配車担当が便ごとに配送先の順番を決める
- 配送先ごとに、走行の時間と荷降ろし・検品の時間を経験と地図で見積もり、到着予定を入れる
- 指定時間の枠に入らない配送先があれば、順番か出発の時刻を変えて入れ直す
- 便の始業から帰庫までの時間を足し、拘束時間と休憩の取り方に無理が無いかを見る
- 到着予定を荷主に共有し、センターの予約の枠を申し込む
- 当日に遅れが出たら、ドライバーからの電話を受けて荷主へ連絡する
- 自動毎日深夜に、前日の車載端末の実績を取り込み、配送先ごとの到着・作業・出発の時刻をそろえる
- 人16時以降に、配車担当が便ごとに配送先の順番を決める(今までどおり)
- 自動順番が決まった便について、配車システムから便の表を書き出したことをきっかけに見込みを始める
- 自動区間ごとの走行時間と、配送先ごとの作業時間を、普通の場合と遅めの場合で見込む
- 自動出発の時刻から到着予定を積み上げ、指定時間の枠・拘束時間・連続運転の目安と照らす
- 自動到着予定を配車システムに取り込む形の表にし、確認が要る便に印を付ける
- 人配車担当が印の付いた便だけを開き、順番か出発の時刻を直す
- 人到着予定を荷主に共有し、センターの予約の枠を申し込む(今までどおり)
各工程の詳しい説明を読む
- 16時に翌日の受注が締まり、配車システムに便と配送先が並ぶ
- 配車担当が便ごとに配送先の順番を決める
- 配送先ごとに、走行の時間と荷降ろし・検品の時間を経験と地図で見積もり、到着予定を入れる
- 指定時間の枠に入らない配送先があれば、順番か出発の時刻を変えて入れ直す
- 便の始業から帰庫までの時間を足し、拘束時間と休憩の取り方に無理が無いかを見る
- 到着予定を荷主に共有し、センターの予約の枠を申し込む
- 当日に遅れが出たら、ドライバーからの電話を受けて荷主へ連絡する
(a)到着予定が人によって違う。 同じ便でも、ベテランが入れた予定と経験の浅い担当が入れた予定では、配送先によって30分以上違います。 ベテランが休んだ日は、量販店のセンターの枠に遅れる便が増えます。
(b)配送先での待ちが読めない。 工場の荷受けは午前の早い時間に混み、量販店のセンターは月曜日と特売の前の日に検品が長くなります。こうした癖は配車担当の頭の中にしかなく、表のどこにも書かれていません。
(c)遅れる便を前日に見抜けない。 到着予定は平均的な時間で入れるので、少し混んだだけで指定時間を過ぎる便が、前日の時点で見分けられません。 当日の朝にドライバーから電話が来て初めて分かります。
(d)実績が計画に戻ってこない。 車載端末には配送先ごとの到着と出発の時刻が毎日残っていますが、それを見るのは遅れの苦情が来たときだけです。 1年分の実績が、翌日の計画に一度も使われないまま積み上がっています。
(e)拘束時間の確認が後回しになる。 到着予定を入れ終わったころには18時を過ぎており、便ごとの拘束時間を足し上げる確認が、急いだ日ほど省かれます。
- 【自動】 毎日深夜に、前日の車載端末の実績を取り込み、配送先ごとの到着・作業・出発の時刻をそろえる
- 【人】 16時以降に、配車担当が便ごとに配送先の順番を決める(今までどおり)
- 【自動】 順番が決まった便について、配車システムから便の表を書き出したことをきっかけに見込みを始める
- 【自動】 区間ごとの走行時間と、配送先ごとの作業時間を、普通の場合と遅めの場合で見込む
- 【自動】 出発の時刻から到着予定を積み上げ、指定時間の枠・拘束時間・連続運転の目安と照らす
- 【自動】 到着予定を配車システムに取り込む形の表にし、確認が要る便に印を付ける
- 【人】 配車担当が印の付いた便だけを開き、順番か出発の時刻を直す
- 【人】 到着予定を荷主に共有し、センターの予約の枠を申し込む(今までどおり)
2番目の順番は、人が決めたままにします。 配送先の順番には、荷主の都合、ドライバーの慣れ、道路の事情が入っており、この構成は順番を組み直しません。 見込むのは、決まった順番で走ったときの時刻です。
7番目が、この設計の分かれ目です。人が開くのは、印の付いた便だけです。 印の無い便は、到着予定が入ったことを一覧で確かめて終わります。全便の時刻を1か所ずつ見直す設計にすると、105.0時間はあまり減りません。
02今回想定するシステム構成
車載端末(デジタルタコグラフ)の実績 │ 配送先ごとの到着・作業開始・出発の時刻、走行距離 ▼ 毎日深夜の書き出し(CSV) Python ── 実績の取り込みと、区間・配送先ごとの所要時間の表 │ ▼【トリガー】配車システムからの便の表の書き出し(16時以降) Python ├──▶ 便・配送先・順番・出発の時刻・個数を読む ├──▶ 配送先のマスタ(指定時間の枠、荷受けの場所)を引く ▼ scikit-learn HistGradientBoostingRegressor(loss="quantile") │ 区間の走行時間 / 配送先での作業時間 │ quantile=0.5(普通なら)と 0.8(遅めなら) ▼ 積み上げ ── 到着予定、指定時間の枠、拘束時間、連続運転の目安 ▼ 配車システムへの取り込み用の表 + 確認が要る便の一覧 ▼ 【配車担当が印の付いた便だけを直す】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・scikit-learn) | R |
| 処理エンジン | scikit-learn の HistGradientBoostingRegressor(分位点の損失) | LightGBM |
| 集計 | Python(実績からの区間・配送先ごとの所要時間の表) | 配車システムの集計の機能 |
| データの取得元 | 車載端末の実績の書き出しと、配車システムの便の表 | 各システムのAPI(提供がある場合) |
| 確認の画面 | 確認が要る便の一覧(表) | 配車システムの画面 |
見込みを出すのは、scikit-learn の HistGradientBoostingRegressor です。 loss に "quantile" を指定すると分位点の損失(pinball loss)で学び、quantile に0から1の値を渡すと、その分位点を見込みます。 0.5で学んだモデルが「普通なら」、0.8で学んだモデルが「遅めなら」の時間を返します。走行時間と作業時間でそれぞれ2つ、合わせて4つのモデルを持ちます。
配送先や車格は、区分の値としてそのまま渡せます。 categorical_features に列の名前を渡すか、pandas の区分の型にしておけば区分として扱われます。1つの区分の値の数は max_bins までなので、配送先が多い場合は、件数の少ない配送先を「その他」にまとめます。
個数が多いほど作業時間が長くなる、という向きを守らせます。 monotonic_cst で、ある列に対して見込みが増える向き(1)か減る向き(-1)かを決められます。作業時間のモデルでは、個数と重量を増える向きに固定します。 実績の少ない配送先で、個数が多いのに作業時間が短く見込まれる逆転を防ぐためです。
生成AIは使いません。 到着予定は時刻の数字で、決まった計算で積み上げます。時刻を文章で考えさせると、根拠の無い数字が混ざります。
配車システムとのつなぎ方は、使っている製品ごとに違います。 便の表の書き出しと、到着予定の取り込みの形式は製品で異なるため、この部分は利用している配車システムに応じた個別の実装が必要です。 本記事では、CSV の書き出しと取り込みができる形を想定します。
03どうやって実装するのか
処理の起点を決める
見込みは2つの時点で動かします。 1つは毎日深夜の実績の取り込みで、前日の車載端末の書き出しを読み、学ぶための表を更新します。もう1つは、配車担当が便の順番を決めて、配車システムから便の表を書き出したときです。
便の表の書き出しは、共有フォルダへの保存で検知します。 保存されたら Python のスクリプトが動き、1〜2分で到着予定の表と確認の一覧を同じフォルダに返します。配車担当は、便を何本か決めるたびに書き出してよく、全便がそろうのを待ちません。 締めの直後に集中する作業を、決まった便から順に流すためです。
モデルの学び直しは週1回、日曜日の深夜です。 前の週までの実績で学び直し、検証の成績が前のモデルより下がっていなければ入れ替えます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 便の表 | 便、車両、車格、ドライバー、出発の時刻、配送先の順番、配送先ごとの個数と重量 | 配車システムの書き出し |
| 配送先のマスタ | 配送先、荷主、住所、指定時間の枠、荷受けの場所の種類(センター・店舗・工場) | 配車システムのマスタ |
| 実績の記録 | 便、日付、配送先ごとの到着・作業開始・出発の時刻、区間の走行距離 | 車載端末の書き出し |
| 休憩の記録 | 運転の中断の開始と終了 | 車載端末の書き出し |
| 暦 | 曜日、祝日、荷主の特売の前日の印 | 自社で用意する表 |
質を決めるのは、実績の記録の「到着」と「作業開始」が分かれているかどうかです。 到着してから荷受けが始まるまでの待ちが、配送先の癖のいちばん大きな部分です。到着と出発しか無いと、待ちと荷降ろしを分けられません。 車載端末の操作で「到着」「作業開始」を押してもらうよう、ドライバーと決めておきます。
荷主の特売の前日の印は、量販店のセンターの作業時間に効きます。 荷主から届く販促の予定を、日付と荷主の表にしておきます。
データの取得方法を決める
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 配送先ごとの到着・作業開始・出発 | 車載端末の書き出し(毎日深夜) | 区間の走行時間と、配送先での作業時間の答え |
| 区間の走行距離 | 同上 | 走行時間のモデルの材料 |
| 便の表 | 配車システムの書き出し(16時以降の随時) | 見込む対象 |
| 指定時間の枠 | 配送先のマスタ | 到着予定との照合 |
| 休憩の記録 | 車載端末の書き出し | 連続運転の目安の学び |
区間とは、1つ前の配送先(最初は営業所)を出てから次の配送先に着くまでです。 実績の記録を、便の順番で並べて「前の配送先の出発」と「次の配送先の到着」の差を走行時間とし、途中に休憩の記録があればその時間を引きます。
作業時間は、到着から出発までです。 そのうち到着から作業開始までを「待ち」として別の列に持ち、一覧で配送先ごとの待ちの長さを見られるようにします。
実績の配送先と、配車システムの配送先を同じ番号で結びます。 車載端末では配送先を位置か名前で記録していることが多く、配車システムの配送先の番号と一致しないことがあります。 最初に対応の表を作り、対応のつかない記録は学ぶ対象から外して、件数を配車担当に返します。ここが合っていないと、別の配送先の作業時間で見込むことになります。
便の表は、書き出しのたびに全便を読み直します。 配車担当が順番を直して書き出し直したときに、古い順番の見込みが残らないよう、同じ便の前回の結果は上書きし、前回の内容は保存・ログの側に残します。
AIへ渡す前に整形する
- 区間を作る … 実績を便の順番で並べ、前の配送先の出発から次の到着までを1区間にします。営業所の出発から最初の配送先、最後の配送先から帰庫までも区間にします
- 休憩を引く … 区間の途中にある運転の中断を、走行時間から引きます。引いた休憩の時間は別の列に残します
- 外れた記録を外す … 押し忘れで到着と出発が同じ時刻、作業時間が数時間を超える、といった記録は学ぶ対象から外します。外した割合を配送先ごとに数えます
- 材料をそろえる … 区間には、前後の配送先、出発の時間帯(30分刻み)、曜日、祝日の前後、走行距離、車格を付けます。作業時間には、配送先、到着の時間帯、曜日、個数、重量、特売の前日の印を付けます
- 件数の少ない配送先をまとめる … 過去1年で実績が20回に満たない配送先は、荷受けの場所の種類ごとの「その他」にまとめます
- 答えを付ける … 走行時間と作業時間を、分の単位の数にします
3番目を軽く見ないでください。 押し忘れの記録を混ぜると、作業時間が0分の日と数時間の日が混ざり、遅めの見込みが大きく振れます。 外した割合が多い配送先は、ドライバーの操作の決まりを見直す材料にします。
5番目の「その他」は、学び直しのたびに入れ替わります。 実績が20回を超えた配送先は、その回から自分の名前の区分で学びます。新しく取引の始まった配送先は、最初の1か月ほど new_stop の印が付き続けることになります。
4番目で、出発の時間帯は見込む区間ごとに変わります。 積み上げの途中で、前の区間の到着予定から次の区間の出発の時間帯が決まるので、区間を1つずつ順に見込みます。
AIに処理させる
させるのは、区間の走行時間と配送先での作業時間を、普通の場合と遅めの場合で見込むことだけです。 到着予定の積み上げと照合は、決まった計算で行います。
| 見るもの | 使うもの | 判断できないときの扱い |
|---|---|---|
| 区間の走行時間 | 前後の配送先、出発の時間帯、曜日、走行距離、車格 | 初めての区間は距離からの目安で入れ、new_leg の印 |
| 配送先での作業時間 | 配送先、到着の時間帯、曜日、個数、重量、特売の前日 | 初めての配送先は種類ごとの「その他」で見込み、new_stop の印 |
| 到着予定 | 出発の時刻と、見込みの積み上げ | 積み上げは計算。モデルにさせない |
| 指定時間の枠との照合 | 遅めの到着予定と枠の終わり | 枠が無い配送先は照合しない |
遅めの到着予定は、遅めの見込みを単純に足し上げません。 各区間で「遅めの見込み − 普通の見込み」を出し、その2乗の和の平方根を、普通の見込みの積み上げに足します。 区間ごとの遅れが毎回そろって起きるわけではないとみなした近似で、単純に足すと、後ろの配送先ほど遅めの予定が大きくなりすぎるためです。この近似が合っているかは、実績で確かめます(第7章の人間の確認と保存・ログ)。
拘束時間と連続運転は、目安として照らすだけです。 トラック運転者の改善基準告示では、1日の拘束時間は13時間を超えないものとし、延長する場合でも最大15時間とされています。連続運転時間は4時間を超えないものとされ、運転の中断は1回がおおむね10分以上、合計30分以上です。見込みの帰庫の時刻から拘束時間の見込みを出し、13時間を超える便と、休憩を入れないと連続運転が4時間を超える便に印を付けます。
| させないこと | 理由 |
|---|---|
| 配送先の順番の組み直し | 荷主・ドライバー・道路の事情を人が知っている |
| 出発の時刻の変更 | ドライバーの始業の時刻と人の手配に関わる |
| 拘束時間・休憩の判断 | 運行管理者が勤務の全体を見て決める |
| 指定時間の枠の変更の依頼 | 荷主との相談で、人が行う |
| 実績の少ない配送先の断定 | 印を付けて人へ |
3行目を最初に決めておいてください。 見込みの拘束時間は、到着予定の見込みから出した目安です。改善基準告示を守れているかの判断は、実際の勤務の記録で運行管理者が行います。 この構成の印は、前日のうちに無理のある便に気づくためのものです。
指示内容を固定する
この構成は生成AIを使わないので、プロンプトの代わりに、モデルと積み上げと照合の設定を書いておきます。
【モデル(4つ)】
- 走行・普通:HistGradientBoostingRegressor(loss="quantile", quantile=0.5)
- 走行・遅め:HistGradientBoostingRegressor(loss="quantile", quantile=0.8)
- 作業・普通:同上 quantile=0.5
- 作業・遅め:同上 quantile=0.8
- categorical_features = ["前の配送先", "次の配送先", "曜日", "車格"](走行)
["配送先", "曜日", "荷受けの種類"](作業)
- monotonic_cst = {"個数": 1, "重量": 1}(作業のモデルだけ)
- 欠けた値は埋めずに渡す
- 検証:TimeSeriesSplit(n_splits=5)(日付の順に並べてから分ける)
【積み上げ】
- 到着予定(普通)= 出発の時刻 + これまでの区間の走行(普通)と作業(普通)の和
- 遅めの上乗せ = √(各区間の(遅め − 普通)の2乗の和)
- 到着予定(遅め)= 到着予定(普通)+ 遅めの上乗せ
- 次の区間の出発の時間帯は、前の配送先の出発予定(普通)で決める
- 休憩は、配車担当が便の表に入れた位置と長さをそのまま使う
【照合と印】
- late_risk:到着予定(遅め)が指定時間の枠の終わりを過ぎる
- early_risk:到着予定(普通)が枠の始まりより 30 分以上早い
- long_duty:始業から帰庫(遅め)までが 13 時間を超える
- drive_4h:休憩を挟まずに走行(普通)の和が 4 時間を超える区間の並びがある
- new_leg / new_stop:実績が 20 回に満たない区間・配送先を含む
- 到着予定の時刻は 5 分単位に丸めて取り込む(照合は丸める前の値で行う)
early_risk を入れているのは、早すぎる到着も配送先で待ちになるためです。 量販店のセンターは枠より前に着いても荷受けが始まらず、早く着いた分は拘束時間が延びるだけです。 出発を遅らせられる便を見つける材料になります。
「照合は丸める前の値で行う」を明記しないと、5分の丸めで枠の境目の便が見落とされます。 9時の枠の終わりに対して8時58分の見込みを9時に丸めて照らすと、間に合う便と間に合わない便の区別がつかなくなります。
出力形式を固定する
便ごとに、次の形のJSONを作り、配車システムへの取り込み用の表と確認の一覧にします。
{
"route_id": "",
"date": "",
"depart_at": "",
"flags": ["late_risk", "early_risk", "long_duty", "drive_4h", "new_leg", "new_stop"],
"duty_hours_p80": 0.0,
"stops": [
{ "seq": 1, "stop_id": "", "window": "08:00-09:00",
"eta_p50": "", "eta_p80": "", "drive_min_p50": 0, "work_min_p50": 0,
"wait_min_hist": 0, "flags": [] }
],
"model_version": ""
}
1つ目の理由は、eta_p50 と eta_p80 を並べられることです。 配車システムの到着予定には eta_p50 を5分単位に丸めて入れ、確認の一覧には2つを並べて、遅めの予定がどれだけ枠に食い込むかを見せます。
2つ目は、drive_min_p50 と work_min_p50 と wait_min_hist で遅れの理由を分けられることです。 枠に遅れそうな配送先について、走行が長いのか、その前の配送先の作業が長いのか、待ちが長いのかが分かれば、順番を変えるか、出発を早めるか、荷主と相談するかを選べます。
3つ目は、flags を便と配送先の両方に持てることです。 便の一覧では印の付いた便だけを並べ、開いた便の中で、どの配送先に印が付いたかをすぐに見つけられます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 車載端末の実績 | CSV の書き出しの読み取り(毎日深夜) | 到着・作業開始・出発・休憩・走行距離 |
| 配車システム(便の表) | CSV の書き出しの読み取り(随時) | 見込む対象の便 |
| 配車システム(マスタ) | CSV の書き出しの読み取り | 指定時間の枠、荷受けの種類 |
| 配車システム(到着予定) | 取り込み用の CSV を作る | 配車担当が取り込みの操作をする |
| 確認が要る便の一覧 | 表の書き出し | 印の付いた便と配送先 |
配車システムへの取り込みは、配車担当が操作します。 スクリプトが直接書き込むことはしません。確認の一覧を見て直した便は、直してから取り込みます。 書き込みを自動にすると、確認する前の到着予定が荷主に共有されることがあります。
車載端末の実績は読み取りだけです。 実績の記録は運行の記録として残すものなので、押し忘れの直しは車載端末の側の手順で行い、この構成の中では直しません。
人が確認する
人が開くのは、印の付いた便だけです。 45便のすべてを1か所ずつ見直す設計にすると、第10章の30.0時間には収まりません。
late_riskを先に見る … 遅めの予定が枠を過ぎる配送先です。順番を入れ替えるか、出発を早めるか、荷主に枠の相談をするかを決めますlong_dutyとdrive_4hを見る … 運行管理者として、休憩の位置と、便の分け方に無理が無いかを確かめますnew_legとnew_stopを見る … 実績の少ない区間と配送先は見込みの幅が大きくなります。ドライバーに荷受けの様子を聞いた担当が、時刻を直しますearly_riskを見る … 出発を遅らせられる便があれば直します- 時刻を直したら記録する … どの配送先の時刻を、どちらへ何分直したか、理由を残します
5番目を省かないでください。 担当が直した時刻と、翌日の実績を並べると、人の直しが当たったのか、モデルの見込みのほうが近かったのかが分かります。人の直しが続けて当たる配送先は、モデルが見ていない事情があるということです。
月に1回、遅めの予定を実績が超えた割合を数えます。 0.8の分位点で見込んでいるので、超えた割合が2割前後なら見込みは合っています。 3割を超える配送先があれば、その配送先の材料が足りていません。
例外に対処する
| 起きること | 対応 |
|---|---|
| 便の表に順番が入っていない配送先がある | その便は見込まずに返し、配車担当へ戻す |
| 初めての配送先・区間 | 種類ごとの「その他」と距離の目安で入れ、new_stop/new_leg |
| 実績の書き出しが届かない | 前日までのモデルと表で見込み続け、取り込みは次の日に行う |
| 押し忘れの多い配送先 | 外した割合を数え、20回に満たなければ「その他」へ |
| 祝日や年末の特別な日 | 過去の同じ日の実績が少ないので、確認の一覧の先頭に印を付ける |
| 工事や通行止めが分かっている | この構成は道路の情報を見ない。配車担当が時刻を直す |
| 学び直しで検証の成績が下がった | 入れ替えずに前のモデルを使い続け、担当者へ |
上から4行目までが大半を占めます。 どれもモデルの問題ではなく、実績の付け方とマスタの整備の問題です。 直すほうが、モデルを作り直すより効きます。
6行目は、この構成の限界です。 過去の実績だけを材料にしているので、翌日だけ起きる道路の事情は見込みに入りません。 分かっている工事や行事は、配車担当が直す前提で運用します。
記録を残す
- 毎日の見込みの結果(便ごとの JSON)と、そのときのモデルの版
- 配車担当が直した時刻と理由
- 翌日の実績の到着・作業開始・出発と、見込みとの差
- 配送先ごとの、遅めの予定を実績が超えた割合(月ごと)
- 学び直しのたびの検証の成績
- 実績から外した記録の数と、配送先ごとの割合
3つ目の「見込みとの差」が、この構成のいちばん大事な記録です。 配送先ごとに差を並べると、見込みがいつも短い配送先、曜日によって外れる配送先が分かります。荷主との時間の相談の材料にもなります。
4つ目の割合は、第7章の人間の確認で月1回見るものです。 割合の推移を残しておくと、学び直しで見込みが良くなったのか悪くなったのかを追えます。
04実装レベルの3段階
最小構成では、毎日の計画には使えません。 3本の便を表計算で見るだけなので、確かめるための段階です。 半自動化で、1便7分が4分程度になります。 配送先ごとの時間の目安が表で引けるようになり、前回の計画を探す時間が減ります。ただし、時刻の入力と枠・拘束時間の確認は人が行います。本格構成で2分になり、この段階が本記事の想定です。 差が大きいのは、時刻を1か所ずつ入れる作業と、枠と拘束時間を足し上げる作業が、印の付いた便の確認に置き換わるからです。 段階を飛ばさないでください。 半自動化の表を1か月使うと、押し忘れの多い配送先と、作業時間が日によって大きく違う配送先が先に分かります。そこを直してからモデルを入れるほうが、見込みが安定します。
05工数削減シミュレーション
導入後 900件 × 2分 ÷ 60 = 30 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 自社のトラックで量販店・飲食店・工場などへ毎日決まった配送先を回り、翌日の配車計画を前日の夕方に作っている運送会社や、配送部門を持つ卸・製造の会社。到着予定の時刻を配車担当の経験で入れており、担当が休むと計画の精度が落ちる場合。車載端末(デジタルタコグラフなど)で配送先ごとの到着・出発の時刻が1年分以上残っている場合。
- 配送先が毎日入れ替わるスポットの配送が中心で、同じ配送先の実績がたまらない場合。便が数本で、配車担当が全便の事情を把握できている場合。到着・出発の時刻が記録されておらず、伝票の締めの時刻しか分からない場合。なお、配送の順番を最適に組み直すこと、ドライバーの労働時間の管理と改善基準告示の遵守の判断は、この構成では代替できません。
07最小構成で試す方法
- 実績の多い便を3本選び、過去3か月の車載端末の記録を書き出す
- 表計算で、区間ごとの走行時間と配送先ごとの作業時間を出す
- 配送先・曜日・時間帯ごとに、作業時間の中央値と、上位2割の境目の値を出す
- 次の1週間、その3本の便について、中央値で積み上げた到着予定を配車担当の予定と並べて出す
- 1週間後、実績の到着と、2つの予定のどちらが近かったかを数える
3本の便で1週間は必ずやってください。 モデルを組む前に、「過去の実績から到着の時刻が見込めるのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 中央値の積み上げが、経験の浅い担当の予定より近い | モデルの組み立てに進む |
| 走行は近いが、作業時間が大きく外れる | 到着と作業開始が分かれていない。記録の付け方を直せば構成は有効 |
| どちらも大きく外れる | 押し忘れが多いか、便ごとの事情が大きい。 記録の見直しが先 |
2行目が出ることは珍しくありません。 失敗ではなく、待ちの時間が記録されていなかったと分かったということです。 その場合は、ドライバーに「到着」と「作業開始」を分けて押してもらう期間を1か月置いてから、同じことをやり直してください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 待ちと荷降ろしが分けられない | 「到着」と「作業開始」を分けて記録する |
| 遅めの予定が後ろの配送先ほど大きすぎる | 遅めの見込みを単純に足さず、2乗の和の平方根で上乗せする |
| 遅めの予定を超える割合が2割から離れる | 配送先ごとに割合を見て、材料を足すか分位点を見直す |
| 押し忘れの記録で見込みが振れる | 外れた記録を外し、外した割合を配送先ごとに数える |
| 個数が多いのに作業時間が短く出る | monotonic_cst で個数・重量を増える向きに固定する |
| 配送先が多くて区分に入りきらない | 件数の少ない配送先を種類ごとの「その他」にまとめる |
| 枠の境目の便を見落とす | 照合は丸める前の値で行う |
| 早く着きすぎて待ちが増える | early_risk で出発を遅らせられる便を拾う |
| 順番まで変えてほしいと言われる | この構成は順番を組み直さない。 人が決める |
| 拘束時間の印を勤務の管理に使う | 印は目安。判断は実際の勤務の記録で運行管理者が行う |
| 工事や行事の日に外れる | 道路の情報は見ない。配車担当が直す前提にする |
上の2行が、この構成の失敗のほとんどです。 待ちが分けられないと遅れの理由が分からず、遅めの予定が大きすぎるとほとんどの便に印が付いて、誰も一覧を見なくなります。
下の2行も、同じくらい早く効いてきます。 見込みが当たり始めると、拘束時間の印をそのまま勤務の管理に使いたくなります。目安と記録を分けておくことを、運用の決まりに書いておいてください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 配送先の住所と納品の時間の枠、荷主ごとの取引の量、ドライバーごとの運転と休憩の記録です。運転と休憩の記録は、個人の働き方が分かる情報です。
- 社内で動かす … 集計とモデルは社内のサーバーで動かし、配送先の住所や車載端末の記録を外部のサービスへ送りません
- ドライバーの評価に使わない … 作業時間の実績は、配送先の荷受けの事情で大きく変わります。見込みとの差をドライバー個人の評価に使うと、到着と作業開始を正しく押してもらえなくなります。 材料にドライバーの名前を入れないのも、この理由です
- 改善基準告示の遵守の判断を代替しない … トラック運転者の改善基準告示では、1日の拘束時間(原則13時間、最大15時間)、連続運転時間(4時間まで)などが決められています。この構成の印は前日の目安で、遵守の確認は実際の勤務の記録で行います
- 荷主の情報を混ぜない … 荷主ごとの取引の量と特売の予定は、荷主から預かった情報です。確認の一覧を他の荷主の担当者が見られる場所に置かないでください
- 取り込みは人が行う … 到着予定は荷主に共有され、センターの予約に使われます。確認する前の予定が外に出ないよう、書き込みを自動にしません
- モデルの版を管理する … どの版のモデルで、どの予定を出したかを残します
誤りが起きた場合のリスクは、遅れる便を間に合うと見込むことと、無理のある勤務を見落とすことの2つです。 前者は遅めの予定で照らすことで、後者は拘束時間と連続運転の印で減らします。どちらも最後は配車担当と運行管理者が見る設計にしています。
10まず何から始めるか
1週目:実績の付け方を確かめる
車載端末の記録で、配送先ごとに「到着」「作業開始」「出発」が分かれて残っているかを確かめます。分かれていなければ、ドライバーに押し方を説明し、分けて押してもらう期間を始めます。
2週目:3本の便で試す
実績の多い便を3本選び、表計算で配送先ごとの作業時間の中央値を出して、1週間分の到着予定を配車担当の予定と並べます。どちらが実績に近かったかを数えます。
3週目:配送先のマスタを整える
指定時間の枠と荷受けの種類(センター・店舗・工場)を、配送先のマスタに入れます。 荷主から届く特売の予定を、日付と荷主の表にする手順も決めます。
4週目:実績の取り込みをつなぐ
Python で車載端末の書き出しを毎日読み、区間と配送先ごとの所要時間の表を作るところまで作ります。この時点では到着予定を出さず、表だけを配車担当に使ってもらいます。
2か月目: 分位点のモデルと積み上げ、照合と印を足し、取り込み用の表を出します。遅めの予定を実績が超えた割合を毎週数えます。3か月目以降: 学び直しを週1回の決まった手順にし、1便7分が何分になったかを実測します。配送先ごとの見込みとの差を荷主との時間の相談に使えるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
HistGradientBoostingRegressor の loss に quantile(pinball loss)があり、quantile に0から1の値で見込む分位点を指定すること。categorical_features で列の名前や区分の型(from_dtype)を区分として扱い、1つの区分の値は max_bins までであること。monotonic_cst で増える向き(1)・減る向き(-1)を列ごとに指定できること。欠けた値を扱えること(scikit-learn 1.9.1) | scikit-learn: HistGradientBoostingRegressor | 2026-10-14 |
TimeSeriesSplit が前の期間で学び後の期間で試す分け方で、他の分け方では未来のデータで学ぶことになるため時系列には不適とされること(scikit-learn 1.9.1) | scikit-learn: TimeSeriesSplit | 2026-10-14 |
| トラック運転者の改善基準告示(2024年4月1日以降)で、1日の拘束時間が13時間を超えないものとし、延長する場合の最大が15時間であること。連続運転時間が4時間を超えないものとし、運転の中断が1回おおむね10分以上・合計30分以上であること。工場等の配達部門の運転者も、運転業務が主であれば対象になること | 厚生労働省: トラック運転者の改善基準告示 | 2026-10-14 |
配送の順番、出発の時刻、勤務の割り当ては、配車担当と運行管理者の判断で決めてください。 本記事は公開されている仕様と厚生労働省のページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1451)についてのご相談はこちらから。
