人材派遣会社が新しく就業を始めたスタッフの就業データから、90日以内に本人都合で契約が終わる見込みを Python で出し、初期のフォローの順番を決める
新しい派遣先で就業を始めたスタッフについて、就業の条件と最初の数週間の勤怠から、90日以内に本人都合で契約が終わる見込みを出します。コーディネーターが初週・3週目・6週目に誰から連絡するかを、毎週の一覧にします。
- 連携・自動化
- Python
- 対象業界
- IT・SaaS/人材/介護/物流
- 対象部門
- 営業
- 対象業務
- 分類・仕分け/集計・分析
- 主な課題
- 判断に時間がかかる/営業フォローが追いつかない/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/工数削減/機会損失防止
- 導入難易度
- ★★★★★
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 毎週月曜に、コーディネーターが派遣管理システムから自分の担当で就業90日以内のスタッフを一覧にする
- 1人ずつ、就業の条件(職種・勤務時間・時給・勤務地)と、紹介のときのメモを開いて読み直す
- 初週からの勤怠を開き、遅刻・欠勤・早退・残業を目で追う
- 過去のフォローの記録を開き、前回話したことと気になる発言を確かめる
- 気になる人に印を付け、その週に連絡する順番と、話す内容のメモを作る
- 電話か面談で連絡し、結果をフォローの記録に書く
- 派遣先の様子が気になるときは、派遣先担当の営業に伝える
- 自動毎週月曜の早朝に、派遣管理システムから就業・勤怠・終了の記録を書き出す
- 自動Python が、就業7日目・21日目・45日目を過ぎたスタッフを拾い、その時点で分かっている項目をそろえる
- 自動学習済みの Cox 比例ハザードモデルで、90日目まで続く見込みを出す
- 自動見込みを「高・中・低」の3段階に分け、効いている項目の上位3つを添える
- 自動コーディネーターごとに、その週に連絡する順番の一覧を作り、共有フォルダに置く
- 人コーディネーターが一覧を見て、連絡する順番を決め、話す内容を考える
- 人電話か面談で連絡し、結果を派遣管理システムのフォローの記録に書く
- 人派遣先の職場に理由がありそうなものは、派遣先担当の営業と相談する
- 自動月に1回、見込みと実際の終了を突き合わせ、当たり方の記録を残す
各工程の詳しい説明を読む
- 毎週月曜に、コーディネーターが派遣管理システムから自分の担当で就業90日以内のスタッフを一覧にする
- 1人ずつ、就業の条件(職種・勤務時間・時給・勤務地)と、紹介のときのメモを開いて読み直す
- 初週からの勤怠を開き、遅刻・欠勤・早退・残業を目で追う
- 過去のフォローの記録を開き、前回話したことと気になる発言を確かめる
- 気になる人に印を付け、その週に連絡する順番と、話す内容のメモを作る
- 電話か面談で連絡し、結果をフォローの記録に書く
- 派遣先の様子が気になるときは、派遣先担当の営業に伝える
(a)連絡の順番が担当者の勘で決まる。 2〜5番は毎週の作業で、何を重く見るかは担当者ごとに違います。勤怠の乱れを重く見る人、紹介のときの迷いを覚えている人、派遣先の評判で判断する人。担当替えのたびに、誰を先に見るかがリセットされます。
(b)勤怠に出たときには遅い。 欠勤や遅刻が続いてから連絡すると、本人の中では気持ちが決まっていることが少なくありません。手がかりは、就業の条件そのもの(通勤時間・前の仕事との時給の差・初めての職種か)に、勤怠より早く出ています。 しかしそれを毎週300人分見直す時間はありません。
(c)就業の日数で見方が変わることを扱えていない。 初週の欠勤1日と、2か月目の欠勤1日は、意味が違います。同じ一覧に並べて同じ印を付けると、立ち上がりの時期の人ほど見落とされます。
(d)終了の理由が後から読めない。 終了の記録は「本人都合」「派遣先都合」「契約満了」と自由記述が混ざり、同じ形で集計できないため、何が早期の終了につながったかを振り返れていません。
- 【自動】 毎週月曜の早朝に、派遣管理システムから就業・勤怠・終了の記録を書き出す
- 【自動】 Python が、就業7日目・21日目・45日目を過ぎたスタッフを拾い、その時点で分かっている項目をそろえる
- 【自動】 学習済みの Cox 比例ハザードモデルで、90日目まで続く見込みを出す
- 【自動】 見込みを「高・中・低」の3段階に分け、効いている項目の上位3つを添える
- 【自動】 コーディネーターごとに、その週に連絡する順番の一覧を作り、共有フォルダに置く
- 【人】 コーディネーターが一覧を見て、連絡する順番を決め、話す内容を考える
- 【人】 電話か面談で連絡し、結果を派遣管理システムのフォローの記録に書く
- 【人】 派遣先の職場に理由がありそうなものは、派遣先担当の営業と相談する
- 【自動】 月に1回、見込みと実際の終了を突き合わせ、当たり方の記録を残す
6番目が、この設計の分かれ目です。 一覧はあくまで「先に見る候補」で、順番を最終的に決めるのはコーディネーターです。 担当者が知っている事情(本人から事前に聞いている家庭の予定など)は、モデルには入っていません。
2番目で時点を3つに分けているのも意図してのことです。 7日目の見込みは就業の条件と初週の勤怠だけで出し、21日目・45日目はそこまでの勤怠を加えて出し直します。各時点で「それまでに分かっていること」しか使わないのが、この構成の決まりです。
02今回想定するシステム構成
派遣管理システム(就業・勤怠・終了の理由・フォローの記録) │ 毎週月曜の早朝に書き出し(CSV) ▼【トリガー】定時実行 Python(pandas) ├──▶ 終了の理由を「本人都合/派遣先都合/満了・その他」にそろえる ├──▶ 就業7日目・21日目・45日目の時点の項目を作る ▼ lifelines の CoxPHFitter(学習済みモデル) │ 90日目まで続く見込み・効いている項目 ▼ Python ── 3段階の区分、コーディネーターごとの一覧 ▼ 共有フォルダ(担当者ごとの一覧) ▼ 【人がフォローの順番を決めて連絡】 ▼ 派遣管理システム(フォローの記録) ── 翌月の当たり方の確認に使う
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・lifelines の CoxPHFitter) | R(survival パッケージ)、scikit-survival |
| 保管 | 社内の共有フォルダ(担当者ごとの一覧) | 既存のCRM |
| データの取得元 | 派遣管理システムの書き出し | 派遣管理システムのAPI |
派遣管理システムへは書き込みません。 この構成が出すのは見込みと一覧までで、フォローの記録を書くのは人です。 書き出しはCSVで足り、毎週同じ形で取れることだけを最初に確かめます。
予測の本体は、lifelines の CoxPHFitter です。 Cox の比例ハザードモデルを当てはめるもので、学習のときに渡す表には、各人の「続いた日数」の列(duration_col)と、出来事が観測されたかの列(event_col)を指定します。公式ページでは、event_col を指定しないと全員が打ち切られていない(全員で出来事が観測された)ものとして扱うとされています。 まだ就業が続いている人を「90日続いた人」でも「辞めた人」でもなく、途中までの記録として扱えることが、この題材で生存時間分析を選ぶ理由です。
係数の大きさには罰則(penalizer)を付けられます。 公式ページでは、回帰のときに係数の大きさへ罰則を付けるもので、推定を安定させ、互いに強く相関する項目を扱うのに役立つとされています。通勤時間と勤務地、時給と職種のように、似た情報を持つ項目が多い題材なので、罰則を付けて使います。
当たり方の物差しには、一致度(concordance index)を使います。 公式ページでは、打ち切りを考慮したうえで ROC AUC を生存時間のデータに一般化したものと説明されています。「早く終わった人ほど高い見込みが付いていたか」を、まだ続いている人を含めて測れます。
03どうやって実装するのか
処理の起点を決める
毎週月曜の早朝に、定時実行で動かします。 コーディネーターは月曜の朝にその週の連絡の予定を立てるので、それまでに一覧が置かれている必要があります。毎日動かすことも考えましたが、連絡の予定は週単位で立てるため、毎日一覧が変わると予定が立ちません。
対象は、その時点で就業7日目・21日目・45日目のいずれかを過ぎ、まだ次の時点の見込みが出ていない人です。週1回の実行なので、7日目を過ぎた直後の人もいれば、12日目の人もいます。時点は「その日数を過ぎた最初の月曜」に出すと決め、各人が各時点で1回ずつ一覧に載るようにします。
月に1回、学習し直すのではなく、当たり方を確かめるだけにします。 学習のし直しは四半期に1回とし、そのたびに一致度が前のモデルより下がっていないかを見てから入れ替えます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 就業の記録 | スタッフ番号、就業番号、派遣先、職種、勤務地、就業の開始日・終了日、終了の理由 | 派遣管理システム |
| 就業の条件 | 時給、勤務時間帯(日勤・夜勤・交替)、週の勤務日数、残業の見込み | 派遣管理システム |
| スタッフの経歴 | 派遣での就業の回数、同じ職種の経験の有無、前の就業の時給 | 派遣管理システム |
| 紹介の経過 | 紹介から就業開始までの日数、希望条件(勤務地・時間帯・曜日)のうち合っていた数 | 派遣管理システム |
| 初期の勤怠 | 日ごとの出勤・遅刻・早退・欠勤、残業の時間 | 派遣管理システム(勤怠) |
| 通勤 | 届け出た経路の片道の所要時間 | 派遣管理システム(交通費の届出) |
入れないものを先に決めます。 年齢、性別、国籍、家族の状況、健康の状態、住所そのものは入れません。早期の終了と統計的な関係があったとしても、それで連絡の順番を変えれば、属性で人を扱い分けることになります。 住所は通勤の所要時間に置き換えてから使い、住所そのものはモデルに渡しません。
フォローの記録の自由記述も、モデルには入れません。 書く量が担当者ごとに違い、「よく書く担当者のスタッフほど見込みが高く出る」という、担当者の癖を学んでしまうからです。 記述は一覧を見た担当者が自分で読みます。
データの取得方法を決める
派遣管理システムから、毎週同じ形のCSVを4つ書き出します。就業、勤怠、スタッフの経歴、交通費の届出です。スタッフ番号と就業番号で結び付けます。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 就業の開始日・終了日・終了の理由 | 就業のCSV | 続いた日数と、出来事(本人都合の終了)の有無 |
| 時給・勤務時間帯・職種 | 就業のCSV | 就業の条件の項目 |
| 前の就業の時給・経験 | 経歴のCSV | 前の仕事との差の項目 |
| 日ごとの勤怠 | 勤怠のCSV | 時点ごとの遅刻・欠勤の数 |
| 通勤の所要時間 | 交通費の届出のCSV | 通勤の項目 |
書き出したら、毎週同じ3つを機械で確かめます。 行数が前の週から大きく変わっていないか、就業の開始日が終了日より後になっている行が無いか、勤怠の最終日が実行日の前日まで届いているか、です。どれかが外れたら一覧を作らずに止め、担当者に知らせます。 書き出しの設定が変わっただけで、全員の見込みが静かにずれることを防ぎます。
学習用のデータは、過去2年分の就業から作ります。 90日の観察が終わっている就業はもちろん、終わっていない直近の就業も、その時点までの記録として入れます。 打ち切りを扱えるモデルなので、直近の就業を捨てる必要がありません。
AIへ渡す前に整形する
- 終了の理由をそろえる … 自由記述を「本人都合」「派遣先都合」「契約満了・その他」の3つに、担当者が決めた対応表で置き換えます。対応表に無い記述は人に回します
- 出来事と打ち切りを決める … 90日以内の本人都合の終了だけを出来事(1)とし、派遣先都合・満了での終了と、90日を超えて続いた人は、その日で打ち切り(0)とします
- 時点ごとの表を作る … 7日目の表は、7日目までに分かる項目だけで作ります。21日目・45日目の表は、その時点まで続いた人だけを入れ、そこまでの勤怠を加えます
- 項目を数値にする … 職種・勤務時間帯は区分ごとの0/1の列にし、時給の差は前の就業との差額にします
- 欠けている値を扱う … 初めて派遣で働く人は「前の就業の時給」がありません。0で埋めず、「初めての派遣」の列を立てて、差額は職種の平均との差で置き換えます
- 派遣先の過去の傾向の扱い … 派遣先ごとの過去の早期終了の割合は、学習の対象期間より前のデータだけで計算します
- 人数の少ない区分をまとめる … 年に数件しかない職種は「その他」にまとめます
2番目がいちばん大事な処理です。 派遣先の事業の都合で終わった就業を出来事に入れると、モデルはスタッフの様子ではなく、派遣先の業績を学んでしまいます。 本人都合と派遣先都合を分けられない記録は、学習から外します。
勤怠の数え方も、時点ごとに割合にそろえます。 週3日勤務の人と週5日勤務の人では、同じ7日間でも出勤の予定日数が違います。欠勤や遅刻は回数ではなく、予定日数に対する割合として列にします。 派遣先の休業日や、本人が事前に届けた休みは欠勤に数えません。
6番目も気を付けます。 同じ期間のデータで派遣先の傾向を計算すると、答えを先に見たのと同じことになり、学習のときだけ当たりが良く見えます。
AIに処理させる
させるのは、各時点で「90日目まで続く見込み」を出し、それに効いている項目を並べることだけです。
| 時点 | 使う項目 | 出すもの |
|---|---|---|
| 7日目 | 就業の条件、経歴、紹介の経過、通勤、初週の勤怠 | 90日目まで続く見込み、効いている項目の上位3つ |
| 21日目 | 上記+3週目までの勤怠 | 21日目まで続いた人の、90日目まで続く見込み |
| 45日目 | 上記+45日目までの勤怠と残業 | 45日目まで続いた人の、90日目まで続く見込み |
21日目以降は「そこまで続いた人の」見込みです。 lifelines の predict_survival_function には conditional_after を渡せるので、既に21日続いた人について、その先の見込みを出す形で計算できます。就業を始めた時点からの見込みを毎回出すと、続いている人ほど見込みが下がらず、2か月目の変化が見えません。
比例ハザードの仮定を確かめます。 Cox のモデルは、項目の効き方が時間を通じて一定であることを前提にしています。lifelines の check_assumptions は、項目ごとにこの仮定を検定し、満たさない項目と直し方の助言を出すとされています。勤務時間帯のように区分の少ない項目が仮定を満たさないときは、strata に入れて層ごとに基準を分けます。
| させないこと | 理由 |
|---|---|
| 紹介する・しないの判断 | 見込みは連絡の順番のためのもの。選考に使うと不利益な扱いになる |
| 契約を更新するかの判断 | 同上。更新は本人と派遣先の意向で決める |
| 終了の理由の推測 | 効いている項目は理由ではない。理由は本人に聞いて記録する |
| 属性による扱い分け | 年齢・性別・国籍などは入れない |
| 本人への見込みの通知 | 見込みは社内の連絡の順番づけにだけ使う |
3行目が、運用でいちばん起きやすい誤りです。 「通勤時間が効いている」は、通勤がつらいという意味ではありません。一覧に出た項目は、連絡のときに確かめる話題の候補にとどめます。
指示内容を固定する
生成AIは使わないので、プロンプトではなくPython の処理の要点を示します。
import pandas as pd
from lifelines import CoxPHFitter
H = 90
df = pd.read_csv("train_day7.csv")
df["duration"] = df["days_worked"].clip(upper=H)
df["event"] = ((df["end_reason"] == "self") & (df["days_worked"] <= H)).astype(int)
features = ["commute_min", "wage_diff", "first_dispatch",
"same_job_exp", "days_to_start", "match_count",
"shift_night", "absent_w1", "late_w1"]
cph = CoxPHFitter(penalizer=0.1)
cph.fit(df[features + ["duration", "event"]],
duration_col="duration", event_col="event")
print(cph.concordance_index_)
cph.check_assumptions(df[features + ["duration", "event"]])
now = pd.read_csv("score_day21.csv")
sf = cph.predict_survival_function(now[features], times=[H],
conditional_after=now["days_worked"])
now["stay_90"] = sf.loc[H].values
now["band"] = pd.cut(now["stay_90"], [0, 0.7, 0.85, 1.0],
labels=["高", "中", "低"])
決まりは3つです。 1つ目は、event を本人都合の終了だけで作ること。派遣先都合と満了は event=0(打ち切り)です。2つ目は、features に属性の列を入れないこと。列の一覧はコードの外の設定ファイルに置き、追加には営業部長と個人情報の担当の承認を要るようにします。3つ目は、21日目以降は conditional_after に、その時点までの就業日数を渡すことです。
区分の境目(0.7・0.85)は、最初は仮の値です。 過去のデータで「高」に入る人数がコーディネーター1人あたり毎週何人になるかを見て、連絡できる人数に合わせて決めます。 当たり方より、連絡しきれる人数に収まることを優先します。
出力形式を固定する
コーディネーターごとに、次の形の表をCSVで置きます。
| 列 | 中身 |
|---|---|
staff_no / assignment_no | スタッフ番号・就業番号 |
checkpoint | day7 / day21 / day45 |
days_worked | その時点までの就業日数 |
stay_90 | 90日目まで続く見込み(0〜1) |
band | 高 / 中 / 低 |
top_factors | 効いている項目の上位3つ(例:通勤75分、初めての派遣、初週の遅刻2回) |
last_follow_date | 前回の連絡日 |
model_version | 使ったモデルの版 |
効いている項目は、係数と、その人の値と平均との差の積の大きい順に3つ選びます。 項目名は担当者が読める言葉に置き換えます。「commute_min」ではなく「通勤75分」と書きます。
一覧の行は、たとえば次のようになります。
| staff_no | checkpoint | days_worked | stay_90 | band | top_factors | last_follow_date |
|---|---|---|---|---|---|---|
| S-10482 | day7 | 9 | 0.62 | 高 | 通勤75分/初めての派遣/初週の遅刻2回 | 初日 |
| S-10377 | day21 | 23 | 0.81 | 中 | 前の就業より時給が低い/夜勤 | 7日目 |
| S-10215 | day45 | 47 | 0.93 | 低 | 同じ職種の経験あり | 21日目 |
1行目のように初日以降の連絡が無い「高」の人が、その週の最初の連絡先になります。 3行目のような「低」の人は、決まりどおりの1か月目の連絡を入れるだけで足ります。
表にする理由は、並べ替えと絞り込みをコーディネーターに任せるためです。 band で絞ってから last_follow_date の古い順に並べる、という使い方を想定しています。見込みの数字そのものより、前回いつ話したかと合わせて見ることのほうが、順番を決めるのに役に立ちます。
model_version を必ず付けます。 モデルを入れ替えた週に見込みの並びが大きく変わったとき、スタッフの様子が変わったのか、モデルが変わったのかを分けるためです。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 派遣管理システム | CSVの書き出し(読み取りのみ) | 就業・勤怠・経歴・交通費の届出 |
| Python の実行環境 | 社内のサーバーの定時実行 | 前処理・見込み・一覧の作成 |
| 共有フォルダ | ファイルの保存 | コーディネーターごとの一覧 |
| 派遣管理システム | 人が入力 | 連絡の結果(フォローの記録) |
見込みは派遣管理システムに書き込みません。 スタッフの画面に見込みが表示されると、紹介や更新の場面で目に入り、使い道を守れなくなります。 一覧は担当のコーディネーターと、その上長だけが開ける共有フォルダに置きます。
人が確認する
- 一覧を見て順番を決める … コーディネーターが「高」の人から見て、自分が知っている事情を加えて順番を決めます
- 連絡する … 効いている項目を話題の候補にしつつ、本人の話を聞くことを優先します
- 結果を記録する … 話した内容と、職場の困りごとの有無をフォローの記録に書きます
- 派遣先に関わることを営業に渡す … 職場の環境や指示のしかたに理由があるものは、派遣先担当の営業と相談します
- 月1回、上長が見る … 「高」と出て連絡しなかった人が終了していないか、「低」なのに終了した人がいないかを確かめます
連絡の話し方は、一覧の項目から入らないようにします。 「通勤が大変ではないですか」と最初に聞くと、本人は見張られているように感じます。「最初の1週間はどうでしたか」と広く聞き、話の中で通勤や仕事の内容に触れたら、そこを詳しく聞くという順にします。効いている項目は、聞き漏らしを防ぐための控えです。
5番目を省かないでください。 「低」なのに終わった人の記録は、モデルが見ていない理由が何かを教えてくれます。 そこから入力の項目を足すかどうかを決めます。
例外に対処する
| 起きること | 対応 |
|---|---|
| 終了の理由が対応表に無い | 学習から外し、担当者に分類を頼む。対応表を足す |
| 通勤の届出が無い | commute_min を欠けとし、「届出なし」の列を立てる。見込みには注記を付ける |
| 勤怠の取り込みが遅れている | その週の21日目・45日目の見込みを出さず、7日目の分だけを出す |
| 同じスタッフが同時に2つの就業 | 就業番号ごとに出し、一覧では並べて示す |
| 就業の途中で派遣先が変わった | 新しい就業として数え直す |
check_assumptions で仮定を満たさない項目 | strata に入れるか、区分に分けて層にする |
| 一致度が前のモデルより下がった | 入れ替えず、前のモデルを使い続ける |
| 「高」の人数が担当者の連絡できる数を超える | 区分の境目を見直す。全員に連絡できる人数が上限 |
下から2行目は、四半期の学習し直しのたびに起こりえます。 新しいデータで学習したモデルが必ず良いとは限りません。下がったときに前のモデルへ戻せるよう、モデルは版ごとに保存します。
記録を残す
- 毎週の書き出しのCSVと、時点ごとに作った表
- 出した見込み(
stay_90・band・top_factors)とmodel_version - モデルの版ごとの係数、一致度、
check_assumptionsの結果 - 終了の理由の対応表と、その更新の履歴
- 連絡の結果(フォローの記録)と、その後の実際の終了
- 特徴量の列の一覧と、追加・削除を承認した記録
最後の行は、使い道を守るための記録です。 誰かが便利だと思って年齢の列を足すことを防ぐには、列の追加に承認が要り、その記録が残る仕組みにしておくのが確実です。
見込みの保存期間も決めておきます。 90日の観察が終わり、当たり方の確認に使い終えた見込みは、一定期間の後に消すと決めます。
04実装レベルの3段階
最小構成は、使えるかを確かめる段階です。 毎週の業務には使いません。 半自動化で、1件8分が5分程度になります。 初週の連絡は一覧で決まりますが、3週目以降の見直しは手作業のまま残ります。本格構成で3分になり、この段階が本記事の想定です。 差が出るのは、2か月目の見直しで勤怠を読み直す作業です。 段階を飛ばさないでください。 半自動化で2か月使うと、「高」の人数が多すぎる週、効いている項目が担当者に通じない言葉になっている箇所が分かります。そこを直してから時点を増やします。
05工数削減シミュレーション
導入後 300件 × 3分 ÷ 60 = 15 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 事務・軽作業・物流倉庫・コールセンター・介護などの登録型派遣で、毎月数百人が新しい派遣先で就業を始める人材派遣会社。就業を始めて1〜2か月での本人都合の終了が多く、派遣先への代わりの紹介と説明に追われている場合。コーディネーターが新しく就業したスタッフの誰に先に連絡するかを勘で決めている場合。就業の開始日・終了日・終了の理由・勤怠が、スタッフと就業の番号で2年分以上引ける場合。
- 新しく就業を始めるスタッフが月に数十人で、担当者が全員に初週・3週目・6週目の連絡を入れられている場合。終了の理由が記録されておらず、本人都合と派遣先都合を後から分けられない場合。なお、紹介するかどうか、どのスタッフをどの派遣先に就けるか、契約を更新するかの判断は、この構成では代替できず、見込みをその判断に使ってはいけません。
07最小構成で試す方法
- 過去1年に就業を始めた人の就業の記録(開始日・終了日・終了の理由)を書き出す
- 終了の理由を「本人都合」「派遣先都合」「満了・その他」に手で分ける
- 通勤時間、初めての派遣か、同じ職種の経験、初週の欠勤の4つだけを列にする
- Python で lifelines の CoxPHFitter を当て、一致度と係数を見る
- 直近3か月の就業について、7日目の見込みを出し、実際の終了と並べる
2番目の手作業を必ずやってください。 終了の理由を分ける作業で、記録がどれくらい分けられるかが分かります。 分けられない記録が多ければ、モデルより先に、終了の理由の記録の付け方を直します。
| 出てきた内容 | 判断 |
|---|---|
| 一致度が0.5を明らかに上回り、係数の向きが現場の感覚と合う | 時点を増やし、一覧の作成に進む |
| 一致度が0.5に近い | 項目が足りない。紹介の経過と勤怠を足して試す |
| 本人都合と派遣先都合を分けられない記録が多い | 記録の付け方が先。 モデルの問題ではない |
5番目では、コーディネーターにも同じ直近3か月の就業について「気になっていた人」を挙げてもらいます。 モデルの「高」と担当者の挙げた人がどれだけ重なるか、重ならない人のうち実際に終わったのはどちらの側かを見ると、モデルが担当者の勘に何を足せるのかが分かります。
3行目は珍しくありません。 その場合は、終了の連絡を受けたときに理由を3つから選ぶ欄を派遣管理システムに足し、3か月ためてから試し直します。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 派遣先都合の終了を出来事に入れる | 本人都合だけを出来事にする。 他は打ち切り |
| まだ続いている人を捨てる、または「続いた人」に数える | 打ち切りとして入れる。event_col を必ず指定する |
| 時点より後の勤怠が表に混ざる | 時点ごとの表を、日付で切ってから作る |
| 派遣先の傾向を同じ期間で計算する | 学習期間より前のデータだけで計算する |
| 似た項目が多く係数が不安定 | penalizer を付ける |
| 項目の効き方が時期で変わる | check_assumptions で確かめ、strata に入れる |
| 21日目以降も開始時点からの見込みを出す | conditional_after にその時点までの日数を渡す |
| 「高」が多すぎて連絡しきれない | 区分の境目を連絡できる人数で決める |
| 効いている項目を理由として本人に伝える | 項目は話題の候補にとどめる |
| 見込みを紹介や更新に使う | 見込みを派遣管理システムに載せない。 閲覧の範囲を絞る |
| 担当者が年齢などの列を足す | 列の追加に承認を要る |
上の3行が、この構成の失敗のほとんどです。 どれも「答えの作り方」の誤りで、モデルを替えても直りません。 最小構成の段階で、終了の理由と時点の切り方を確かめてください。
下の2行は、運用が始まってから起きます。 一覧が役に立つほど、ほかの場面にも使いたくなります。使い道を最初に文書で決め、上長がそれを守る側に立つことが要ります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: スタッフの就業の記録、勤怠、時給、前の就業の時給、通勤の経路と所要時間、そしてモデルが出す早期終了の見込みです。
- 利用目的を、本人が予測できる程度に特定する … 個人情報保護委員会のガイドライン(通則編)は、本人から得た情報から本人に関する行動・関心等の情報を分析する場合、どのような取扱いが行われているかを本人が予測・想定できる程度に利用目的を特定しなければならないとしています。登録のときの利用目的の書き方を、就業の記録を分析してフォローに使うことが分かる形に見直します
- 見込みを不利益な扱いに使わない … 紹介、選考、更新、時給の決定には使いません。使い道は「連絡の順番」だけと文書で決めます
- 属性を入れない … 年齢・性別・国籍・家族・健康は入れません。住所は通勤の所要時間に置き換えてから使います
- 見込みの閲覧を絞る … 担当のコーディネーターとその上長だけが開ける場所に置き、派遣管理システムには載せません。派遣先には渡しません
- 本人に見込みを伝えない … 「辞めそうだと出ています」と伝えることは、本人を傷つけ、関係を壊します
- 外部に出さない … この構成は社内のサーバーで完結し、生成AIなどの外部のサービスにデータを送りません
- 学習用のデータの持ち出しを止める … 2年分の就業と勤怠をまとめたファイルは、それだけで全スタッフの働き方の記録です。作る人の手元のPCに置いたままにせず、社内のサーバーの決まった場所でだけ扱います。最小構成で手元のPCを使うときも、試し終えたら消します
- 見込みが外れることを前提にする … 「低」の人も終わりますし、「高」の人の多くは続きます。「高」と出たことを、その人の評価として扱わないよう、上長がコーディネーターに伝えておきます
誤りが起きた場合のリスクは、連絡が必要な人を後回しにすることと、見込みを本来の使い道の外で使うことの2つです。 前者は月1回の当たり方の確認で気づけます。後者はモデルの精度とは関係なく起きるので、運用の決まりで防ぎます。
10まず何から始めるか
1週目:終了の理由を分ける
過去1年の就業の終了の記録を書き出し、「本人都合」「派遣先都合」「満了・その他」に分けます。 分けられない記録の割合を数えます。
2週目:使い道と入れない項目を決める
営業部長、コーディネーターのリーダー、個人情報の担当で、見込みを何に使い、何に使わないか、どの項目を入れないかを決めて文書にします。登録のときの利用目的の書き方もあわせて見直します。
3週目:4項目で試す
通勤時間、初めての派遣か、同じ職種の経験、初週の欠勤の4つで、lifelines の CoxPHFitter を当てます。一致度と係数の向きを、コーディネーターに見てもらいます。
4週目:7日目の一覧を作る
毎週の書き出しから、7日目の見込みとコーディネーターごとの一覧を作るところまで作ります。この時点では、一覧を見るだけで、連絡の順番は従来どおりにします。
2か月目: 一覧を使って初週の連絡の順番を決め、「高」の人数と連絡できた人数を毎週数えます。3か月目以降: 21日目・45日目の見込みを足し、月1回の当たり方の確認を始めます。「低」なのに終わった人の記録から項目を見直し、四半期の学習し直しの手順が回った時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
CoxPHFitter が Cox の比例ハザードモデルを当てはめること。fit に duration_col(各人の生存期間の列)と event_col を渡し、event_col を指定しないと全員が打ち切りでないものとして扱うこと。strata で層別できること。penalizer が係数の大きさに罰則を付け、推定を安定させ相関の強い項目の扱いに役立つこと。predict_survival_function が times と conditional_after を受け取ること。一致度(concordance index)が打ち切りを考慮して ROC AUC を生存時間のデータに一般化したものであること | lifelines: CoxPHFitter | 2026-10-26 |
check_assumptions が項目ごとに比例ハザードの仮定を検定し、満たさない項目と直し方の助言を出すこと。区分の少ない項目は strata に入れ、連続値は区切ってから層にする直し方が示されていること | lifelines: Testing the proportional hazard assumptions | 2026-10-26 |
| 本人から得た情報から本人に関する行動・関心等の情報を分析する場合、どのような取扱いが行われているかを本人が予測・想定できる程度に利用目的を特定しなければならないこと | 個人情報保護委員会: 個人情報の保護に関する法律についてのガイドライン(通則編) | 2026-10-26 |
見込みの使い道と、利用目的の書き方は、自社の個人情報の担当と顧問の専門家と決めてください。 本記事は上記の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1906)についてのご相談はこちらから。
