Claude Media
採用の歩留まりをClaudeで分析する手順 — ATSのCSVから媒体別に見る

採用の歩留まりをClaudeで分析する手順 — ATSのCSVから媒体別に見る

ATSから書き出したCSVをClaudeに渡し、媒体別・職種別に応募から承諾までの転換率を出す手順です。ステージ列の整え方、依頼文、分母0の落とし穴、結果の読み方まで扱います。

採用の歩留まりを、CSV1枚とチャットで出す

採用の歩留まりとは、応募から書類通過、面接、内定、承諾へと進む各段階で、候補者がどれだけ次へ残るかの割合です。ATS(採用管理システム)から書き出したCSVをClaudeに添付すれば、媒体別・職種別の転換率を表とグラフで受け取れます。

Claudeは実行環境でPythonのコードを書いて動かし、集計表やPNGのグラフ、Excelファイルを返します。Free・Pro・Max・Team・Enterpriseのどのプランでも、Web・Claude Desktop・モバイルから使えます。TeamとEnterpriseは、組織の管理者が機能を止めている場合があります。

この記事の流れは次の4つです。

流れ

歩留まり分析の流れ

  1. 1

    CSVを「最終到達ステージ」の形に整える

    1候補者1行にして、どこまで進んだかを1列で持たせます。

  2. 2

    個人を特定する列を外してから添付する

    分析に氏名や連絡先は要りません。候補者IDだけを残します。

  3. 3

    読み込み件数を先に答えさせる

    集計の前に、行数とステージ名の種類を確認させます。

  4. 4

    媒体別・職種別の転換率と、落ちている段階を出させる

    表とグラフで受け取り、分母の小さい行は割り引いて読みます。

個別の候補者を1人ずつ評価する用途は、Workableの候補者スクリーニングが別の主題です。ここで扱うのは、候補者の集団を数える分析だけです。

ATSのCSVは「最終到達ステージ」の列に寄せる

ATSによって、書き出せる項目名も形式も異なります。ステージごとに日付が入る形式もあれば、現在のステータスだけが入る形式もあります。どちらでも、Claudeに渡す前に次の4列へ寄せておくと集計が安定します。

列中身例
candidate_id中身候補者を区別するID例C001
source中身応募経路(媒体)例人材紹介
job中身応募した職種例エンジニア
last_stage中身最後に到達したステージ例一次面接
CSVの先頭行(架空のサンプル)
candidate_id,source,job,last_stage
C001,求人媒体A,営業,一次面接
C002,求人媒体A,エンジニア,書類通過
C003,求人媒体A,エンジニア,一次面接

last_stageは「応募 → 書類通過 → 一次面接 → 内定 → 承諾」の5段階にそろえます。内定まで進んだ人は、書類通過と面接も通過しているので、到達人数は「そのステージ以降にいる人数」として数えます。不採用や辞退の理由は別の列に分けておくと、落ちた段階の内訳を後から聞けます。

ステージ名のゆれは先に潰します。ATSの設定次第で「書類選考」「書類通過」「書類OK」のように表記が混ざることがあり、Claudeは別のステージとして数えかねません。これも依頼文の中で、ステージ名の一覧を明示する形で防げます。

個人を特定する列は外してから渡す

歩留まりの計算に、氏名・メールアドレス・電話番号は使いません。ATSの書き出しファイルにこれらが入っているなら、表計算ソフトで列ごと削除してから添付します。候補者IDがあれば、気になる行を後でATSに戻って照合できます。

病歴や信条のような要配慮個人情報が自由記述欄に混ざっていないかも、書き出しの時点で確かめます。扱いの考え方は要配慮個人情報をClaudeに入力してよいかにまとめています。

読み込みの確認から始める依頼文

CSVの添付後、最初の依頼では集計をさせません。読み込めた行数とステージ名の種類を答えさせ、想定とずれていないかを人間が先に見ます。

プロンプト例(最初の確認)
添付したCSVは、採用選考の候補者データです。
集計に入る前に、次を答えてください。
 
- 読み込んだ行数
- last_stage 列にある値の種類と、それぞれの件数
- source 列と job 列の値の種類
- 空欄がある列と、その件数

ここで行数がATS側の候補者数と合わなければ、書き出し条件が違っています。ステージ名の種類が6個以上あれば、表記ゆれがあります。直してから次へ進みます。

プロンプト例(歩留まりの集計)
last_stage は次の順に進む5段階です。
応募 → 書類通過 → 一次面接 → 内定 → 承諾
あるステージにいる人は、それ以前のステージも通過済みとして数えてください。
 
source(媒体)ごとに、次を表にしてください。
- 各ステージの到達人数
- 隣り合うステージ間の転換率(分母と分子の人数も併記)
- 応募から承諾までの通算の転換率
 
