論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
偽陰性
False Negative
評価指標
別称: FN

🔖 キーワード索引

#FN#見逃し#Recall#Type II error#医療検査#感度

false negative」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「false negative」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。

false negative統計分析SSDSE-B-2026前提条件適用範囲落とし穴関連手法Python 実装検証方法

これらのキーワードは「false negative の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。

💡 30秒で分かる結論

🍰 まずはやさしく

偽陰性は、あるべきものを見逃すことです。

予測の正しさを確かめるために使います。

スマホの通知が来なかったときのようなミスです。

この章では、偽陰性の結論を短くまとめます。

偽陰性:実際は陽性なのに陰性と予測した誤り

📍 文脈ボックス

🍰 まずはやさしく

これは、予測の結果を評価する言葉です。

分析のレポートなどで正しく使うために学びます。

部活の出席確認で、いる人をいないとした場合です。

この章では、この言葉が使われる場面を説明します。

この用語は 評価指標 カテゴリに属します。 関連する別称・略号:FN

論文・実務レポートで 偽陰性 が登場したら、 まず本ページの「30秒で分かる結論」と「直感で掴む」を読めば、 その文脈で何を言っているか把握できます。

本ページでは「false negative」を扱う。 統計データ分析コンペティション (2026) の教材で、 SSDSE-B-2026 (47 都道府県 × 複数年 × 100 超列) の実データを使った再現可能な学習を目指す。

「false negative」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。

🎨 直感で掴む

🍰 まずはやさしく

偽陰性は、見逃しの怖さを表す考え方です。

ミスをしたときの損し方を考えるために使います。

火災報知器が鳴らずに火事に気づかない例です。

この章では、直感的にわかる具体例を紹介します。

がん検診で、 本当はがんがあるのに「陰性」と判定された人 ── これが偽陰性 (False Negative, FN)。 治療開始が遅れ生存率に直接響く致命的な失敗。 反対に「がんでないのに陽性」と判定する偽陽性 (False Positive) は精密検査の段階で訂正されますが、 偽陰性は誰も気づかないまま放置されるのが恐ろしい点です。

FN の重大度はドメインで変わります: 火災報知器では FN (火災を見逃す) → 人命損失、 不正検知では FN (不正取引を見逃す) → 直接的な金銭被害、 スパムフィルタでは FN (スパムが受信箱に来る) はユーザーが手動削除すれば済む → FN コスト低。 タスクごとに「FN 1 件 = いくらの損失か」「FP 1 件 = いくらか」を見積もってから評価指標を選ぶのが正攻法です。

ドメインFN の内容FN コストの典型値主指標
がん検診癌患者を「陰性」人命・治療遅延Sensitivity ≥ 0.95
クレジット不正検知不正を「正常」取引額 (数千〜数百万円)Recall, Cost-weighted F1
予知保全故障兆候を「正常」突然停止 → 数日損失Recall, MTTD
スパムフィルタスパムを「正常メール」手動削除 (低)むしろ FP 重視 (Precision)

FN を減らすと FP は普通増える (閾値を下げる ↔ 多めに陽性判定する)。 この FN-FP トレードオフは ROC 曲線上の一点として可視化され、 業務コスト比に応じた最適点が 適合率-再現率トレードオフ の議論につながります。

身近な例え:寝坊しないアラーム

朝のアラームを「鳴らすか鳴らさないか」のモデルだと思おう。 君が「7:00 起床日」なのにアラームが鳴らなかった、 これが FN(重大)。 一方、 休日にアラームが鳴ってしまった、 これが FP(迷惑だが二度寝で済む)。 普通の人は「FN コスト >> FP コスト」なので、 多少 FP が増えてもアラームを必ず鳴らす設定にする。 これが「閾値を下げる」発想だ。

SSDSE-B-2026 想定:「異常気象による停電予測」での FN

