人材派遣の会社が契約・稼働・派遣先の記録から、翌月に派遣先の都合で更新されない契約を Python で予測し、派遣先への訪問と次の仕事の準備の順番を決める
派遣契約の台帳、勤怠、派遣先ごとの発注の推移、営業の訪問の記録から、Python で翌々月の初めまでに満了する契約ごとに「派遣先の都合で更新されない」確率を出します。営業は確率の高い契約から派遣先を訪ね、スタッフの次の仕事を探し始めます。
- 連携・自動化
- Python
- 対象業界
- 人材
- 対象部門
- 営業
- 対象業務
- 分類・仕分け/集計・分析
- 主な課題
- 営業フォローが追いつかない/属人化している/期限・対応漏れが起きる
- AIで行う処理
- 予測
- 主な効果
- 判断支援/属人化解消/機会損失防止
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 月の初めに、営業課の事務が基幹システムから翌々月の初めまでに満了する契約の一覧を書き出し、更新の管理表に貼る
- 営業が自分の担当の契約を1件ずつ見て、最近の訪問の記録、残業の多さ、派遣先の様子を思い出す
- 「危なそう」と思う契約に印を付け、派遣先への訪問の予定を入れる
- 満了日の1か月前をめどに、派遣先に更新の意向を確かめる
- 更新しないと告げられたら、スタッフに伝え、次の仕事を探し始める
- 課長が週に1回、更新の管理表の印と回答を見て、遅れている営業に声をかける
- 自動毎月の第1営業日の朝、Python が基幹システムから書き出した契約・勤怠・請求・訪問の記録を読み込む
- 自動翌々月の初めまでに満了する契約ごとに、その日の時点で分かっていた記録だけから項目を作る
- 自動学習済みのモデルで、派遣先の都合で更新されない確率を出し、較正した値に直す
- 自動契約ごとに、目立つ変化(同じ部署の人数の減り、残業の減り、依頼の止まり)を規則で書き出す
- 自動確率の高い順に並べ、営業ごとの一覧と、課全体の一覧を作る
- 人営業が一覧の上から、自分の担当の契約の目立つ変化を確かめ、訪問の予定を入れる
- 人課長が週に1回、上位の契約の訪問の結果と派遣先の回答を一覧で見る
- 人派遣先の都合の終了が見込まれる契約は、スタッフの希望を聞き、次の仕事を探し始める
各工程の詳しい説明を読む
- 月の初めに、営業課の事務が基幹システムから翌々月の初めまでに満了する契約の一覧を書き出し、更新の管理表に貼る
- 営業が自分の担当の契約を1件ずつ見て、最近の訪問の記録、残業の多さ、派遣先の様子を思い出す
- 「危なそう」と思う契約に印を付け、派遣先への訪問の予定を入れる
- 満了日の1か月前をめどに、派遣先に更新の意向を確かめる
- 更新しないと告げられたら、スタッフに伝え、次の仕事を探し始める
- 課長が週に1回、更新の管理表の印と回答を見て、遅れている営業に声をかける
(a)更新しないと告げられるのが満了の直前になる。 4番の確認は満了日の1か月前が目安ですが、派遣先の担当者は「社内で確認します」と答えを先に延ばすことがあります。答えが出るのが満了の2週間前になると、スタッフの次の仕事を探す時間がほとんど残りません。 先に派遣先を訪ねて様子を聞いていれば、もっと早く分かった契約も混ざっています。
(b)2番が担当者の記憶に寄っている。 50件の契約を1件ずつ見て、どこが危ないかを決めるのは経験です。新しい営業や、担当を引き継いだばかりの営業には、派遣先の様子の記憶がありません。 同じ記録を見ても、印を付ける契約は人によって大きく違います。
(c)兆しは記録にあるのに、誰も並べて見ていない。 同じ部署の派遣の人数が3か月で減っている、スタッフの残業がこの2か月で半分になった、派遣先からの新しい依頼が止まっている。どれも基幹システムに残っていますが、契約ごとに並べて見る画面がありません。 営業は勤怠の画面と請求の画面と訪問の記録を行き来して見ています。
(d)次の仕事の準備が後追いになる。 派遣先の都合で終わったスタッフのうち、同じ組織単位で長く働いた人には、派遣元として雇用の安定のための措置を考える場面があります。終わると分かってから動くので、次の派遣先の紹介が満了に間に合わないことがあります。
- 【自動】 毎月の第1営業日の朝、Python が基幹システムから書き出した契約・勤怠・請求・訪問の記録を読み込む
- 【自動】 翌々月の初めまでに満了する契約ごとに、その日の時点で分かっていた記録だけから項目を作る
- 【自動】 学習済みのモデルで、派遣先の都合で更新されない確率を出し、較正した値に直す
- 【自動】 契約ごとに、目立つ変化(同じ部署の人数の減り、残業の減り、依頼の止まり)を規則で書き出す
- 【自動】 確率の高い順に並べ、営業ごとの一覧と、課全体の一覧を作る
- 【人】 営業が一覧の上から、自分の担当の契約の目立つ変化を確かめ、訪問の予定を入れる
- 【人】 課長が週に1回、上位の契約の訪問の結果と派遣先の回答を一覧で見る
- 【人】 派遣先の都合の終了が見込まれる契約は、スタッフの希望を聞き、次の仕事を探し始める
6番目で決めるのは営業です。 一覧は訪問の順番の案で、どの派遣先に何を聞きに行くかは、派遣先の担当者を知っている営業が決めます。
8番目は、スタッフに「終わりそう」と伝える工程ではありません。 派遣先の回答が出るまでは、終わるかどうかは決まっていません。営業がするのは、スタッフの希望の職種や通勤の範囲を聞き直し、次の候補を手元に用意しておくことです。 終わると決まったときに、すぐ紹介できる状態にしておきます。
02今回想定するシステム構成
派遣の基幹システム(契約の台帳・勤怠・請求・営業日報) + 更新の管理表(過去の更新の結果と、終わった理由の区分) │ 月に1回、決まった様式の CSV を書き出してフォルダに置く ▼【トリガー】毎月の第1営業日の朝(定時実行) Python(pandas) ├──▶ その日の時点の記録だけで契約ごとの項目を作る ▼ scikit-learn(HistGradientBoostingClassifier) │ 派遣先の都合で更新されない確率 ▼ scikit-learn(CalibratedClassifierCV + FrozenEstimator) │ 確率を、数字どおりの割合で当たる値に較正 ▼ Python ── 目立つ変化を規則で書き出し、営業ごとの一覧を作る ▼ 【人】営業が上から確かめ、訪問の予定と次の仕事の準備を決める
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・scikit-learn) | R |
| 処理エンジン | scikit-learn の HistGradientBoostingClassifier と CalibratedClassifierCV | LightGBM、XGBoost |
| 集計 | Python(目立つ変化の書き出し、営業ごとの一覧) | スプレッドシートの計算式 |
| 保管 | 社内のファイルサーバー(書き出した CSV、一覧、予測の記録) | - |
新しく足すのは、Python の処理と、更新の管理表の「終わった理由の区分」の列です。 基幹システムには書き込みません。この構成が出すのは、契約ごとの確率と目立つ変化の一覧までです。
予測のエンジンに HistGradientBoostingClassifier を選んだのは、派遣の記録の形に合うからです。 職種や派遣先の業種のような区分は、pandas の Categorical の列にしておけば categorical_features の既定の 'from_dtype' でカテゴリとして扱われます。入ったばかりのスタッフの「3か月前の残業」のような欠けた値も、埋めずに学習できます。 欠けた値を持つ行を、分岐ごとに左右どちらへ送るかを学習するとされています。
確率の較正には CalibratedClassifierCV を使います。 学習済みのモデルは FrozenEstimator で包んで渡すと、渡したデータをすべて較正に使い、学習と較正のデータが重ならないように分けるのは使う側の責任とされています。期間で分けて渡します。
生成AIは使いません。 予測は記録の数の問題で、営業に渡すのは確率と目立つ変化の表です。
03どうやって実装するのか
処理の起点を決める
毎月の第1営業日の朝に1回動かします。 対象は、その月の翌月から翌々月の初めまでに満了する契約です。翌月の初めに満了する契約は、その日の時点で満了まで30日ほどしかなく、訪問しても間に合わないことが多いため、上の一覧には載せつつ印を変えます。 主に見るのは、満了まで5〜9週ほどある契約です。
動かすのは、基幹システムの月の締めのあとです。 前の月の勤怠と請求が締まっていないと、直近の残業や人数の推移が欠けて出ます。締めの日が遅れた月は、締めのあとにずらして動かします。 締まる前の記録で作った一覧には、表の上に「勤怠の締め前」と印字します。
モデルの作り直しは3か月に1回にします。 派遣先の都合の終了は月に数十件なので、毎月作り直すと当たり方が揺れます。作り直す前と後で直近3か月の当たり方を比べ、悪くなっていれば前のモデルのまま使います。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 契約の台帳 | 契約番号、派遣先、部署(組織単位)、職種、開始日と満了日、更新の回数、契約期間の長さ、事業所単位と個人単位の抵触日 | 基幹システム |
| 勤怠 | スタッフごと・月ごとの出勤日数、残業時間、派遣先の指示による休み | 基幹システム |
| 請求 | 派遣先ごと・部署ごと・月ごとの派遣の人数と請求の時間 | 基幹システム |
| 派遣先からの依頼 | 新しい依頼、増員・交代の依頼、依頼の取り消しの日付 | 基幹システムの受注の記録 |
| 営業日報 | 訪問の日付と、決まった区分(担当者の交代、業務量の話、苦情、単価の話) | 基幹システムの営業日報の欄 |
| 更新の結果 | 過去の契約ごとの更新・終了と、終わった理由の区分(派遣先の都合/本人の都合/直接雇用/その他) | 更新の管理表 |
| 派遣先の情報 | 業種、決算の月、取引を始めた時期 | 基幹システムの取引先の情報 |
質を決めるのは、いちばん下から2つ目の「終わった理由の区分」です。 これが無いと、派遣先の都合と本人の都合を分けられません。多くの会社では、終わった理由は営業日報の自由な文にしか残っていません。 導入の最初の仕事は、過去2年分の終わった契約に区分を付け直すことです(第14章)。
営業日報は、自由な文をそのまま使いません。 訪問のたびに、決まった区分(担当者の交代、業務量の話、苦情、単価の話)に印を付ける欄を足し、印の数を項目にします。 文の言い回しは営業ごとに違い、そのまま使うと書き方の癖を学習します。
スタッフの年齢、性別、国籍、家族の事情は入力に入れません。 予測しているのは派遣先の都合の終了で、スタッフの属性は要らないうえに、使えば属性で扱いを分けることにつながります。
データの取得方法を決める
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 契約の台帳 | 基幹システムの帳票の書き出し(CSV) | 対象の契約と、更新の回数・抵触日 |
| 勤怠と請求 | 月の締めのあとの書き出し(CSV) | 残業と人数の推移 |
| 依頼の記録 | 受注の一覧の書き出し | 依頼の止まりと取り消し |
| 営業日報の区分 | 営業日報の書き出し | 訪問の間隔と区分の数 |
| 更新の結果 | 更新の管理表を CSV で保存 | 学習の答え |
書き出しの様式は最初に固定し、読み込むときは列の名前で選びます。 帳票の列の並びは画面で変えられることが多いためです。
すべての記録は「いつの時点で分かっていたか」を持たせて保存します。 勤怠は後から直されることがあり、更新の管理表の回答は日々書き換わります。月ごとの書き出しをそのまま残し、学習のときは各月の書き出しを使います。 最新の台帳で過去を作り直すと、後から分かったことが過去の項目に入ります。
AIへ渡す前に整形する
- 答えを付ける … 過去の契約ごとに、満了の時点で「派遣先の都合で終わった」を1、「更新された」を0とします。本人の都合と直接雇用への切り替えで終わった契約は、学習から外します
- 基準の日をそろえる … 各契約について、満了日の5〜9週前に当たる月の第1営業日を基準の日とし、その日までに分かっていた記録だけで項目を作ります
- 推移の項目を作る … 直近3か月の残業の平均と、その前の3か月との比、同じ部署の派遣の人数の3か月前との差、派遣先全体の請求の時間の前年同月との比
- 契約の項目を作る … 更新の回数、契約期間の長さ、抵触日までの月数、満了の月が派遣先の決算の月か、職種、派遣先の業種
- 訪問と依頼の項目を作る … 最後の訪問からの日数、直近3か月の区分ごとの印の数、直近3か月の新しい依頼と取り消しの数
- 区分を Categorical にする … 職種、派遣先の業種、満了の月を pandas の Categorical の型にします
- 期間で分ける … 古い順に学習・較正・確かめの3つに分けます。混ぜて分けません
1番目で本人の都合を外すのは、答えの意味をはっきりさせるためです。 本人の都合の終了を0に入れると、「本人が辞めた契約は派遣先の都合では終わらなかった」と教えることになり、本人が辞めそうな契約ほど確率が低く出ます。 本人の都合は UC-1407 のような別の見込みで扱います。
2番目がいちばん大事な前処理です。 満了の直前の記録には、派遣先がすでに終わりを告げたあとの動きが入ります。派遣先が交代の依頼を取り消した、更新の管理表に「先方検討中」と入った、といった記録を項目に入れると、当たり方は良く見えますが、使う時点では手に入りません。 基準の日より後の記録は使いません。
AIに処理させる
させるのは、契約ごとに「派遣先の都合で更新されない」確率を出すことだけです。 機械学習のモデルを1本作り、その確率を較正します。
| 出すもの | 作り方 | 使いみち |
|---|---|---|
| 派遣先の都合の終了の確率(生の値) | HistGradientBoostingClassifier の predict_proba | 並べ替えの元 |
| 較正した確率 | CalibratedClassifierCV(FrozenEstimator で包み、method="sigmoid") | 訪問の対象をどこで切るかの判断 |
| 目立つ変化 | 規則で書き出す(モデルの中身ではない) | 営業が派遣先で何を聞くかの材料 |
目立つ変化は、モデルの判断の理由ではありません。 「同じ部署の人数が3か月で2人減った」「残業が前の3か月の半分以下」「最後の訪問から60日以上」のような、決まった規則に当たった記録を書き出すだけです。営業が派遣先を訪ねたときに、何を聞くかの手がかりにします。モデルがなぜその確率を出したかの説明として使わないでください。
| 確率の帯 | 一覧の印 | 営業の動き |
|---|---|---|
| 較正した確率が30%以上 | 赤 | 2週間以内に派遣先を訪ね、スタッフの次の候補を探し始める |
| 15%以上30%未満 | 橙 | 次の定期の訪問で、業務量と人数の見通しを聞く |
| 15%未満 | - | これまでどおり満了の1か月前に意向を確かめる |
30%と15%の線は、 営業が月に訪ねられる数と釣り合うよう、課長と営業が最初の3か月で決めます。
| させないこと | 理由 |
|---|---|
| スタッフに終わりを告げること | 派遣先の回答が出るまで、終わるかは決まっていない |
| 雇止めの予告の要否と時期の判断 | 予告が要るかは契約の更新の回数や勤続で決まり、会社として判断する |
| 確率を派遣先に見せること | 派遣先との関係に関わる。見せるのは訪問で聞いた話だけ |
| 確率でスタッフの扱いを変えること | 次の仕事の紹介の順番や条件を、確率で下げない |
| 本人の都合の終了の見込み | 別の兆しと打ち手。別のモデルで扱う |
2行目は、とくに気を付けてください。 厚生労働省の告示では、3回以上更新した、または雇入れから1年を超えて続けて働いている人の有期労働契約を更新しないときは、少なくとも満了の日の30日前までに予告するとされています。予告は会社としての判断で行うもので、確率が高いことを理由に予告を出すものではありません。 派遣先の都合の終了が決まったら、予告の要否と時期を、契約の更新の回数と勤続から担当が確かめます。
指示内容を固定する
生成AIを使わないので、プロンプトはありません。 かわりに、学習と較正の中身を示します。
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.calibration import CalibratedClassifierCV
from sklearn.frozen import FrozenEstimator
FEATURES = ["renewal_count", "term_months", "months_to_conflict_site",
"months_to_conflict_person", "is_client_fiscal_month",
"job_type", "client_industry",
"ot_recent3_mean", "ot_ratio_prev3", "dept_headcount_diff3",
"client_hours_yoy", "days_since_visit", "visit_flag_staff_change",
"visit_flag_workload", "new_orders3", "cancel_orders3"]
# job_type・client_industry は pandas の Categorical にしておく
# 期間で3つに分ける(古い順に 学習 / 較正 / 確かめ)
train = df[df["base_date"] < "2025-10-01"]
calib = df[(df["base_date"] >= "2025-10-01") & (df["base_date"] < "2026-04-01")]
test = df[df["base_date"] >= "2026-04-01"]
base = HistGradientBoostingClassifier(
max_iter=500, learning_rate=0.05, class_weight="balanced",
early_stopping=True, validation_fraction=0.15, random_state=0)
base.fit(train[FEATURES], train["client_end"])
cal = CalibratedClassifierCV(FrozenEstimator(base), method="sigmoid")
cal.fit(calib[FEATURES], calib["client_end"])
test = test.assign(p=cal.predict_proba(test[FEATURES])[:, 1])
class_weight="balanced" を使うのは、派遣先の都合の終了が少ないからです。 600件のうち数十件しか無い答えをそのまま学習すると、ほとんどの契約に低い確率を出すモデルになります。「balanced」はクラスの数に反比例する重みを付けるとされています。そのかわり生の確率は実際より高く出るので、較正で数字どおりの割合に戻します。
較正の方法に sigmoid を選んでいるのは、較正に使う件数が多くないからです。 公式のページでは、isotonic は較正のデータが1,000件をはるかに下回るときは過学習しやすいため勧めないとされ、大きく偏ったデータでは sigmoid のほうが向くことがあるとされています。6か月分の較正の期間でも、派遣先の都合の終了は数百件に届きません。
early_stopping を明示的に有効にしているのは、既定の 'auto' では学習の行が10,000を超えるときにしか有効にならないからです。 2年分の契約でも、本人の都合を外すと超えないことがあります。
確かめの期間では、月ごとに上位60件(営業12名が1人5件ずつ先に訪ねられる数)の当たりの割合を出し、営業がこれまで付けていた印と比べます。
出力形式を固定する
営業に渡すのは、次の一覧です。 営業ごとに自分の担当の契約だけを並べたものと、課全体のものの2つを作ります。
【2026年11月 第1営業日 作成(モデル作成 2026-10-01)/対象:12月〜1月初めに満了】
印 | 確率 | 契約番号 | 派遣先・部署 | 職種 | 満了日 | 更新回数 | 目立つ変化
赤 | 0.42 | K-20431 | 〇〇工業 第2製造課 | 製造補助 | 12/31 | 5 | 部署の人数 3か月で -3/残業 前3か月の0.4倍
赤 | 0.33 | K-19877 | △△物流 入荷センター | 軽作業 | 12/15 | 2 | 新しい依頼 3か月0件/最後の訪問から74日
橙 | 0.21 | K-20102 | □□商事 経理部 | 一般事務 | 1/5 | 7 | 満了の月が派遣先の決算の月/訪問で「担当者の交代」
- | 0.06 | K-20518 | ◇◇電機 品質保証課 | 検査 | 12/31 | 3 | -
「更新回数」の列を並べているのは、予告の要否を確かめる手がかりにするためです。 3回以上更新した契約が派遣先の都合で終わると決まったときは、満了の30日前までの予告が要るかを担当が確かめます。 一覧が予告の要否を判断するわけではありません。
機械で読む用には、同じ内容を CSV でも残します。 列は、契約番号、基準の日、生の確率、較正した確率、印、目立つ変化の規則の番号、モデルの作成日です。翌々月に実際の結果と並べて当たり方を見るのは、この CSV です。
確率を較正した値で出すので、 営業は「0.42」を「このような契約が10件あれば4件ほど終わる」と読めます。目立つ変化が添えてあれば、「部署の人数が3か月で3人減った」から「来期の人員の計画は」と聞けます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 派遣の基幹システム | 月に1回、決まった様式の帳票を CSV で書き出してフォルダに置く | 契約・勤怠・請求・依頼・営業日報 |
| 更新の管理表 | スプレッドシートを CSV で保存して読む | 過去の更新の結果と、終わった理由の区分 |
| 営業ごとの一覧 | 社内のファイルサーバーの、営業ごとに権限を分けたフォルダに置く | 自分の担当の契約の確率と目立つ変化 |
| 基幹システムの契約の台帳 | 書き込まない | - |
基幹システムには書き込みません。 確率を契約の台帳の欄に入れると、請求や勤怠の画面を見る他の担当者の目にも入り、スタッフへの接し方に影響しかねません。 一覧は営業課の中だけで使います。
営業ごとの一覧のフォルダは、担当の営業と課長だけが開けるようにします。 課全体の一覧は課長だけが見ます。
人が確認する
- 作った日時とモデルの作成日を見る … 一覧の上の日付が当月の第1営業日であることを確かめます
- 赤の契約の目立つ変化を確かめる … 自分が知っている派遣先の事情(期末の人員計画、新しい設備の導入)と合うかを見ます
- 訪問の予定を入れる … 赤の契約は2週間以内に訪ねる予定を入れ、橙は次の定期の訪問で聞く項目に加えます
- 訪問の結果を更新の管理表に入れる … 派遣先が話した見通しを、決まった区分で残します
- 次の仕事の準備を始める … 赤の契約のスタッフの希望を聞き直し、次の候補を手元に用意します
2番目で確率が低すぎると思った契約は、営業の判断で赤に上げてかまいません。 上げた契約と理由は記録に残します。
目標は、600件をならして1件2分です。 印の無い契約は一覧で流し見るだけで、時間を使うのは赤と橙の契約の目立つ変化を確かめ、訪問の予定を入れるところです。
例外に対処する
| 起きること | 対応 |
|---|---|
| 基幹システムの書き出しの列が変わっている | 列の名前で読み、決めた列が無ければ止めて事務に知らせる |
| 勤怠の締めが終わっていない | 一覧の上に「勤怠の締め前」と印字。締めのあとに作り直す |
| 就業して3か月未満で推移の項目が作れない | 欠けた値のまま予測し、一覧に「就業3か月未満」と出す |
| 初めて取引する派遣先 | 派遣先の推移の項目が欠ける。一覧に「新しい派遣先」と出し、確率を参考にとどめる |
| 終わった理由の区分が空の過去の契約 | 学習から外し、件数を記録する |
| 派遣先の工場の閉鎖など、記録に無い大きな事情 | 営業が赤に上げ、理由を記録する |
| 作り直したモデルが前より外れる | 前のモデルのまま使い、作り直しの記録を残す |
| 動かなかった(パソコンの停止など) | 担当が手で実行する。作った日付の古い一覧は使わない |
4行目と6行目は、モデルが知りようのない契約です。 営業の耳のほうが早い場面に備え、営業が上げられる作りにしておきます。
記録を残す
- 実行の日時、使ったモデルの作成日、読み込んだ書き出しの月
- 契約ごとの生の確率、較正した確率、印、目立つ変化
- 営業が上げ下げした契約と、その理由
- 訪問の日付と、派遣先が話した見通し(決まった区分)
- 実際の結果(更新・派遣先の都合の終了・本人の都合の終了)と、派遣先が終わりを告げた日
- 月ごとの当たり方(上位60件の当たりの割合、終わった契約のうち上位60件に入った割合、較正した確率の帯ごとの実際の割合)
5つ目の「派遣先が終わりを告げた日」が、この構成の効き目を測る物差しです。 一覧を使う前と後で、告げられた日が満了の何日前だったかを比べます。早く分かるようになっていれば、スタッフの次の仕事を探す時間が増えたということです。
最後の行の「確率の帯ごとの実際の割合」で、較正が効いているかを見ます。 0.3〜0.4の帯の契約のうち、実際に終わったのが3〜4割なら較正は合っています。大きくずれていれば、較正の期間を新しくします。
04実装レベルの3段階
本記事の想定は本格構成です。 半自動化では確率の順の一覧までで、営業はまだ勤怠と請求の画面を開いて、なぜ上にあるのかを調べます。 第3章の(c)の画面の行き来が半分ほど残ります。 半自動化で1件5分が3分ほどに、本格構成で2分になります。 差が大きいのは、目立つ変化が一覧に書き出されると、画面を開いて理由を探す時間が無くなるからです。 段階を飛ばさないでください。 半自動化の一覧を3か月使うと、営業が上げ下げした契約の傾向が分かり、項目に足すものが見えてきます。
05工数削減シミュレーション
導入後 600件 × 2分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 事務・製造・物流などの登録型の派遣を行い、ひとつの営業所で毎月数百件の派遣契約が更新の時期を迎える人材派遣の会社。契約の台帳と勤怠の記録が2年分ほど残っていて、更新しなかった契約に「派遣先の都合」「本人の都合」の別が付いている、または付け直せる場合。派遣先から更新しないと告げられるのが満了の直前になり、スタッフの次の仕事の紹介が間に合わない、営業の訪問が担当者の勘で決まっている、ということが続いている場合。
- 派遣先が数社に限られ、営業が全部の契約の様子を把握できている場合。契約の台帳に更新しなかった理由が残っておらず、付け直すこともできない場合。紹介予定派遣が中心で、契約の終わり方が直接雇用への切り替えで決まる場合。なお、雇止めの予告、雇用安定措置の内容、派遣先との契約の条件の判断は、この構成では代替できません。
07最小構成で試す方法
- 基幹システムから、過去2年分の契約の台帳と、月ごとの勤怠・請求を書き出す
- 去年の1年分の終わった契約に、「派遣先の都合/本人の都合/直接雇用/その他」の区分を付ける
- 第7章の前処理のうち、基準の日、推移の項目、契約の項目までを作る
- 1年目で学習し、2年目の前半で較正し、2年目の後半の各月で上位60件の当たり方を見る
- 同じ月に営業が更新の管理表に付けていた印と並べる
訪問の記録と依頼の項目は、最初は入れなくてかまいません。 確かめたいのは、残業と人数の推移と契約の項目だけで、営業の印と同じくらい当てられるかです。
| 出てきた内容 | 判断 |
|---|---|
| 上位60件の当たりが、営業の印と同じかそれ以上 | 訪問の記録と依頼の項目を足し、毎月の一覧を出す段階に進む |
| 当たりが営業の印より大きく低い | 終わった理由の区分と、基準の日のそろえ方を確かめる |
| 当たりが良すぎる(上位がほぼ全部当たる) | 基準の日より後の記録が入っている。 前処理を見直す |
3行目は、ほとんどの場合、時点のずれです。 更新の管理表の「先方検討中」の欄や、交代の依頼の取り消しが項目に紛れ込んでいます。当たりすぎる結果は、喜ぶ前に疑ってください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 本人の都合の終了を0として学習する | 学習から外す。 答えを派遣先の都合だけに絞る |
| 満了の直前の記録で当たりが良すぎる | 基準の日より後の記録を使わない。当たりすぎを疑う |
| 最新の台帳で過去の項目を作る | 月ごとの書き出しを残し、その月の書き出しで作る |
| 生の確率をそのまま読む | class_weight="balanced" で高く出る。較正してから読む |
| 較正に isotonic を使って揺れる | 件数が少ないときは sigmoid |
| 学習と較正のデータが重なる | FrozenEstimator で包むときは、期間で分けて渡す |
| 目立つ変化をモデルの理由として説明する | 規則に当たった記録の書き出しで、理由ではないと一覧に書く |
| 営業日報の自由な文をそのまま使う | 決まった区分の印の数にする |
| 帳票の列の並びが変わる | 列の名前で読み、無ければ止める |
| 確率でスタッフの扱いを変える | 紹介の順番や条件を確率で下げない |
上の3行が、この構成の失敗のほとんどです。 どれも答えと項目の時点がずれることから起きます。当たり方が良く見えても、使う時点では手に入らない記録で当てているなら、毎月の一覧はまったく当たりません。
最後の行は運用で出てくる問題です。 一覧は営業課の中だけで、訪問の順番を決めるために使います。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 派遣スタッフの勤怠と残業、契約の更新の回数、派遣先ごとの人数と請求、営業の訪問の記録です。スタッフの勤怠は個人情報で、派遣先ごとの人数や請求は取引先の秘密にあたる情報です。
- データを外に出さない … 予測は社内のパソコンの中で動き、生成AIや外部のサービスに記録を送りません
- スタッフの属性を入力に入れない … 年齢、性別、国籍、家族の事情は使いません。予測の対象は派遣先の都合の終了で、属性は要りません
- 確率を見る人を絞る … 一覧は担当の営業と課長だけが開けるフォルダに置きます。基幹システムの欄には書き込みません
- 確率でスタッフの扱いを変えない … 確率が高い契約のスタッフを、次の仕事の紹介の順番や条件で後回しにしないでください。確率は派遣先を訪ねる順番の材料で、スタッフの評価ではありません
- 雇止めの予告は会社として判断する … 告示では、3回以上更新した、または雇入れから1年を超えて続けて働いている人の有期労働契約を更新しないときは、少なくとも満了の30日前までに予告するとされています。予告の要否と時期は、派遣先の回答を受けて担当が判断します
- 雇用の安定の措置を早めに考える … 労働者派遣法第30条は、同じ組織単位で続けて1年以上働く見込みのある有期雇用の派遣労働者などについて、派遣先への直接雇用の依頼、新しい派遣先の提供などの措置を派遣元に求めています(3年の見込みがある人には義務)。一覧で早く分かった契約は、この措置を考え始める時期を前に倒す材料に使えます
誤りが起きた場合のリスクは、終わる契約を見逃して次の仕事の準備が遅れることと、確率が社内でスタッフへのラベルとして回ることの2つです。 前者は営業が上げられる作りと月ごとの当たり方の確認で抑え、後者は見る人を絞ることと、確率でスタッフの扱いを変えない決まりで防ぎます。
10まず何から始めるか
1週目:終わった理由の区分を決める
「派遣先の都合/本人の都合/直接雇用/その他」の4つの区分と、それぞれに入れる例を営業課で決めます。「業務縮小」「人員削減」「プロジェクトの終了」は派遣先の都合、「本人が別の仕事を見つけた」は本人の都合、のように具体的に並べます。
2〜3週目:過去2年分に区分を付ける
更新の管理表と営業日報を見ながら、過去2年分の終わった契約に区分を付けます。営業ごとに自分の担当だった契約を受け持ち、迷ったものは課長が決めます。 あわせて、今月から終わった契約には区分を必ず付ける決まりにします。
4週目:1年分で試す
第8章のとおり、1年目で学習し、2年目で当たり方を見ます。営業の印と比べ、当たりすぎていないかを最優先で見ます。
2か月目: 毎月の第1営業日に確率の順の一覧を出す半自動化を始め、営業はこれまでどおり自分の印も付けながら一覧と見比べます。 翌々月に、どちらが多く当てたかを書き残します。3か月目以降: 較正と目立つ変化の書き出し、営業ごとの一覧を足します。営業日報に区分の印の欄を足し、項目に加えます。派遣先が終わりを告げた日が満了の何日前かを毎月数え、それが早まり、営業が一覧の上から訪問の予定を決められるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
HistGradientBoostingClassifier の class_weight に 'balanced' があり、クラスの数に反比例する重みを付けること。categorical_features の既定が 'from_dtype' で Categorical の列をカテゴリとして扱うこと。欠けた値を分岐ごとに左右どちらへ送るか学習すること。early_stopping='auto' は行が10,000を超えるときなどに有効になること。predict_proba で確率を返すこと(版 1.9.1) | scikit-learn: HistGradientBoostingClassifier | 2026-10-28 |
学習済みの分類器を FrozenEstimator で包んで較正でき、その場合は渡したデータをすべて較正に使い、学習と較正のデータを分けるのは使う側の責任であること。method に sigmoid・isotonic・temperature があること。isotonic は較正のデータが1,000件をはるかに下回るときは過学習しやすく勧めないこと。大きく偏ったデータでは sigmoid が向くことがあること | scikit-learn: CalibratedClassifierCV | 2026-10-28 |
| 労働者派遣法第30条が、同じ組織単位の業務で続けて1年以上働く見込みのある特定有期雇用派遣労働者などに、派遣先への労働契約の申込みの依頼、新しい就業の機会の提供などの措置を講ずるよう派遣元に求め、3年の見込みがある人には講じなければならないとしていること。第26条が労働者派遣契約に契約の解除にあたっての雇用の安定の措置を定めるとしていること | e-Gov 法令API: 労働者派遣事業の適正な運営の確保及び派遣労働者の保護等に関する法律 | 2026-10-28 |
| 有期労働契約(3回以上更新し、または雇入れから1年を超えて継続勤務している者に係るもの。あらかじめ更新しない旨を明示したものを除く)を更新しないときは、少なくとも期間の満了する日の30日前までに予告すること。更新しない理由の証明書を請求されたら遅滞なく交付すること | 厚生労働省: 有期労働契約の締結、更新、雇止め等に関する基準(平成15年厚生労働省告示第357号) | 2026-10-28 |
雇止めの予告、雇用安定措置の内容、派遣先との契約の条件は、自社の労務の担当と社会保険労務士に確かめて決めてください。 本記事は上記の公開情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-2222)についてのご相談はこちらから。
