派遣スタッフの勤怠とフォロー面談の記録から、翌月に就業の終了を申し出そうなスタッフを見込み、営業がフォローする順番を決める
就業中の派遣スタッフの勤怠、就業の記録、フォロー面談の記録から、翌月に本人都合で就業の終了を申し出そうなスタッフを見込みます。営業とコーディネーターが先に話す順番と、話題の候補を毎月の一覧にします。
- 生成AI
- ChatGPT/Claude
- 連携・自動化
- Python
- 対象業界
- IT・SaaS/人材/介護
- 対象部門
- 営業
- 対象業務
- 分類・仕分け/集計・分析
- 主な課題
- 判断に時間がかかる/営業フォローが追いつかない/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/工数削減/機会損失防止
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 月の中旬に、派遣管理システムから翌月に更新を迎えるスタッフの一覧を書き出す
- 担当者ごとに一覧を分け、1人ずつ勤怠の画面を開いて欠勤・遅刻・残業を見る
- フォロー面談の記録を開き、直近の面談で何が話されたかを読む
- 派遣先からの連絡(指摘・要望)の有無を確かめる
- 気になるスタッフに印を付け、印の付いた人から電話や訪問の予定を入れる
- 印を付けなかったスタッフには、更新の意向確認の連絡だけをする
- 自動毎月15日の夜に、派遣管理システムから翌月に更新を迎えるスタッフの記録を書き出す
- 自動生成AIが、直近3か月のフォロー面談の記録から話題のタグ(残業・人間関係・業務の内容・通勤など)と根拠の一文を抜き出す
- 自動Pythonのプログラムが、勤怠・就業の記録・話題のタグから特徴量を作る
- 自動学習済みのモデルが、翌月に本人都合の終了を申し出る見込みを出す
- 自動見込みの高い順に並べ、根拠の候補(どの手がかりが効いたか)を付けて担当者ごとの一覧にする
- 自動3年の期間制限に当たるスタッフと、派遣先から終了の連絡があったスタッフは、見込みの対象から外して別の一覧にする
- 人営業とコーディネーターが一覧を見て、話す順番を決める。担当者の判断で順番を入れ替えてよい
- 人話した結果(申し出があったか、困りごとは何か)を派遣管理システムに残す
各工程の詳しい説明を読む
- 月の中旬に、派遣管理システムから翌月に更新を迎えるスタッフの一覧を書き出す
- 担当者ごとに一覧を分け、1人ずつ勤怠の画面を開いて欠勤・遅刻・残業を見る
- フォロー面談の記録を開き、直近の面談で何が話されたかを読む
- 派遣先からの連絡(指摘・要望)の有無を確かめる
- 気になるスタッフに印を付け、印の付いた人から電話や訪問の予定を入れる
- 印を付けなかったスタッフには、更新の意向確認の連絡だけをする
(a)手がかりが画面に散っている。 勤怠、面談の記録、派遣先からの連絡は、派遣管理システムの別々の画面にあります。1人あたり6分のほとんどは、画面を開いて読むことに使われます。
(b)面談の記録が読まれないまま残る。 面談はコーディネーターが行い、記録は自由記述で残ります。営業がそれを読むのは、問題が起きた後です。 「残業が増えて困っている」と書かれていても、派遣先との調整に使われません。
(c)印の付け方が人によって違う。 欠勤を重く見る人、面談の様子を重く見る人がいます。担当が替わると、同じスタッフでも印が付いたり付かなかったりします。
(d)忙しい月ほど後回しになる。 新しい派遣先の立ち上げがある月は、2番と3番を省いて意向確認の連絡だけになり、その月に限って急な申し出が重なります。
- 【自動】 毎月15日の夜に、派遣管理システムから翌月に更新を迎えるスタッフの記録を書き出す
- 【自動】 生成AIが、直近3か月のフォロー面談の記録から話題のタグ(残業・人間関係・業務の内容・通勤など)と根拠の一文を抜き出す
- 【自動】 Pythonのプログラムが、勤怠・就業の記録・話題のタグから特徴量を作る
- 【自動】 学習済みのモデルが、翌月に本人都合の終了を申し出る見込みを出す
- 【自動】 見込みの高い順に並べ、根拠の候補(どの手がかりが効いたか)を付けて担当者ごとの一覧にする
- 【自動】 3年の期間制限に当たるスタッフと、派遣先から終了の連絡があったスタッフは、見込みの対象から外して別の一覧にする
- 【人】 営業とコーディネーターが一覧を見て、話す順番を決める。担当者の判断で順番を入れ替えてよい
- 【人】 話した結果(申し出があったか、困りごとは何か)を派遣管理システムに残す
7番目が、この設計の分かれ目です。 一覧は順番の「案」で、最後に決めるのは担当者です。 担当者が知っていて記録に無いこと(派遣先の繁忙期、本人の家庭の事情)を、モデルは知りません。
6番目を見込みの前に外しているのも意図してのことです。 期間制限で終わるスタッフには、派遣法の雇用安定措置として別の対応が要ります。見込みの一覧に混ぜると、本人都合の申し出への対応と取り違えます。
02今回想定するシステム構成
派遣管理システム(スタッフ・契約・勤怠・面談の記録・派遣先からの連絡) │ ▼【トリガー】毎月15日の夜(定時実行) Python(社内のサーバー) ├──▶ 対象者の書き出し(翌月に更新を迎える就業中のスタッフ) ├──▶ 期間制限・派遣先都合の終了を別の一覧へ ▼ Claude API ── 面談の記録から話題のタグと根拠の一文(JSON) ▼ Python ── 特徴量の作成 │ 勤怠の変化/就業期間の節目/話題のタグ/派遣先の変化 ▼ Python(scikit-learn)── 翌月の本人都合の終了の見込み(確率) ▼ Python ── 並べ替えと根拠の候補の付与 ▼ 担当者ごとの一覧(共有フォルダ) ▼ 【人が順番を決めて話す】── 結果を派遣管理システムへ
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・scikit-learn の HistGradientBoostingClassifier・CalibratedClassifierCV) | R、Amazon SageMaker |
| 生成AI | Claude API(面談の記録から話題のタグを抜き出す。構造化出力) | OpenAI API |
| 保管 | 社内の共有フォルダ(担当者ごとの一覧)、派遣管理システム(話した結果) | 既存のCRM |
予測の本体は、scikit-learn の HistGradientBoostingClassifier です。 欠損値(NaN)をそのまま扱え、学習のときに欠損のあるサンプルを左右どちらの枝に送るかを学ぶとされています。面談をまだ受けていないスタッフ、勤怠の一部が欠けているスタッフがいても、値を埋めずに学習できます。 公式ページでは、1万件以上のデータでは GradientBoostingClassifier よりはるかに速いとされています。
見込みの数字は、CalibratedClassifierCV で確率として読めるように整えます。 scikit-learn の解説では、よく較正された分類器は、0.8前後の確率を付けたサンプルのおよそ8割が実際に陽性になるものとされています。「0.3」が「10人に3人は申し出る」と読めないと、担当者は数字を信じません。
生成AIは予測をしません。 Claude API の役割は、自由記述の面談の記録を、決まったタグに置き換えることだけです。予測は数値の記録とタグから scikit-learn が行います。
03どうやって実装するのか
処理の起点を決める
毎月15日の夜に、社内のサーバーで1回動かします。 更新の意向確認は翌月の契約の1か月前から始まるので、その前の週に一覧が担当者の手元にあるようにします。毎日動かす形にはしません。 毎日見込みが動くと、担当者は数字の上下に振り回されます。
処理は次の順に1本のプログラムで流します。途中で止まったら、そこまでの結果は一覧に出さず、担当者には「今月の一覧は遅れる」とだけ知らせます。 半分だけの一覧が出ると、載っていない人を「見込みが低い」と読まれるからです。
| 順 | 処理 | かかる時間の目安 |
|---|---|---|
| 1 | 派遣管理システムからの書き出しの取り込み | 数分 |
| 2 | 期間制限・派遣先都合の終了の振り分け | 数秒 |
| 3 | 面談の記録へのタグ付け(生成AI) | 600人分で数十分 |
| 4 | 特徴量の作成と見込みの計算 | 数分 |
| 5 | 担当者ごとの一覧の書き出し | 数秒 |
3番目だけが外部のAPIを呼ぶので、失敗したら3番目だけをやり直せるようにします。 タグ付けの結果はスタッフ番号と面談の日付ごとに保存し、前の月にタグを付けた記録は付け直しません。 毎月新しく増えた面談の記録だけを渡すので、2か月目からは呼び出しの量が減ります。
モデルの学習し直しは、3か月に1回です。 毎月の結果(実際に申し出があったか)がたまるのを待ち、四半期ごとに過去2年分で学び直します。学び直したモデルは、前のモデルと同じ過去の月で成績を比べ、良くなったときだけ入れ替えます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| スタッフと契約 | スタッフ番号、派遣先、職種、就業開始日、契約の期間、更新回数、時給 | 派遣管理システム |
| 勤怠 | 日ごとの出勤・欠勤・遅刻・早退・残業時間(直近6か月) | 派遣管理システム |
| フォロー面談の記録 | 面談の日付、面談者、自由記述(直近3か月) | 派遣管理システム |
| 派遣先からの連絡 | 指摘・要望・担当者の交代の記録 | 派遣管理システム |
| 終了の記録(学習用) | 終了日、終了の申し出の日、終了の区分(本人都合/派遣先都合/期間制限/その他) | 派遣管理システム |
| 組織単位と期間制限 | 派遣先の組織単位、その組織単位での就業開始日 | 派遣管理システム |
質を決めるのは、終了の区分です。 学習の答え(翌月に本人都合の終了を申し出たか)は、ここから作ります。区分が「その他」ばかりなら、まず過去2年分の終了の記録に区分を付け直すところから始めます。 付け直しは担当者の記憶に頼る部分があり、時間がかかります。
面談の記録は、体調や家庭の事情が書かれていることがあります。 これらは予測には使いません(前処理の4番)。
データの取得方法を決める
派遣管理システムから、スタッフ番号をキーにしたCSVを6種類書き出します。書き出しの画面か機能がシステムにあるかを先に確かめます。 無い場合は、システムの提供元に定期の書き出しを相談します。この部分は利用中のシステムに応じた個別の対応が要ります。
| ファイル | 1行の単位 | 主な列 |
|---|---|---|
| staff.csv | スタッフ1人 | スタッフ番号、職種、登録日、年齢の区分(10歳刻み) |
| contract.csv | 契約1件 | スタッフ番号、派遣先番号、組織単位、開始日、終了日、更新回数、時給 |
| attendance.csv | スタッフ1人の1日 | スタッフ番号、日付、出勤区分、遅刻・早退の分、残業の分 |
| interview.csv | 面談1回 | スタッフ番号、日付、面談者、自由記述 |
| client_contact.csv | 派遣先からの連絡1件 | 派遣先番号、日付、種類(指摘・要望・担当交代)、対象スタッフ番号 |
| termination.csv | 終了1件 | スタッフ番号、申し出の日、終了日、終了の区分 |
年齢は10歳刻みの区分だけにします。 生年月日そのものは予測に要りません。性別と国籍は書き出しません。 見込みの根拠に属性が入り込むと、属性で話す順番が決まることになるからです。
学習用のデータは、「その月の15日時点で分かっていたこと」だけで作ります。 たとえば2025年4月15日の行には、4月15日までの勤怠と面談の記録だけを入れ、答えは「5月中に本人都合の終了を申し出たか」にします。15日より後の記録を混ぜると、本番では手に入らない情報で学ぶことになり、成績が見かけだけ良くなります。
期間制限の判定は、組織単位での就業開始日から機械的に計算します。 労働者派遣法は、派遣元が同じ組織単位の業務に3年を超えて同じ派遣労働者を派遣してはならないと定めています(第35条の3。法令に定める例外を除く)。翌月中に3年に達するスタッフは、見込みの一覧から外して別の一覧へ回します。
AIへ渡す前に整形する
- 対象者の絞り込み … 翌月に更新を迎える就業中のスタッフだけにします
- 別の一覧への振り分け … 期間制限に当たる人、派遣先から終了の連絡があった人を外します
- 勤怠の集計 … 直近1か月と、その前の3か月の平均を出し、差(増えたか減ったか)を特徴量にします。欠勤の絶対数より、増え方のほうが効きます
- 面談の記録の下ごしらえ … 氏名・電話番号・派遣先の担当者名を記号に置き換えてから生成AIに渡します。体調・病気・家族の介護などの話題は、タグにしても予測には使いません
- 就業期間の節目 … 就業開始から何か月目かを入れます。節目(3か月・6か月・1年)で申し出が増えるかは、自社のデータで確かめます
- 答えの作成(学習時のみ) … 翌月中に本人都合の終了を申し出たら1、それ以外は0にします
前処理で作る特徴量は、最初は次の10個に絞ります。
| 特徴量 | 作り方 |
|---|---|
| 欠勤の増え方 | 直近1か月の欠勤日数 - 前の3か月の月平均 |
| 遅刻・早退の増え方 | 同じ作り方で回数 |
| 残業の増え方 | 同じ作り方で時間 |
| 就業の月数 | 今の派遣先での就業開始からの月数 |
| 更新回数 | 今の派遣先での更新の回数 |
| 直近の面談からの日数 | 面談が無ければ欠損のまま |
| 話題のタグの有無 | overtime から positive までの7個を、直近3か月にあったかどうか |
| 派遣先の担当交代 | 直近2か月に派遣先の担当者が替わったか |
| 派遣先からの指摘 | 直近2か月に、そのスタッフについての指摘があったか |
| 職種 | pandas の Categorical 型で渡す |
職種を Categorical 型で渡すのは、HistGradientBoostingClassifier の categorical_features の既定値が "from_dtype" で、Categorical 型の列をカテゴリとして扱うからです。 数字の番号に置き換えると、職種の番号の大小に意味があるものとして学んでしまいます。
4番目の「予測に使わない」は、仕組みで守ります。 タグの一覧に health(体調)を持たせ、特徴量を作るプログラムで health を読まないようにします。体調の話題があったスタッフは、予測とは別に、コーディネーターが気にかける一覧に載せます。
AIに処理させる
生成AI(Claude API)にさせるのは、面談の記録を決まったタグに置き換え、根拠の一文を写すことだけです。
| タグ | 意味 | 予測に使うか |
|---|---|---|
overtime | 残業・業務量の多さへの不満 | 使う |
relationship | 派遣先の人間関係の困りごと | 使う |
job_content | 契約と違う業務・業務の内容への不満 | 使う |
commute | 通勤の負担 | 使う |
pay | 時給・待遇への不満 | 使う |
next_job | 他の仕事・次の仕事への言及 | 使う |
positive | 仕事に満足している発言 | 使う |
health | 体調・病気・通院 | 使わない(別の一覧へ) |
family | 家族の介護・育児など | 使わない(別の一覧へ) |
予測(scikit-learn)にさせるのは、特徴量から翌月の申し出の確率を出すことです。 出した確率に、どの手がかりが効いたかの候補を付けます。候補は、そのスタッフの特徴量のうち、過去の申し出者で多かった状態に当てはまるもの(欠勤が直近で増えた、overtime のタグがある、など)を規則で拾います。
| させないこと | 理由 |
|---|---|
| 契約を更新するかの判断 | 見込みを不利益な扱いに使わない |
| 「辞めそう」という言葉で一覧に書く | 一覧が本人の目に触れたとき、関係が壊れる |
| 面談の記録の要約・評価 | 面談者の印象を上書きしない。写すのは根拠の一文だけ |
| 体調・家族の話題を予測に入れる | 要配慮の情報になりうる。予測の材料にしない |
| 派遣先へ見込みを伝える | 派遣先がスタッフを替える材料になる |
1行目が、この構成でいちばん守るべきことです。 見込みの高いスタッフを更新しない側に回せば、困りごとを抱えた人ほど仕事を失います。一覧の冒頭に使い道を書き、営業部の取り決めとして文書にします。
指示内容を固定する
あなたは人材派遣会社のコーディネーターの補助として、
派遣スタッフとのフォロー面談の記録を読み、話題のタグを付ける役割です。
記録に書かれていることだけを根拠にしてください。推測で付けないでください。
【付けるタグ】
overtime(残業・業務量)/relationship(派遣先の人間関係)/
job_content(契約と違う業務・業務の内容)/commute(通勤)/
pay(時給・待遇)/next_job(他の仕事・次の仕事への言及)/
positive(仕事に満足している発言)/health(体調・病気・通院)/
family(家族の介護・育児など)
【厳守事項】
- タグごとに、根拠になった一文を記録からそのまま quote に写してください。
言い換えたり、まとめたりしないでください。
- 記録に書かれていない気持ちを推測しないでください。
「元気がなかった」とだけある場合、どのタグも付けないでください。
- 面談者の感想(「辞めそうな印象」など)は、スタッフの発言ではないので
タグを付けず、interviewer_note に写してください。
- 1つの記録に当てはまるタグが無ければ、tags を空にしてください。
- 辞めそうかどうか、更新すべきかどうかは書かないでください。
- 氏名や派遣先名は記号に置き換えてあります。元に戻そうとしないでください。
【面談の記録】{interview_notes}
「面談者の感想はタグにしない」を入れているのは、面談者の印象が予測に入り込むのを防ぐためです。 「辞めそうな印象」と書く面談者と書かない面談者がいると、モデルは面談者の書き癖を学びます。 感想は別の欄に写し、予測には使いません。
出力形式を固定する
生成AIからは、次の形のJSONで受け取ります。 Claude API の構造化出力(output_config.format に JSON スキーマ)を使います。
{
"staff_id": "S-04821",
"notes": [
{
"note_date": "2026-09-12",
"tags": [
{ "tag": "overtime", "quote": "" }
],
"interviewer_note": ""
}
]
}
構造化出力を使う理由は、タグの名前が一覧の外に出ないようにするためです。 tag を列挙型にすると、overwork のような似た名前が混ざらず、特徴量を作るプログラムが読み落としません。 構造化出力ではオブジェクトの additionalProperties を false にする必要があり、数値や文字数の制約は使えないとされています。
予測の部分は、次のような流れのプログラムになります。 学習は過去の月で行い、成績は学習に使っていない後の月で測ります。
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.calibration import CalibratedClassifierCV
# 行=「スタッフ×月」。各月15日時点の特徴量と、翌月の申し出の有無(y)
train = rows[rows.month < "2026-01"] # 学習に使う月
test = rows[rows.month >= "2026-01"] # 成績を測る月(学習に使わない)
base = HistGradientBoostingClassifier(max_iter=300, learning_rate=0.05)
model = CalibratedClassifierCV(base, method="sigmoid", cv=5)
model.fit(train[FEATURES], train.y)
test["p"] = model.predict_proba(test[FEATURES])[:, 1]
# 月ごとに上位50人を取り、実際に申し出た人数を数える
hits = test.sort_values("p", ascending=False).groupby("month").head(50)
print(hits.groupby("month").y.sum())
較正の方法を sigmoid にしているのは、本人都合の申し出が月に数十件で、答えが1の行が少ないからです。 scikit-learn の解説では、isotonic は約1,000件を超えるデータで sigmoid と同等以上になる一方、小さいデータでは過学習しやすいとされています。申し出の件数が十分にたまったら、isotonic と比べます。
予測の結果は、担当者ごとに次の形の一覧(CSV)にします。
| 列 | 例 |
|---|---|
| 順番 | 1 |
| スタッフ番号・氏名・派遣先 | S-04821・(氏名)・(派遣先) |
| 見込み | 0.34(同じくらいの見込みの過去のスタッフの約3人に1人が翌月に申し出た) |
| 根拠の候補 | 欠勤が直近1か月で3回増えた/面談で overtime(「先月から毎日1時間残っている」) |
| 前回話した日 | 2026-08-20 |
| 担当者のメモ欄 | (空欄) |
見込みの列に、確率の読み方を添えます。 数字だけを載せると、0.34を「低い」と読む人がいます。全体の申し出の割合が数%の中では、0.34はかなり高い値です。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 派遣管理システム | CSVの書き出し(個別の対応) | 対象者・勤怠・面談・派遣先の連絡・終了の記録 |
| Claude API | API呼び出し(Python から) | 面談の記録に話題のタグを付ける |
| 共有フォルダ | ファイルの書き出し | 担当者ごとの一覧(CSV)と、別の一覧(期間制限・体調の話題) |
| 派遣管理システム | 担当者の手入力 | 話した結果(申し出の有無・困りごと) |
派遣管理システムには書き込みません。 見込みの数字をスタッフの画面に載せると、営業以外の部署の人の目にも触れ、更新や紹介の判断に使われる経路ができます。 一覧は営業部の共有フォルダだけに置き、閲覧できる人を絞ります。
人が確認する
人が確かめるのは、一覧の上位と、別の一覧です。 600人を全員読む必要はありません。
- 別の一覧を先に見る … 期間制限に当たる人には、雇用安定措置の手続きとして別に連絡します。体調・家族の話題があった人は、コーディネーターが気にかけます
- 上位から根拠の候補を読む … 根拠が担当者の知っていることと合うかを見ます。合わなければ、担当者の判断で順番を下げてよい
- 話す順番を決めて予定を入れる … 上位の30人前後を目安に、今週と来週に分けます
- 話した結果を残す … 申し出があったか、困りごとは何かを記録します。次の学び直しの答えになります
4番目を省かないでください。 話した結果が残らないと、「話したから申し出が出なかった」のか「もともと出なかった」のかが分からず、モデルの成績を測れません。
目標は、600人をならして1人2分です。 上位の人は根拠を読んで数分、下位の人は一覧で流し見るだけです。
例外に対処する
| 起きること | 対応 |
|---|---|
| 面談の記録が無いスタッフ | タグは空。欠損として扱い、勤怠と就業の記録だけで見込みを出す |
| 就業して1か月未満のスタッフ | 勤怠の差が作れない。見込みを出さず「新しく就業」として別に載せる |
| 派遣先を替わったばかりのスタッフ | 前の派遣先の勤怠を混ぜない。替わった後の記録だけで見る |
| 生成AIが応答しない・JSONが壊れている | そのスタッフはタグなしで見込みを出し、一覧に「面談未反映」と印を付ける |
| quote が記録に無い文になっている | プログラムで記録と照合し、見つからなければそのタグを捨てる |
| 終了の区分が「その他」のまま | 学習から外す。本人都合として扱わない |
| 見込みの上位が特定の派遣先に偏る | 派遣先側の事情(繁忙・担当交代)を疑い、営業が派遣先と話す材料にする |
| モデルの成績が前の月より大きく落ちる | 入れ替えずに前のモデルを使い続け、原因(記録の書き方の変化など)を調べる |
5行目の照合は必ず入れます。 生成AIは、記録に無い文を「それらしく」写すことがあります。写した文がそのまま一覧に載ると、スタッフが言っていないことを担当者が信じることになります。
記録を残す
- 毎月の対象者の一覧と、使った特徴量の値
- 生成AIに渡した面談の記録(記号に置き換えた後)と、返ってきたJSON
- モデルの版と、出した見込み・根拠の候補
- 担当者が順番を入れ替えた記録と、話した結果
- 翌月に実際に申し出があったか(答え合わせ)
- 一覧を開いた人と日時
4つ目と5つ目は、モデルの成績を測るために残します。 毎月、上位50人のうち実際に申し出た人が何人いたかを数え、担当者の印の50人とも比べます。担当者が入れ替えた人の結果も見ると、モデルより担当者が正しかった場面が分かります。
04実装レベルの3段階
半自動化で、勤怠の画面を開く作業(第4章の①)がほぼ無くなります。 面談の記録を読む作業は残ります。本格構成で面談の記録もタグと根拠の一文になり、人は上位の根拠を読むだけになります。 本記事の想定はこの段階です。 半自動化を飛ばさないでください。 規則で並べた一覧を3か月使うと、担当者がどの手がかりを信じるかが分かり、モデルの根拠の候補をどう見せればよいかが決まります。
05工数削減シミュレーション
導入後 600件 × 2分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 事務・コールセンター・軽作業・介護などの登録型派遣で、就業中のスタッフが千人以上おり、毎月数百人が契約の更新を迎える人材派遣会社。営業とコーディネーターが、更新の前に誰と先に話すかを勘と記憶で決めていて、急な終了の申し出で派遣先への代わりの手配が間に合わないことがある場合。勤怠・就業の記録・フォロー面談の記録が、スタッフの番号で2年分以上引ける場合。
- 就業中のスタッフが百人程度で、担当者が全員と毎月話せている場合。終了の申し出の理由と日付が記録されておらず、本人都合の終了と派遣先都合の終了を後から分けられない場合。なお、契約を更新するかどうか、どのスタッフをどの派遣先に就けるかの判断は、この構成では代替できず、見込みをその判断に使ってはいけません。
07最小構成で試す方法
- 過去1年分の終了の記録を書き出し、本人都合の終了だけに印を付ける
- 各月の15日時点の勤怠から、「直近1か月の欠勤が前の3か月の平均より増えたか」を表計算で出す
- 増えた人と増えなかった人で、翌月に本人都合の終了を申し出た割合を比べる
- 申し出た人の直前の面談の記録を20人分読み、どんな話題が出ていたかを数える
- 担当者が当時「気になる」と印を付けていた人と、2番と4番の手がかりを比べる
ここでは機械学習を使いません。 手がかりが本当に申し出の前に現れているかを、表計算と記録の読み直しで確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 欠勤の増え方や面談の話題で、申し出の割合がはっきり違う | モデルを作る段階に進む |
| 違いはあるが、担当者の印と同じ人ばかり | 担当者の勘はすでに効いている。読む手間を減らす目的で進める |
| 違いが見えない | 記録の残し方が先。 終了の区分と面談の書き方を整える |
3行目が出ても失敗ではありません。 記録から予測できないということは、担当者が記録に残していない手がかりで判断しているということです。 その手がかりを記録に残すところから始めます。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 見込みが更新の判断に使われる | 使い道を文書にし、一覧を営業部の外に出さない |
| 派遣先都合の終了を答えに混ぜる | 終了の区分で本人都合だけを答えにする。「その他」は学習から外す |
| 15日より後の記録で学んでしまう | その月の15日時点で分かっていたことだけで行を作る |
| 面談者の書き癖を学ぶ | 面談者の感想をタグにしない。interviewer_note に分ける |
| 体調の話題が予測に入る | health・family を特徴量のプログラムで読まない |
| 生成AIが記録に無い文を写す | quote を記録と照合し、無ければ捨てる |
| 確率の数字が信じられない | 較正し、「同じ見込みの人の何人に1人」で添える |
| 期間制限の人が一覧に混ざる | 組織単位での就業開始日から計算し、別の一覧へ |
| 上位が特定の派遣先に偏る | 派遣先の事情を疑い、営業が派遣先と話す材料にする |
| 話した結果が残らない | 結果の記録を担当者の手順に入れる。次の学び直しの答えになる |
上の3行が、この構成の失敗のほとんどです。 1行目は使い方の失敗、2行目と3行目は答えの作り方の失敗です。どれも、モデルの精度を上げる工夫では直りません。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 派遣スタッフの氏名・勤怠・時給・就業の記録、そしてフォロー面談の自由記述(職場の困りごと、体調、家族の事情が含まれることがあります)です。
- 利用目的を本人が予測できる程度に特定する … 個人情報保護委員会のガイドラインは、本人から得た情報から本人に関する行動・関心等の情報を分析する場合、どのような取扱いが行われているかを本人が予測・想定できる程度に利用目的を特定しなければならないとしています。登録時の利用目的の書き方を、顧問の弁護士と見直してください
- 見込みを不利益な扱いに使わない … 更新・紹介・時給の判断に使わないことを、営業部の取り決めとして文書にします
- 面談の記録を外部に渡す範囲を絞る … 氏名・電話番号・派遣先の担当者名を記号に置き換えてから渡します。体調・家族の話題は、タグは付けても予測には使いません
- 一覧の閲覧を絞る … 営業部の共有フォルダだけに置き、開いた人と日時を残します
- 派遣先に見込みを伝えない … 派遣先がスタッフの交代を求める材料になります
- 生成AIの選び方 … 18歳未満のスタッフがいる可能性がある場合は、利用規約で未成年の利用に制限がある生成AIを使わないでください
誤りが起きた場合のリスクは、見込みの誤りそのものより、使い道の誤りです。 見込みが外れても話す順番が少し変わるだけですが、見込みを更新しない判断に使えば、困りごとを抱えたスタッフほど仕事を失います。 構成でできるのは一覧の置き場所と閲覧を絞ることまでで、最後は営業部の取り決めで守ります。
10まず何から始めるか
1週目:使い道を決めて文書にする
一覧を「話す順番」にだけ使い、更新・紹介・時給の判断に使わないことを、営業部長の名前で文書にします。あわせて、登録時の利用目的の書き方を見直す相談を始めます。
2週目:終了の記録に区分を付ける
過去1年分の終了の記録に、本人都合/派遣先都合/期間制限/その他の区分を付けます。ここが答えの質を決めます。 担当者に聞き取りながら進めます。
3週目:表計算で手がかりを確かめる
第8章の手順で、欠勤の増え方と面談の話題が、申し出の前に現れているかを確かめます。担当者が当時付けていた印とも比べます。
4週目:規則で並べた一覧を1回出す
Pythonで勤怠の特徴量を作り、欠勤の増え方で並べた一覧を担当者に渡します。話した結果を残してもらう手順も、この月から始めます。
2か月目: 生成AIで面談の記録にタグを付け、quote の照合を入れます。3か月目以降: scikit-learn で確率を出し、較正して、上位50人のうち実際に申し出た人の数を毎月数えます。担当者が一覧を使って話す順番を決め、急な申し出で代わりの手配が間に合わなかった件数が減っていくのを確かめられた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
HistGradientBoostingClassifier が欠損値(NaN)をそのまま扱い、学習時に欠損のあるサンプルを左右どちらの子に送るかを学ぶこと。class_weight に balanced を指定できること。1万件以上のデータで GradientBoostingClassifier よりはるかに速いこと。predict_proba で確率を返すこと(scikit-learn 1.9.1) | scikit-learn: HistGradientBoostingClassifier | 2026-10-13 |
よく較正された分類器では、0.8前後の確率を付けたサンプルのおよそ8割が陽性になること。CalibratedClassifierCV が sigmoid と isotonic の2つの方法を持ち、isotonic は約1,000件を超えるデータで sigmoid と同等以上になるが小さいデータでは過学習しやすいこと | scikit-learn: Probability calibration | 2026-10-13 |
構造化出力が output_config.format に JSON スキーマ(type: json_schema)で指定すること。オブジェクトの additionalProperties を false にする必要があり、数値や文字数の制約に対応しないこと | Claude API Docs: Structured outputs | 2026-10-13 |
| 派遣元事業主が、派遣先の組織単位ごとの業務について、3年を超える期間継続して同一の派遣労働者に係る労働者派遣を行ってはならないこと(第35条の3)。特定有期雇用派遣労働者等への雇用安定措置(第30条) | e-Gov 法令API: 労働者派遣事業の適正な運営の確保及び派遣労働者の保護等に関する法律 | 2026-10-13 |
| 本人から得た情報から本人に関する行動・関心等の情報を分析する場合、どのような取扱いが行われているかを本人が予測・想定できる程度に利用目的を特定しなければならないこと(通則編 3-1-1) | 個人情報保護委員会: 個人情報の保護に関する法律についてのガイドライン(通則編) | 2026-10-13 |
見込みの使い道と利用目的の書き方は、顧問の弁護士と営業部で決めてください。 本記事は公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1407)についてのご相談はこちらから。