分母が0の転換率は、0%ではなく「算出不可」と書いてください。
次に、転換率がいちばん低い段階を媒体ごとに1行で示し、
最後に媒体別の通算転換率を棒グラフにしてください。

分母と分子の人数を併記させるのが肝心です。「転換率32%」だけでは、19人中6人なのか、190人中61人なのか区別がつきません。

職種別を見るときは、同じ依頼文のsourceをjobに差し替えます。媒体と職種を掛け合わせると行が細かく割れて分母が小さくなるので、まず1軸ずつ見て、気になる組み合わせだけを掘り下げます。

プロンプト例(掘り下げ)
求人媒体Aの「一次面接 → 内定」の転換率が低く見えます。
職種別に分けると、どの職種で落ちていますか。
分母が10人未満の行には注意書きを付けてください。

グラフの種類の指定や作り直しの頼み方はClaudeにグラフを作らせる基本の頼み方で扱っています。

出力の例と、結果の読み方

200人分の架空データ(求人媒体A・人材紹介・リファラル・自社サイトの4経路)で、通算の転換率を出すとこうなります。数字は動作確認のために作ったもので、実在の採用データではありません。

媒体応募数書類通過率面接→内定応募→承諾
求人媒体A応募数90書類通過率49%面接→内定32%応募→承諾4%
人材紹介応募数50書類通過率80%面接→内定39%応募→承諾14%
リファラル応募数30書類通過率83%面接→内定71%応募→承諾30%
自社サイト応募数30書類通過率53%面接→内定0%応募→承諾0%

見るべき点は3つあります。

  • 応募数が最多の求人媒体Aは、通算の転換率でも最下位に近い。応募の多さと採用への貢献は別の指標です
  • リファラルは母数が30人と小さいので、30%という率は上下に振れやすい
  • 自社サイトの面接→内定0%は、6人中0人という意味で、「内定が出ない媒体」と断定できる根拠にはならない

率の隣に人数を置いて読めば、3点目のような過大評価を避けられます。ただし小さな母数の差を読み切れる統計的な検定までは、この表だけでは足りません。必要なら「この差は偶然の範囲か」とClaudeに聞き、使った手法と前提を答えさせます。

選考中の候補者が率を押し下げる

もう一つ、CSVの形に由来する落とし穴があります。書き出した時点で選考中の候補者は、last_stageが途中のままです。その人は「落ちた」のではなく「まだ途中」なのに、集計では次のステージに進まなかった人として数えられます。

直近の応募ほど、この影響で転換率が低く出ます。対策は2つです。

  • 選考が終わった候補者(合否や辞退が確定した人)だけに絞って集計する
  • ステータス列を持たせ、「選考中」を別に数えて分母から外す

依頼文に「選考中の候補者は除外してください」と書き、除外した人数を報告させます。

落ちた段階の理由を聞き直す

転換率が低い段階が見つかったら、不採用か辞退かの内訳を理由の列から集計させます。同じ「面接→内定」の低さでも、企業側が見送ったのか、候補者が辞退したのかで、見直す先が選考基準か面接の体験かに分かれるためです。

プロンプト例(理由の内訳)
求人媒体Aで一次面接のあとに止まった候補者について、
reason 列の値を、不採用と辞退に分けて件数で示してください。
reason が空欄の行は、別枠で件数だけ報告してください。

理由の列が自由記述なら、分類は読み手の解釈に左右されます。カテゴリの一覧を先に決め、そこへの当てはめをClaudeに頼む形が安定します。

検算用に手元で同じ集計を動かす

Claudeの集計を鵜呑みにせず、数字の入口と出口を確かめる癖をつけると安全です。標準ライブラリだけで動く小さなスクリプトを手元に置けば、Claudeの表と突き合わせられます。

funnel.py(標準ライブラリのみ)
import csv
from collections import Counter, defaultdict
 
STAGES = ["応募", "書類通過", "一次面接", "内定", "承諾"]
rank = {s: i for i, s in enumerate(STAGES)}
 
reached = defaultdict(Counter)   # 媒体 -> ステージ -> 到達人数
with open("ats.csv", encoding="utf-8") as f:
    for row in csv.DictReader(f):
        last = rank[row["last_stage"]]
        for s in STAGES[: last + 1]:
            reached[row["source"]][s] += 1
 
for src, c in reached.items():
    print(src, [c[s] for s in STAGES])
    for a, b in zip(STAGES, STAGES[1:]):
        rate = f"{c[b]/c[a]:.0%}" if c[a] else "算出不可(分母0)"
        print(f"  {a}->{b}: {c[b]}/{c[a]} = {rate}")
