- レコメンドシステムのオフライン検証で必ず名前が挙がる 7 指標(Precision / Recall / F1 / MAP / NDCG / Hit Rate / Coverage)を、文系出身のプロダクトマネージャーでも理解できるように解説する。
- 「式 → 日本語訳 → 計算ステップ → ビジネス活用 → よくある誤解」までワンストップで理解できます。
なぜこの記事を書いたか
- 僕自身、最初にオフライン検証の結果を渡されたとき “横文字の暗号” に圧倒され、理解に苦しんだ記憶があります
- 同じ落とし穴を避けるべく、たった 5 件のデータを例に数式・図解・たとえ話をフル動員し、どの指標が何を語るのかを徹底的に噛み砕きます。
- 共通で使う “5件データ”
- 1. Precision@5(適合率)—「外れをどれだけ減らせたか?」
- 2. Recall@5(再現率)—「ユーザーが欲しかった求人を取りこぼしていないか?」
- 3. F1@5 ― Precision と Recall を 1 つにまとめる指標
- 4. MAP@5(平均適合率)— 上位配置の腕前を測る
- 5. NDCG@5 ― 行動に重みを付けたランキング指標
- 6. Hit Rate@5 — 「1件でも当たりがあれば勝ち」
- 7. Coverage — ラインナップ健全性のセーフティネット
- 指標の選び方 & 併用パターン — まず “ビジネスの問い” を 1 行に書き出すところから
- 今日からできる PM アクション 4 ステップ
- Q&A:よくある疑問を一問一答
- 参考情報
共通で使う “5件データ”
順位 (Position) |
求人ID (Job) |
ユーザー行動 (User Action) |
---|---|---|
① | A社 | クリック |
② | B社 | 応募 |
③ | C社 | 無反応 |
④ | D社 | クリック |
⑤ | E社 | 無反応 |
- Relevant(興味求人)=クリック or 応募 ⇒ 3件(A・B・D)
- Recommended(表示求人)= 5件(A〜E)
- K(評価対象行数)= 5
1. Precision@5(適合率)—「外れをどれだけ減らせたか?」
■ なぜ重要?
例えば、求人トップ枠は 10〜15 件など表示面積が限られます。そうでなくてもECサイトなどでも表示枠は一定限られるでしょう。
Precision が低い=外れ求人が多いと「自分に合わないサイト」と感じ離脱率が上がるため、
トップ枠やPush通知のようにワンショット勝負の場面で特に重視されます。
■ 数式と“日本語訳”
Precision@K = (Relevant ∩ Recommended) / K
- Relevant ∩ Recommended:当たり(=クリックor応募)の数
- K:推薦した件数(ここでは 5)
■ 計算ステップ
- 当たり = 3 件(A, B, D)
- K = 5
- Precision@5 = 3 ÷ 5 = 0.60(60 %)
■ 読み取りポイント
Precision@5 | UX イメージ |
---|---|
>0.8 | ほぼ外れなし。「お、当たるサービス」感 |
0.4〜0.7 | 半々ガチャ。改善余地大 |
<0.3 | 外れ連発。トップ枠で致命傷 |
■ よくある落とし穴
- 枠を増やすと Precision は下がりやすい(当たりを入れ続けるのが難しい)。
- クリック誘導文言を変えただけで Precision が変動 → モデルの良し悪しと切り分けを。
2. Recall@5(再現率)—「ユーザーが欲しかった求人を取りこぼしていないか?」
■ ざっくり 1 行で
“ユーザーが本当に興味を持った求人を、どれだけ 拾い切れたか?”を 0~1 で表す。
■ どんな場面で効く?
- 求人ニュースレター:1通で興味求人を拾えないと「もう読まない」と思われやすい。
- 無限スクロール一覧:下層まで行かずに離脱される前に、重要求人を画面上方へ出したい。
- 検索リザルト:キーワード完全一致だけでは漏れる求人をレコメンド側で補完したい。
■ 数式と“人間語訳”
Recall@K = レコメンドした中で当たった求人(クリック/応募) ─────────────────────────────── ユーザーがそのセッションで本当に興味を示した求人
要は「ユーザーが興味を示したすべての求人セット」を分母にする指標です。
Precision は分母が「推薦数」だったので、この違いを押さえてください。
■ 5件データで手計算
順位 | 求人ID | 行動 |
---|---|---|
① | A社 | クリック |
② | B社 | 応募 |
③ | C社 | 無反応 |
④ | D社 | クリック |
⑤ | E社 | 無反応 |
- 当たり求人(クリック/応募)= A・B・D = 3件
- 興味求人の総数 = A・B・D = 3件
- Recall@5 = 3 ÷ 3 = 1.00(取りこぼしゼロ)
■ 取りこぼしが発生したシナリオ
ユーザーが B・C・D の 3 件に興味を示したが C 社を上位 5 件に出せなかった場合:
- 当たり求人 = 2 件(B・D)
- 興味求人総数 = 3 件(B・C・D)
→ 興味求人の 1/3 を取りこぼし
■ Precision との違いを 10 秒で思い出す図
観点 | Precision | Recall |
---|---|---|
分 母 | 推薦件数(5) | 興味件数(3) |
問い | 「出した中で外れは?」 | 「興味を何件拾えた?」 |
■ KPI として使うときの目安 & 改善ヒント
Recall 水準 | UX 印象 | 改善アクション例 |
---|---|---|
0.9〜1.0 | 「自分向け求人が必ずある」 | 多様性・説明性へ投資しリテンション向上 |
0.6〜0.8 | 一部取りこぼしが気になる | 枠数増/類似求人サジェスト/ランキング微調整 |
<0.6 | 「合う求人が少ない…」 | 特徴量追加・コールドスタート対策・NDCG 最適化 |
■ 誤解と注意点まとめ
- Recall ≠ 「クリック数が多いモデル」
- クリック誘起バナーでも上がるので、クリック率 (CTR) とは別物と認識。
- 枠を増やすだけの Recall 改善は危険
- Precision が急落 → 外れ感で離脱/レイテンシ増。
- 興味求人ラベルの定義を定期点検
- 「応募完了」か「応募開始」かで Recall 値は大きく変動。
3. F1@5 ― Precision と Recall を 1 つにまとめる指標
■ F1とは?
F1 は「当たり率(Precision)と取りこぼし率(Recall)を両方そこそこ満たしているか?」を示す 0〜1 の点数。
どちらか一方が低いと引っ張られて下がります。
■ 計算式(調和平均)
F1 = 2 × Precision × Recall ÷ (Precision + Recall)
■ 5 件データで “手計算&比較”
同じ 5 行を使い、クリックが何件入ったかだけ変えて 3 パターンを比べます。
パターン | クリック / 応募 (当たり件数) |
Precision@5 | Recall@5 | F1@5 |
---|---|---|---|---|
① A・B・D (元データであたりが3件) |
3 件 | 3/5 = 0.60 | 3/3 = 1.00 | 0.75 |
② A・B (当たりが2件) |
2 件 | 2/5 = 0.40 | 2/3 ≈ 0.67 | 0.50 |
③ B だけ (当たりが1件) |
1 件 | 1/5 = 0.20 | 1/3 ≈ 0.33 | 0.25 |
ポイント
- 当たりが減るたびに Precision も Recall も低下し、F1 が連動して落ちることが分かります。
- F1 = 0.75 ⇒ バランス良好、0.50 ⇒ どちらか不足、0.25 ⇒ 両方不足、という目安で見てください。
■ いつ使うか?
- トップ 10 枠:外れも漏れも許せない UI。F1 ≧ 0.7 がひとつの目標ライン。
- モデル初期比較:Precision と Recall が一長一短になる複数案を
ワンスコアでソートして優先順位付け。
■ 誤解しやすい点
- 「F1 が高い=完璧モデル?」
- 多様性や応募重視(NDCG)など他指標を無視すると落とし穴。
F1 は P・R のバランスだけを語る点を忘れずに。 - 「F1 が低い=両方悪い?」
- 片方だけが低くても F1 は大きく下がる。
必ず Precision と Recall を個別に点検して原因を特定。
◆ 調和平均(Harmonic Mean)の超入門
調和平均 = “バランスが悪いと点が下がる平均” です。
普通の平均(算術平均)は (a + b) ÷ 2
ですが、調和平均は2 ÷ (1/a + 1/b)
。
極端に小さい数が 1 つでも混ざると結果がグッと下がるのが特徴です。
■ 具体例:Precision と Recall を比べてみる
Precision | Recall | 算術平均 (普通の平均) |
調和平均 (F1 の本体) |
---|---|---|---|
1.0 | 0.0 | 0.50 | 0.00 |
0.9 | 0.1 | 0.50 | 0.18 |
0.6 | 0.6 | 0.60 | 0.60 |
- どちらかがゼロだと調和平均もゼロ —— 片方だけ優秀でもダメ。
- 数字が離れているほど算術平均とのギャップが大きくなる。
■ F1 に当てはめると…
F1 は Precision と Recall の調和平均。
片方が低いモデルは容赦なく点が下がるので、
「外れを減らしつつ、取りこぼしも少ない」バランス型だけが高得点になります。
4. MAP@5(平均適合率)— 上位配置の腕前を測る
■ コンセプト
Precision/Recall は 数 を見るだけ。
MAP は「当たりの並び順」に着目し、早く当たるほど高評価します。
■ 計算ステップ
順位 | 行動 | 累積当たり数 | Precision at その時点 |
---|---|---|---|
① | クリック | 1 | 1/1 = 1.00 |
② | 応募 | 2 | 2/2 = 1.00 |
④ | クリック | 3 | 3/4 = 0.75 |
MAP (Mean Average Precision) は 全ユーザー の AP を平均したもの。
「上から順に刺さるか?」をモデル単位で可視化できます。
■ MAP が不安定になるケース
- クリック数が極端に少ないと AP の分母が小さく振れ幅が大きい。
- 興味求人がゼロのユーザーは AP 計算不能 → 除外 or ゼロ扱いかを明示。
5. NDCG@5 ― 行動に重みを付けたランキング指標
■ なぜ MAP だけでは足りない?
クリックと応募を同列に扱う MAP では、「応募を上位に置けているか」が評価できません。
NDCG は
- アクションに点数(Gain)を付ける
- 上位ほど割引を小さく積算
- 理想並びと比較
という 3 段構えで“価値の高い行動を上に置く力”を測ります。
■ 計算ステップ
- Gain を決める → クリック=1・応募=3
- DCG(Discounted Cumulative Gain)
- 順位① 応募3 / log₂(1+1)=1 → 3.00
- 順位② 無反応0 / log₂(2+1)=1.585 → 0
- 順位③ 無反応0 → 0
- 順位④ クリック1 / log₂(4+1)=2.322 → 0.43
- 順位⑤ 無反応0 → 0
- 合計 DCG@5 ≈ 3.43
- Ideal DCG:応募→クリック→クリック→無→無 の順で再計算 ≈ 4.13
- NDCG@5 = 3.43 ÷ 4.13 ≈ 0.83
■ 目安と解釈
NDCG | 解釈 |
---|---|
>0.9 | ほぼ理想順。応募が最上位に来る |
0.6〜0.9 | 応募は上位だがクリックが散在 |
<0.6 | 価値行動が下位。リランク必須 |
必ずステークホルダー合意を取ってから運用。
■ 「log₂」って何? 2 分で分かる log の超基礎
log(対数)のイメージを一言で
例えば
log₂(倍数)
は “何回 2 倍したか” を表します。log(対数)の計算イメージ
順位 (i) | log₂(i+1) | 割引係数 (1 / log₂) |
---|---|---|
1 | 1 ← 21=2 | 1.00 |
2 | 1.585 | 0.63 |
3 | 2.000 | 0.50 |
4 | 2.322 | 0.43 |
5 | 2.585 | 0.39 |
- 上位ほど割引係数が 1 に近い → 点数がほぼそのまま加算される。
- 下位に行くほど割引係数が小さく → “価値はあるけど遅れて表示” とみなして減点。
- 「
i+1
」の “+1” は順位1位で割り算が 0 になるのを防ぐ安全策。
つまり、応募3点を順位①に置くと 3 点フルでもらえますが、
順位④に置くと 3 ÷ 2.322 ≈ 1.29 点に “価値が目減り” します。
これが「価値ある行動は上に置くほど良い」と数式で表現している部分です。
6. Hit Rate@5 — 「1件でも当たりがあれば勝ち」
■ コンセプト
- ユーザーが当たりコンテンツを 1 件でも見つけられれば良しとする割り切り。
- カルーセルやレコメンドメールのようにスクロール・スワイプ可能な UI と相性◎。
■ 計算
(含まれなければ 0)
■ ポイント
- ユーザー単位指標なので平均を取って使う(例:全体 Hit Rate=0.84)。
- 「最低保証」のため Precision/Recall が多少落ちても許容できる UX で有効。
7. Coverage — ラインナップ健全性のセーフティネット
■ 定義
Coverage = (推薦に 1 回でも登場した求人の数) / (総掲載求人数)
■ 例と解釈
- 25 % は “やや人気偏重” のサイン。
- <10 % は「同じ求人ばかり」状態 → 多様性向上の施策を検討。
- >60 % は多様だが Precision/Recall が落ちていないか要チェック。
■ よくある改善策
- 人気求人の出現上限を設定
- コールドスタート求人を確率的に混ぜる(エクスプロイト & エクスプロア)
指標の選び方 & 併用パターン — まず “ビジネスの問い” を 1 行に書き出すところから
「どの指標を追えばいい?」と迷ったら、必ず先に “問い” を日本語で書き出してください。
指標は 問いを数字に翻訳 するツールにすぎません。
ここでは求人サービスで頻発する 4 つのシーンを取り上げ、どの指標を設定するか解説してみます。
🎯 シーン① トップ枠 — “最初の 10 件” の外れ感を抑えたい
要素 | 詳細 |
---|---|
① 背景 | ・ファーストビューは 10 件程度 ・外れが続くと 直帰率が急上昇 ・クリック ≒ サイト継続利用の起点 |
② 指標セット | 主:Precision@10 ─ ハズレ率を直接削減 補:MAP@10 ─ 当たりを上位に並べ替え 補:Coverage(月次) ─ 人気求人偏重を監視 |
③ 運用のコツ |
|
④ 落とし穴 |
|
✉️ シーン② ニュースレター — “抜け漏れゼロ” で届けたい
要素 | 詳細 |
---|---|
① 背景 | ・1 通 20〜30 件 ・取りこぼすと「読む価値なし」で開封停止 ・外れが数件あっても UX 影響は小 |
② 指標セット | 主:Recall@30 ─ 興味求人を拾い切ったか 補:Hit Rate@30 ─ 最低 1 件ヒット保証 補:Precision@30 ─ 外れ過多を抑止 |
③ 運用のコツ |
|
④ 落とし穴 |
|
💰 シーン③ 応募価値を最大化 — “応募を最上位” に置きたい
要素 | 詳細 |
---|---|
① 背景 | ・応募 = 売上直結 → クリックより重視 ・“価値の高い行動” を上位露出したい |
② 指標セット | 主:NDCG@k ─ Gain:応募=3・クリック=1 補:Precision@k ─ 外れ率も並行監視 補:MAP@k ─ 応募が少ない職種はクリック順で補完 |
③ 運用のコツ |
|
④ 落とし穴 |
|
🌈 シーン④ 大手求人偏重を避ける — “広さ&バランス” を守る
要素 | 詳細 |
---|---|
① 背景 | ・大手はクリックを集めやすい ・中小・ニッチが埋もれると掲載解約リスク |
② 指標セット | 主:Coverage ─ 月次で 30〜60% キープ 補:Diversity ─ 業種・勤務地ごとの比率 補:Precision ─ 外れ急増を抑止 |
③ 運用のコツ |
|
④ 落とし穴 |
|
■ “指標コンパス” 作成ステップ
- 問いを書く:「トップ枠で外れを減らしたい」
- 主指標を 1 個に絞る:Precision
- 副作用を測る補助指標:Coverage や Recall
- 目標値を言語化:「週平均 0.75 以上」
- 可視化:Looker Studio / Redash で週次ダッシュボード
コツは「主指標=守りたい UX」「補助指標=副作用チェック」の役割分担を明確にすること。
これだけで改善サイクルの優先度付けが 10 倍ラクになります。
今日からできる PM アクション 4 ステップ
- 5 件例を手で再計算し、式を身体で覚える。
- 週次ダッシュボード:Precision・Recall・Coverage を最小セットに可視化。
- Gain 設計ワークショップ:応募=3、クリック=1 など重み付けをチーム合意。
- オフ→オンライン:オフラインで上位モデルのみ A/B テストへ昇格。
Q&A:よくある疑問を一問一答
- Q1. @K の最適値は?
- ユーザーが一度に視認できる件数に合わせる。例:トップ10枠→@10/メール20件→@20。
- Q2. Precision と Recall、どちらを優先?
- 枠が狭い UI → Precision/枠が広い UI → Recall。F1 で妥協点を探る方法も。
- Q3. Coverage を上げたら Precision が下がった…
- トレードオフ。
人気・新着・ニッチなどサブモデルをブレンドしてリランクすると両立しやすい。
参考情報
- Ricci et al. (2022) Recommender Systems Handbook
- Cremonesi et al. (2010) “Performance of Recommender Algorithms on Top-N Tasks”
- Netflix TechBlog “Selecting the Right Metrics for Recommender Evaluation”
コメント