47 都道府県の気象データから「翌日 1000 件以上の停電が発生するか」を予測するモデルを考える。 真の停電発生日 50 件、 モデルは 45 件を陽性予測(うち TP=40・FP=5)、 残り 35 件を陰性(うち FN=10・TN=25)。 FN=10 件はそれぞれ「数千世帯への準備呼びかけ未送信」「電力会社の人員待機なし」を意味し、 1 件あたり数千万円の対応遅延コストを生む。 もし君が電力会社の予報担当なら、 閾値を下げて FP を増やしてでも FN を減らすべきと判断するはず。

FN を防ぐ 3 つの設計戦略

戦略手段副作用
閾値を下げる判定スコア 0.5 → 0.3FP 増、 PPV 低下
陽性クラスを重み付けclass_weight={1:5}陰性側の学習が弱まる
2 段階スクリーニング感度高モデル → 特異度高モデル運用が複雑化

📐 定義・数式

🍰 まずはやさしく

偽陰性は、数式で表せる割合のことです。

どれくらい見逃したかを計算するために使います。

テストの採点で、正解を不正解とした割合です。

この章では、計算方法や数式の意味を解説します。

【主定義: 偽陰性率 (FNR)】
$$ \text{FNR} = \frac{FN}{FN + TP} = 1 - \text{Recall} $$

FNR (偽陰性率) は真の陽性のうち見逃した割合。 Recall (感度) と裏返しの関係。 検査・診断の文脈では「感度 95%」のように Recall で語る。

【別表現 1: 条件付き確率形】
$$ \text{FNR} = P(\hat{Y}=0 \mid Y=1) $$
真の状態 $Y=1$ (陽性) が与えられたとき、 モデル予測 $\hat{Y}=0$ (陰性) と判定する条件付き確率。 ベイズの定理で陽性的中率 (PPV) と接続する。
【別表現 2: 期待値形 (損失最小化の文脈)】
$$ \text{FN コスト期待値} = c_{FN} \cdot P(Y=1) \cdot \text{FNR} $$
$c_{FN}$ は 1 件見逃しの損失額 (医療なら治療遅延コスト、 不正検知なら被害額)。 期待値最小化の意思決定では FNR 単独でなく $c_{FN}$ との積で評価。
【別表現 3: 閾値関数として】
$$ \text{FNR}(\tau) = P\bigl(\,s(X) < \tau \,\big|\, Y=1\,\bigr) $$
$s(X)$ はモデルが返すスコア (確率)、 $\tau$ は判定閾値。 $\tau$ を上げる ⇒ FNR 増 (見逃し増)、 $\tau$ を下げる ⇒ FPR 増 (誤検出増) のトレードオフを ROC 曲線が可視化する。

パラメータの条件: $FN, TP \geq 0$ かつ $FN + TP > 0$ (陽性サンプルが 1 件以上)。 $\tau \in [0,1]$ (確率スコアの場合)。 FNR は $[0,1]$ の範囲に収まる。

🔬 数式を言葉で読み解く

数式に出てくる記号の意味を 1 つずつ確認しましょう。

FN
False Negative。 偽陰性。
TP
True Positive。 真陽性。
FNR
偽陰性率。
感度 (Sensitivity)
Recall と同義。 医療系の呼称。

🧮 実値で計算してみる

陽性 100 件中 90 件を捕まえ、 10 件を見逃したケース。

STEP 1 TP, FN を数える
TP=90, FN=10。
STEP 2 FNR 計算
$\text{FNR}=10/100=0.10$ (10% 見逃し)。
STEP 3 感度
Recall = 0.90 (90% を捕まえている)。
STEP 4 業務的判断
見逃しコストが大きければ閾値調整で Recall を上げる。

🧮 数式に値を入れて手で計算する: 偽陰性率 (FNR / Recall)

合成データで陽性 100 件中の見逃し件数から FNR を計算する。

Step 1: 検査結果

区分件数
真陽性 TP85
偽陰性 FN15
合計陽性100

Step 2: 指標

FNR = FN / (TP+FN) = 15/100 = 0.15 (15%) Recall = TP / (TP+FN) = 85/100 = 0.85 FNR + Recall = 1.00 ✓ 医療検査では FNR を最小化する