python3 funnel.py
実際の出力(Python 3.12.2・上の架空データ200件)
求人媒体A [90, 44, 19, 6, 4]
  応募->書類通過: 44/90 = 49%
  書類通過->一次面接: 19/44 = 43%
  一次面接->内定: 6/19 = 32%
  内定->承諾: 4/6 = 67%
人材紹介 [50, 40, 23, 9, 7]
  応募->書類通過: 40/50 = 80%
  書類通過->一次面接: 23/40 = 57%
  一次面接->内定: 9/23 = 39%
  内定->承諾: 7/9 = 78%
リファラル [30, 25, 17, 12, 9]
  応募->書類通過: 25/30 = 83%
  書類通過->一次面接: 17/25 = 68%
  一次面接->内定: 12/17 = 71%
  内定->承諾: 9/12 = 75%
自社サイト [30, 16, 6, 0, 0]
  応募->書類通過: 16/30 = 53%
  書類通過->一次面接: 6/16 = 38%
  一次面接->内定: 0/6 = 0%
  内定->承諾: 0/0 = 算出不可(分母0)

自社サイトの最終行が、分母0の例です。最初に書いたスクリプトはc[b]/c[a]をそのまま計算していて、この行でZeroDivisionError: division by zeroと止まりました。集計ツールを自作しても、Claudeに書かせても、この落とし穴には当たります。依頼文に「分母が0なら算出不可と書く」と入れておく理由はここにあります。

Claudeの表の人数が上の出力と一致すれば、集計の骨格は信頼できます。一致しないなら、ステージ名のゆれや除外条件の違いが原因です。差分の出た行を指定して、Claudeに理由を聞きます。

結果をExcelやグラフで持ち帰る

集計結果は、会話の中の表だけでなくファイルとして受け取れます。Claudeが作れるのはExcel(.xlsx)・PowerPoint(.pptx)・Word(.docx)・PDFで、グラフはPNGの画像として出力されます。ダウンロードするほか、Google Driveに直接保存もできます。

プロンプト例(ファイルでの出力)
ここまでの集計を、Excelファイルにまとめてください。
- シート1: 媒体別の到達人数と転換率
- シート2: 職種別の到達人数と転換率
- シート3: 前提(除外した人数、ステージの定義、分母0の扱い)
グラフはPNGで別に出力してください。

前提のシートを必ず付けさせます。数カ月後に同じ集計を見返したとき、どの条件で出した数字か分からなくなるのを防げます。

月次で同じ分析を繰り返すなら、プロジェクトに集計の依頼文とステージの定義を置いておく手もあります。プロジェクトのファイルは、Claudeの実行環境から参照できます。毎回プロンプトを貼り直さずに済みます。

添付できる量の目安

CSVの添付で押さえる数字は次のとおりです。

項目上限
1ファイルの大きさ上限30MB(アップロードもダウンロードも)
1回のチャットに添付できるファイル数上限20件

4列に絞ったCSVは小さくなります。30MBに収まらないときは、期間で分割して依頼します。また、コード実行とファイル作成は通常のチャットより使用量を多く消費するため、大きなCSVを何度も作り直すと、プランの上限に早く近づきます。

うまくいかないときの切り分け

集計が進まない、またはファイルが出てこないときは、依頼文より先に機能がオンかを確かめます。

  • Free・Pro・Maxは、既定で「コード実行とファイル作成」が有効です
  • Teamは、組織の管理者が設定から機能ごとに無効にできます。無効だとメンバー側では何をしても動きません
  • Enterpriseも同様に管理者が切り替えます

ネットワーク接続がオフの組織では、Claudeは事前に入っているパッケージだけで動きます。集計に必要なパッケージが足りないときは、管理者にネットワーク設定を相談します。

採用データは、人事部門が管理する機微な情報でもあります。会社のAI利用ルールで外部サービスへの添付が制限されていないかは、分析の前に確かめます。ATSの人事情報をチャットの会話で扱う連携の例はClaudeとBambooHRを連携する方法にあります。

まとめ

歩留まり分析の精度は、プロンプトの上手さより、CSVの形で決まります。1候補者1行、最終到達ステージを1列、個人を特定する列は削除という3点を守ると、Claudeは媒体別・職種別の転換率をすぐ返します。

数字を読むときは、率より先に分母を見ます。分母0の算出不可、10人未満の行、選考中の候補者という3つが、歩留まりを実態からずらす主な原因です。手元の小さなスクリプトで人数を突き合わせておけば、Claudeの表を採用会議に出す前に確かめられます。CSV分析そのものの基本はClaude CSV分析の使い方にあります。

この記事を共有:XはてブLinkedIn