ハイヤー会社が予約の台帳・曜日・催し・天気の記録から Python で翌週の日ごとの配車の需要を予測し、乗務員の勤務と応援の手配の案を出す
ハイヤー会社の予約の受付の記録と曜日・催し・天気から、Python で翌週の日ごと・時間帯ごとに、これから積み上がる予約を含めた最終の配車の数を幅付きで予測します。勤務の表と比べて、休日の出勤や協力会社への応援を頼む日と、休みを勧める日の案を出します。
- 連携・自動化
- Python
- 対象業界
- その他/物流
- 対象部門
- 経営企画
- 対象業務
- 集計・分析
- 主な課題
- 人手が足りない/判断に時間がかかる/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/属人化解消/機会損失防止
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 木曜に、事務が配車の仕組みから翌週の日ごとと時間帯ごとの予約の数を書き出す
- 前年の同じ週と、先週の日ごとの最終の配車の数を書き出して並べる
- 配車の責任者が、催し(国際会議、株主総会の集中する日、展示会、大使館の行事)と週間天気予報を見て、日ごとに「あと何台増えるか」を見立てる
- 見立てた数と、役員送迎の契約の数を足して、時間帯ごとの必要な乗務員の数を決める
- 勤務の表の出勤の数と比べ、足りない日は乗務員に休日の出勤を頼み、それでも足りなければ協力会社に応援を頼む
- 余りそうな日は、乗務員に休みを取るよう勧める
- 週の途中で予約が見立てより増えた日は、前日に協力会社へ電話で応援を頼む
- 人事務が、翌週の催し(国際会議、株主総会の集中する日、展示会、大使館の行事、大きな式典)と、週間天気予報の日ごとの天気を予定のシートに入れる
- 自動木曜の朝、Python が配車の仕組みの予約の書き出し、予定のシート、勤務の表を読み込む
- 自動翌週の日ごと・時間帯ごとに、いま台帳に入っている予約の数を数え、取り消しの見込みを引く
- 自動学習済みのモデルで、利用日までに積み上がる予約を含めた最終の配車の数を、下振れ・中央・上振れの3つで予測する
- 自動時間帯ごとの必要な乗務員の数に置き換え、勤務の表の出勤の数と並べて、足りない日・余る日に印を付ける
- 自動休日の出勤を頼む人数、協力会社への応援の台数、休みを勧める人数の案を出す
- 人配車の責任者が印の付いた日を中心に見て、勤務と応援の依頼を決める
- 【自動/人】 月曜と水曜の朝に、その週の残りの日を予測し直し、責任者が直すかを決める
各工程の詳しい説明を読む
- 木曜に、事務が配車の仕組みから翌週の日ごとと時間帯ごとの予約の数を書き出す
- 前年の同じ週と、先週の日ごとの最終の配車の数を書き出して並べる
- 配車の責任者が、催し(国際会議、株主総会の集中する日、展示会、大使館の行事)と週間天気予報を見て、日ごとに「あと何台増えるか」を見立てる
- 見立てた数と、役員送迎の契約の数を足して、時間帯ごとの必要な乗務員の数を決める
- 勤務の表の出勤の数と比べ、足りない日は乗務員に休日の出勤を頼み、それでも足りなければ協力会社に応援を頼む
- 余りそうな日は、乗務員に休みを取るよう勧める
- 週の途中で予約が見立てより増えた日は、前日に協力会社へ電話で応援を頼む
(a)応援の依頼が前日になる。 3番の見立てが外れて予約が増えると、7番で前日に協力会社へ電話します。協力会社も同じ日に忙しいことが多く、前日だと車が空いていません。 断られた分は、自社の乗務員に休日の出勤を頼むか、新しい予約を断ることになります。断った予約は、その法人の次の予約にも響きます。
(b)余る日がある。 逆に「まだ増える」と見立てて乗務員を多めに出した日に予約が伸びず、車庫で待つ乗務員が出ます。 待つ時間も拘束の時間で、乗務員の残業の枠を使ってしまいます。
(c)見立てが責任者の頭の中にある。 どの法人がいつごろ予約を入れてくるか、雨の日はどれだけ増えるか、株主総会の週はどうなるかは、責任者が長年の経験で知っています。責任者が休みの週は、前年の写しで決まり、連休の並びが変わった年に大きく外れます。
(d)取り消しが読めていない。 冠婚葬祭と観光の貸切は、直前に取り消されることもあります。台帳の数をそのまま見ると、取り消される分まで乗務員を手配します。 取り消しの起きやすさは予約の種類で違いますが、それを数字で見ている人はいません。
- 【人】 事務が、翌週の催し(国際会議、株主総会の集中する日、展示会、大使館の行事、大きな式典)と、週間天気予報の日ごとの天気を予定のシートに入れる
- 【自動】 木曜の朝、Python が配車の仕組みの予約の書き出し、予定のシート、勤務の表を読み込む
- 【自動】 翌週の日ごと・時間帯ごとに、いま台帳に入っている予約の数を数え、取り消しの見込みを引く
- 【自動】 学習済みのモデルで、利用日までに積み上がる予約を含めた最終の配車の数を、下振れ・中央・上振れの3つで予測する
- 【自動】 時間帯ごとの必要な乗務員の数に置き換え、勤務の表の出勤の数と並べて、足りない日・余る日に印を付ける
- 【自動】 休日の出勤を頼む人数、協力会社への応援の台数、休みを勧める人数の案を出す
- 【人】 配車の責任者が印の付いた日を中心に見て、勤務と応援の依頼を決める
- 【自動/人】 月曜と水曜の朝に、その週の残りの日を予測し直し、責任者が直すかを決める
7番目で決めるのは配車の責任者です。 モデルが出すのは台数と人数の案で、どの乗務員に休日の出勤を頼めるか、どの協力会社にどの車種を頼めるかを知っている責任者が決めます。
応援の依頼は、足りない見込みが出た時点で前もって打診します。 第3章の(a)で前日の依頼が断られていたのは、協力会社も同じ日に車が埋まるからです。上振れの見込みで足りない日は、木曜のうちに協力会社へ空きを聞いておきます。
02今回想定するシステム構成
配車の仕組みの書き出し(予約の受付・取消の日時、利用日、時間帯、車種、予約の種類) + 過去の天気(気象庁の過去の気象データ)+ 祝日(内閣府の CSV) + 翌週の催しと天気予報(事務が入れる予定のシート) + 勤務の表(翌週の乗務員ごとの出勤・休み) │ ▼【トリガー】毎週木曜の朝、月曜と水曜の朝(事務所のパソコンの定時実行) Python(pandas) ├──▶ 過去の日ごとに「利用日の何日前に、何件が台帳にあったか」を組み立てる ▼ scikit-learn(HistGradientBoostingRegressor) │ 最終の配車の数:中央(ポアソン)・下振れと上振れ(分位点) ▼ Python ── 時間帯ごとの必要な乗務員の数に置き換え、勤務の表と並べる ▼ Python ── 休日の出勤・応援の台数・休みを勧める人数の案 ▼ 【人】配車の責任者が勤務と応援の依頼を決める
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・scikit-learn) | R |
| 処理エンジン | scikit-learn の HistGradientBoostingRegressor(ポアソン損失と分位点損失、単調性の制約) | LightGBM、statsmodels |
| 集計 | Python(取り消しの見込み、乗務員の数への換算、勤務の表との突き合わせ) | スプレッドシートの計算式 |
| 保管 | Google スプレッドシート(予定、換算の規則、決めた勤務と応援の記録) | - |
新しく足すのは、Python の処理と、予定のシート、換算の規則の表です。 配車の仕組みと勤務の表はこれまでどおりで、この構成は勤務の表も配車の仕組みも書き換えません。 出すのは日ごとの案です。
予測のエンジンに HistGradientBoostingRegressor を選んだのは、3つの理由からです。 1つ目は、損失を目的に合わせて替えられることです。配車の数は0以上の数なので、中央の見込みには loss="poisson"(目的の値が0以上であることが要る)を使い、下振れと上振れには loss="quantile" で分位を指定します。2つ目は、特徴ごとに単調性の制約を monotonic_cst で付けられることです。「いま台帳にある数が多いほど、最終の数も多い」という当たり前の関係を、モデルに守らせます。3つ目は、欠けた値をそのまま扱えることです。学習のときに欠けた値を分岐の左右どちらへ送るかを学ぶとされ、天気の欠けた日を行ごと捨てずに済みます。
生成AIは使いません。 予測は数の問題で、配車の責任者に渡すのは日ごとの表です。
03どうやって実装するのか
処理の起点を決める
毎週木曜の朝に1回、翌週の7日分を動かします。 翌週の勤務の表を乗務員に配るのが金曜なので、配車の責任者が木曜のうちに案を見て、協力会社へ打診できる時刻にします。事務所のパソコンの定時実行の仕組み(Windows ならタスク スケジューラ)で Python のスクリプトを起動します。
月曜と水曜の朝にも、その週の残りの日を予測し直します。 予約は日を追って積み上がるので、木曜に出した見込みより、月曜の台帳のほうが多くのことを知っています。 やり直すたびに、利用日まであと何日かという項目が変わり、幅が狭くなります。
月に1回、モデルを作り直します。 毎月の第1木曜に先月までの記録で学習し直し、作り直す前と後で、先月の当たり方を比べた結果を残します。悪くなっていれば、前のモデルのまま使います。
結果の表には、作った日時と、読み込んだ予約の書き出しの日時を必ず印字します。 予約の書き出しが古いまま動くと、台帳の数が少なく出て、「まだ増える」と過大に見込むからです。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 予約 | 予約の番号、受け付けた日時、取り消した日時、利用日、迎えの時刻、車種、予約の種類(契約・空港・会議接待・冠婚葬祭・観光)、拘束の見込みの時間 | 配車の仕組みの書き出し(CSV) |
| 配車の実績 | 利用日ごとの実際に出た車と乗務員、協力会社に頼んだ台数、断った予約の数 | 配車の仕組みの書き出し |
| 過去の天気 | 日ごとの降水量・気温など | 気象庁の過去の気象データ・ダウンロード(CSV) |
| 祝日 | 国民の祝日の日付 | 内閣府の祝日の CSV |
| 予定 | 翌週の催し、天気予報の天気、大きな式典や交通の規制 | 予定のシート(事務が入れる) |
| 勤務の表 | 翌週の乗務員ごとの出勤・休み・勤務の種類(早番・日勤・遅番) | 勤務の表(スプレッドシート) |
| 換算の規則 | 予約の種類と時間帯ごとの1台あたりの拘束の時間、早番と遅番で受けられる時間帯 | 換算の規則の表(配車の責任者と決める) |
質を決めるのは、予約を受け付けた日時と取り消した日時です。 利用日と配車の記録だけでは、「利用日の5日前に、何件が台帳にあったか」を後から組み立てられません。
断った予約の数も、できれば数えます。 車が足りなくて断った予約は、配車の実績には残りません。断った日の実績は、本当の需要より少なく出ています。
天気は日ごとの値を使います。 気象庁の過去の気象データ・ダウンロードでは、地点と項目と期間を選んで観測値を CSV で落とせるので、営業所の近くの観測地点の日ごとの降水量と気温を取ります。
データの取得方法を決める
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 予約と取り消し | 配車の仕組みから、過去3年分と翌週の分を CSV で書き出し、決まったフォルダに置く | 台帳の積み上がりの組み立てと、いま入っている数 |
| 配車の実績 | 配車の仕組みから週に1回書き出す | 最終の配車の数と、断った数 |
| 過去の天気 | 月に1回、気象庁のページから CSV を落とす | 降水と気温の項目 |
| 祝日 | 年に1回、内閣府の CSV を入れ替える | 祝日の印 |
| 勤務の表 | スプレッドシートを CSV で書き出して読む | 翌週の出勤の数 |
気象庁の CSV には、値の列のほかに品質情報や均質番号、現象なし情報の列が並びます。 値の列だけを名前で選んで読みます。列の位置で読むと、降水量の列に品質情報が入ります。
祝日の CSV は、翌年の分が前の年の2月に載るとされています。年に1回、2月に入れ替えます。年末の時点で翌年の祝日が無いと、1月の連休を平日として予測します。
予約の書き出しには、利用者の名前、迎えと行き先の住所、法人名が含まれます。 読み込むときに、日時・車種・予約の種類・拘束の時間以外の列を捨てます。予測に要るのは数と時刻だけです。
AIへ渡す前に整形する
- 台帳の積み上がりを組み立てる … 過去の利用日ごとに、利用日の13日前から前日まで、その時点で受け付け済みで、まだ取り消されていない予約の数を数えます。受け付けた日時と取り消した日時から、毎日の時点の台帳を作り直します
- 時間帯に分ける … 迎えの時刻で、早朝(5〜9時)、日中(9〜17時)、夜(17時以降)の3つに分けます。乗務員の早番・日勤・遅番に合わせた区切りです
- 予約の種類で分ける … 契約の送迎は数が決まっているので予測から外し、単発の予約(空港・会議接待・冠婚葬祭・観光)だけを学習の対象にします
- 取り消しの率を作る … 予約の種類と、利用日まであと何日かごとに、過去に取り消された割合を出します
- 断った日に印を付ける … 断った予約の数が残っている日は、最終の数に足した値を別の列に持ちます
- 項目を作る … 利用日まであと何日か、いま台帳にある数、曜日、祝日とその前後、連休の何日目か、月、月末か、降水の有無と量、催しの種類、前年の同じ週の同じ曜日の最終の数、直近4週の同じ曜日の平均
- 曜日・月・催しを Categorical にする … pandas の Categorical の型にしておけば、既定の設定でカテゴリとして扱われます
1番目が、この構成の肝です。 学習の1行は「ある利用日を、その何日前に見たか」の組で、同じ利用日が13行に分かれて入ります。 こうしておくと、木曜に翌週の金曜(8日前)を見る場合も、水曜に同じ金曜(2日前)を見る場合も、同じモデルで予測できます。
3番目で契約の送迎を外すのは、二重に数えないためです。 契約の送迎は台帳に毎日同じ数が載っていて、それを学習に混ぜると、モデルは「台帳の数がだいたい最終の数」と覚えます。 読めない単発の部分だけを予測し、契約の数は台帳からそのまま足します。
4番目の取り消しの率は、冠婚葬祭と観光で大きく違います。いま台帳にある数から取り消しの見込みを引いた値を、モデルの項目に入れます。
AIに処理させる
させるのは、翌週の日ごと・時間帯ごとの単発の予約の最終の数を予測することだけです。 機械学習のモデルを3本作ります。
| 出すもの | 損失 | 使いみち |
|---|---|---|
| 中央の見込み | loss="poisson" | 必要な乗務員の数の目安 |
| 下振れの見込み(0.2) | loss="quantile"、quantile=0.2 | 休みを勧める人数(余る日を見つける) |
| 上振れの見込み(0.8) | loss="quantile"、quantile=0.8 | 協力会社へ前もって打診する台数 |
休みを勧めるのに下振れを使うのは、休みを勧めて足りなくなると取り返しにくいからです。 下振れでも乗務員が余る日だけ、休みを勧めます。応援の打診に上振れを使うのは、打診は断れるからです。 空きを聞いておき、月曜と水曜のやり直しで要らなくなれば取り下げます。どの分位を使うかは、断る予約と待つ乗務員のどちらを重く見るかで、配車の責任者と決めます。
乗務員の数への置き換えは、換算の規則で行います。 時間帯ごとの予約の数に、予約の種類ごとの1台あたりの拘束の時間を掛けて、その時間帯に必要な乗務員の延べの時間を出し、1人の勤務の時間で割ります。
| 上振れでの必要な人数と出勤の数の差 | 案 | 表の印 |
|---|---|---|
| 下振れでも出勤が2人以上多い | 休みを勧める人数を出す | 青 |
| 中央と上振れの間に出勤の数がある | 通常。月曜と水曜のやり直しを見る | 黄 |
| 上振れで足りない | 休日の出勤の依頼と、協力会社への打診の案 | 赤 |
ハイヤーの乗務員の労働時間の扱いも、案を出すときに見ます。 厚生労働省の改善基準告示のページでは、タクシーの拘束時間の上限の表はハイヤーの運転者には適用されないとされ、ハイヤーの運転者の時間外・休日労働の協定の延長時間は1か月45時間、1年360時間を限度とし、臨時的特別な事情がある場合でも1年960時間を超えないものとされています。休日の出勤を頼む案には、その乗務員の今月の時間外の累計を並べ、枠に近い人を候補から外します。
| させないこと | 理由 |
|---|---|
| 勤務の決定と、乗務員への出勤の依頼 | 乗務員の事情と労働時間の管理を知る責任者が決める |
| 協力会社への依頼と料金の取り決め | 取引の判断。責任者が決める |
| 予約を受けるか断るかの判断 | 受付の担当が台帳の空きで決める |
| 初めての催しの効果 | 記録が無い。責任者が上乗せする |
| 天気予報そのもの | 事務が予報を見て入れる |
3行目は、とくに気を付けてください。 予測が少なめの日に予約を断る理由に使わないでください。予測は勤務を決めるための見込みで、目の前の予約を受けるかは、その時点の車と乗務員の空きで決めます。
指示内容を固定する
生成AIを使わないので、プロンプトはありません。 かわりに、台帳の積み上がりの組み立てと予測の中身を示します。
from sklearn.ensemble import HistGradientBoostingRegressor
def snapshot(bookings, use_date, days_ahead):
"""use_date の days_ahead 日前の時点で、台帳に残っていた単発の予約の数"""
t = use_date - pd.Timedelta(days=days_ahead)
b = bookings[(bookings["use_date"] == use_date) & (bookings["kind"] != "contract")]
alive = (b["booked_at"] <= t) & (b["cancelled_at"].isna() | (b["cancelled_at"] > t))
return b[alive].groupby("slot").size()
FEATURES = ["days_ahead", "booked_net", "weekday", "is_holiday", "holiday_seq",
"month", "month_end", "rain_mm", "event_type",
"last_year_same", "recent4w_same_mean"]
# weekday・month・event_type は pandas の Categorical にしておく
MONO = {"booked_net": 1} # 台帳の数(取り消しの見込みを引いた値)が多いほど最終も多い
def hgb(**kw):
return HistGradientBoostingRegressor(
max_iter=500, learning_rate=0.05, early_stopping=True,
validation_fraction=0.15, monotonic_cst=MONO, random_state=0, **kw)
center = hgb(loss="poisson")
lower = hgb(loss="quantile", quantile=0.2)
upper = hgb(loss="quantile", quantile=0.8)
for m in (center, lower, upper):
m.fit(train[FEATURES], train["final_spot"]) # 断った日は final_spot に断った数を足す
monotonic_cst を辞書で渡しているのは、特徴の名前で制約を付けるためです。 列の並びを後で変えても、制約が別の列に付くことがありません。カテゴリの列には単調性の制約を付けられないので、付けるのは台帳の数だけにします。公式の解説は、単調性の制約が特徴の効き方を「わずかにしか」縛らないとも書いています。
early_stopping を明示的に有効にしているのは、既定の 'auto' では学習の行が10,000を超えるときなどにしか有効にならないからです。
検証の行は、利用日で分けます。 同じ利用日の13行が学習と検証の両方に入ると、当たり方がよく見えすぎます。
初めての催しは、学習のときに無かったカテゴリになります。 公式の解説では、学習のときに見なかったカテゴリは予測のときに欠けた値として扱われるとされています。そのため、初めての催しの日は「催しなし」に近い見込みになります。 表に「初めての催し:上乗せ未定」と出し、責任者が上乗せします。
出力形式を固定する
配車の責任者に渡すのは、次の表です。 印刷して木曜の昼に見ることを前提にします。
【翌週の日ごとの配車の見込み(2026年11月第2週・木曜 7:32 作成/予約の書き出し 7:15)】
| 日 | 時間帯 | 契約 | 単発の台帳(取消見込みを引く) | 単発の最終(下振れ/中央/上振れ) | 必要な人数(上振れ) | 出勤 | 印 | 案 |
|---|---|---|---|---|---|---|---|---|
| 月 | 早朝 | 18 | 4 | 6/8/10 | 26 | 27 | - | 通常 |
| 水 | 夜 | 9 | 6 | 9/13/18 | 24 | 20 | 赤 | 休日の出勤2名、協力会社へ2台の打診 |
| 金 | 日中 | 20 | 11 | 18/23/29 | 41 | 38 | 黄 | 月曜・水曜のやり直しを見る |
| 日 | 日中 | 0 | 3 | 4/6/8 | 7 | 12 | 青 | 休みを勧める3名 |
「印」と「案」で、責任者が見る先を決めます。 赤の日は、休日の出勤を頼む乗務員と、打診する協力会社を決めます。青の日は、休みを勧める乗務員を決めます。 黄の日は、月曜と水曜のやり直しの結果を待ちます。
表の下には、休日の出勤の候補を並べます。 今月と今年の時間外の累計を並べ、枠に近い人には「候補外」の印を付けます。 候補を決めるのは責任者で、表は判断の材料です。
表の一番下には、注意の印を並べます。 初めての催しには「催しの上乗せ未定」、予定のシートが空の日には「予定未入力」を出します。
機械で読む用には、同じ内容を CSV でも残します。 列は、日、時間帯、契約の数、台帳の数、取り消しの見込み、下振れ・中央・上振れ、必要な人数、出勤の数、印、案、モデルを作った日付、利用日まであと何日で予測したかです。翌週に実績と並べて当たり方を見るのは、この CSV です。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 配車の仕組み | 毎朝、予約と配車の記録を CSV で書き出してフォルダに置く(名前・住所・法人名の列は捨てる) | 台帳の数と最終の配車の数 |
| 予定と換算の規則のシート | スプレッドシートを CSV で書き出して読む | 催し、天気予報、拘束の時間 |
| 勤務の表 | スプレッドシートを CSV で書き出して読む | 翌週の出勤と、時間外の累計 |
| 勤務の表と配車の仕組みへの書き込み | 書き込まない(責任者が決めてから直す) | - |
勤務の表は、責任者が決めてから事務が直します。 予測の案をそのまま勤務の表に入れる作りにすると、月曜と水曜のやり直しのたびに勤務が変わり、乗務員が予定を立てられません。 勤務の変更は、乗務員の同意が要る話でもあります。
人が確認する
- 作った日時と台帳の日時を見る … 表の上の2つの日時が当日の朝であることを確かめます
- 赤と青の日を見る … 休日の出勤を頼める乗務員、打診できる協力会社、休みを勧められる乗務員を決めます
- 時間外の累計を確かめる … 休日の出勤の候補が、協定の枠を超えないかを勤務の記録で確かめます
- 予測の外の事情を足し引きする … 役員の海外出張、大口の予約の打診、道路の規制などを足し引きします
目標は、30日をならして1件8分です。 印の無い日は案を写すだけで、時間を使うのは赤と青の日と、初めての催しの日です。
例外に対処する
| 起きること | 対応 |
|---|---|
| 予約の書き出しが古い・届いていない | 予測を止め、表の一番上に「台帳が古い」と出す |
| 取り消した日時が空の取り消しがある | 取り消しの区分だけ付いた行は、利用日の前日に取り消したものとして扱い、件数を記録 |
| 断った予約の記録が無い日 | 最終の数をそのまま使い、表に「断った数の記録なし」 |
| 大きな災害・大雪で運行を止めた日 | 予定のシートで止めた印を付け、学習から外す |
| 初めての催し | 「催しなし」に近い見込みになる。表に印を出し、責任者が上乗せ |
| 中央と上振れが交わる | 大きいほうを上振れとして使い、日数を記録 |
| 作り直したモデルが前より外れる | 前のモデルのまま使い、作り直しの記録を残す |
| パソコンが止まっていて動かなかった | 事務が手で実行。作った日時の古い表は使わない |
1行目がいちばん起きやすい失敗です。 赤の日が急に増えたら、まず書き出しの日時を見ます。
記録を残す
- 実行の日時、使ったモデルの作成日、読み込んだ予約の書き出しの日時と期間
- 日ごと・時間帯ごとの台帳の数、取り消しの見込み、下振れ・中央・上振れ、必要な人数、印、各案
- 責任者が決めた勤務と応援の依頼と、案から変えた理由
- 翌週の実績(最終の配車の数、協力会社に頼んだ台数、断った予約の数、車庫で待った時間)
- 月曜と水曜のやり直しの前と後の案
- 月ごとの当たり方(利用日まであと何日で予測したかごとの、中央の外れの大きさ、上振れを上回った日の割合)と、モデルの作り直しの結果
当たり方は、利用日まであと何日で予測したかに分けて見ます。2日前の予測が外れ続けるなら、直前の予約の入り方が変わっています。
3つ目と4つ目を並べると、応援の判断が合っていたかが分かります。 赤の日に前もって打診し、断った予約が出なかったなら、判断は働いています。青の日に休みを勧めて断った予約が出たなら、下振れの線を見直します。
04実装レベルの3段階
本記事の想定は本格構成です。 半自動化では配車の数の表までで、乗務員の数への置き換えと、勤務の表との突き合わせは責任者の手に残ります。 第4章の③の時間がそのまま残ります。 半自動化で1件30分が18分ほどに、本格構成で8分になります。 差が大きいのは、拘束の時間からの換算と勤務の表との突き合わせが、規則があれば機械で出せる作業だからです。 段階を飛ばさないでください。 半自動化の表を1か月見ると、どの曜日・時間帯・予約の種類の予測が当たり、どこが外れるかが分かります。外れる部分の記録を直してから、本格構成に進みます。
05工数削減シミュレーション
導入後 30件 × 8分 ÷ 60 = 4 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 車両が数十台ほどで、法人の役員送迎の契約に加えて、空港送迎・会議や接待・冠婚葬祭・観光の貸切の単発の予約を受けるハイヤー会社。配車の仕組みに予約を受けた日時と取り消した日時が残っている場合。翌週の乗務員の勤務を配車の責任者が前の週に決めていて、直前に予約が積み上がって協力会社に応援を頼む日と、車が余る日の両方がある場合。予約制の観光タクシーや、送迎の専業の会社にも使える。
- 流しと無線の配車が中心で、前もって予約で受ける仕事が少ないタクシー会社(乗車の記録から時間帯とエリアの需要を見る別の構成が向く)。予約を受けた日時が残らず、利用日の記録しか無い場合。車両が数台で、責任者が予約の一覧を見れば足りる場合。なお、乗務員の勤務の決定、労働時間の管理、協力会社への依頼と料金の取り決め、運行の安全の判断は、この構成では代替できません。
07最小構成で試す方法
- 配車の仕組みから、去年の秋から冬の4か月分の予約を、受け付けた日時と取り消した日時を付けて書き出す
- その期間に車が足りなくて断った予約と、協力会社に頼んだ日を、配車の日誌から拾う
- 気象庁の過去の気象データ・ダウンロードで、近くの地点の日ごとの降水量を落とす
- Python で第7章の組み立てと設定を動かし、その4か月の最後の4週を「翌週」として、8日前と2日前の時点で予測させる
- 当時の責任者の見立てと、実際の最終の配車の数と並べる
4か月・4週で十分です。 確かめたいのは、「台帳の数から最終の数を、責任者の見立てと同じくらい読めるか」です。
| 出てきた内容 | 判断 |
|---|---|
| 8日前と2日前の予測が、どちらも実績と近い | 予定のシートと換算の規則を作り、毎週の表を出す段階に進む |
| 2日前は合うが8日前が大きく外れる | 直前の予約の入り方が読めていない。予約の種類ごとの積み上がりを分けて見る |
| 混む日が低めに出る | 断った日が頭打ちになっている。断った数の記録を確かめる |
3行目は、ほとんどの会社で出ます。 断った予約の数が日誌にしか無いためで、失敗ではなく、断った数を記録する理由が数字で分かったということです。
秋から冬を選ぶのは、予約の振れが大きい時期だからです。 年末の会合の送迎、雨の日、年始の挨拶回りが入り、直前の積み上がりの効き方を短い期間で確かめられます。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 最終の数だけで学習し、台帳の数を使わない | 利用日まであと何日と、その時点の台帳の数を項目にする |
| 取り消された予約を台帳に数えたまま学習する | 時点ごとに、取り消した日時より前だけを数える |
| 契約の送迎まで予測して二重に数える | 単発の予約だけを予測し、契約は台帳の数を足す |
| 断った日が頭打ちのまま学習される | 断った数を記録し、最終の数に足す |
| 同じ利用日が学習と検証に分かれる | 利用日で分けて検証する |
| 運行を止めた日を少ない日として学習する | 行ごと外す |
| 気象庁の CSV を列の位置で読む | 品質情報などの列が並ぶ。列名で選ぶ |
| 単調性の制約を曜日に付けようとする | カテゴリの列には付けられない。台帳の数だけに付ける |
| 予約の書き出しが古いまま動く | 書き出しの日時を表に印字し、古ければ止める |
| 予約の書き出しの名前・住所を読み込む | 日時・車種・種類・拘束の時間以外の列を捨てる |
上の2行が、この構成の失敗のほとんどです。 どちらも、「その時点で何が分かっていたか」と「後から分かったこと」を混ぜることから起きます。取り消された予約を最初から無かったものとして数えると、過去の台帳が実際より少なく見え、モデルは「台帳の数より大きく伸びる」と覚えます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 予約の受付と取消の日時、利用日と時間帯、車種、予約の種類、配車の実績、乗務員ごとの出勤と時間外の累計です。予約の書き出しには、利用者の名前、迎えと行き先の住所、法人名が含まれることがあります。 役員の送迎の予定は、契約先にとって秘密の情報です。
- 利用者の名前・住所・法人名を予測に使わない … 予約の書き出しを読み込むときに、日時・車種・種類・拘束の時間以外の列を捨てます。予測に要るのは数と時刻だけです
- データを外に出さない … 予測は事務所のパソコンの中で動き、生成AIや外部のサービスに記録を送りません。役員の移動の予定が、数の形でも社外に出ないようにします
- 勤務は人が決める … 案はあくまで案で、休日の出勤を頼むかは、乗務員の事情と労働時間の管理を知る責任者が決めます。 予測の数を理由に、乗務員に出勤を強いる運用にしないでください
- 労働時間の枠を案の側でも守る … ハイヤーの運転者の時間外・休日労働は、協定の延長時間の限度が1か月45時間・1年360時間とされています。枠に近い乗務員を休日の出勤の候補から外す仕組みを案の段階に入れておきます。勤務の終わりのあとに一定の休息期間を与えることも、ページで求められています
- 予約を断る理由に使わない … 予測が少なめの日でも、目の前の予約はその時点の車と乗務員の空きで受けます
- 気象庁のデータの出典を書く … 天気のデータを社内の資料に載せるときは、気象庁のデータであることを書きます
誤りが起きた場合のリスクは、車が足りずに予約を断ることと、乗務員が余って拘束の時間を使ってしまうことの2つです。 前者は台帳の積み上がりや断った数の補いが足りないと起き、後者は上振れの線が高すぎると起きます。利用日まであと何日ごとの当たり方の確認で、両方を抑えます。
10まず何から始めるか
1週目:断った予約を記録し始める
車が足りなくて断った予約の件数と時間帯を、受付の担当が記録する決まりにします。過去の分も、配車の日誌から拾えるだけ拾います。 あわせて、配車の仕組みから受け付けた日時と取り消した日時を書き出せるかを確かめます。
2週目:4か月分で試す
第8章のとおり、去年の秋から冬の4か月分の予約で台帳の積み上がりを組み立て、最後の4週を8日前と2日前の時点で予測させます。取り消しを時点ごとに引けているか、混む日が低めに出ていないかを最優先で見ます。
3週目:換算の規則を決める
配車の責任者と一緒に、予約の種類と時間帯ごとの1台あたりの拘束の時間、休みを勧める分位と応援を打診する分位、時間外の累計で候補から外す目安を表にします。
4週目:翌週の表を毎週出す
木曜の朝に日ごと・時間帯ごとの配車の数の表を出す半自動化を始め、責任者はこれまでどおり自分で決めながら、表と見比べます。 翌週の金曜に、責任者の見立てと表の中央のどちらが実績に近かったかを書き残します。
2か月目以降: 乗務員の数への換算と勤務の表との突き合わせを足し、月曜と水曜のやり直しを始めます。責任者が案から変えた理由、利用日まであと何日ごとの当たり方、断った予約の数を毎月見ます。 責任者が印の付いた日だけを見て勤務と応援を決められるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
HistGradientBoostingRegressor の loss に 'poisson'(目的の値が0以上であることが要る)と 'quantile' があり quantile で分位を指定すること。monotonic_cst で特徴ごとに単調性の制約(1・0・-1)を付けられ、名前をキーにした辞書でも渡せること。categorical_features の既定が 'from_dtype' であること。欠けた値を分岐ごとに左右どちらへ送るか学習すること。early_stopping='auto' は行が10,000を超えるときなどに有効になること(版 1.9.1) | scikit-learn: HistGradientBoostingRegressor | 2026-10-29 |
| 単調性の制約は特徴の効き方をわずかにしか縛らないこと、カテゴリの特徴には付けられないこと。学習のときに見なかったカテゴリは予測のときに欠けた値として扱われること | scikit-learn: Ensembles(Histogram-Based Gradient Boosting) | 2026-10-29 |
| 過去の気象データ・ダウンロードで複数地点・複数項目の過去の観測値(日別値など)を CSV で落とせること。CSV に品質情報・均質番号・現象なし情報の列が並ぶこと | 気象庁: 過去の気象データ・ダウンロード(このページでできること) | 2026-10-29 |
| 国民の祝日の CSV が昭和30年から令和9年までを収録し、令和10年の分を前年の2月に掲載するとされていること | 内閣府: 国民の祝日について | 2026-10-29 |
| タクシーの拘束時間・休息期間の表はハイヤーの運転者には適用されないこと。ハイヤーの運転者の時間外・休日労働の協定の延長時間は1か月45時間・1年360時間を限度とし、臨時的特別な事情がある場合でも1年960時間を超えないものとされ、勤務終了後に一定の休息期間を与えるものとされていること | 厚生労働省: ハイヤー・タクシー運転者の改善基準告示 | 2026-10-29 |
乗務員の勤務、労働時間の管理、協力会社への依頼は、会社の判断で行ってください。 本記事は公開されている仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-2302)についてのご相談はこちらから。