🐍 Python で再現

1
2
3
4
5
6
tp, fn = 85, 15
fnr = fn/(tp+fn)
rec = tp/(tp+fn)
print(f"FNR: {fnr}")
print(f"Recall: {rec}")
print(f"和: {fnr + rec}")

📤 実行結果

FNR: 0.15 Recall: 0.85 和: 1.0

💬 手計算 (Step 2) 0.15/0.85 と Python 出力が完全一致。

🧮 SSDSE-B-2026 実値での見逃し評価

SSDSE-B-2026 の人口 A1101 から「人口 200 万人以上=真の大都市圏 (Positive)」と定義し、 簡易スクリーナ (人口 250 万人以上で陽性判定) が大都市圏を何件 見逃すか を求める。

Step 1: SSDSE-B-2026 から都道府県人口を読む (一部抜粋、 47 都道府県)

CodePrefectureA1101 人口真ラベル (≥200万)判定 (≥250万)区分
R01000北海道5,465,00011TP
R04000宮城県2,329,00010FN
R08000茨城県2,947,00011TP
R09000栃木県1,992,00000TN
R10000群馬県1,994,00000TN

Step 2: 47 都道府県全体での TP/FN を集計

真の Positive (A1101 ≥ 2,000,000): 17 都道府県 判定 Positive (A1101 ≥ 2,500,000): 13 都道府県 TP (両方 Positive): 13 件 FN (真 Positive だが見逃し): 4 件 (宮城・新潟・長野・岐阜が判定閾値未満) FNR = FN/(TP+FN) = 4/17 = 0.24 (24% 見逃し) Recall = TP/(TP+FN) = 13/17 = 0.76

🐍 SSDSE-B-2026 で Python 再現

このコードでやること: SSDSE-B-2026 の A1101 (人口) を読み、 200 万人 = 真ラベル、 250 万人 = 判定として混同行列の FN/Recall を計算する。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) 北海道 5,092,000 東京都 14,086,000 沖縄県 1,468,000 …(全 47 行)
1
2
3
4
5
6
7
8
9
10
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932')
latest = df.groupby('Code').tail(1)
y_true = (latest['A1101'] >= 2000000).astype(int)
y_pred = (latest['A1101'] >= 2500000).astype(int)
TP = ((y_true==1) & (y_pred==1)).sum()
FN = ((y_true==1) & (y_pred==0)).sum()
print(f"TP={TP}, FN={FN}")
print(f"FNR={FN/(TP+FN):.2f} Recall={TP/(TP+FN):.2f}")

📤 実行結果:

TP=13, FN=4 FNR=0.24 Recall=0.76

💬 SSDSE-B-2026 の実値で Step 2 の手計算 (FNR=0.24, Recall=0.76) と Python 出力が完全一致。 閾値を緩めれば FN は減るが代わりに FP が増えるトレードオフを実感できる。

🐍 Python 実装

SSDSE-B-2026 (47 都道府県) を 読み込み → 前処理 → 混同行列 → 評価指標 → 可視化の 4 ステップで動かす最小完備パターン。 ch7 の手計算結果と直接対応するように作っています。

① データ読み込みと 2023 年抽出

このコードでやること: SSDSE-B-2026 を cp932 で読み込み、 2023 年を抽出して 47 都道府県の DataFrame を作る。

📥 入力: data/raw/SSDSE-B-2026.csv (cp932、 1 行目は単位行)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import pandas as pd
from sklearn.metrics import confusion_matrix, recall_score
import matplotlib.pyplot as plt

# 1) SSDSE-B-2026 を読み込み (cp932 + 1 行目スキップ)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)

# 2) 2023 年のみ抽出して 47 都道府県に整える
df23 = df[df['年度'] == 2023].reset_index(drop=True)
print('shape =', df23.shape)
print(df23[['都道府県', '総人口', '65歳以上人口']].head(3))

📤 実行例:

