勤怠・評価・異動・面談の記録から退職の兆しがある社員を毎月見込み、上司の1on1で話す材料と理由の候補を人事に出す
勤怠・評価・異動・面談の記録から、今後6か月に自己都合で退職するおそれのある社員を毎月見込みます。人事の担当者に、点数を押し上げた理由と、上司が1on1で話すきっかけの案を渡します。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Python
- 対象業界
- IT・SaaS/その他/小売/物流
- 対象部門
- 人事
- 対象業務
- 集計・分析
- 主な課題
- データ分析に時間がかかる/判断に時間がかかる/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/工数削減/機会損失防止
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 月初に、人事の担当者が勤怠システムを開き、受け持ちの上司の部下ごとに先月の残業時間と休暇を見る
- 人事評価システムを開き、直近2回の評価と、異動の希望の有無を見る
- 人事マスタを開き、異動・上司の交代・等級の据え置きの年数を見る
- 1on1の実施記録を開き、最後の1on1がいつだったかを見る
- 4つを頭の中で組み合わせ、気になる社員に印を付け、理由をメモする
- 上司に連絡し、気になる社員について1on1で話してほしいことを伝える
- 上司から1on1の結果を聞き、必要なら異動や働き方の相談につなぐ
- 自動毎月第1営業日の夜、4つのシステムから先月末までの記録をCSVで書き出す
- 自動Python が社員ごとに記録を結び付け、直近3か月と前年同期の変化を表す特徴量を作る
- 自動ロジスティック回帰のモデルが、今後6か月に自己都合で退職するおそれを0〜1の点数で出す
- 自動点数を押し上げた特徴量の上位3つを、社員ごとに日本語の理由として書き出す
- 自動人事の担当者ごとに、上司別・点数の高い順の一覧を作る。退職の申し出済み・休職中の社員は別枠にする
- 自動一覧の上位の社員について、Claude API が上司に渡す1on1の話題の案を作る
- 人人事の担当者が一覧を開き、理由を読み、自分の知っている事情と照らして順番を直す
- 人上司に伝える社員と話題を決める。点数と理由そのものは上司に渡さない
- 人上司から1on1の結果を聞き、異動や働き方の相談が要るかを決める
- 自動6か月後に実際に退職したかを人事マスタと照らし、点数の当たり外れを残す
各工程の詳しい説明を読む
- 月初に、人事の担当者が勤怠システムを開き、受け持ちの上司の部下ごとに先月の残業時間と休暇を見る
- 人事評価システムを開き、直近2回の評価と、異動の希望の有無を見る
- 人事マスタを開き、異動・上司の交代・等級の据え置きの年数を見る
- 1on1の実施記録を開き、最後の1on1がいつだったかを見る
- 4つを頭の中で組み合わせ、気になる社員に印を付け、理由をメモする
- 上司に連絡し、気になる社員について1on1で話してほしいことを伝える
- 上司から1on1の結果を聞き、必要なら異動や働き方の相談につなぐ
(a)申し出を受けてから事情を知る。 1か月分の記録だけを見ると、残業が少し増えた、1on1が1回飛んだ、という変化は目立ちません。3か月から半年の変化を並べて見る時間は、月初にはありません。 気づくのは、退職の申し出を受けてからです。
(b)見立てが担当者ごとに違う。 ある担当者は残業の多さを重く見て、別の担当者は評価の下がり方を重く見ます。同じ社員が、担当者によって印が付いたり付かなかったりします。 担当者が替わると、それまで気にかけていた社員の情報が途切れます。
(c)4つの画面を行き来するだけで時間が終わる。 上司1人あたりの部下は約12名で、4つのシステムを順に開いて並べると、組み合わせて考える前に時間がなくなります。結局、印は直近に話題になった社員にだけ付きます。
(d)上司への伝え方を毎回考える。 「この部下が辞めそう」と伝えるわけにはいきません。上司が構えずに話せる話題を、担当者が一から考えています。 考えるうちに月半ばになり、上司の1on1の予定に間に合わないこともあります。伝え方の上手な担当者ほど時間をかけ、受け持ちの残りの上司に手が回らなくなります。
- 【自動】 毎月第1営業日の夜、4つのシステムから先月末までの記録をCSVで書き出す
- 【自動】 Python が社員ごとに記録を結び付け、直近3か月と前年同期の変化を表す特徴量を作る
- 【自動】 ロジスティック回帰のモデルが、今後6か月に自己都合で退職するおそれを0〜1の点数で出す
- 【自動】 点数を押し上げた特徴量の上位3つを、社員ごとに日本語の理由として書き出す
- 【自動】 人事の担当者ごとに、上司別・点数の高い順の一覧を作る。退職の申し出済み・休職中の社員は別枠にする
- 【自動】 一覧の上位の社員について、Claude API が上司に渡す1on1の話題の案を作る
- 【人】 人事の担当者が一覧を開き、理由を読み、自分の知っている事情と照らして順番を直す
- 【人】 上司に伝える社員と話題を決める。点数と理由そのものは上司に渡さない
- 【人】 上司から1on1の結果を聞き、異動や働き方の相談が要るかを決める
- 【自動】 6か月後に実際に退職したかを人事マスタと照らし、点数の当たり外れを残す
8番目が、この設計の分かれ目です。 人事の中では点数と理由を見ますが、上司に渡すのは「最近話せていない部下」と話題の案だけです。上司の手元に点数が届くと、点数が独り歩きします。
10番目を最初から組み込むのも意図してのことです。 点数0.3の社員が本当に3割くらい辞めているかを確かめないと、人事の担当者は点数を信用する理由がありません。 当たり外れは、人事部長が四半期ごとに見ます。
02今回想定するシステム構成
勤怠(CSV) 人事評価(CSV) 人事マスタ(CSV) 1on1の実施記録(CSV) │ │ │ │ ▼【トリガー】毎月第1営業日 22:00 の定時実行 Python(pandas で社員ごとに結合・特徴量の作成) │ 残業・休暇の変化/評価の推移/異動の希望と据え置き │ 上司の交代/最後の1on1からの日数 ▼ Python(scikit-learn のロジスティック回帰) │ 今後6か月に自己都合で退職するおそれの点数(0〜1) │ 点数を押し上げた特徴量の上位3つ ▼ 人事の担当者ごとの一覧(人事だけが見られる場所) │ ├──▶ 上位の社員だけ ── Claude API │ 上司に渡す1on1の話題の案(点数と理由は含めない) ▼ 【人事の担当者が順番を確かめ、上司に伝える社員と話題を決める】 ▼ 6か月後の在籍 ── 当たり外れの記録 ── 四半期ごとの学び直しへ
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・scikit-learn のロジスティック回帰) | R、BigQuery ML |
| 生成AI | Claude API(1on1の話題の案) | OpenAI API、Gemini API |
| データの取得元 | 勤怠・人事評価・人事マスタ・1on1の実施記録のCSV出力 | 各システムのAPI |
| 一覧の出力先 | 人事部だけが見られる共有フォルダの表 | 人事システムの帳票 |
| 定時実行 | OSのタスクスケジューラ | クラウドのジョブ実行サービス |
4つのシステムには書き込みません。 この構成は、書き出されたCSVを読むだけです。どの項目が取り出せるかは、実際の書き出しで確かめてから特徴量を決めます。
モデルにロジスティック回帰を選ぶのは、点数の理由を人事が説明できるからです。 scikit-learn の LogisticRegression は、既定のソルバーが lbfgs、正則化の強さの逆数 C の既定が1.0です。現在の版(1.9.1)では penalty の指定は 1.8 で非推奨になり、l1_ratio で正則化の種類を指定する書き方に変わっています(既定は l1_ratio=0、L2 にあたる)。学習後の coef_ には特徴量ごとの係数が入り、社員ごとに「係数 × 特徴量の値」を並べれば、どの記録が点数を押し上げたかを書き出せます。
自己都合の退職は少数なので、重みを付けます。 class_weight='balanced' は、クラスの出現頻度に反比例する重みを n_samples / (n_classes * np.bincount(y)) で付けます。少数の側を軽く扱うと、モデルは「全員辞めない」と答えるのが最も楽になります。
03どうやって実装するのか
処理の起点を決める
毎月第1営業日の22時に、定時で動かします。 勤怠は月末で締まり、第1営業日に前月分が確定します。人事の担当者が一覧を見るのは第2営業日の朝です。毎週回すことはしません。 1on1が月1回なので、それより細かく点数を出しても、上司が動ける回数は増えません。
書き出しの順番は、人事マスタ → 勤怠 → 人事評価 → 1on1の実施記録です。人事マスタを先にするのは、その月の在籍者と上司の対応を先に確定させるためです。4つのCSVがそろったことを確かめてから点数を出し、1つでも欠けていれば点数を出さずに止めます。 勤怠が欠けたまま出すと、全員の残業の変化が0になり、点数がそろって下がります。
モデルの学び直しは四半期に1回にします。 毎月学び直すと点数の目盛りが月ごとに動き、先月の0.4と今月の0.4が比べられなくなります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 在籍と所属 | 社員ID、入社日、等級、部署、拠点、上司の社員ID、異動の履歴 | 人事マスタ |
| 退職の記録 | 退職日と退職の区分(自己都合/定年/契約満了/会社都合) | 人事マスタ |
| 勤怠 | 月ごとの残業時間、休日出勤の日数、有給休暇の取得日数、遅刻・早退の回数 | 勤怠システム |
| 評価 | 半期ごとの評価の段階、異動の希望の有無と希望先の区分 | 人事評価システム |
| 1on1 | 実施した日付と、上司・部下の社員ID。話した中身は使わない | 1on1の実施記録 |
| 別枠の印 | 退職の申し出済み、休職中、育児・介護の短時間勤務 | 人事部が持つ表 |
質を決めるのは、2行目の退職の区分です。 正解のラベルは「自己都合の退職」だけにします。定年や契約満了まで混ぜると、年齢と契約の種類だけで点数が決まるモデルになります。区分が付いていない過去の退職があれば、学習の前に人事部で付け直します。
休職の理由は、モデルにも生成AIにも渡しません。 休職の理由には病気のことが書かれていることがあり、慎重に扱うべき情報です。 6行目の別枠の印で休職中の社員を外し、休職の有無そのものも特徴量に入れません。
1on1の中身を残していないことは、この構成の前提です。 中身を読ませる設計にすると、部下は1on1で本音を話さなくなります。使うのは実施した日付だけです。
データの取得方法を決める
4つのシステムとも、画面からCSVを書き出す機能を使う想定です。APIを持つシステムならAPIで取りますが、最初は画面の書き出しで項目を確かめます。
| 特徴量 | 作り方 |
|---|---|
| 残業の変化 | 直近3か月の平均残業時間 ÷ 前年同期の平均(季節の波を消すため前年同期と比べる) |
| 有給休暇の取り方の変化 | 直近3か月の取得日数 − 前年同期の取得日数 |
| 評価の推移 | 直近の評価の段階 − 1回前の段階 |
| 異動の希望の据え置き | 異動の希望を出してから、異動しないまま経った月数 |
| 等級の据え置き | 現在の等級になってからの年数 |
| 上司の交代 | 直近6か月以内に上司が替わったか |
| 最後の1on1からの日数 | 月末時点で、最後に1on1を実施した日からの日数 |
| 在籍の年数の区分 | 1年未満/1〜3年/3〜7年/7年以上 |
年齢、性別、国籍、家族構成は特徴量に入れません。 入れると点数がそれらの属性で決まり、属性で人を見分ける一覧になります。 在籍の年数を区分にしているのも、年齢の代わりにならないよう幅を粗くするためです。偏りが出ていないかは、第13章のとおり属性ごとの上位の割合で後から確かめます。
特徴量は「直近」と「前年同期」を比べて作ります。 保守の仕事は季節で忙しさが変わり、夏や年度末に全員の残業が増えます。前の月と比べると、季節の波を変化と取り違えます。
正解のラベルは「その月末から6か月以内に自己都合で退職した」とします。 3か月にすると申し出の後の期間ばかりになり、12か月にすると記録の変化との結び付きが弱くなります。6か月は、上司が1on1で話す時間が残る長さとして決めます。 期間は人事部長と担当者で決め、変えたらモデルを学び直します。
AIへ渡す前に整形する
- 社員IDのそろえ … 4つのシステムで社員IDの形式が違うことがあります。人事マスタを正として対応表を作ります
- 月ごとの断面を作る … 過去3年の各月末について、在籍していた社員の特徴量とその後6か月の退職の有無を1行にします
- 退職の申し出後の月を外す … 申し出から退職日までの月は、学習の行からも点数づけからも外します。申し出の後の記録を学ぶと、引き継ぎで残業が増えることを兆しと覚えます
- 入社1年未満の扱い … 前年同期の記録が無いので、変化の特徴量を作れません。在籍の年数の区分だけで別に見るか、点数を出さずに別枠に入れます
- 別枠の社員を外す … 休職中、短時間勤務、申し出済みの社員は点数の計算から外します
- 値のそろえ … 割合、日数、年数と単位が違うので、標準化してからモデルに入れます。標準化の平均と標準偏差は学習のときの値を保存し、毎月の点数づけでも同じ値を使います
学習と検証は、時間の順で分けます。 過去3年のうち、最初の2年の断面で学習し、最後の1年の断面で検証します。ランダムに分けると、同じ社員の翌月の断面が学習と検証に分かれ、答えを見ながら学ぶことになります。 さらに、ラベルが6か月先を見ているので、学習に使う最後の断面と検証の最初の断面の間を6か月空けます。
3番目を飛ばすと、点数が当たっているように見えて役に立たないモデルになります。 申し出済みの社員は確実に辞めるので、検証の成績は上がります。しかしその社員は、人事がすでに知っている社員です。
AIに処理させる
この構成の「AI」は2段に分かれます。 点数を出すのは Python のロジスティック回帰で、生成AIは点数を出しません。生成AIにさせるのは、上司に渡す1on1の話題の案だけです。
| 段 | させること | させないこと |
|---|---|---|
| ロジスティック回帰 | 今後6か月に自己都合で退職するおそれの点数と、押し上げた特徴量の上位3つ | 退職の理由の推定 |
| Claude API | 上司が1on1で使える話題の案(記録の事実から作る問いかけ) | 点数の付け直し、順番の入れ替え、退職の理由の推測 |
生成AIに渡すのは、理由の上位3つ(事実の文)、部下の等級と在籍の年数の区分、最後の1on1からの日数だけです。氏名は渡さず、社員IDも仮の番号に置き換えます。
| 生成AIにさせないこと | 理由 |
|---|---|
| 退職の理由の推測(不満、転職活動、家庭の事情など) | 記録に無いことを書く。上司の思い込みになる |
| 話題の案に「退職」「離職」「リスク」「点数」を入れる | 上司に点数の存在が伝わる |
| 引き止めの言い回しや、昇給・異動を約束する言い回し | 決めるのは人事と上司 |
| 健康や家庭の事情に触れる問いかけ | 部下が話したいときに話すこと |
| 評価や処遇の提案 | この構成の目的の外 |
1行目がいちばん起きやすい失敗です。 「残業が前年同期の1.6倍」と渡すと、生成AIは「仕事量に不満を感じている可能性があります」と書きます。記録に無い理由を書いた話題の案は、上司の見方を1つに決めてしまいます。
指示内容を固定する
あなたは人事部で、上司が部下と行う月1回の1on1の準備を手伝う立場です。
渡された記録の事実だけを使って、上司に渡す「話題の案」を作ってください。
この案は人事の担当者が読んで直してから、上司に渡します。
【使ってよい情報】
- 記録から分かった事実(下の「事実」)
- 部下の等級と在籍の年数の区分
- 最後の1on1からの日数
【作るもの】
- 話題の案を3つまで。各話題は、上司が部下にたずねる問いかけ1文と、
その話題を選んだ記録の事実(どの事実から作ったか)の組にする
- 1on1の時間の取り方の提案を1文(最後の1on1から日が空いている場合のみ)
【厳守事項】
- 退職の理由、不満、転職、家庭の事情、健康を推測して書かないでください。
記録に書かれていないことは書かないでください。
- 「退職」「離職」「辞める」「リスク」「点数」「兆し」という言葉を使わないでください。
- 問いかけは、部下が答えを選べる開いた形にしてください。
「〜で困っていませんか」のような決めつけの形にしないでください。
- 昇給、昇格、異動、手当を約束したり、ほのめかしたりしないでください。
- 健康、家族、私生活についての問いかけを作らないでください。
- 渡された情報が足りないときは、足りない項目名を missing_info に入れ、
推測で補わないでください。
【事実】{reasons}
【等級・在籍の年数の区分】{grade}/{tenure_band}
【最後の1on1からの日数】{days_since_1on1}
「退職」「リスク」などの語を禁じるのは、上司に点数の存在を伝えないためです。 話題の案に「離職の兆しについて」と一言でも入れば、上司はその部下を辞めるおそれのある人として見ます。
問いかけを開いた形にするのは、部下が話したいことを話せるようにするためです。 「残業が多くて困っていませんか」は答えを「困っている/いない」に決めます。「この3か月の仕事の進み方はどうですか」なら、部下が話す入口になります。
出力形式を固定する
次の形のJSONで受け取ります。 Claude API の構造化出力(output_config.format に type: "json_schema" を指定)で、この形に固定します。
{
"pseudo_id": "E-0412",
"month": "2026-10",
"score": 0.27,
"rank_in_hrbp": 4,
"reasons": [
{ "feature": "overtime_ratio", "text": "直近3か月の残業が前年同期の1.6倍" },
{ "feature": "transfer_wait_months", "text": "異動の希望を出して12か月据え置き" },
{ "feature": "days_since_1on1", "text": "最後の1on1から74日" }
],
"topics": [
{ "question": "", "based_on": "overtime_ratio" }
],
"schedule_note": "",
"missing_info": [],
"hr_override": { "new_rank": null, "pass_to_manager": true, "note": "" }
}
score rank_in_hrbp reasons は Python が埋め、topics schedule_note missing_info は生成AIが埋めます。hr_override は人事の担当者が書きます。上司に渡すのは topics と schedule_note だけです。
1つ目の理由は、点数と話題の案を別の層に置けることです。 生成AIの出力に score を含めないので、生成AIが点数を書き換える経路がありません。 構造化出力では数値の範囲(minimum/maximum)や文字数の制約が使えないとされ、additionalProperties は false にする必要があります。話題の数と文字数の確認は、受け取った後に Python で行います。
2つ目は、人事の判断を記録できることです。 hr_override に順番の直しと、上司に渡したかどうかが残るので、どの理由のときに担当者が渡さなかったかを後から数えられます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 人事マスタ・勤怠・人事評価・1on1の記録 | CSVの書き出し(読み取りのみ) | 特徴量の材料 |
| Claude API | API呼び出し | 上位の社員の話題の案 |
| 担当者ごとの一覧 | 人事部だけが見られる共有フォルダへの書き込み | 点数・理由・話題の案 |
| 上司への連絡 | 人事の担当者が手で送る | 話題の案だけ |
上司へ自動で送ることはしません。 話題の案をそのまま上司に送ると、どの部下が一覧の上位にいたかが上司に伝わります。どの上司に、どの部下について、どう伝えるかは担当者が決めます。
生成AIに回すのは、担当者ごとの上位10名までにします。 250名全員の案を作っても、担当者が上司と話せるのは毎月数名です。読まれない下書きは、社員の情報を外へ渡す回数を増やすだけです。
人が確認する
人事の担当者は、毎月、一覧の上位を必ず見ます。 点数の順番は提案で、確定するのは担当者です。
- 上位10名の理由を読む … 自分の知っている事情(家族の転勤、資格の取得、本人からの相談)と照らします。合わないときは順番を直し、一言書きます
- 一覧の下位も流し見る … 点数が低くても気になっている社員がいれば上げます。モデルは記録に残る変化しか見ません
- 上司に伝えるかを決める … 伝える場合は話題の案を直し、点数と理由は伝えません
- 1on1の後に結果を聞く … 異動や働き方の相談が要るかを決め、要るものを人事部長に上げます
- 判断を記録する … 順番を直した理由と、上司に渡したかどうかを
hr_overrideに書きます。一言でよいので、空欄にしません
3番目で伝えないと決めることも大事な判断です。 上司との関係そのものが理由に見える場合、上司経由で話すと逆効果になります。その場合は、担当者が本人と直接話す場を設けます。
目標は、上司1名をならして10分です。 上位の社員がいる上司には理由を読み話題の案を直すので数分以上、いない上司は一覧を流し見て終わります。
例外に対処する
| 起きること | 対応 |
|---|---|
| CSVが1つ欠けている | 点数を出さずに止め、担当者に知らせる。欠けたまま出さない |
| 社員IDが対応表に無い | その社員を一覧の末尾の「照合できない」欄に入れる |
| 上司の対応が未更新 | 異動直後に上司が空欄のまま。人事マスタの更新を待ってから一覧を作る |
| 入社1年未満 | 変化の特徴量が作れないので別枠。担当者が自分の見立てで見る |
| 全社で残業が急に増えた月 | 繁忙期や災害対応。全社の平均の急な上昇を検知し、その月は点数に注記を付ける |
| 1on1の記録が上司ごとに付け忘れ | 最後の1on1からの日数が伸び続ける。記録の付け忘れか実施していないかを上司に確かめる |
| 生成AIが禁じた語を書いた | 受け取った後に語を検知し、案を出さずに理由だけを担当者に渡す |
| Claude API が応答しない | 一覧は点数と理由だけで出す。話題の案の欄は空にする |
| 評価の確定前の月 | 評価の推移が半期前のまま。評価の特徴量に「確定前」の印を付け、理由に出さない |
| 組織変更で上司と部署が一斉に替わった | 上司の交代の特徴量が全員で立つ。その月は上司の交代を理由から外す |
下の2行は、人事の行事と組織の変更で起きる誤りです。 どちらも社員の側の変化ではないので、理由に出すと担当者が一覧を信用しなくなります。
6行目は、最初の数か月で必ず起きます。 1on1の実施記録は上司が自分で付ける表で、付け忘れが多いからです。同じ上司の部下全員が上位に並んだら、部下ではなく記録の付け方を疑います。
記録を残す
- 毎月の4つのCSVの元のファイルと、書き出した日時
- 作った特徴量の表と、そのとき使った標準化の平均・標準偏差とモデルの版
- 社員ごとの点数、理由の上位3つ、一覧での順番
- 生成AIに渡した内容と、返ってきた話題の案
- 人事の担当者が順番を直した記録と、上司に渡したかどうか(
hr_override) - 6か月後の在籍と退職の区分、点数の当たり外れ
2つ目でモデルの版を残すのは、四半期ごとに学び直すためです。 先月の一覧がどのモデルで作られたかが残っていないと、当たり外れの比較ができません。
5つ目の担当者の判断は、モデルを直す材料になります。 担当者が繰り返し順番を下げる理由(たとえば「残業の増加」が、資格の講習で一時的に増えたもの)が分かれば、特徴量の作り方を直します。 一覧と記録は人事部の中だけに置き、閲覧した人と日時も残します。
04実装レベルの3段階
半自動化だけでも、①の15分はほぼ消えます。 4つの画面を開く代わりに、1枚の一覧で直近3か月と前年同期の変化が並ぶからです。順番は担当者が一覧を見て決めます。 本格構成で上司1名あたり10分になり、この段階が本記事の想定です。 違いは、順番が先に並んでいることと、話題の案が最初から付いていることです。 段階を飛ばさないでください。 半自動化の一覧を3か月使うと、担当者がどの変化を見て上司に声をかけているかが分かります。それを特徴量に足してから点数を出します。
05工数削減シミュレーション
導入後 120件 × 10分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 従業員が1,000名を超え、人事の担当者が1人で数百名の社員と数十名の上司を受け持っている会社。勤怠・人事評価・異動の記録がシステムに残っていて、毎月CSVで書き出せる場合。退職の申し出を受けてから事情を知ることが多く、上司ごとに部下と話す頻度がばらついている場合。過去3年以上の在籍と退職の記録が残っている場合。
- 従業員が数百名以下で、人事が全員の様子を直接知っている会社。過去の自己都合退職が年に数件しかなく、学ばせる材料が無い場合。点数を人事評価や配置の判断に使うことを前提にしている場合。なお、ある社員が本当に辞めようとしているかの見立て、引き止めるかどうか、処遇を変えるかどうかの判断は、この構成では代替できません。
07最小構成で試す方法
- 過去2年に自己都合で退職した社員のうち、20名を選ぶ
- その20名の、退職の申し出の6か月前から申し出までの記録を表にする(残業、休暇、評価、異動の希望、最後の1on1)
- 同じ時期に在籍を続けた社員を、部署と在籍の年数をそろえて20名選び、同じ表を作る
- 社員名を仮の番号に置き換え、手元のAIサービスに2つの表を貼って「どの項目の変化に差があるか」を聞く
- 出てきた差を、人事の担当者の見立てと比べる
この段階ではモデルを作りません。 確かめたいのは、記録の変化に、退職の前触れが出ているかどうかです。
| 出てきた内容 | 判断 |
|---|---|
| 残業や異動の希望の据え置きに、はっきり差がある | モデルを作る段階に進む |
| 差はあるが、担当者がすでに気づいていた社員ばかり | 早く気づける余地は小さい。一覧の時間短縮だけを狙う |
| 記録に差が出ていない | 記録の取り方が先。退職の区分と1on1の記録から見直す |
3行目が出ることは珍しくありません。 失敗ではなく、退職の区分が付いていない、1on1の記録が抜けていることが分かったということです。その場合は、区分の付け直しと1on1の記録の付け方を3か月整えてから、同じ表を作り直してください。手元のAIサービスに貼るのは仮の番号に置き換えた表だけにし、氏名と評価のコメントは貼りません。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 全員の点数が低く出て、上位がいない | 少数の側に重みが無い。class_weight='balanced' を付ける |
| 重みを付けたら点数が全体に高くなった | 点数は順番として使い、目盛りは較正曲線と当たり外れで確かめる |
| 検証ではよく当たるのに本番で外れる | 申し出後の月が入っている、または時間の順を無視して分けた |
| 定年や契約満了まで当たってしまう | 正解のラベルを自己都合の退職だけにする |
| 夏と年度末に全員の点数が上がる | 前の月と比べている。前年同期と比べる |
| 同じ上司の部下が全員上位に並ぶ | 1on1の記録の付け忘れ。上司に確かめる |
| 話題の案に「退職」と入る | 指示で禁じたうえで、受け取り後にも語を検知する |
| 上司に点数が伝わった | 上司には話題の案だけを手で渡す。一覧の置き場所を人事部に限る |
penalty の指定で警告が出る | 1.8 で非推奨。l1_ratio と C で指定する |
| 学び直したら先月と点数が比べられない | モデルの版を残し、学び直しは四半期に1回に固定する |
上の3行が、予測の部分の失敗のほとんどです。 較正曲線は、予測した確率と実際の陽性の割合をビンごとに並べて比べるものとされています。点数0.3の社員が実際に3割辞めているかを、四半期ごとにこの図で確かめます。
下の3行は、使われ続けるかを決めます。 一覧が上司に流れた時点で、社員から見て「監視の道具」になり、1on1で本音が話されなくなります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 社員の氏名と社員ID、勤怠、人事評価、異動の希望、上司との対応、退職の記録。社員の処遇に関わる情報で、本人に不利に使われうるものです。
- 利用目的を本人が予測できる形で示す … 個人情報保護委員会のガイドライン(通則編)では、本人から得た情報から本人の行動・関心等を分析する場合、どのような取扱いが行われているかを本人が予測・想定できる程度に利用目的を特定しなければならないとされています。社員への説明と就業規則・個人情報の取扱いの示し方を、法務と決めてから始めます
- 点数を処遇に使わない … 評価、昇格、配置、契約の更新の判断に使わないでください。話す機会を作る以外の用途に広げると、社員にとって不利な使われ方になります
- 点数を上司に見せない … 一覧を見られるのは人事部の担当者と人事部長に限ります
- 生成AIへ渡す範囲を絞る … 渡すのは仮の番号、理由の3つ、等級と在籍の年数の区分、最後の1on1からの日数だけです。氏名、評価のコメント、休職の理由は渡しません
- 偏りを定期的に見る … 拠点、年齢層、性別、雇用の形で、上位に入る割合が偏っていないかを人事部長が四半期ごとに見ます
- 保存の期間を決める … 点数と理由は、当たり外れの確認と学び直しに必要な期間だけ残します。退職した社員の点数は、確認が済んだら消します
誤りが起きた場合のリスクは、話すべき社員を見落とすことと、点数が独り歩きして社員に不利に働くことの2つです。 前者は担当者が下位を流し見ることで補い、後者は上司に見せない・処遇に使わないという取り決めで防ぎます。後者のほうが、起きたときの害が大きい失敗です。
10まず何から始めるか
1週目:点数の扱いの取り決めを作る
人事部長と担当者で、点数を誰が見てよいか、何に使ってはいけないか、上司に何を渡すかを文書にします。あわせて、社員への利用目的の示し方を法務に相談します。
2週目:退職の区分を付け直す
過去3年の退職者に、自己都合/定年/契約満了/会社都合の区分が付いているかを確かめ、無いものを付けます。正解のラベルが決まらないと、モデルは作れません。
3週目:過去の記録で前触れを確かめる
自己都合で退職した20名と在籍を続けた20名の、6か月分の記録を表にします。どの変化に差が出ているかを、担当者の見立てと比べます。
4週目:変化の一覧を出す
Python で4つのCSVを結び付け、直近3か月と前年同期の変化を上司別の一覧にします。この時点では点数を出しません。 担当者に2か月使ってもらいます。
2か月目: ロジスティック回帰で点数と理由を出し、時間の順で検証します。上位10名に話題の案を添えます。3か月目以降: 6か月後の当たり外れを記録し、較正曲線を四半期ごとに見ます。上司120名の点検が毎月全員に届き、担当者の直しを特徴量に反映できた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
LogisticRegression の既定のソルバーが lbfgs、C の既定が1.0であること。penalty が1.8で非推奨になり l1_ratio(既定0)で指定すること。class_weight='balanced' が n_samples / (n_classes * np.bincount(y)) で重みを付けること。coef_ が決定関数の特徴量ごとの係数であること。predict_proba がクラスごとの確率の推定値を返すこと(版 1.9.1) | scikit-learn: LogisticRegression | 2026-10-07 |
較正曲線が予測確率と実際の陽性の割合をビンごとに比べるものであること。LogisticRegression が logit のリンク関数を持つため、それ自体で較正された予測を返しやすいとされること | scikit-learn: Probability calibration | 2026-10-07 |
構造化出力で output_config.format に type: "json_schema" を指定できること。数値の範囲(minimum/maximum)や文字数の制約が使えず、additionalProperties は false にする必要があること | Claude Docs: Structured outputs | 2026-10-07 |
| 本人から得た情報から本人に関する行動・関心等の情報を分析する場合、どのような取扱いが行われているかを本人が予測・想定できる程度に利用目的を特定しなければならないこと | 個人情報保護委員会: 個人情報の保護に関する法律についてのガイドライン(通則編) | 2026-10-07 |
点数を誰が見てよいか、社員にどう説明するかは、人事部長と法務で決めてください。 本記事は製品の公開ドキュメントと公的なガイドラインで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0639)についてのご相談はこちらから。
