求人ごとの職種・勤務地・年収・応募の推移から、採用決定までの日数を予測し、遅れそうな求人を早めに知らせる
人材紹介で預かっている求人ごとに、採用が決まるまでの残りの日数と、企業の希望の時期までに決まる見込みを出します。見込みの低い求人を毎週並べ、担当者が手を打つ先を早めに決められるようにします。
- 連携・自動化
- Python
- 対象業界
- IT・SaaS/人材/製造
- 対象部門
- 営業/採用
- 対象業務
- 集計・分析
- 主な課題
- 判断に時間がかかる/営業フォローが追いつかない/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/工数削減/機会損失防止
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 毎週月曜、担当者が求人管理の仕組みで自分の求人の一覧を開く
- 求人ごとに、先週の推薦の数、書類の通過、面接の予定を確かめる
- 受注からの日数と、企業の希望の時期を見比べる
- 「このままだと間に合わない」と感じた求人に印を付け、理由を書く
- 週次の会議で、印を付けた求人を報告し、上長と打ち手を決める
- 打ち手(条件の見直しの相談、スカウトの強化、他の担当者への共有)を進める
- 自動毎週日曜の夜、求人管理の仕組みから、すべての求人と推薦・選考の記録を書き出す
- 自動Python が、求人ごとに受注からの日数、決定・取り下げ・募集中の別、週ごとの推薦・書類通過・面接の数を整える
- 自動過去の求人で学ばせたモデルで、募集中の求人ごとに、いまの経過を条件にした残りの日数と、希望の時期までに決まる見込みを出す
- 自動見込みの低い求人に `late_risk`、記録の少ない職種に `low_history`、先週から見込みが大きく下がった求人に `drop` の印を付ける
- 自動見込みを下げている要因を、モデルの係数から上位3つ並べる
- 自動担当者ごとに、印の付いた求人の一覧を月曜の朝に届ける
- 人担当者が、印の付いた求人だけを確かめ、打ち手の案を書く
- 人週次の会議で、上長と打ち手を決める
- 自動決定・取り下げが記録されたら、翌週の学ばせる記録に入る
各工程の詳しい説明を読む
- 毎週月曜、担当者が求人管理の仕組みで自分の求人の一覧を開く
- 求人ごとに、先週の推薦の数、書類の通過、面接の予定を確かめる
- 受注からの日数と、企業の希望の時期を見比べる
- 「このままだと間に合わない」と感じた求人に印を付け、理由を書く
- 週次の会議で、印を付けた求人を報告し、上長と打ち手を決める
- 打ち手(条件の見直しの相談、スカウトの強化、他の担当者への共有)を進める
(a)「間に合わない」の見立てが経験に頼っている。 4番目は担当者の感覚で決まっています。経験の長い担当者は、受注から3週間で書類の通過が無い求人を危ないと見ますが、 入って1年目の担当者は、推薦を続けていれば決まると考えます。同じ求人でも、誰が持つかで手を打つ時期が変わります。
(b)遅れに気づくのが直前になる。 企業の希望の時期の1か月前になって「間に合いません」と伝えても、条件を見直して新しく候補者を集める時間が残っていません。本当に話したいのは、受注から数週間の時点での見通しです。
(c)決まりにくい求人がいつまでも残る。 半年決まらない求人も、毎週の一覧に同じように並びます。手を打っても決まりにくい求人と、手を打てば決まる求人の区別がつかず、 時間の使い方が担当者の熱意で決まります。
(d)過去の求人から学べていない。 似た職種・似た年収の求人が過去にどれくらいで決まったかは、求人管理の仕組みに記録があります。しかし、それを毎週引いて比べる人はいません。
- 【自動】 毎週日曜の夜、求人管理の仕組みから、すべての求人と推薦・選考の記録を書き出す
- 【自動】 Python が、求人ごとに受注からの日数、決定・取り下げ・募集中の別、週ごとの推薦・書類通過・面接の数を整える
- 【自動】 過去の求人で学ばせたモデルで、募集中の求人ごとに、いまの経過を条件にした残りの日数と、希望の時期までに決まる見込みを出す
- 【自動】 見込みの低い求人に
late_risk、記録の少ない職種にlow_history、先週から見込みが大きく下がった求人にdropの印を付ける - 【自動】 見込みを下げている要因を、モデルの係数から上位3つ並べる
- 【自動】 担当者ごとに、印の付いた求人の一覧を月曜の朝に届ける
- 【人】 担当者が、印の付いた求人だけを確かめ、打ち手の案を書く
- 【人】 週次の会議で、上長と打ち手を決める
- 【自動】 決定・取り下げが記録されたら、翌週の学ばせる記録に入る
7番目が、この設計の分かれ目です。担当者が見るのは十数件の全部ではありません。 印の無い求人は一覧に出さず、印の付いた求人だけを読み、打ち手を考える時間に使います。 全件を見直す設計にすると、40.0時間はほとんど減りません。
5番目の要因は、打ち手の手がかりです。 「年収の上限が、同じ職種・地域で決まった求人の中央値より低い」「書類の通過が受注から3週間無い」のように、見込みを下げているものが分かれば、企業に相談する中身が決まります。
02今回想定するシステム構成
求人管理の仕組み(求人・推薦・選考の段階・決定・取り下げ、表の形で書き出し) ▼【トリガー】毎週日曜 22:00 Python(pandas) ├──▶ 求人ごとの経過の日数と状態(決定/取り下げ/募集中) ├──▶ 受注後14日・30日・60日・90日の時点での推移の特徴 ▼ lifelines CoxPHFitter(時点ごとのモデル、職種の大分類で strata) │ predict_survival_function(conditional_after で経過を条件に) ▼ 見込み ── 残りの日数の中央値/希望の時期までに決まる見込み ▼ 印付け ── late_risk / low_history / drop + 要因の上位3つ ▼ 【担当者が印の付いた求人だけ確かめ、打ち手を決める】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・lifelines) | R(survival) |
| 処理エンジン | lifelines の CoxPHFitter(比例ハザードモデル) | scikit-survival |
| 集計 | Python(経過の日数と推移の特徴、要因の並べ替え) | 求人管理の仕組みの帳票 |
| データの取得元 | 求人管理の仕組みの書き出し | 求人管理の仕組みのAPI |
| 結果の出力先 | 担当者ごとの一覧と、週次の会議の資料 | 社内チャットへの通知 |
求人管理の仕組みには書き込みません。 求人と選考の記録を読むだけで、求人の状態も、担当者も、優先度の欄も書き換えません。 一覧は別に届けます。
見込みの中心は、lifelines の CoxPHFitter です。 Cox の比例ハザードモデルを当てはめる部品で、fit には受注からの日数の列(duration_col)と、決まったかどうかの列(event_col。決まったら1、まだなら0)を渡します。右側が打ち切られた記録、つまり「少なくともここまでは決まらなかった」記録をそのまま扱えます。 募集中の求人と取り下げた求人を、捨てずに学ばせられます。
経過を条件にした見込みは、conditional_after で出します。 予測の関数にこの引数で「すでに何日経ったか」を渡すと、その日数を過ぎても決まっていないことを条件にした、残りの見込みが返ります。何も渡さないと、受注した日の時点の見込みになります。
職種の大分類は strata で分けます。 比例ハザードの仮定に合わない列を、効果を推定せずにモデルに含める方法で、層ごとに基準のハザードを別に持ち、係数は共通にします。 IT職と製造の技術職では、決まるまでの時間の形そのものが違うためです。
生成AIは使いません。 見込みも要因も、モデルの数字と決まった文型で出します。打ち手の案を文章で作らせると、企業ごとの事情を知らないまま条件の見直しを勧める文が混ざります。
03どうやって実装するのか
処理の起点を決める
毎週日曜の夜22時に動かします。 月曜の朝の週次の会議に、一覧が間に合う時刻です。金曜の夕方以降に記録された推薦と選考の結果まで入るよう、週末の最後に書き出します。 祝日で会議が火曜に動く週も、実行の日時は変えません。毎週同じ曜日の時点で見込むほうが、先週との比べ方がそろいます。
モデルの学ばせ直しは、月に一度、別に動かします。 毎週の見込みは、その月に決めた版のモデルで出します。学ばせ直した版は、直近の3か月に決まった・取り下げた求人で前の版と比べ、良くなっていたときだけ切り替えます。 毎週学ばせ直すと、見込みが下がった理由が求人の変化なのかモデルの変化なのか分からなくなります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 求人 | 求人ID、求人企業、職種(大分類・小分類)、勤務地、年収の下限と上限、必須の要件の数、雇用形態、受注日、希望の入社時期 | 求人管理の仕組み |
| 求人の結果 | 決定日、取り下げ日と理由(企業の都合・他社で決定・条件の不一致など) | 同上 |
| 推薦と選考 | 推薦日、書類の結果と日付、面接の各段階の日付と結果、内定日 | 同上 |
| 求人企業の記録 | 過去の求人の数、書類の結果を返すまでの日数の中央値 | 同上から集計 |
| 決定した求人の年収 | 職種・地域ごとの、過去に決まった求人の年収の中央値 | 同上から集計 |
質を決めるのは、受注日・決定日・取り下げ日の3つです。 この3つがそろわないと、決まるまでの日数も、打ち切りの日数も作れません。取り下げ日が空のまま「募集中」になっている古い求人が混ざっていると、決まりにくい求人がいつまでも打ち切られずに残り、 見込みが長めにずれます。
希望の入社時期は、受注のときに日付で入れてもらいます。 「なるべく早く」のような書き方では、間に合うかを計算できません。決まっていない企業は「受注から90日」のような既定の値を置き、既定の値であることを印で残します。
データの取得方法を決める
求人管理の仕組みの帳票の機能で、求人・推薦・選考の記録を表の形で書き出します。API を持つ仕組みなら定時に取りに行き、持たないものは定時の書き出しを共有フォルダに置かせて読みます。 製品によって書き出せる項目が違うので、上の入力データの列がそろうかを最初に確かめます。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 過去2年分の求人と結果 | 求人と求人の結果 | 学ばせる記録(決定は1、募集中と取り下げは0) |
| 過去2年分の推薦と選考 | 推薦と選考 | 時点ごとの推移の特徴 |
| 募集中の求人 | 求人 | 見込みを出す相手 |
| 職種・地域ごとの年収の中央値 | 決定した求人から集計 | 「年収の上限が相場より低い」の特徴 |
| 求人企業ごとの書類の返答の日数 | 推薦と選考から集計 | 企業の選考の速さの特徴 |
年収の中央値は、決まった求人だけから作ります。 募集中の求人の年収を混ぜると、決まりにくい条件の求人が相場を引き下げます。ただし、件数が10件に満たない職種・地域は大分類にまとめて出します。
AIへ渡す前に整形する
- 状態をそろえる … 決定日があれば「決定」、取り下げ日があれば「取り下げ」、どちらも無ければ「募集中」にします。最終の更新から180日以上動きの無い募集中の求人は、担当者に状態を確かめる一覧に回し、確かめるまで学ばせる記録から外します
- 日数を作る … 決定・取り下げは受注日からその日まで、募集中は受注日から書き出しの日までを日数にします
- 時点ごとの記録を作る … 受注後14日・30日・60日・90日の時点ごとに、その時点でまだ決まっていなかった求人だけを集めます。日数は、その時点からの残りにします
- 時点までの推移を特徴にする … その時点までの推薦の数、書類の通過の数と率、最初の面接までの日数、最後の推薦からの日数です。その時点より後の記録は使いません
- 条件の特徴を足す … 年収の上限と職種・地域の中央値の差、必須の要件の数、勤務地の区分、企業の書類の返答の日数
- 取り下げの理由を確かめる … 「他社で決定」で取り下げた求人は、決まらなかったのではなく別の経路で決まった求人です。決まりやすさの点では決定に近いので、割合を別に見ます
4番目で、その時点より後の記録を使わないでください。 受注後30日の時点の特徴に、40日目の面接の記録が入ると、決まった求人ほど面接が多いのは当たり前なので、モデルが当たりすぎて見えます。 本番では、その先の記録はまだありません。
3番目の時点ごとの記録は、例で見ると分かりやすくなります。 受注から45日目に決まった求人は、14日と30日の時点の記録には「残り31日で決定」「残り15日で決定」として入り、60日と90日の時点の記録には入りません。受注から100日経っていまも募集中の求人は、4つの時点すべてに「少なくとも残り86日・70日・40日・10日は決まらなかった」として入ります。 同じ求人が複数の時点に入りますが、時点ごとに別のモデルで学ばせるので重なりません。
6番目は、この構成の弱いところです。 「他社で決定」も「企業の都合」も、ここでは同じ打ち切りとして扱います。他社で決定の割合が多い職種は、見込みが長めに出ていると読み、その割合を一覧に並べて出します。
AIに処理させる
させるのは、募集中の求人ごとに、いまの経過を条件にした残りの日数の分布を見込むことだけです。 そこから中央値と、希望の時期までに決まる見込みを計算します。
| 見込むもの | 使うもの | 判断できないときの扱い |
|---|---|---|
| 残りの日数の中央値 | 直近の時点のモデルの predict_median か predict_percentile(p=0.5) | 生存曲線が0.5を下回らなければ「当面決まりにくい」 |
| 希望の時期までに決まる見込み | predict_survival_function を conditional_after 付きで出し、1 − 残りの日数での値 | 希望の時期が既定の値なら印を残す |
| 見込みを下げている要因 | 係数と、その求人の特徴の値の平均からの差 | 係数の小さい要因は並べない |
左上の「当面決まりにくい」が、この構成で大事な区別です。 predict_median は、生存曲線が0.5を下回らないとき無限大を返します。 これを大きな数字としてそのまま一覧に出すと、意味の分からない「残り9999日」が並びます。無限大は「当面決まりにくい」という区分に置き換え、条件の見直しを相談する候補として先頭に並べます。
| させないこと | 理由 |
|---|---|
| 条件の見直しの提案の中身 | 企業ごとの事情は担当者が知っている |
| 求人の取り下げの判断 | 企業との関係にかかわる |
| 担当者の評価への利用 | 決まりやすさは担当者より求人の条件で決まる |
| 候補者ごとの合否の予測 | 別の話。個人の選考の結果を扱わない |
| 学ばせた範囲の外の職種の見込み | low_history にして人へ |
3行目を最初に決めておいてください。 見込みの低い求人を多く持つ担当者は、成績が悪いのではなく、決まりにくい求人を預かっているだけのことがあります。 一覧を評価に使うと、担当者が決まりにくい求人を受けなくなります。
指示内容を固定する
この構成は生成AIを使わないので、プロンプトの代わりに、モデルの設定と印の規則を書いておきます。
【モデル】
- 時点ごと(受注後 14 / 30 / 60 / 90 日)に CoxPHFitter を1つずつ
- fit(df, duration_col="days_remaining", event_col="filled", strata=["job_family"])
- penalizer = 0.1(相関の強い特徴を安定させる。学ばせ直しのたびに見直す)
- 募集中の求人には、受注からの日数が過ぎた直近の時点のモデルを使う
- conditional_after = 受注からの日数 − その時点の日数
【見込み】
- 残りの日数の中央値 = predict_median(無限大は "hard_to_fill")
- 希望の時期までに決まる見込み = 1 − S(希望の時期までの残りの日数)
- 要因 = 係数 × (その求人の値 − 学ばせた記録の平均)の小さい順に3つ
【印を付ける条件】
- late_risk:希望の時期までに決まる見込みが 0.4 未満、または hard_to_fill
- low_history:その職種の小分類で学ばせた求人が 30 未満
- drop:先週より、決まる見込みが 0.15 以上下がった
- 印の無い求人は一覧に出さない
conditional_after を渡し忘れるのが、いちばん起きやすい誤りです。 渡さないと、その時点に入ったばかりの求人として見込まれ、受注後50日の求人も30日の求人も、同じ30日のモデルで同じ見込みになります。 経過の日数の差が、見込みに出なくなります。
penalizer の値は、学ばせ直すたびに比べて決めます。 年収の上限と相場との差、必須の要件の数のように、互いに関係の強い特徴があると、係数が不安定になります。係数の向きが学ばせ直しのたびに入れ替わるなら、penalizer を強めるか、特徴を減らします。
出力形式を固定する
募集中の求人ごとに、次の形のJSONを作り、担当者ごとの一覧にします。
{
"job_id": "",
"owner": "",
"days_open": 0,
"landmark_model": "d14 | d30 | d60 | d90",
"median_remaining_days": 0,
"hard_to_fill": false,
"target_date": "",
"target_is_default": false,
"prob_filled_by_target": 0.0,
"prob_change_from_last_week": 0.0,
"top_factors": [
{ "feature": "", "value": "", "direction": "lowers | raises" }
],
"flags": ["late_risk | low_history | drop"],
"model_version": ""
}
1つ目の理由は、prob_filled_by_target と median_remaining_days を並べて持てることです。 担当者が見たいのは「あと何日か」ですが、企業と話すときに要るのは「希望の時期に間に合う見込みはどれくらいか」です。同じ分布から出した2つを並べ、どちらで話すかを担当者が選べます。
2つ目は、top_factors で打ち手の手がかりを渡せることです。 例えば {"feature": "年収の上限と相場の差", "value": "−80万円", "direction": "lowers"} が並べば、相談の中身は年収の幅です。 書類の通過が無いことが並べば、必須の要件の見直しか、推薦する候補者の選び方の見直しです。
3つ目は、target_is_default で見込みの前提が分かることです。 希望の時期が既定の値の求人は、見込みが低くても急ぐ必要が無いことがあります。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 求人管理の仕組み | 帳票の定時の書き出し、またはAPI | 求人・推薦・選考・結果の記録 |
| 担当者ごとの一覧 | 表の書き出しとメールでの送付 | 印の付いた求人と見込み・要因 |
| 週次の会議の資料 | 表の書き出し | 部全体の late_risk の件数と、職種ごとの見込み |
| 状態の確認の一覧 | 表の書き出し | 180日以上動きの無い募集中の求人 |
担当者ごとの一覧は、印の重い順に並べます。 hard_to_fill、late_risk のうち希望の時期が近いもの、drop、low_history の順です。1人に届く件数が毎週十件を超えるなら、印の条件の値を見直します。 一覧が長いと、上から数件しか読まれなくなります。
一覧は、担当者本人と上長にだけ届けます。 部全体の会議の資料には、担当者ごとの件数ではなく、職種ごとの件数を出します。 第7章の「させないこと」の3行目と同じ理由です。
人が確認する
人が見るのは、印の付いた求人だけです。 印の無い求人は一覧に出ません。全件を毎週読む設計にすると、第10章の10.0時間には収まりません。
late_riskのhard_to_fillを先に見る … 当面決まりにくい求人です。企業に条件の見直しを相談するか、取り下げを含めて話すかを決めますlate_riskの残りを見る … 要因の上位3つを読み、打ち手の案を一行で書きますdropを見る … 先週から見込みが下がった求人です。面接の辞退や書類の不通過が続いていないかを、選考の記録で確かめますlow_historyを見る … 記録の少ない職種です。モデルの見込みより、似た求人を持った担当者の経験を聞きます- 見込みと違う判断をしたら記録する … 「見込みは低いが、来週面接が3件あるので待つ」のように理由を残します
4番目で、モデルの見込みを無理に使わないでください。 学ばせた求人が少ない職種では、見込みの幅が大きく、当たっているように見えても偶然のことがあります。
目標は、600件をならして1件1分です。 印が付くのは一部の求人という想定で、それより多い週は、希望の時期の既定の値が短すぎるか、相場の集計がずれています。
例外に対処する
| 起きること | 対応 |
|---|---|
| 書き出しが失敗した | 前週の一覧を出さず、「今週は見込みなし」と担当者に知らせる |
| 受注日が空・決定日が受注日より前 | 学ばせる記録から外し、データの直しの一覧に回す |
| 180日以上動きの無い募集中の求人 | 学ばせる記録から外し、担当者に状態を確かめる |
predict_median が無限大 | hard_to_fill に置き換える |
| 新しい職種の求人 | low_history。大分類の strata で見込み、印を付ける |
| 学ばせ直した版の成績が前の版より悪い | 新しい版を使わず、前の版で見込みを出す |
| 求人の条件が途中で変わった(年収の上限を上げた等) | 変えた日を記録し、その後の推移は新しい条件の特徴で見込む |
| 同じ求人が別のIDで再登録された | 求人企業・職種・勤務地が同じで受注日が近いものを、担当者に確かめる |
上から2行目と3行目が、最初の数か月でいちばん起きます。 求人管理の仕組みに、状態の更新が漏れた古い求人が残っていることは珍しくありません。ここを片付けるだけで、見込みが長めにずれる原因の多くが消えます。
記録を残す
- 実行ごとに、書き出したファイルの名前と書き出し日時
- モデルの版(学ばせた期間、時点、特徴の列、
penalizer、strata の列) - 版ごとの成績(一致の指標(c-index)と、時点ごとの外れ方)
- 求人ごとの出力のJSON(
prob_filled_by_target、top_factors、flags) - 担当者が見込みと違う判断をした記録と、その後の結果
- 決定・取り下げになった求人の、各週の見込みの推移
成績は、打ち切りを考えた一致の指標で測ります。 lifelines は、生存時間の予測の順位が実際の順と合っているかを測る一致の指標(c-index)を持ち、打ち切りのある記録でも使えます。 学ばせた記録での値に加え、k_fold_cross_validation で記録を分け、学ばせていない側での値も見ます。
学ばせ直しのたびに、比例ハザードの仮定も確かめます。 CoxPHFitter には仮定に合わない列を知らせる check_assumptions() があり、合わない列が出たら、その列を strata に回すか、特徴の作り方を変えます。 確かめた結果も、版の記録に残します。
最後の行は、この構成の答え合わせです。 決まった求人について、受注後30日の時点での見込みと実際の日数を並べると、どの職種で見込みがずれているかが分かります。
04実装レベルの3段階
半自動化で、職種ごとの「決まるまでの日数の分布」が打ち切りを含めて出ます。 ただし、同じ職種の求人はすべて同じ見込みになり、年収や選考の進み具合の差は入りません。 本格構成で、1件4分が1分になります。 本記事の想定はこの段階です。差が大きいのは、①の確かめる時間と②の見立ての時間が、印の付いた求人の要因を読む時間に置き換わるからです。 段階を飛ばさないでください。 半自動化を2〜3か月回すと、状態の更新の漏れと、取り下げの理由の書き方のばらつきが先に見つかります。記録が整っていない状態で特徴を増やすと、モデルが記録の癖を学びます。
05工数削減シミュレーション
導入後 600件 × 1分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 数百件の求人を同時に預かる人材紹介会社や、職種の多い求人を自社で抱える企業の採用部門。求人ごとの進み具合を毎週の会議で担当者が1件ずつ読み上げ、どの求人に手を打つかを経験で決めている場合。求人管理の仕組みに、受注日・決定日・取り下げ日と、推薦・書類通過・面接の数が2年分以上残っている場合。
- 同時に持つ求人が数十件で、全件を毎週話し合える場合。求人の記録に受注日や決定日が残っておらず、決まるまでの日数を数えられない場合(まず記録をそろえる)。職種がほぼ1つで、求人ごとの差がほとんど無い場合。なお、企業への条件の見直しの提案の中身、候補者の推薦の判断、求人を受けるかどうかの判断は、この構成では代替できません。
07最小構成で試す方法
- 求人管理の仕組みから、過去2年分の求人を受注日・決定日・取り下げ日つきで書き出す
- 表計算ソフトで、職種の大分類ごとに、決まった求人の「受注から決定までの日数」の中央値を出す
- 同じ大分類で、取り下げた求人と、いまも募集中の求人の数を数える
- 募集中の求人のうち、受注からの日数が2番目の中央値を超えているものを抜き出す
- 抜き出した求人を、担当者が毎週の会議で「危ない」と言っている求人と並べる
最初に確かめるのは、3番目の数です。 取り下げと募集中の求人が多い職種ほど、2番目の中央値は短めに出ています。 決まった求人だけで日数を出すと楽観的になることが、ここで見えます。生存時間分析に進む理由がここで分かります。
| 出てきた内容 | 判断 |
|---|---|
| 4番目の求人と、担当者の「危ない」がおおむね重なった | Python で、推移と経過を入れたモデルに進む |
| 受注日や取り下げ日が空の求人が多い | 記録の整理が先。 状態の更新の漏れを片付ける |
| 職種によって取り下げの割合が大きく違う | 想定どおり。取り下げの理由の記録をそろえる |
2行目が出ても、構成は有効です。 状態の更新が漏れた求人を片付けるだけで、毎週の一覧が短くなり、担当者の見直しの時間そのものが減ります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 決まった求人だけで日数を出して、楽観的になる | 募集中と取り下げを打ち切りとして含める |
| その時点より後の記録が特徴に入って当たりすぎる | 時点ごとに、その日までの記録だけで特徴を作る |
| 経過の日数が見込みに出ない | conditional_after を渡す |
| 「残り9999日」が一覧に並ぶ | predict_median の無限大を hard_to_fill に置き換える |
| 状態の更新の漏れた古い求人が残る | 180日以上動きの無い求人を確かめる一覧に回す |
| 職種で決まるまでの形が違い、合わない | 職種の大分類を strata にする |
| 係数の向きが学ばせ直しのたびに変わる | penalizer を強めるか、特徴を減らす |
| 他社で決定の取り下げが多い職種で長めに出る | 割合を別に並べ、長めに出ていると読む |
| 一覧が担当者の評価に使われる | 職種ごとに集計し、担当者ごとの件数は会議に出さない |
| 希望の時期が「なるべく早く」で計算できない | 受注のときに日付で聞き、無ければ既定の値と印 |
上の2行が、この構成の失敗のほとんどです。 どちらも、見込みが実際より良く見える方向にずれます。楽観的な見込みは、遅れに気づくのを遅らせ、この構成を入れた意味を消します。
下の2行も、同じくらい早く効いてきます。 一覧が評価に使われ始めると、担当者は印の付きそうな求人の記録を後回しにします。記録が遅れると、見込みもまた遅れます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 求人の条件(職種・勤務地・年収)、求人企業の名前と選考の速さ、推薦と選考の段階の日付です。候補者の氏名・経歴は使いません。
- 候補者の個人の情報を書き出さない … 見込みに要るのは推薦と選考の段階の日付と数だけです。書き出しの設定で、候補者の氏名・連絡先・経歴の列を外します
- 求人企業の情報を外に出さない … 求人の条件と選考の速さは、求人企業から預かった情報です。モデルと一覧は社内の環境だけで扱います
- 見込みを担当者の評価に使わない … 決まりやすさは、求人の条件と市場で大きく決まります。見込みの低い求人を持つことを、担当者の成績の低さとして扱わないでください
- 企業への伝え方を人が決める … 「決まる見込みは3割です」をそのまま企業に伝えると、数字が独り歩きします。条件の相談は、要因を手がかりに担当者が自分の言葉で行います
- 見込みの限界を共有する … 見込みは過去の求人から学んだもので、市場が大きく変わった時期には外れます。 学ばせ直しの成績を、上長と担当者に毎月見せます
誤りが起きた場合のリスクは、間に合わない求人を見逃すことと、決まりそうな求人に余計な条件の見直しを持ちかけることの2つです。 前者は打ち切りを捨てると起き、後者は記録の少ない職種の見込みを信じすぎると起きます。どちらも、打ち切りを含めた学ばせ方と low_history の印で守ります。
10まず何から始めるか
1週目:古い求人を片付ける
求人管理の仕組みで、180日以上動きの無い募集中の求人を抜き出し、担当者に決定・取り下げ・募集中のどれかを確かめてもらいます。 取り下げの理由の選び方も、ここでそろえます。
2週目:最小構成で中央値を出す
過去2年分の求人を書き出し、職種の大分類ごとに決定までの日数の中央値と、取り下げ・募集中の数を出します。決まった求人だけの中央値が、どれくらい楽観的かを見ます。
3週目:希望の時期を日付でそろえる
新しく受ける求人から、希望の入社時期を日付で記録するようにします。募集中の求人も、担当者が分かる範囲で埋めます。
4週目:生存曲線を出す
Python と lifelines で、打ち切りを含めた職種ごとの生存曲線を出し、受注からの経過で見込みの低い求人に印を付けます。担当者の「危ない」と並べ、重なり方を見ます。
2か月目: 時点ごとの CoxPHFitter を作り、conditional_after で求人ごとの見込みを出します。一致の指標と k_fold_cross_validation で成績を測ります。3か月目以降: 要因の並べ替えと担当者ごとの一覧の配信を足し、1件4分が何分になったかを実測します。受注から数週間の時点で、遅れそうな求人について企業と相談を始められるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
CoxPHFitter が Cox の比例ハザードモデルを右側打ち切りの記録に当てはめること。fit の duration_col と event_col(観察された事象が1、打ち切りが0)、strata、penalizer の指定。predict_median が生存曲線が0.5を下回らないとき無限大を返すこと。predict_percentile と predict_survival_function、conditional_after で経過を条件にした残りの見込みを出せること。一致の指標(c-index)が打ち切りを含む生存時間の記録に使えること | lifelines: CoxPHFitter | 2026-10-08 |
KaplanMeierFitter の fit(durations, event_observed) で、事象が観察されなかった記録(0)を右側打ち切りとして扱うこと。survival_function_ と median_survival_time_ | lifelines: Survival analysis with lifelines | 2026-10-08 |
CoxPHFitter の check_assumptions() が比例ハザードの仮定に合わない列を知らせること。strata が比例ハザードの仮定に合わない列を効果を推定せずに含め、層ごとに基準のハザードを持ち係数を共有すること。すべての予測の関数で conditional_after を指定できること。一致の指標(c-index)が打ち切りを考えた指標であること。k_fold_cross_validation が記録を分けて学ばせ、学ばせていない側で評価すること | lifelines: Survival Regression | 2026-10-08 |
企業への条件の見直しの相談、求人の取り下げ、候補者の推薦は、担当者と上長の判断で決めてください。 本記事は製品の公開ドキュメントで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1095)についてのご相談はこちらから。