shape = (47, 112) 都道府県 総人口 65歳以上人口 0 北海道 5092000 1681000 1 青森県 1184000 417000 2 岩手県 1163000 407000

💬 47 行 × 112 列。 都道府県・総人口・65歳以上人口が揃ったので、 これを「真ラベル」の元に使う。

② 真ラベルと予測ラベルの作成

このコードでやること: 高齢化率 30% 以上を「真の高齢化県」(y_true)、 人口減少率 −1% 未満を「予測上の高齢化県」(y_pred) とする。

1
2
3
4
5
6
7
8
# 3) 真ラベル: 高齢化率 (65歳以上 / 総人口) が 30% 以上を「高齢化県」(1)
aging = df23['65歳以上人口'] / df23['総人口']
y_true = (aging >= 0.30).astype(int)

# 4) 予測ラベル: 人口減少率 (出生数 - 死亡数) / 総人口 が -1% 未満を「高齢化県」と予測
delta = (df23['出生数'] - df23['死亡数']) / df23['総人口']
y_pred = (delta <= -0.01).astype(int)
print('陽性件数 真 =', y_true.sum(), ' 予測 =', y_pred.sum())

📤 実行例:

陽性件数 真 = 35 予測 = 12

💬 真陽性 35 県に対し、 人口減少率ベースの予測では 12 県しか拾えていない。 この差が FN (見逃し) の温床。

③ 混同行列で FN を取り出して指標化

このコードでやること: confusion_matrix で 4 セルを取り出し、 Recall (= 1 − FNR) と FNR を計算する。

1
2
3
4
5
6
7
8
# 5) 混同行列で FN を取り出す
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
print(f'TN={tn}  FP={fp}  FN={fn}  TP={tp}')

# 6) Recall (= 1 - FNR) と FNR
recall = tp / (tp + fn)
fnr = fn / (tp + fn)
print(f'Recall = {recall:.3f}   FNR = {fnr:.3f}')

📤 実行例:

TN=12 FP=0 FN=23 TP=12 Recall = 0.343 FNR = 0.657

💬 FN=23 県を見逃し、 FNR=65.7%。 ch7 の手計算 (0.15/0.85) と数式 (FNR = FN/(FN+TP)) の対応がそのまま再現されている。

④ 見逃した県の一覧 + 棒グラフ可視化

このコードでやること: FN になった県名を取り出し、 混同行列の 4 セルを棒グラフで保存する。 「どこを見逃したか」を地名レベルで確認できる。

1
2
3
4
5
6
7
8
9
# 7) どの県を見逃したか (FN 県名) を一覧化
miss = df23.loc[(y_true == 1) & (y_pred == 0), '都道府県'].tolist()
print('見逃し県 (FN):', miss)

# 8) 棒グラフで TP/FN/FP/TN を可視化して保存
plt.bar(['TP','FN','FP','TN'], [tp, fn, fp, tn], color=['#2E7D32','#C62828','#EF6C00','#1565C0'])
plt.ylabel('件数 (47 都道府県)')
plt.title('SSDSE-B-2026: 高齢化県の予測 混同行列')
plt.tight_layout(); plt.savefig('fn_bar.png', dpi=150)

📤 実行例:

見逃し県 (FN): ['北海道', '茨城県', '栃木県', '群馬県', '富山県', '石川県', '福井県', '山梨県', '長野県', '岐阜県', '静岡県', '三重県', '奈良県', '鳥取県', '岡山県', '広島県', '香川県', '佐賀県', '長崎県', '熊本県', '大分県', '宮崎県', '鹿児島県'] (fn_bar.png 保存: TP=12 緑、 FN=23 赤、 FP=0 橙、 TN=12 青)

💬 FN 23 県は高齢化が進んでいるのに人口減少率がまだ顕在化していない自治体。 政策現場では「見逃しは命取り」なので、 閾値を 0.5% 緩める (delta <= -0.005) と FN は減るが FP が増える。 このトレードオフが ch6 の数式 FNR = FN/(FN+TP) の意味そのもの。

⚠️ よくある落とし穴

偽陰性 (False Negative, FN) は「見逃し」の指標。 検診・故障検出・詐欺検出のように FN の代償が極めて大きい場面では、 Accuracy 偏重で評価すると人命・損失に直結します。 FN 特有の罠 5 つ。

❌ Accuracy だけで評価して FN を見逃す
陽性 5% のがん検診で「全員陰性」と予測しても Accuracy は 0.95 になり、 すべての患者を見逃しても「高精度」に見える。 Recall (= TP / (TP+FN)) または FNR (= FN / (TP+FN)) を主指標に据えること。 医療系では Recall ≥ 0.95 を目標値にする実装が多い。
❌ 閾値 0.5 を盲信して FN を増やす
分類器の確率出力を二値化する閾値はタスクのコスト比で決めるべき。 FN 1 件 = 100 万円、 FP 1 件 = 1 万円なら、 最適閾値は $t^* = c_{FP} / (c_{FP} + c_{FN}) = 1/101 \approx 0.01$。 Youden index ($J = \text{TPR} - \text{FPR}$) を最大化する閾値が ROC 曲線上で定まる。
❌ クラス不均衡データで FN が埋もれる
陽性 1% の不正検知データでは、 損失関数 (cross-entropy) が陽性事例を統計的に軽視する。 対策: (1) class_weight='balanced' で陽性損失を 99 倍、 (2) SMOTE 等のオーバーサンプリング、 (3) Focal Loss でハードサンプル重み付け、 (4) AUC ではなく PR-AUC で評価。
❌ FN と Type II error (β) を混同
統計検定の Type II error は「対立仮説が真なのに帰無仮説を棄却できない」確率 β。 分類の FN は「個別事例の見逃し」。 検出力 $1 - \beta$ ≒ Recall の対応はあるが、 母集団レベル ↔ 個別予測の単位が違う。 「FN 件数を減らす」と「検出力を上げる」は同じ方向だが、 厳密には別概念。
❌ 学習データの陽性ラベルが欠損していて FN が過小評価される
PU learning (Positive-Unlabeled) のように、 真の陽性が「未ラベル」として陰性扱いされていると、 評価セットでも FN がカウントされず実際より良いスコアが出る。 アノテーションの抜け率 (recall of labeling) を測定し、 必要に応じて学習側で `class_prior` を補正。

🎮 触って理解する

判定しきい値 (閾値 τ) を左右に動かすと、 実際は陽性なのに陰性と判定された「偽陰性 (FN)」 の領域がリアルタイムで増減します。 陽性群 (青) と陰性群 (灰) の 2 つの分布は重なっており、 完全には分離できません。 τ を右 (厳しく) に動かすと FN が増え FP が減るトレードオフを体感してください。 グラフ上をドラッグ (タッチ) しても閾値を動かせます。

FN 偽陰性 (見逃し) TP 真陽性 FP 偽陽性 TN 真陰性
FN 偽陰性
50
陽性 100 件中
TP 真陽性
50
陽性 100 件中
FP 偽陽性
50
陰性 100 件中
TN 真陰性
50
陰性 100 件中
FNR = FN / (TP+FN) = 1 − Recall
50.0%
Recall (感度) = TP / (TP+FN)
50.0%
FPR = FP / (FP+TN)
50.0%
🎨 直感
偽陰性は陽性分布 (青) のうち、 閾値より左側 (=陰性判定される側) に落ちる部分です。 閾値を右へ動かすほどこの赤い領域が広がり、 見逃しが増えます。 一方で閾値を右へ動かすと陰性群 (灰) の誤検出 (FP=橙) は減ります。 FN と FP は同時にゼロにできない――これが 2 つの分布が重なる限り避けられない本質です。 分離度スライダーを大きくすると重なりが減り、 どの閾値でも FN・FP を同時に小さくできることも確かめられます。
⚠️ よくある落とし穴
見逃しコスト: がん検診や不正検知では FN 1 件の損失が FP 1 件よりはるかに大きいことが多く、 その場合は閾値を左 (ゆるく) に寄せて Recall を上げるのが定石です。 「FNR を下げる = FN の領域を狭める」ことがスライダーで見えます。
第二種の過誤との関係: 統計的仮説検定の第二種の過誤 (Type II error, β) は「対立仮説が真なのに帰無仮説を棄却できない」確率で、 検出力 $1-\beta$ が Recall (感度) に対応します。 この図の τ は検定の棄却域の境界に相当し、 τ を厳しくすると β (=FN 側) が増える構図はまったく同じです。 ただし検定は母集団レベルの誤り確率、 分類の FN は個別事例の見逃し件数という単位の違いに注意。
🚀 発展
τ を 0→100 まで動かしたときの (FPR, Recall) の軌跡が ROC 曲線です。 コストを考慮する場合、 FN 単価 $c_{FN}$・FP 単価 $c_{FP}$ に対し期待損失を最小化する最適閾値は $t^{*}=c_{FP}/(c_{FP}+c_{FN})$ で与えられ、 見逃しコストが大きいほど閾値は左へ動きます。 スライダーで手を動かした感覚を、 次に挙げる関連ページの数式と結び付けてみてください。
🔗 あわせて読む
再現率 (Recall・感度)偽陽性 (False Positive)混同行列第二種の過誤 (Type II error)適合率 (Precision)特異度 (Specificity)ROC 曲線分類

🗺 概念マップ

「false negative」を中心とした関連概念マップ。

偽陰性 第 II 種の過誤 β Recall = TP/(TP+FN) 検出力 1−β (Cohen 1988) 医療スクリーニング 偽陽性 (FP) コスト感応学習

偽陰性 (False Negative, FN) は「陽性を見逃した数」で、 第二種過誤 (Type II error, β) と同義。 検出力 1−β = Recall (= TP/(TP+FN)) で測定される。 がん診断・防犯センサー・SSDSE-B-2026 を用いた高リスク県スクリーニング (例: 高齢化率 ≥ 30% を見逃すと福祉政策が遅れる) など、 見逃しコストが高いタスクで重要。 閾値を下げて FN を減らせば FP が増えるトレードオフがあり、 ROC 曲線・PR 曲線で最適点を決める。

🔗 隣接手法への橋渡し

「偽陰性」は単独で完結せず、 隣接する手法と接続することで分析パイプラインの一部として機能する。 以下に具体的な接続関係を示す。

偽陰性は (1) 業務コスト比 FN:FP の数値化 → (2) Recall を主指標化 → (3) 閾値下げ + クラス重み付与 + Oversampling (SMOTE) → (4) PR 曲線で全閾値挙動確認 → (5) コスト感応学習 (cost-sensitive) → (6) 運用後の継続監視、 という 6 段で減らす。 医療スクリーニング (癌検診) や情報セキュリティ (侵入検知) で特に重要。

🌳 手法選択フロー

「偽陰性」を実際の課題に当てはめるとき、 以下の 3 ステップで判断する。 領域固有の判断基準と組み合わせて使用する。

  1. ステップ 1: FN コスト > FP コストか確認 (癌診断・侵入検知など)
  2. ステップ 2: Recall (Sensitivity) を主指標に
  3. ステップ 3: 閾値を下げる・F_β (β>1) で Recall 重視

FN を減らすために Recall を上げると Precision が落ち、 「人手による二次確認」コストが増える。 高 Recall + 低 Precision の鋭敏ステップ → 高 Precision の確認ステップ、 という二段階パイプライン (sieving) が医療・セキュリティの実務標準。 sklearn なら `make_scorer(recall_score)` で GridSearch のスコア関数を切替。

🔬 深掘り解説(追補)

既存セクションと重複しない 4 つの角度で偽陰性 (False Negative, FN) を締めくくります。 鍵は「FN は声を上げない誤りである」という一点です。

直感 ── 偽陽性は叫び、偽陰性は沈黙する

FP と FN は数の上では対称ですが、 観測されやすさ (可視性) は非対称です。 偽陽性 (誤警報) は「陽性と判定 → 調べたら陰性だった」と、 その場でほぼ必ずフィードバックが返ってきます。 対して偽陰性は「陰性と判定 → だから誰も調べない」ため、 見逃した事実そのものが永遠に観測されないことが多い。 火災報知器の誤作動 (FP) はうるさくて必ず気づくが、 鳴らなかった本物の火事 (FN) は手遅れになるまで気づかない ── この沈黙の非対称性こそ、 FN が実務で過小評価される根本原因です。

落とし穴(重要)

❌ 「FN を測れている」という思い込み ── そもそも数えられない誤り
FP は運用中でも「フラグを立てた案件を人が確認する」ことで自然に露見しますが、 FN を数えるには陰性判定した案件の真の正解 (gold standard) が要ります。 これは通常入手困難です。 見逃したがん・見逃した不正・出店しなかった有望市場は追跡調査しない限り FN として計上されず、 Recall は実際より高く見積もられます。 対策: 陰性判定の一部を無作為抽出して精査する監査サンプリングで、 現場 FN 率を定期推定する。
❌ FNR (見逃し率) は有病率に不変でも、見逃し「件数」は有病率で増減する
FNR = FN/(TP+FN) は陽性者の中での割合なので、 有病率 (陽性の出現率) が変わっても比率としては同じです。 しかし現場で効いてくるのは絶対件数。 同じ FNR=10% でも、 陽性が 100 人なら見逃し 10 人、 10,000 人なら 1,000 人。 「Recall は据え置きだから安全」と考えると、 対象母集団が拡大したときに見逃しの実害だけが線形に膨らむ。 KPI は率と件数の両方で管理すること。

発展 ── 実データで見るしきい値トレードオフとコスト最適点

閾値を上げると FN が増え FP が減る──この教科書的トレードオフを SSDSE-B-2026 の実測値で確認します。 想定シナリオ(架空の意思決定設定・数値は実データ): 出店先を選ぶため、 入手しやすい先行指標「住宅地の標準地価 C5401」で、 本当に狙いたい「商業地地価が全国上位 1/4 の高機会県C5403 ≥ 181,150 円/m²、 該当 12 県 = 真の陽性、 残り 35 県 = 陰性)」を早期スクリーニングします。 「住宅地地価 ≥ τ なら現地調査へ」という規則の τ を上げていくと(すべて 2023 年 47 都道府県の実測、 skiprows=[1]・in-sample の記述統計):

τ (住宅地 円/m²) 調査対象 TP FN(見逃し) FP(空振り) Recall FNR FPR 加重コスト(FN:FP=10:1)
30,00026120141.000.000.4014
50,0001311120.920.080.0612 ← 最小
80,00088400.670.330.0040
120,00033900.250.750.0090
200,000111100.080.920.00110

τ を 30,000 → 200,000 と上げると FN は 0 → 1 → 4 → 9 → 11 と単調増加、 FP は 14 → 2 → 0 と単調減少。 完全な教科書どおりのトレードオフが実データで再現されます。 ここで見逃しコストが高い点が本質です: FN 1 件 = 有望市場を丸ごと逃す機会損失、 FP 1 件 = 無駄な現地調査 1 回。 仮に FN:FP = 10:1 で重み付けすると、 加重コストが最小になるのは τ=50,000(低めの閾値)で 12。 「空振りを恐れて閾値を上げる」直感とは逆に、 見逃しが痛い場面では閾値を下げて FP を許容するのが合理的です。 なお τ=200,000 まで上げると、 宮城・埼玉・千葉・神奈川・愛知・京都といった商業地に比べ住宅地地価が相対的に安い大都市圏を軒並み見逃します(住宅地地価という単一 proxy の限界)。 📝 補足: 上表は n=47 の in-sample 記述統計であり、 予測モデルの汎化性能ではありません。 「高機会」の定義は商業地地価の上位 1/4 という便宜的な設定で、 閾値・コスト比も例示です。

関連ページ