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

🔖 キーワード索引

偽陽性」を取り巻く中核キーワード群です。 検索やインデックス作成で参照する際の手がかりにしてください。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になります。

偽陽性FPα errorType I error混同行列specificityprecisionFPR

💡 30秒で分かる結論 — 偽陽性

🍰 まずはやさしく

偽陽性は、間違いで「あり」と出ることです。

判定のミスを正しく知るために使います。

大事なメールが迷惑メールに分類される例です。

まずは結論を短くまとめました。

最も忙しい読者のために、 まず結論だけまとめます。 詳細は以下のセクションへ:

📍 文脈 — どこで出会うか

🍰 まずはやさしく

偽陽性は、日常のいたるところにあります。

予測がどれくらい正しいか測るために使います。

スマホの検査キットなどで出会う考え方です。

この言葉がどこで使われるかを見ていきましょう。

「コロナの抗原検査の偽陽性率 5%」 「迷惑メールフィルタが大事なメールを消した」 — 全て偽陽性の問題。 二値分類の評価では必ず登場する基本概念。

このページの読み方:まず 30秒結論直感 を読み、 必要に応じて 数式計算例落とし穴 に進んでください。

🎨 直感で掴む

🍰 まずはやさしく

偽陽性は、いわば「空振り」のようなものです。

ミスの種類によって困り方が違うことを知るためです。

火災報知器が、火事でないのに鳴る例です。

イメージで分かりやすく解説します。

偽陽性 (False Positive, FP) とは「本当は陰性なのに、 予測モデルや検査が陽性と判定した」事例のこと。 統計検定の Type I error (α) と概念的に対応します。 火災報知器で考えると整理が容易です。

予測 / 真実火事 (陽性)火事でない (陰性)
鳴る (陽性予測)TP 火事 → 鳴る (正解)FP 火事でない → 鳴る (誤報・住民迷惑)
鳴らない (陰性予測)FN 火事 → 鳴らない (致命的・人命)TN 火事でない → 鳴らない (正解)

火災報知器では FN > FP のコスト (人命 > 誤報)。 一方、 スパムフィルタでは FP (正規メールを spam フォルダに送る) のほうが深刻で、 大事なメールを見逃した瞬間にユーザーが離脱します。 医療検診でも、 PCR 検査は FP 多めでも構わない (偽陽性は再検査で訂正可) が、 確定診断では FP コストが急上昇 (患者に誤って癌告知)。 検査・予測のフェーズで FP コストが変動するのが特徴。

FP は 偽陰性 (FN) とトレードオフ関係にあり、 閾値を下げれば FN は減るが FP が増えます。 業務コストと有病率を踏まえて、 ROC 曲線 上の最適点を選ぶのが正攻法です。

身近な例え:空港の金属探知機

空港の手荷物検査で「ピー」と鳴ったのに調べたら鍵束だった、 これが FP。 もし君が旅行者で、 急いでいるのに毎回 FP で止められたらどう感じるか? 逆に感度を下げれば FP は減るが、 本物の危険物(FN)を見逃すリスクが跳ね上がる。 だから探知機の閾値は「FP の不快コスト」と「FN の人命コスト」のバランスで決められている。

SSDSE-B-2026 想定:「人口減少県」スクリーニング

SSDSE-B-2026 の 47 都道府県を対象に「次年度に人口減少する県」を予測モデルでスクリーニングする例を考える。 真の人口減少県は 40 県(陽性 base rate ≈ 0.85)。 モデルが 43 県を「減少」と予測し、 内訳が TP=37・FP=6・FN=3・TN=1 だったとする。

指標計算意味
FPR6 / (6+1)0.857真の非減少県の 86% を誤検出
陽性適中率37 / (37+6)0.860予測陽性のうち 86% は本当に減少
感度37 / (37+3)0.925真の減少県の 93% を捕捉

「FP が多い」と即「悪いモデル」ではない。 有病率(base rate)が高いタスクでは FP の多さよりも FN を抑える方が重要なケースが多い。

FP コストが大きい場面・小さい場面

📐 定義・数式

🍰 まずはやさしく

偽陽性は、数式で計算できる間違いです。

ミスの割合を正確に求めるために使います。

検査の結果を、表にして整理する例です。

定義と計算方法について詳しく説明します。

【混同行列】
$$\begin{array}{c|cc} & \hat{y}=1 & \hat{y}=0 \\ \hline y=1 & TP & FN \\ y=0 & FP & TN \end{array}$$
【関連指標】
$$\text{FPR} = \frac{FP}{FP + TN}, \quad \text{Precision} = \frac{TP}{TP + FP}, \quad \text{Specificity} = 1 - \text{FPR}$$

🔬 記号・要素の読み解き

TP(真陽性)
陽性を陽性と正しく判定。
FP(偽陽性)
陰性を陽性と誤判定。 「狼少年型」エラー。
TN(真陰性)
陰性を陰性と正しく判定。
FN(偽陰性)
陽性を陰性と取り逃がす。 「見逃し型」エラー。
閾値 (threshold)
確率予測を 0/1 に変える境界。 通常 0.5 だが、 用途で調整。

🧮 実値で計算してみる

有病率 1% の病気で精度 99% の検査を実施(100,000 人):

陽性 (検査)陰性 (検査)合計
病気あり (1%)990 (TP)10 (FN)1,000
病気なし (99%)990 (FP)98,010 (TN)99,000

陽性判定された 1,980 人のうち、 実際に病気の人は 990 人(半分)。 残り半分は健康なのに陽性 = FP。 精度 99% でも有病率が低いと 陽性的中率は 50%

🧮 数式に値を入れて手で計算する: SSDSE-B-2026 で FP を数える

SSDSE-B-2026 (2023 年・47 都道府県) の A1101 総人口を使い、 「人口 200 万人以上 = 陽性」を真のラベルとする。 一方、 予測モデルは A4101 出生数が 11,000 人以上なら陽性と予測した (出生数は人口とおおむね比例するため簡便な代理指標になる)。 このとき何件 FP が出るかを手計算する。

Step 1: 真ラベルと予測ラベルの設定

都道府県コードA1101 総人口 (人)真 (人口 200 万以上)A4101 出生数 (人)予測 (出生数 11,000 以上)判定
R01000 北海道5,092,000陽性24,430陽性TP
R13000 東京14,086,000陽性86,348陽性TP
R15000 新潟2,126,000陽性10,916陰性FN
R47000 沖縄1,468,000陰性12,549陽性FP
R05000 秋田914,000陰性3,611陰性TN

Step 2: 偽陽性率 FPR の計算

真陰性 (人口 200 万未満) = {沖縄, 秋田} → N=2 そのうち予測陽性 (出生数 11,000 以上) = {沖縄} → FP=1 FPR = FP / (FP + TN) = 1 / (1 + 1) = 0.500 人口 200 万未満だが出生数の多い県 (沖縄) が 出生数基準で誤って「人口が多い」と予測される → 予測指標と真の指標がズレるとき FP が増える

🐍 Python での扱い

このコードでやること: SSDSE-B-2026 (2023 年 47 都道府県) で A1101 人口 ≧ 200 万 = 真陽性、 A4101 出生数 ≧ 11,000 = 予測陽性 として混同行列を計算する。 上記 Step 2 の手計算 (FPR=0.500 on 5 県) を含む 47 県全体で再現。

📥 入力: data/raw/SSDSE-B-2026.csvA1101 (総人口、 単位: 人)、 A4101 (出生数、 単位: 人)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import pandas as pd
from sklearn.metrics import confusion_matrix

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
d = df[df['SSDSE-B-2026'] == 2023]           # 2023 年 47 都道府県
y_true = (d['A1101'] >= 2000000).astype(int)   # 総人口 200 万人以上 = 真陽性
y_pred = (d['A4101'] >= 11000).astype(int)   # 出生数 11,000 人以上 = 予測陽性

tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
print(f'TP={tp}, FP={fp}, TN={tn}, FN={fn}')
print(f'FPR = {fp/(fp+tn):.3f}, Precision = {tp/(tp+fp):.3f}')

# 5 県抜粋で Step 2 と照合
small = d[d['Code'].isin(['R01000','R05000','R13000','R15000','R47000'])]
yt = (small['A1101'] >= 2000000).astype(int)
yp = (small['A4101'] >= 11000).astype(int)
tn2, fp2, fn2, tp2 = confusion_matrix(yt, yp).ravel()
print(f'5 県抜粋: FP={fp2}, TN={tn2}, FPR={fp2/(fp2+tn2):.3f}')

📤 実行結果:

TP=15, FP=3, TN=28, FN=1 FPR = 0.097, Precision = 0.833 5 県抜粋: FP=1, TN=1, FPR=0.500

💬 5 県抜粋の FP=1 / FPR=0.500 は Step 2 の手計算と完全一致。 47 県全体では FP=3・FPR=0.097 (出生数は多いが人口 200 万未満の県が 3 件: 岡山・熊本・沖縄)。 出生数は人口と相関するが同一ではないため、 都市規模の割に出生数が多い県で FP が生じる。

⚠️ よくある落とし穴

偽陽性 (False Positive, FP) は「誤警報」の指標。 検査・スパムフィルタ・侵入検知のように、 陽性判定が下流コスト (精密検査・確認手間・通報対応) を発生させる場面で深刻になります。 FP 特有の罠 5 つ。

❌ Accuracy だけ見て高有病率錯覚
陽性 1% の感染症検査では、 「全員陰性」と予測しても Accuracy は 0.99。 一方、 陽性予測すべての 陽性的中率 (PPV = TP/(TP+FP)) は有病率に強く依存し、 同じ Sensitivity 95% / Specificity 95% の検査でも有病率 1% なら PPV は約 16% にしかならない (残り 84% は FP)。 PR-AUC や PPV/NPV を併記。
❌ ベイズの逆確率を忘れる
「陽性反応が出た人の何%が本当に病気か?」は $P(D|+) = \frac{P(+|D)P(D)}{P(+|D)P(D)+P(+|\neg D)P(\neg D)}$ で計算。 例: 感度 99%・特異度 99%・有病率 0.1% → PPV = 0.99·0.001 / (0.99·0.001 + 0.01·0.999) ≈ 0.090。 99% 検査でも陽性者の 91% は FP という驚きの結果。
❌ 多重検査による FP 累積
FPR 5% の独立検査を 20 種類同時実施すると、 少なくとも 1 つで誤陽性が出る確率は $1 - 0.95^{20} \approx 0.64$。 ゲノムワイド関連解析 (GWAS) で 10 万 SNP を検定するなら、 補正なしでは 5,000 件の偽陽性が確実に出る。 Bonferroni か BH-FDR で補正必須。
❌ FP と FN のコスト比を無視した閾値固定
スパムフィルタは FP (正規メール削除) が深刻なので閾値を高め (例: 0.9 以上で spam 判定)。 がん検診は FN が深刻なので閾値を低め。 両者で 0.5 を使い回すと真逆の失敗。 業務コスト $c_{FP}, c_{FN}$ を見積もって $t^* = c_{FP}/(c_{FP}+c_{FN})$ で最適化。
❌ ROC AUC だけで不均衡データを評価
ROC AUC は陰性 (多数) クラスの TN を分母に含むため、 陽性 1% のような不均衡では FP の影響が見えづらい。 同じ AUC=0.95 でも PR-AUC では 0.4 と 0.8 と大差がつくケースが普通。 不均衡データでは PR-AUC や Precision@k を主指標に。

※ 上記は混同行列・ROC 解析・ベイズ統計の知見をもとに、 偽陽性が問題化する具体場面に沿って整理したもの。 ドメインの有病率・コスト比で重み付けを調整すること。

🌐 関連手法・派生

偽陽性 (FP) は単独の指標ではなく、 混同行列・閾値・多重比較・ベイズ更新と「家系図」のように繋がる。 SSDSE-B-2026 で「人口 200 万以上県」を識別するモデル (47 県、 陽性 16 / 陰性 31) を題材に整理する。

🧭 上位概念 (FP を内包する枠組み)

🔀 同カテゴリ・派生指標の比較表 (SSDSE 例: 人口 200 万県識別)

指標定義SSDSE 47 県での値FP との関係
FPR (偽陽性率)FP / (FP+TN)3/31 ≒ 0.097陰性のうち誤って陽性とした割合 (ROC の x 軸)
Precision (適合率)TP / (TP+FP)15/18 ≒ 0.833分母に FP が直接入る、 FP↑ で Precision↓
Specificity (特異度)TN / (TN+FP) = 1 - FPR28/31 ≒ 0.9031 - FPR の関係、 医学検査で頻出
FDRFP / (FP+TP)3/18 ≒ 0.167陽性予測のうち偽の割合、 1-Precision (fdr.html)
PPVTP / (TP+FP) = Precision0.833有病率に依存、 ベイズ後確率と一致

🛠 派生手法 (FP を抑制する技術)

SSDSE-B-2026 47 県のような小規模 + ほぼ均衡 (16 vs 31) なケースでは、 ROC-AUC だけでなく PR-AUC と PPV/NPV を併記し、 行政コスト (誤って人口大県と判定した県への配分ミス) で閾値を調整するのが妥当である。

❓ よくある質問

Q1. 「偽陽性」を学ぶ前提知識は?
分野(評価指標)の基本概念を一通り押さえておくと理解が早いです。 不明な用語が出てきたら、 各リンクから前提の用語ページを参照してください。 数式が出てくる場合は中学〜高校レベルの代数と、 必要なら微分・確率の基礎が役立ちます。
Q2. 数式が分からなくても使える?
多くの場合「直感」と「Python での扱い」を理解すれば実務で使えます。 ただし 落とし穴 セクションの内容は数式の意味と紐づくため、 余裕があれば数式も眺めてみてください。
Q3. 関連する手法・概念は?
関連用語 セクションを参照してください。 並列概念(兄弟)、 前提(必要知識)、 発展(次に学ぶべき)の 3 種類で整理してあります。
Q4. レポート・論文での書き方は?
数値だけでなく、 (1) 使ったデータの出典、 (2) 適用条件の確認結果、 (3) 不確実性(CI・SE)、 (4) 限界、 を含めるのが標準です。 実務チェックリスト も参考に。
Q5. 業務以外の身近な例は?
本ページの 直感で掴む セクションに具体例があります。 自分の関心領域(趣味・専門)でも例を考えてみると、 理解が深まります。

📜 ひとことヒストリー

偽陽性 は「評価指標」分野の中で発展してきた概念・手法です。 学術的には継続的な研究で精緻化され、 実務的にはツール・ライブラリの普及で誰でも使えるようになってきました。 用語の使い方・意味は時代と分野で少しずつ変わるため、 文脈に応じた解釈が大切です。 入門書だけでなく、 標準的な教科書(例:データサイエンス・統計学の定本)や信頼できるオンライン教材も併用すると、 ぶれない理解に近づけます。

✅ 実務チェックリスト — 偽陽性

「偽陽性」は単独で完結する概念ではなく、 より大きな分野の一部です。 上位カテゴリの教材を読むことで、 この用語の 位置づけ が立体的に見えてきます:

💡 学習のコツ:用語ページは「点」、 グループ教材は「線」、 概念マップは「面」。 行き来することで知識が定着します。

🎯 まとめ — このページで押さえること

「偽陽性」 はこのページで詳しく扱った概念です。 持ち帰ってほしい 3 つの要点

  1. 偽陽性 (False Positive, FP)=実際は 陰性なのに 陽性と判定した誤り。 「Type I エラー」 「α エラー」とも。
  2. 対比:偽陰性 (FN)=陽性を陰性と取り逃がす Type II エラー。
  3. コスト:医療検査で 不要な精密検査、 スパムフィルタで 正規メールが消える、 採用で 無実の候補排除

さらに学ぶには、 関連用語関連グループ教材 を参照してください。 各用語ページを縦断的に読むことで、 体系的な理解が育ちます。

🧰 偽陽性 (False Positive, FP) ハンドブック拡張

偽陽性 = 本当は陰性(無関係・健康・正常)なのに、 検査・分類器が陽性と判定してしまう誤り。 Type I error。 本ハンドブックでは数式・計算例・産業界事例・失敗例・演習・FAQ・50 連発レシピを一気通貫で提供する。 本ページの数値はすべて公的データ SSDSE-B-2026(独立行政法人 統計センター)data/raw/SSDSE-B-2026.csv として読み込み、 2023 年・47 都道府県のレコードを集計したもの。 合成データは一切使用していない。

📐 数式を言葉で読み解く(詳細版)

$$\text{FPR} = \frac{\text{FP}}{\text{FP}+\text{TN}} = P(\hat{y}=1 \mid y=0)$$

FPR(偽陽性率)は『本来陰性の集合のうち、 誤って陽性と判定された割合』。 有意水準 α と一致し、 仮説検定では通常 0.05 に設定されます。 ROC 曲線の横軸そのもの。

📖 記号と意味の対応表

記号意味SSDSE-B-2026 での例
FPFalse Positive。 陰性なのに陽性判定出生率 5.8‰ 未満だが高齢化率 32% 未満で『高齢化県』と誤判定された 11 県
TNTrue Negative。 陰性を正しく陰性判定高齢化率 32% 未満を正しく非高齢化と判定した数
FPRFP/(FP+TN)。 陰性集団中の陽性率本例では FP=11・TN=13 で FPR=11/24≈0.458
y真ラベル (0=陰性, 1=陽性)true_aging = 1 if 高齢化率≥32% else 0
ŷ予測ラベルpred_aging = 1 if 出生率<5.8‰ else 0
α有意水準=Type I error 確率通常 0.05。 多重検定では Bonferroni 補正で α/m に縮小

🧭 直感的な理解

47 都道府県を高齢化率(65 歳以上人口 A1303 ÷ 総人口 A1101)が 32% 以上なら『高齢化県 = 陽性』と定義します。 その予測に出生率(出生数 A4101 ÷ 総人口 A1101 × 1000)が 5.8‰ 未満という代理指標を使うと、 出生率は低いのに高齢化率は 32% 未満の県(埼玉・千葉など大都市圏)を『高齢化県』と誤判定します。 これが偽陽性です。

🐍 Python 実装(拡張 narration 付き)

🎯 このコードでやること:SSDSE-B-2026 の 2023 年データで『出生率 5.8‰ 未満なら高齢化県(陽性)』と判定するルールの偽陽性を計算する(真ラベルは高齢化率 32% 以上)。

📥 入力データ:47 都道府県の 2023 年 A1101 総人口・A1303 高齢者人口・A4101 出生数。 真ラベル=高齢化率(A1303/A1101)が 32% 以上か。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', header=0, encoding='cp932', skiprows=[1])
df23 = df[df['SSDSE-B-2026']==2023][['Prefecture','A1101','A1303','A4101']].copy()
d = df23.copy()
d['aging'] = d['A1303']/d['A1101']*100
d['birth_rate'] = d['A4101']/d['A1101']*1000
d['true_aging'] = d['aging'] >= 32   # 真ラベル: 高齢化率 32% 以上
d['pred_aging'] = d['birth_rate'] < 5.8     # 予測: 出生率<5.8‰ → 高齢化と推定

TP = ((d.pred_aging) & (d.true_aging)).sum()
FP = ((d.pred_aging) & (~d.true_aging)).sum()
TN = ((~d.pred_aging) & (~d.true_aging)).sum()
FN = ((~d.pred_aging) & (d.true_aging)).sum()
print(f'TP={TP}  FP={FP}  TN={TN}  FN={FN}')
print(f'FPR (偽陽性率) = FP/(FP+TN) = {FP/(FP+TN):.3f}' if (FP+TN)>0 else 'TN=0')
print(d[(d.pred_aging) & (~d.true_aging)][['Prefecture','birth_rate']])

📤 実行すると次の出力が得られる

TP=18 FP=11 TN=13 FN=5 FPR (偽陽性率) = 0.458 Prefecture birth_rate 3 宮城県 5.445230 7 茨城県 5.273628 8 栃木県 5.249341 9 群馬県 5.231335 10 埼玉県 5.743828 11 千葉県 5.698897 18 山梨県 5.523869 20 岐阜県 5.421543 21 静岡県 5.335865 23 三重県 5.514765 25 京都府 5.476134 (← 出生率<5.8‰ だが高齢化率<32% の 11 県すべて)

💬 結果の読み方:高齢化率 32% 以上の県 (23) を出生率<5.8‰ で予測すると、 出生率は低いが高齢化率 32% 未満の県 11 件が偽陽性 (FP) となる。 FPR=11/24≈0.458。 代理指標の限界を示す好例。

🧮 SSDSE-B-2026 で実値計算(拡張)

47 都道府県を『出生率 5.8‰ 未満なら高齢化県(陽性)』とする単純ルールで予測した結果、 TP=18(正しく高齢化と予測)、 FP=11(誤って高齢化と予測)、 TN=13、 FN=5 となった。 高齢化率 32% 以上は 23 県、 未満は 24 県とほぼ均衡し、 FPR=11/24≈0.458 と偽陽性が多発している。 出生率という代理指標は高齢化の傾向を捉えるが、 大都市圏では出生率が低くても高齢化率は低いため FP が生じる。 balanced accuracyPR-AUC も併用する。

真:高齢化真:非高齢化
予測:高齢化TP=18FP=11
予測:非高齢化FN=5TN=13

本ページの数値はすべて公的データ SSDSE-B-2026(独立行政法人 統計センター)data/raw/SSDSE-B-2026.csv として読み込み、 2023 年・47 都道府県のレコードを集計したもの。 合成データは一切使用していない。

🏭 産業界の活用事例 6 件

業種・領域活用内容代表事例
医療検診の腫瘍マーカーCA19-9 など腫瘍マーカーは健常者でも 5% 程度が陽性閾値を越え偽陽性となる。 確定診断には画像・組織検査が必須。がん検診
空港セキュリティチェック金属探知機は鍵・ベルトでも反応し偽陽性が大量発生。 二次検査の人手を増やすトレードオフ。国土交通省 航空保安
クレジットカード不正検知海外旅行で普段と違う場所での利用を不正と誤判定。 利用者の電話確認で実害を回避。 ROC 曲線で FP/TP のバランス調整。VISA/Mastercard
迷惑メールフィルタ正規のメルマガを spam に誤分類。 受信者は『重要メールが届かない』と苦情。 FP を 1% 以下に抑える運用目標。Gmail/Outlook
地震警報 (緊急地震速報)落雷ノイズや火山性微動を地震と誤検出した過去事例。 偽陽性は社会的影響が大きいため厳しく制御。気象庁
AI チャットの有害発言検出皮肉・引用を有害と誤判定。 言論の自由とのバランスから FPR を年次でモニタリング。SNS プラットフォーム

🔬 関連手法の比較表

手法/概念意味主要パラメータ代表ユースケース備考
偽陽性 FP陰性を陽性と誤判定α / FPR迷惑メール過検出Type I error
偽陰性 FN陽性を陰性と見逃しβ / FNRがん見落としType II error
真陽性 TP陽性を正しく検出Recall感度の分子求めたい結果
真陰性 TN陰性を正しく除外Specificity検査の的中除外FPR の分母
適合率 Precision陽性予測の正確さTP/(TP+FP)FP を直接抑える高 P は低 FP を意味
再現率 Recall陽性の捕捉率TP/(TP+FN)見落とし削減FN を直接抑える

💥 失敗例とアンチパターン

失敗パターン発生メカニズム対処
クラス不均衡で FPR が低くても精度低陰性 99% のとき全部陰性予測でも accuracy 99%。Precision・Recall・F1・PR-AUC を併用。 SSDSE-B-2026 の人口減少データはまさにこの例。
複数検定で FPR が膨張47 都道府県 × 多重検定で α=0.05 でも 2.3 件は偶然陽性。Bonferroni / Benjamini-Hochberg 補正を適用。
ROC 曲線だけ見て閾値設定陽性が稀な問題で AUC が高くても実運用で FP 多発。PR 曲線・Cost-sensitive 閾値最適化を併用。
検定の事後解釈で FPR を語る『p<0.05 なら 95% で正しい』は誤り。 FPR は事前確率。ベイズ的事後確率 P(H1|データ) と区別する。

📘 拡張ハンドブック(応用編)

コスト感度評価
FP 1 件の業務コストと FN 1 件のコストを定量化し、 閾値を最適化。
校正
Platt scaling / Isotonic regression で予測確率を実際の頻度に合わせる。
反復検証
クロスバリデーション 5-fold × 3 回 で FPR の信頼区間を推定。
Adversarial test
教師データに見られないパターンを意図的に入力し FPR の安定性を測る。
運用後モニタリング
PSI(Population Stability Index)でドリフトを検知。 ドリフト時は再学習。
公平性監査
サブグループ別の FPR が均等かを Equalized Odds で確認。

📝 演習問題 5 問

  1. Q1: FPR と Type I error の関係を述べよ。
  2. Q2: 検査の感度 0.95、 特異度 0.90、 有病率 1% のとき、 陽性的中率(PPV)を計算せよ。
  3. Q3: SSDSE-B-2026 の人口減少判定で、 FPR を計算する pandas/numpy コードを書け。
  4. Q4: 多重検定で 47 都道府県を α=0.05 で個別検定したとき、 偶然陽性となる期待件数は何件か?
  5. Q5: Bonferroni 補正と Benjamini-Hochberg 補正の違いを述べよ。

解答例は付属の Jupyter Notebook(notebooks/glossary_exercises.ipynb)に収録。 SSDSE-B-2026 を使って自力で動かしてから答え合わせすること。

📔 関連用語辞典 10 語

Type I error
本来正しい帰無仮説を棄却する誤り=偽陽性。
Type II error
偽の帰無仮説を採択する誤り=偽陰性。
ROC 曲線
FPR 対 TPR をプロットした感度-特異度曲線。
PR 曲線
Recall 対 Precision。 不均衡データに有効。
AUC
曲線下面積。 0.5 = ランダム、 1.0 = 完璧。
Precision
TP/(TP+FP)。 陽性予測の正確さ。
Recall
TP/(TP+FN)。 陽性の捕捉率=感度。
F1 スコア
Precision と Recall の調和平均。
Bonferroni 補正
多重検定で α を /m。 保守的。
BH 法
Benjamini-Hochberg。 FDR を制御する多重検定補正。

⚡ 50 連発レシピ集

日常の SSDSE-B-2026 分析でそのままコピペして使える 50 個のスニペット集。 1 行で完結するパターンを優先。

  1. from sklearn.metrics import confusion_matrix; confusion_matrix(y, yhat)
  2. tn, fp, fn, tp = confusion_matrix(y, yhat).ravel()
  3. fpr = fp / (fp + tn)
  4. from sklearn.metrics import roc_curve; fpr, tpr, th = roc_curve(y, score)
  5. from sklearn.metrics import roc_auc_score; roc_auc_score(y, score)
  6. from sklearn.metrics import precision_recall_curve; p, r, t = precision_recall_curve(y, score)
  7. from sklearn.metrics import average_precision_score; average_precision_score(y, score)
  8. from sklearn.metrics import f1_score; f1_score(y, yhat)
  9. from sklearn.metrics import precision_score, recall_score
  10. from sklearn.metrics import classification_report; print(classification_report(y, yhat))
  11. from statsmodels.stats.multitest import multipletests; multipletests(p_values, method='bonferroni')
  12. multipletests(p_values, method='fdr_bh')
  13. from scipy.stats import binomtest; binomtest(fp, fp+tn).pvalue
  14. from scipy.stats import beta; beta.ppf([0.025,0.975], fp+1, tn+1) # ベイズ CI
  15. import numpy as np; ci = np.percentile([fpr_boot for _ in range(1000)], [2.5,97.5])
  16. from sklearn.calibration import calibration_curve; calibration_curve(y, score)
  17. from sklearn.isotonic import IsotonicRegression; IsotonicRegression().fit(score, y)
  18. from sklearn.linear_model import LogisticRegression; lr = LogisticRegression().fit(X, y)
  19. from sklearn.model_selection import cross_val_score; cross_val_score(lr, X, y, scoring='roc_auc')
  20. from sklearn.model_selection import StratifiedKFold; for tr,te in StratifiedKFold(5).split(X,y): ...
  21. df['pred'] = (df['score']>0.5).astype(int)
  22. df['fp_flag'] = (df.pred==1) & (df.y==0)
  23. df.groupby('group').apply(lambda g: ((g.pred==1)&(g.y==0)).mean()) # subgroup FPR
  24. np.where(score>th, 1, 0)
  25. (yhat & ~y).sum() / (~y).sum() # FPR
  26. (yhat & y).sum() / y.sum() # Recall
  27. (yhat & y).sum() / yhat.sum() # Precision
  28. import seaborn as sns; sns.heatmap(confusion_matrix(y,yhat), annot=True)
  29. from sklearn.metrics import balanced_accuracy_score; balanced_accuracy_score(y, yhat)
  30. from sklearn.metrics import matthews_corrcoef; matthews_corrcoef(y, yhat)
  31. from sklearn.metrics import cohen_kappa_score; cohen_kappa_score(y, yhat)
  32. from sklearn.metrics import log_loss; log_loss(y, score)
  33. from sklearn.metrics import brier_score_loss; brier_score_loss(y, score)
  34. fpr_target = 0.05; th = np.percentile(score[y==0], (1-fpr_target)*100)
  35. from sklearn.svm import OneClassSVM; OneClassSVM().fit(X[y==0])
  36. from sklearn.ensemble import IsolationForest; IsolationForest().fit_predict(X)
  37. df['decile'] = pd.qcut(df.score, 10, labels=False)
  38. df.groupby('decile').agg(rate=('y','mean'), n=('y','size'))
  39. import shap; shap.summary_plot(shap.Explainer(model)(X), X)
  40. from sklearn.inspection import permutation_importance; permutation_importance(model, X, y)
  41. from sklearn.model_selection import GridSearchCV; GridSearchCV(lr, {'C':[0.1,1,10]}).fit(X,y)
  42. from imblearn.over_sampling import SMOTE; SMOTE().fit_resample(X, y)
  43. from imblearn.under_sampling import RandomUnderSampler; RandomUnderSampler().fit_resample(X, y)
  44. model.predict_proba(X)[:,1]
  45. np.linspace(0,1,101)
  46. from sklearn.metrics import auc; auc(fpr, tpr)
  47. matplotlib.pyplot.plot(fpr, tpr); plt.xlabel('FPR'); plt.ylabel('TPR')
  48. plt.fill_between(fpr, tpr, alpha=0.2)
  49. from sklearn.metrics import det_curve; det_curve(y, score)
  50. from sklearn.metrics import precision_recall_fscore_support; precision_recall_fscore_support(y, yhat)

❓ よくある質問 FAQ 20 問

Q01. FPR と FDR の違いは?
FPR は陰性集団中の陽性率、 FDR は陽性予測中の偽陽性率。 多重検定で重要。
Q02. p<0.05 とは何が 5% なのか?
帰無仮説が真のとき、 観測以上に極端な統計量が出る確率=FPR。
Q03. ROC 曲線の AUC が 0.5 を下回ったら?
予測を反転させれば 0.5 以上になる(モデルは情報を持っているが逆方向)。
Q04. クラス不均衡時の評価指標は?
PR-AUC, F1, balanced accuracy, MCC。
Q05. 閾値はどう決める?
業務コストに基づく Cost-sensitive optimization、 または FPR 目標値。
Q06. 信頼区間はどう計算する?
Wilson score 法、 Bootstrap、 ベイズ Beta 分布。
Q07. Bonferroni と BH 法どちらを使う?
厳密に FWER を抑えるなら Bonferroni、 FDR でよいなら BH(検出力高い)。
Q08. SSDSE-B-2026 で FPR を計算する典型例は?
47 都道府県の出生率閾値で人口減少を予測した時の評価。
Q09. ベイズ的事後確率 P(H1|data) との関係は?
FPR は P(data|H0)、 事後は事前分布が必要で別物。
Q10. キャリブレーションは何のため?
予測確率を実際の頻度に合わせる。 0.7 と予測したら 70% で当たる状態に。
Q11. ROC と PR どちらを優先?
陽性が稀なら PR、 半々なら ROC。
Q12. F1 が高くても運用で困る例は?
Precision と Recall が不均衡の場合。 業務コストに沿った重み付き F-beta を使う。
Q13. balanced accuracy とは?
(TPR+TNR)/2。 クラス不均衡に頑健。
Q14. MCC(Matthews 相関係数)の利点は?
全 4 セル(TP/FP/TN/FN)を使い、 不均衡に強い。
Q15. log loss と Brier score の違い?
log loss は対数尤度、 Brier は二乗誤差。 後者は外れ予測に寛容。
Q16. PSI でドリフトを検知する閾値は?
0.1 以下は安定、 0.1〜0.25 は注意、 0.25 超は要再学習。
Q17. 公平性監査の指標は?
Demographic Parity / Equalized Odds / Calibration。
Q18. 異常検知での FPR コントロールは?
Isolation Forest や One-Class SVM の閾値を陰性データで FPR 目標値に合わせる。
Q19. 検査の事前確率が低いと FP が増える理由は?
陽性 1% で感度 95% 特異度 95% でも PPV は 16% しかない(基準率の誤謬)。
Q20. 学習リソースは?
ESLII 第 9 章、 ISLR 第 4 章、 Google ML Crash Course の Classification セクション。

📚 参考文献

  1. Neyman & Pearson (1933) On the problem of the most efficient tests of statistical hypotheses。
  2. Wasserstein & Lazar (2016) The ASA's Statement on p-Values — p 値の誤用に対する公式声明。
  3. Benjamini & Hochberg (1995) Controlling the False Discovery Rate。
  4. ESLII (Hastie, Tibshirani, Friedman) 第 9 章 — 分類評価指標。
  5. 総務省 SSDSE-B-2026 — 本教材デモデータ。
  6. Ioannidis (2005) Why Most Published Research Findings Are False。

📚 偽陽性と分類評価の徹底解説

本章では SSDSE-B-2026 の 47 都道府県を題材に、 FP/FN/TP/TN の混同行列から始まり、 ROC/PR/F1/MCC/Calibration/多重検定補正 までを実値計算で総点検する。 クラス構成(陽性 49% vs 陰性 51%)のほぼ均衡した高齢化ラベルで検証する。

📊 47 都道府県 TOP10(人口降順)と BOTTOM10

都道府県人口 A1101高齢者 A1303出生 A4101高齢化率出生率
東京都14,086,0003,205,00086,34822.8%6.13‰
神奈川県9,229,0002,390,00053,99125.9%5.85‰
大阪府8,763,0002,424,00055,29227.7%6.31‰
愛知県7,477,0001,923,00048,40225.7%6.47‰
埼玉県7,331,0002,012,00042,10827.4%5.74‰
千葉県6,257,0001,756,00035,65828.1%5.70‰
兵庫県5,370,0001,609,00032,61530.0%6.07‰
福岡県5,103,0001,452,00033,94228.5%6.65‰
北海道5,092,0001,681,00024,43033.0%4.80‰
静岡県3,555,0001,101,00018,96931.0%5.34‰

TOP10 だけで全国人口の 60% 以上を占める一極集中。 東京都の高齢化率は 22.8% と最低で出生率も 6.13‰ と最高水準。 ただし出生数の絶対値は東京 86,348 人と圧倒的に多く、 県別の率と絶対値の差異に注意。

都道府県人口 A1101高齢者 A1303出生 A4101高齢化率出生率
鳥取県537,000179,0003,26333.3%6.08‰
島根県650,000227,0003,75934.9%5.78‰
高知県666,000242,0003,38036.3%5.08‰
徳島県695,000246,0003,90335.4%5.62‰
福井県744,000235,0004,56331.6%6.13‰
佐賀県795,000252,0005,14431.7%6.47‰
山梨県796,000253,0004,39731.8%5.52‰
和歌山県892,000305,0004,90134.2%5.49‰
秋田県914,000357,0003,61139.1%3.95‰
香川県926,000301,0005,36532.5%5.79‰

BOTTOM10 は地方県中心で、 秋田県の高齢化率は 39.1% と最高、 出生率も 3.95‰ と低い。 こうした少数派サンプルこそ統計指標が極端な値を取り、 平均では見えない実態が浮かぶ。

📈 東京都 12 年推移(2012-2023)

東京都人口高齢者出生数高齢化率出生率
201213,234,0002,812,000107,40121.25%8.12‰
201313,307,0002,914,000109,98621.90%8.27‰
201413,399,0003,011,000110,62922.47%8.26‰
201513,515,2713,005,516113,19422.24%8.38‰
201613,646,0003,120,000111,96422.86%8.20‰
201713,768,0003,160,000108,99022.95%7.92‰
201813,887,0003,189,000107,15022.96%7.72‰
201914,007,0003,209,000101,81822.91%7.27‰
202014,047,5943,107,82299,66122.12%7.09‰
202114,010,0003,202,00095,40422.86%6.81‰
202214,038,0003,202,00091,09722.81%6.49‰
202314,086,0003,205,00086,34822.75%6.13‰

12 年で人口は 13.23M → 14.09M(+6.4%)、 高齢者は 2.81M → 3.21M(+14%)、 出生数は 107,401 → 86,348(△19.6%)。 人口増加の影でも出生数は急減。 これが「都市部の少子化」の実像。

🐍 実装例 ① — narration 完全装備

🎯 このコードでやること:47 都道府県の出生率を閾値 5.8‰ で『高齢化県(高齢化率 32% 以上)』と予測し、 混同行列・FPR・Precision・Recall・F1を一気に計算する。

📥 入力データ:SSDSE-B-2026 2023 年の 47 行(人口 A1101, 高齢者 A1303, 出生数 A4101)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', header=0, encoding='cp932', skiprows=[1])
df23 = df[df['SSDSE-B-2026']==2023][['Prefecture','A1101','A1303','A4101']].copy()
d = df23.copy()
d['aging'] = d['A1303']/d['A1101']*100
d['birth_rate'] = d['A4101']/d['A1101']*1000
y    = (d['aging'] >= 32).astype(int)
yhat = (d['birth_rate'] < 5.8).astype(int)
TP = int(((yhat==1)&(y==1)).sum()); FP = int(((yhat==1)&(y==0)).sum())
TN = int(((yhat==0)&(y==0)).sum()); FN = int(((yhat==0)&(y==1)).sum())
prec = TP/(TP+FP) if TP+FP else float('nan')
rec  = TP/(TP+FN) if TP+FN else float('nan')
f1   = 2*prec*rec/(prec+rec) if prec+rec else float('nan')
print(f'TP={TP}  FP={FP}  TN={TN}  FN={FN}')
print(f'Precision={prec:.3f}  Recall={rec:.3f}  F1={f1:.3f}')

📤 実行結果

TP=18 FP=11 TN=13 FN=5 Precision=0.621 Recall=0.783 F1=0.692

💬 結果の読み方:Precision 62%・Recall 78%。 陽性予測 29 件のうち 11 件 (38%) が偽陽性で、 高齢化県でない県を高齢化と誤判定している。 閾値 (5.8‰) を下げれば FP↓だが FN↑。 業務コストで閾値を決めるのが王道。

🐍 実装例 ② — 拡張シナリオ

🎯 このコードでやること:ROC 曲線と AUC を計算し、 出生率を連続スコアとして使ったときの判別力を測る。

📥 入力データ:上記 d(47 行)。 score = -birth_rate(小さいほど陽性傾向)。

1
2
3
4
5
6
7
8
from sklearn.metrics import roc_curve, roc_auc_score
score = -d['birth_rate'].values   # 出生率が低いほど高齢化スコア大
fpr, tpr, th = roc_curve(y, score)
auc = roc_auc_score(y, score)
print(f'AUC = {auc:.3f}')
print('閾値毎の (FPR, TPR) 抜粋:')
for i in [1, len(fpr)//4, len(fpr)//2, 3*len(fpr)//4, -1]:
    print(f'  th={-th[i]:.2f}‰  FPR={fpr[i]:.2f}  TPR={tpr[i]:.2f}')

📤 実行結果

AUC = 0.707 閾値毎の (FPR, TPR) 抜粋: th=3.95 FPR=0.00 TPR=0.04 th=5.47 FPR=0.25 TPR=0.48 th=5.74 FPR=0.46 TPR=0.70 th=6.13 FPR=0.71 TPR=0.87 th=8.55 FPR=1.00 TPR=1.00

💬 結果の読み方:AUC=0.707 は 0.5 を上回り、 『出生率が低い県ほど高齢化率が高い』傾向を確かに捉えている。 ただし完全ではなく、 FPR を上げないと TPR が伸びない領域があり、 出生率だけでは高齢化の判別に偽陽性が伴う。

🔍 深掘りトピック 6 件

基準率の誤謬 (Base-rate fallacy)

陽性 1% × 感度 95% × 特異度 95% でも PPV は 16%。 検査結果の解釈には事前確率が不可欠。

Bonferroni 補正

47 都道府県を α=0.05 で個別検定すると、 偶然陽性が 2.35 件出る期待値。 補正後の α=0.001 で抑える。

BH 法 (Benjamini-Hochberg)

FDR を制御。 Bonferroni より緩いがパワーが高い。 ゲノム解析などで標準。

Cost-sensitive 閾値最適化

FP の業務コスト C_FP、 FN の業務コスト C_FN を見積もり、 期待損失を最小化する閾値を選ぶ。

Calibration

Platt scaling / Isotonic regression で予測確率=実頻度を保証。 SHAP よりまず Calibration を見るべき。

公平性指標

Demographic Parity / Equalized Odds はサブグループ別の FPR/TPR が均等かを測る。 GDPR・AI 規制で重要度増。

✅ 実務チェックリスト 10 項目

  1. 業務コスト C_FP と C_FN を見積もる
  2. ROC + PR + Calibration の 3 点セットで評価
  3. Cross-Validation 5fold × 3 回で CI を出す
  4. Subgroup FPR/TPR を Equalized Odds で監査
  5. 閾値は事業判断と合わせて決める
  6. 多重検定は BH 法で FDR を制御
  7. ベースラインモデル(majority class)を必ず比較
  8. 予測確率は Platt/Isotonic で校正
  9. 本番モニタは PSI + drift detector
  10. 意思決定の人間ループを設計に含める

📊 ベンチマーク参考値

項目参考値備考
感度 95% 特異度 95% prevalence 1%PPV 16%基準率の誤謬の典型例
感度 95% 特異度 99% prevalence 1%PPV 49%特異度を上げると PPV 急上昇
感度 99% 特異度 95% prevalence 50%PPV 95%高有病率なら感度重視
Bonferroni m=47 α=0.05α'=0.001厳しすぎる
BH 法 m=47 FDR=0.05α'≈0.02-0.05適度な保護
ROC-AUC ベースライン0.5ランダム
PR-AUC ベースラインprevalence不均衡時は AUC=陽性率

🕰 歴史年表

🛤 学習ロードマップ 4 段階

初級
混同行列・FPR/Precision/Recall を手計算。
中級
sklearn で ROC/PR/AUC を出し、 閾値最適化。
上級
Calibration + Bootstrap CI + 多重検定補正。
達人
EU AI Act 準拠の公平性監査とドリフト監視。

🔗 関連用語ホップ 10 件

🔗 false-negative🔗 precision🔗 recall🔗 roc-curve🔗 auc🔗 f1-score🔗 accuracy🔗 hypothesis-testing🔗 p-value🔗 multiple-comparisons

同カテゴリ・前提・並列・発展の用語ページにジャンプ。 リンク先が未公開の場合は索引ページから参照可能。

📕 偽陽性評価 クックブック 30

本パートでは偽陽性 (FP) 関連の評価コード 30 個を、 scikit-learn / statsmodels / imbalanced-learn を中心に整理する。 47 都道府県データを題材に Calibration / Bootstrap CI / Subgroup 監査まで実装する。

📋 SSDSE-B-2026 全 47 都道府県データ(2023 年)

本ページの分析で使用した全 47 行を以下に掲載する。 数値はすべて独立行政法人 統計センター SSDSE-B-2026 の公的データから取得(合成データは一切使用していない)。 全国合計人口 124,353 千人、 高齢者 36,229 千人(29.1%)、 出生数 727,269 人(5.85‰)。

#都道府県人口 A1101高齢者 A1303出生数 A4101高齢化率出生率
1北海道5,092,0001,681,00024,43033.0%4.80‰
2青森県1,184,000417,0005,69635.2%4.81‰
3岩手県1,163,000407,0005,43235.0%4.67‰
4宮城県2,264,000662,00012,32829.2%5.45‰
5秋田県914,000357,0003,61139.1%3.95‰
6山形県1,026,000361,0005,15135.2%5.02‰
7福島県1,767,000586,0009,01933.2%5.10‰
8茨城県2,825,000865,00014,89830.6%5.27‰
9栃木県1,897,000573,0009,95830.2%5.25‰
10群馬県1,902,000589,0009,95031.0%5.23‰
11埼玉県7,331,0002,012,00042,10827.4%5.74‰
12千葉県6,257,0001,756,00035,65828.1%5.70‰
13東京都14,086,0003,205,00086,34822.8%6.13‰
14神奈川県9,229,0002,390,00053,99125.9%5.85‰
15新潟県2,126,000720,00010,91633.9%5.13‰
16富山県1,007,000333,0005,51233.1%5.47‰
17石川県1,109,000338,0006,75730.5%6.09‰
18福井県744,000235,0004,56331.6%6.13‰
19山梨県796,000253,0004,39731.8%5.52‰
20長野県2,004,000655,00011,12532.7%5.55‰
21岐阜県1,931,000603,00010,46931.2%5.42‰
22静岡県3,555,0001,101,00018,96931.0%5.34‰
23愛知県7,477,0001,923,00048,40225.7%6.47‰
24三重県1,727,000529,0009,52430.6%5.51‰
25滋賀県1,407,000380,0009,24927.0%6.57‰
26京都府2,535,000753,00013,88229.7%5.48‰
27大阪府8,763,0002,424,00055,29227.7%6.31‰
28兵庫県5,370,0001,609,00032,61530.0%6.07‰
29奈良県1,296,000423,0006,94332.6%5.36‰
30和歌山県892,000305,0004,90134.2%5.49‰
31鳥取県537,000179,0003,26333.3%6.08‰
32島根県650,000227,0003,75934.9%5.78‰
33岡山県1,847,000573,00011,57531.0%6.27‰
34広島県2,738,000825,00016,68230.1%6.09‰
35山口県1,298,000459,0007,18935.4%5.54‰
36徳島県695,000246,0003,90335.4%5.62‰
37香川県926,000301,0005,36532.5%5.79‰
38愛媛県1,291,000441,0006,95034.2%5.38‰
39高知県666,000242,0003,38036.3%5.08‰
40福岡県5,103,0001,452,00033,94228.5%6.65‰
41佐賀県795,000252,0005,14431.7%6.47‰
42長崎県1,267,000435,0007,65634.3%6.04‰
43熊本県1,709,000552,00011,18932.3%6.55‰
44大分県1,096,000375,0006,25934.2%5.71‰
45宮崎県1,042,000351,0006,50233.7%6.24‰
46鹿児島県1,549,000524,0009,86833.8%6.37‰
47沖縄県1,468,000350,00012,54923.8%8.55‰
全国合計124,353,00036,229,000727,26929.1%5.85‰

🐍 実装例 ③ — 拡張パターン

🎯 このコードでやること:ROC-AUC と PR-AUC をBootstrap で 1000 回計算し、 95% 信頼区間を作る。

📥 入力データ:47 都道府県の出生率 (連続スコア) と『高齢化率 32% 以上』ラベル。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import pandas as pd, numpy as np
from sklearn.metrics import roc_auc_score, average_precision_score

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', header=0, encoding='cp932', skiprows=[1])
df23 = df[df['SSDSE-B-2026']==2023][['Prefecture','A1101','A1303','A4101']].copy()
d = df23.copy()
d['aging'] = d['A1303']/d['A1101']*100
y     = (d['aging'] >= 32).astype(int).values
score = -(d['A4101']/d['A1101']).values  # 出生率が低いほど高齢化スコア大

rng = np.random.default_rng(0)
auc_boot, ap_boot = [], []
for _ in range(1000):
    idx = rng.integers(0, len(y), len(y))
    if len(set(y[idx])) == 2:
        auc_boot.append(roc_auc_score(y[idx], score[idx]))
        ap_boot.append(average_precision_score(y[idx], score[idx]))
print(f'ROC-AUC = {np.mean(auc_boot):.3f}  95% CI = [{np.percentile(auc_boot,2.5):.3f}, {np.percentile(auc_boot,97.5):.3f}]')
print(f'PR-AUC  = {np.mean(ap_boot):.3f}  95% CI = [{np.percentile(ap_boot,2.5):.3f}, {np.percentile(ap_boot,97.5):.3f}]')

📤 実行結果

ROC-AUC = 0.706 95% CI = [0.544, 0.850] PR-AUC = 0.749 95% CI = [0.571, 0.878]

💬 結果の読み方:ROC-AUC 0.706、 95% CI [0.544, 0.850] は 0.5 を上回るので、 出生率は高齢化の予測に有意な情報を持つ。 PR-AUC 0.749 は陽性率(base rate ≈ 0.49)を明確に上回り、 単なる多数派予測より優れる。 ただし FPR≈0.46 と偽陽性は多く、 閾値調整が要る。

📓 クックブック 30 構文

#構文・関数用途
①01from sklearn.metrics import confusion_matrix混同行列
①02tn,fp,fn,tp = confusion_matrix(y,yhat).ravel()4 セル取り出し
①03fpr = fp/(fp+tn)FPR 計算
①04tpr = tp/(tp+fn) # = recallTPR / Recall
①05precision = tp/(tp+fp)Precision
①06f1 = 2*p*r/(p+r)F1
①07from sklearn.metrics import roc_curveROC 曲線
①08from sklearn.metrics import roc_auc_scoreROC-AUC
①09from sklearn.metrics import precision_recall_curvePR 曲線
①10from sklearn.metrics import average_precision_scorePR-AUC
②11from sklearn.metrics import classification_report総合レポート
②12from sklearn.metrics import balanced_accuracy_score不均衡対応 acc
②13from sklearn.metrics import matthews_corrcoefMCC
②14from sklearn.metrics import cohen_kappa_scoreKappa
②15from sklearn.metrics import log_loss対数損失
②16from sklearn.metrics import brier_score_lossBrier
②17from sklearn.calibration import calibration_curveキャリブレーション
②18from sklearn.calibration import CalibratedClassifierCV確率校正器
②19from sklearn.isotonic import IsotonicRegressionIsotonic 校正
②20from statsmodels.stats.multitest import multipletests多重検定補正
③21multipletests(pvals, method='bonferroni')Bonferroni
③22multipletests(pvals, method='fdr_bh')BH 法
③23from scipy.stats import binomtest二項検定
③24from imblearn.over_sampling import SMOTEオーバサンプリング
③25from imblearn.under_sampling import RandomUnderSamplerアンダーサンプリング
③26GridSearchCV(clf, {'C':[0.1,1,10]}, scoring='roc_auc')ハイパラ最適化
③27permutation_importance(clf, X, y)重要度
③28shap.Explainer(clf)(X)SHAP
③29Equalized Odds via fairlearn.metrics公平性監査
③30DriftDetector(ref, current)ドリフト検知

❓ FAQ 拡張(Q21-Q30)

Q21. 確率閾値を 0.5 以外にすべき?
業務コストに応じて変える。 不均衡時は 0.1〜0.3 が多い。
Q22. SHAP で FP の原因特定はできる?
可。 FP サンプルに対して shap_values を確認すると、 寄与の大きい特徴量がわかる。
Q23. ベイズ的に FPR を語るには?
Beta-binomial 事後分布 Beta(FP+1, TN+1) を使う。
Q24. PR-AUC が高くても危ない例は?
陽性率が高い(不均衡が逆)データ。 ベースライン=陽性率なので比較必須。
Q25. クラス重みと SMOTE どちらが先?
まず class_weight='balanced'、 効果なければ SMOTE/ADASYN。
Q26. テストデータでもSMOTE を使う?
NO。 評価は元の分布で行う。
Q27. AUC が複数モデルで同じとき?
Calibration / 信頼区間 / 推論速度で選ぶ。
Q28. anomaly detection の閾値は?
陰性データの 95 パーセンタイルで FPR=5% に。
Q29. 多重検定で BH 法と Storey 法どちらが強い?
Storey の方が検出力が高いが π0 推定に依存。 BH が標準。
Q30. 公平性指標 3 つは?
Demographic Parity / Equalized Odds / Calibration。 同時最適は不可能定理あり。

🎓 まとめ — この用語をどう活かすか

偽陽性は『誤って警報を鳴らす』誤り。 ゼロにはできないが、 業務コストとのバランスで閾値を選ぶ。 SSDSE-B-2026 の人口分析でも実証したように、 評価指標を 1 つだけ見て決めるのは危険。 ROC / PR / Calibration の 3 点セット + Subgroup 監査が王道。

本ページは data/raw/SSDSE-B-2026.csv の実値計算に基づいており、 合成データは一切含まない。 演習問題・FAQ・クックブックを順に読み、 手を動かしながら自分の用途に翻訳することを推奨する。

📓 拡張深掘り — false positive を実務で乗りこなす 9 視点

ここまで偽陽性(false positive, FP)の定義・指標・閾値・コスト最適化を扱った。 ここでは SSDSE-B-2026 都道府県データを使った 9 つの追加トピックを順に提示する。 すべて実データに基づく実演で、 合成データは使用しない。 演習問題 → 図 3 枚 → 医療/詐欺/公平性/ベイズ/歴史/英訳/学習リソースを連結させ、 「偽陽性を 1 つの章として習得する」構成にしている。

🧪 理解度チェック — 練習問題 10 問(解答解説つき)

以下の練習問題を 1 問ずつ自分で解いてから解答を確認すること。 答えを暗記するのでなく、 「なぜそうなるか」を SSDSE-B-2026 のデータ感覚と紐づけて理解するのが狙いである。 制限時間の目安は全 10 問で 20 分。 まずは紙とペンで結論を出し、 そのうえで Python を動かして数値を確かめる。

Q1. 47 都道府県のうち「人口減少県」を陽性と定義する。 ある分類器が陽性 35 件のうち 30 件を正しく当て、 さらに 4 件を誤って陽性とした。 偽陽性数 FP と偽陽性率 FPR を計算せよ。
解答: FP = 4。 全陰性数は 47-35=12、 そのうち 4 件が誤陽性なので FPR = 4/12 ≈ 0.333。
解説: FPR は「陰性のうち誤って陽性とした割合」。 ベースラインの陰性総数で割るのが鉄則で、 サンプル全体(47)で割ってはいけない。
Q2. Q1 の状況で precision を求めよ。 さらに「精度(accuracy)が 0.93 だから優秀」という主張の問題点を指摘せよ。
解答: precision = TP/(TP+FP) = 30/(30+4) ≈ 0.882。 accuracy = (30+8)/47 ≈ 0.809。
解説: 不均衡時には accuracy が高くても陽性側の判定がガタガタな例がある。 ここでは accuracy ≈ 0.81 だが、 precision と recall の片方が低ければ実務的には失敗。 必ず混同行列ベースで多角的に評価する。
Q3. SSDSE-B-2026 の都道府県別「出生率(出生数÷人口)」と「高齢化率 32% 以上フラグ」の関係を ROC 曲線で確認したところ AUC=0.707 だった。 これは何を意味するか。
解答: 0.5 を上回るので「ランダムより良い分類器」。 出生率が低い県ほど高齢化率が高い傾向を捉えている。 ただし 0.7 程度なので判別力は中程度で、 偽陽性 (FP) を無視できない。
解説: AUC は 0-1 の指標で 0.5 が偶然。 0.7 台は「中程度の予測力」。 bootstrap の 95% CI は 0.544-0.850 で下限が 0.5 を上回るため、 「予測力あり」と結論できる。 ただし点推定 0.7 は完璧ではなく、 FP 抑制には別特徴量や閾値調整が必要。
Q4. 医療スクリーニング検査で罹患率 1% の疾患を対象に sensitivity=0.99, specificity=0.95 の検査を用いる。 陽性的中率 PPV を求めよ。
解答: PPV = (0.99×0.01)/(0.99×0.01 + 0.05×0.99) = 0.0099/0.0594 ≈ 0.167。
解説: スペック上の感度 99% が高く見えても、 罹患率が低いと PPV は 17% 程度に落ちる。 これが「希少疾患スクリーニングで陽性が出ても 80% 以上は偽陽性」と言われる根拠。
Q5. Q4 の検査の specificity を 95% から 99% に改善した。 PPV はどう変化するか。
解答: PPV = (0.99×0.01)/(0.99×0.01 + 0.01×0.99) = 0.0099/0.0198 = 0.5。
解説: specificity を 4% 改善するだけで PPV は 0.17 → 0.50 と約 3 倍になる。 希少事象では FP を減らす(specificity を上げる)方が PPV 改善には効きやすい。
Q6. 多重比較で 1000 個の独立な検定を α=0.05 で実施したとき、 期待される偽陽性件数と、 1 件以上偽陽性が出る確率を求めよ。
解答: 期待 FP = 1000×0.05 = 50 件。 1 件以上偽陽性が出る確率 = 1-(1-0.05)^1000 ≈ 1.0(ほぼ確実)。
解説: 多重比較で補正しなければ「有意」とされる結果の大半がノイズである。 Bonferroni(α/m)や Benjamini-Hochberg(FDR 制御)を必ず使う。
Q7. Bonferroni 補正を Q6 の 1000 検定に適用すると、 個々の検定の有意水準はいくらになるか。
解答: α' = 0.05/1000 = 0.00005。
解説: 非常に厳しくなる代わりに family-wise error rate(FWER)を 5% 以下に制御できる。 検出力は大きく下がるので、 探索段階では BH 法(FDR)の方が好まれる。
Q8. 詐欺検知モデルで FP のコストが「顧客 1 人に電話確認 200 円」、 FN のコストが「不正取引平均 50,000 円」のとき、 コスト最小化のための閾値はどう設定するか直感で説明せよ。
解答: FN コスト / FP コスト = 250。 つまり FN 1 件を防ぐためには FP を 250 件まで許容する価値がある。 閾値は 0.5 より大幅に低くする(例 0.01-0.05)。
解説: コスト感度分析では FP コストと FN コストの比が閾値選択を支配する。 不均衡データでは閾値 0.5 は意味を持たない。
Q9. 同じモデルでも、 男女別に FPR を計算したら男性 0.05、 女性 0.15 だった。 これは何が問題か。
解答: Equalized Odds の観点で「女性側の偽陽性率が 3 倍」となっており、 公平性違反(disparate impact)の疑いがある。
解説: 全体の FPR は 0.10 でも、 サブグループに分解すると差が出る。 公平性監査では必ず group-wise FPR を比較する。
Q10. bootstrap で AUC の 95% 信頼区間を求めると [0.45, 0.85] となった。 この AUC は「有意」と言えるか。
解答: 0.5 を含むため、 5% 有意水準では「ランダム判別と区別できない」。 つまり統計的に有意な予測力があるとは言えない。
解説: 単点推定の AUC が 0.65 だけを見て「予測力あり」と判断するのは危険。 信頼区間が 0.5 を跨ぐかどうかで判定する習慣をつける。

🖼 図解 — 3 図で見る FP の振る舞い

以下 3 枚は SSDSE-B-2026 都道府県データに基づいて作成した分布と関係の図である。 偽陽性は「分布の裾」「閾値の置き場所」「群間比較」の 3 つの観点でしばしば発生する。 図と本文を見比べながら「どの場合に FP が増えるか」を直感で掴んでほしい。

図 1. SSDSE 散布図 — 人口と出生数の関係

人口と出生数の散布図

📊 47 都道府県の人口(横軸)と出生数(縦軸)。 強い正の相関だが、 関係を機械的に閾値で切ると外れ値(東京・大阪・愛知)が常に陽性扱いとなり、 これらは「異常な大都市」ではなく実態どおり大きいだけのため、 文脈上の偽陽性になり得る。 閾値カットの前に必ず散布図を見ること。

図 2. 都道府県人口のヒストグラム

都道府県人口のヒストグラム

📊 47 都道府県の人口分布。 右に裾を引く対数正規的形状で、 平均と分散から正規分布を仮定して「3σ ルール」で外れ値を切ると、 東京・神奈川・大阪が機械的に陽性となる。 これは分布の歪みが大きい場合に起こる典型的な偽陽性で、 IQR や対数変換、 ロバスト統計の利用で回避できる。

図 3. 地域ブロック別 箱ひげ図

地域ブロック別の指標分布

📊 SSDSE 指標を地域ブロック(北海道/東北/関東/中部/近畿/中国/四国/九州)に分けた箱ひげ図。 同じ閾値を全国共通で適用すると、 関東ブロックでは偽陽性が増え、 四国ブロックでは偽陰性が増える。 群ごとに base rate が違うので、 群ごと閾値(per-group threshold)または階層モデルでの補正が必要となる。

🏥 ケーススタディ A — 医療スクリーニングと FP

医療では偽陽性が最も多くの議論を呼ぶ。 ここでは 3 つの代表的ケースを表で整理する。 いずれも「感度 vs 特異度 vs base rate」のトレードオフが鍵で、 検査の精度よりも罹患率の方が PPV を支配することが多い。

検査罹患率感度特異度PPV解釈
マンモグラフィ(40歳代)0.4%85%90%3.3%陽性者の 97% は偽陽性
PSA(前立腺癌)3%75%85%13.4%陽性者の 86% は偽陽性
COVID-19 PCR(流行期)5%95%99%83.3%陽性者の 17% が偽陽性
HIV ELISA(高リスク群)10%99%99%91.7%陽性者の 8% が偽陽性
HIV ELISA(低リスク群)0.1%99%99%9.0%陽性者の 91% は偽陽性
大腸内視鏡(症状あり)15%95%85%52.8%陽性者の半数は偽陽性

💡 上記から読めるのは「罹患率が低い集団で広く検査をすると、 たとえ高精度な検査でも陽性の大半が偽陽性になる」事実である。 これは Bayes の定理が直接示す結果で、 検査前確率(事前確率)を上げる、 つまり「症状やリスクで集団を絞る」のが PPV 改善の王道。 集団的スクリーニングを設計する際は、 必ず PPV を Bayes 計算で見積もる。

💳 ケーススタディ B — 詐欺検知・スパム・不正検知

詐欺検知は陽性率(fraud rate)が極端に低い(0.1% 程度)不均衡問題の典型である。 偽陽性は「顧客体験悪化」「カード一時停止」「コンタクトセンター負荷増」につながり、 FN(見逃し)は直接的な金銭損失につながる。 両者のコスト比で閾値を選ぶ。

ドメイン陽性率FP コストFN コスト推奨閾値
クレジット詐欺0.1%確認電話 200 円不正額平均 50,000 円0.005-0.02
メールスパム20%重要メール紛失(大)迷惑メール受信(小)0.7-0.95(高めに)
不正ログイン0.05%MFA 追加要求(中)アカウント乗っ取り(大)0.01-0.05
マネーロンダリング0.01%調査人件費 5,000 円規制罰金 数千万円0.001-0.01
EC レビュー操作検出3%健全レビュー削除(中)サクラ放置(中)0.4-0.6

💡 詐欺検知では「閾値 0.5」はほぼ常に間違い。 ベースラインの陽性率と業務コストから「最適閾値」を導出し、 半年ごとにモニタリングして再調整する。 ライフサイクル管理(MLOps)が偽陽性制御の鍵。

⚖ 公平性深掘り — Group-wise FPR と Equalized Odds

同じモデルでも、 サブグループ(性別・年代・地域)別に偽陽性率は変わる。 これが公平性違反になるかは、 採用シナリオ次第で判定が異なる。 SSDSE-B-2026 のような都道府県データでも「地域ブロック別 FPR」を必ず確認する習慣が必要。

公平性指標数式意味FP との関係
Demographic ParityP(ŷ=1|A=a)=P(ŷ=1|A=b)陽性率の平等間接的
Equal OpportunityTPR_a = TPR_b真陽性率の平等補集合に注意
Equalized OddsTPR_a = TPR_b ∧ FPR_a = FPR_bTPR/FPR の同時平等FPR 直接制約
Predictive ParityPPV_a = PPV_b陽性的中率の平等FP 数の比率に影響
CalibrationP(y=1|p=q, A=a) = q確率の解釈一致確率ベース FP
Treatment EqualityFN_a/FP_a = FN_b/FP_bエラー比率の平等FP/FN バランス

💡 Chouldechova (2017) と Kleinberg et al. (2017) の不可能定理により、 base rate が群間で異なる場合、 上記公平性指標を 同時に満たすことは不可能。 業務上どれを優先するかを明示的に選ばなければならない。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 Prefecture(都道府県) SSDSE-B-2026(年度) A1101(総人口) A4103(合計特殊出生率) 北海道 北海道 2,023 5,092,000 1.06 東京都 東京都 2,023 14,086,000 0.99 沖縄県 沖縄県 2,023 1,468,000 1.6 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import pandas as pd, numpy as np
from sklearn.metrics import confusion_matrix
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=1, encoding='cp932')
# 行は「県ごとに 2023→2012 の降順」で並んでいる。
# そのまま diff() を取ると (a) 県の境目をまたぐ (b) 新しい年から古い年を引くので符号が逆、
# の 2 つが同時に起きる。 県ごとに年度昇順へ並べ替えてから差分を取る。
df = df.sort_values(['都道府県', '年度'])
df['人口減少'] = (df.groupby('都道府県')['総人口'].diff().fillna(0) < 0).astype(int)
df['ブロック'] = df['都道府県'].map({'北海道':'北海道','青森県':'東北','岩手県':'東北','宮城県':'東北','秋田県':'東北','山形県':'東北','福島県':'東北'}).fillna('その他')
df['予測'] = (df['合計特殊出生率'] < 1.3).astype(int) if '合計特殊出生率' in df.columns else 0
for blk, sub in df.groupby('ブロック'):
    tn,fp,fn,tp = confusion_matrix(sub['人口減少'], sub['予測'], labels=[0,1]).ravel()
    fpr = fp/(fp+tn) if (fp+tn) else float('nan')
    print(f'ブロック {blk}: FPR = {fpr:.3f}')

📤 実行結果(例)

ブロック その他: FPR = 0.176 ブロック 北海道: FPR = 1.000 ブロック 東北: FPR = 0.000

💬 結果の読み方: ブロック別 FPR は その他 0.176 / 東北 0.000 / 北海道 1.000 と大きくばらついた。 しかしこの数字をそのまま「北海道は不公平」と読んではいけない。 FPR の分母は「実際には人口減少していない年」の件数で、 その他 108 件・東北 8 件に対し 北海道はわずか 1 件しかない。 1 件が偽陽性なら FPR は自動的に 1.000 になる。 群ごとのサンプル数が極端に違うとき、 比率だけを並べた表は誤読を生む。 公平性監査の第一歩はこのような group-wise 比較だが、 同時に分母 (件数) を必ず併記し、 小さい群には信用区間を付けることが欠かせない (次節のベイズ的アプローチがまさにその処方箋)。

🔮 ベイズ的アプローチ — FPR の事後分布

FPR を「点推定 0.05」と報告するのではなく、 事後分布として扱うとサンプル数の少なさによる不確実性が明示できる。 Beta-Binomial モデルが標準的で、 prior を Beta(1,1)(無情報)とし、 観測 FP=4, TN=8 なら事後は Beta(5, 9)。 95% 信用区間は分位点から直接計算できる。

1
2
3
4
5
6
7
8
import numpy as np
from scipy import stats
fp, tn = 4, 8     # 観測値
a, b = 1+fp, 1+tn # Beta 事後パラメータ
post = stats.beta(a, b)
print(f'事後平均 = {post.mean():.3f}')
print(f'95% 信用区間 = [{post.ppf(0.025):.3f}, {post.ppf(0.975):.3f}]')
print(f'FPR>0.5 の事後確率 = {1-post.cdf(0.5):.3f}')

📤 実行結果

事後平均 = 0.357 95% 信用区間 = [0.139, 0.614] FPR>0.5 の事後確率 = 0.133

💬 結果の読み方: サンプル数 12 しかない場合、 点推定 FPR=0.333 だけ見せるより 95% 信用区間 [0.139, 0.614] を併記すべき。 「FPR が 50% を超える可能性が 13.3% 残る」と読み取れる。 ベイズは少ない観測でも誤解を生みにくい言葉を提供する。

📜 歴史的マイルストーン — FP 概念の発展史

人物・出来事貢献
1763Bayes / Price事後確率の概念 — PPV 計算の理論基盤
1928Neyman & PearsonType I / Type II error の定式化(FP=Type I)
1941RADAR ROC 曲線第二次大戦中、 信号検知のため ROC が誕生
1961Tanner & Swetssignal detection theory として体系化
1995Benjamini & HochbergFDR 概念導入 — 多重比較で FP 管理
2006Hand分類器の「H-measure」提案、 AUC の批判
2016ProPublica COMPAS 報告人種別 FPR 格差が司法 AI 公平性議論を加速
2018Chouldechova 不可能定理公平性指標の同時満足不可を証明

📖 英訳辞典 — 関連用語ミニ辞書(12 項)

日本語英語補足
偽陽性false positive (FP) / Type I error「あわてんぼうの誤り」
偽陰性false negative (FN) / Type II error「ぼんやりの誤り」
真陽性true positive (TP)正しく陽性
真陰性true negative (TN)正しく陰性
偽陽性率false positive rate (FPR)FP/(FP+TN) = 1-specificity
特異度specificity / true negative rateTN/(TN+FP)
陽性的中率positive predictive value (PPV)TP/(TP+FP) = precision
陰性的中率negative predictive value (NPV)TN/(TN+FN)
族関連誤発見率family-wise error rate (FWER)Bonferroni が制御
偽発見率false discovery rate (FDR)BH 法が制御
確率校正probability calibrationPlatt / Isotonic
公平性指標fairness metricEqualized Odds 等

📚 学習リソース — 次に読むべき 8 件

  1. Fawcett (2006) "An introduction to ROC analysis" — Pattern Recognition Letters。 ROC/AUC の決定版解説。
  2. Davis & Goadrich (2006) "The relationship between Precision-Recall and ROC curves" — 不均衡時に PR-AUC を選ぶ理由。
  3. Benjamini & Hochberg (1995) "Controlling the false discovery rate" — FDR の原著論文。
  4. Saito & Rehmsmeier (2015) "The Precision-Recall Plot Is More Informative" — 不均衡データでの可視化指針。
  5. Chouldechova (2017) "Fair prediction with disparate impact" — 不可能定理の証明。
  6. Kleinberg, Mullainathan & Raghavan (2017) "Inherent trade-offs in the fair determination of risk scores" — 公平性指標の不可能性。
  7. Niculescu-Mizil & Caruana (2005) "Predicting Good Probabilities with Supervised Learning" — Platt / Isotonic 校正の比較。
  8. Gigerenzer (2002) "Reckoning with Risk" — Bayes 思考の入門書、 医療検査の偽陽性の社会的解説。

偽陰性適合率再現率特異度AUCROC 曲線混同行列F1 スコアp 値多重比較FDR対立仮説クラス不均衡分類ロジスティック回帰決定木ランダムフォレスト交差検証ブートストラップ公平性SHAP

🧮 数理深掘り — FPR と関連量の代数的関係

偽陽性率 FPR は 1-specificity と等しく、 ROC 曲線の横軸そのものでもある。 ここでは混同行列の 4 セル(TP, TN, FP, FN)から派生する主要指標 12 種を、 計算式と意味を併記して整理する。 同じ実験データに対して指標値を一斉に出すと、 不均衡や閾値の影響が浮き彫りになる。

指標英名数式意味・補足
偽陽性率FPRFP/(FP+TN)ROC 横軸、 type I error
真陽性率TPR / recallTP/(TP+FN)ROC 縦軸、 検出力
特異度specificity / TNRTN/(TN+FP)= 1-FPR
適合率precision / PPVTP/(TP+FP)陽性出力の信頼度
陰性的中率NPVTN/(TN+FN)陰性出力の信頼度
FDRfalse discovery rateFP/(TP+FP) = 1-precision陽性中の偽の割合
FORfalse omission rateFN/(TN+FN) = 1-NPV陰性中の偽の割合
F1F1 score2·P·R/(P+R)precision と recall の調和平均
尤度比+LR+TPR/FPR陽性検査結果の尤度比
尤度比-LR-FNR/TNR陰性検査結果の尤度比
バランス精度balanced accuracy(TPR+TNR)/2不均衡時に使う accuracy
MCCMatthews correlation(TP·TN-FP·FN)/√(...)不均衡対応の総合指標

💡 これらの指標は互いに代数的に結び付いている。 たとえば precision と recall を高めると F1 が上がるが、 不均衡時には FPR が小さくても陽性出力が大半 FP になる場合があり、 PPV/PR-AUC で別途確認すべき。 単一指標を金科玉条にせず、 複数指標の組合せで意思決定する。

🐍 実装深掘り — classification_report と calibration の併用

FPR を最小化するためには、 単純にクラス重み付けや SMOTE だけではなく、 確率校正(calibration)と組み合わせる必要がある。 校正されていない確率の閾値を 0.1 に下げても、 元のスコア分布がいびつだと FP が安定的に減らない。 以下は SSDSE-B-2026 を題材にした典型的なパイプライン。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 Prefecture(都道府県) SSDSE-B-2026(年度) A1101(総人口) A4101(出生数) 北海道 北海道 2,023 5,092,000 24,430 東京都 東京都 2,023 14,086,000 86,348 沖縄県 沖縄県 2,023 1,468,000 12,549 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import pandas as pd, numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.calibration import CalibratedClassifierCV
from sklearn.metrics import classification_report, roc_curve
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=1, encoding='cp932')
# 行は「県ごとに 2023→2012 の降順」で並んでいる。
# そのまま diff() を取ると (a) 県の境目をまたぐ (b) 新しい年から古い年を引くので符号が逆、
# の 2 つが同時に起きる。 県ごとに年度昇順へ並べ替えてから差分を取る。
df = df.sort_values(['都道府県', '年度'])
y = (df.groupby('都道府県')['総人口'].diff().fillna(0) < 0).astype(int)
X = df[['総人口','出生数']].astype(float)
base = LogisticRegression(class_weight='balanced', max_iter=1000)
cal  = CalibratedClassifierCV(base, method='isotonic', cv=5)
cal.fit(X, y)
prob = cal.predict_proba(X)[:,1]
fpr, tpr, thr = roc_curve(y, prob)
target_fpr = 0.05                       # FPR を 5% 以下に抑える
idx = np.argmax(fpr > target_fpr) - 1   # 5% を超える直前の閾値
chosen = thr[idx]
yhat = (prob >= chosen).astype(int)
print(f'選択閾値 = {chosen:.3f}, 実 FPR = {fpr[idx]:.3f}, TPR = {tpr[idx]:.3f}')
print(classification_report(y, yhat, digits=3))

📤 実行結果(例)

選択閾値 = 0.917, 実 FPR = 0.043, TPR = 0.582 precision recall f1-score support 0 0.375 0.957 0.538 117 1 0.981 0.582 0.730 447 accuracy 0.660 564 macro avg 0.678 0.769 0.634 564 weighted avg 0.855 0.660 0.691 564

💬 結果の読み方: FPR を 5% 以下に抑える閾値 0.917 を選ぶと、 実 FPR = 0.043 で TPR = 0.582 ── 取りこぼしを許す代わりに誤警報を 20 分の 1 に抑えた形になる。 ここで注意したいのは accuracy 0.660 という数字にほとんど意味がないこと。 このデータは 564 件中 447 件 (79%) が「人口減少あり」の不均衡データなので、 全部を「減少あり」と答えるだけで accuracy 0.79 が出てしまう。 accuracy が下がったのは、 誤警報を減らすために意図的に陽性判定を絞った結果であって、 モデルが劣化したわけではない。 閾値を動かしたときは accuracy ではなく FPR と TPR の組で評価する。 さらに精度を上げたいなら、 別の特徴量(合計特殊出生率、 高齢化率、 転入超過数)を加えることを検討する。

📈 モニタリング — 本番運用での FPR ドリフト検出

モデルを本番投入したら、 FPR は時間とともに変動する(drift)。 とくに季節性・キャンペーン・ユーザー属性変化により陽性率(base rate)が変動するため、 「学習時と同じ閾値」を維持しているだけでは想定 FPR を超える。 以下は典型的なモニタリング指標。

指標監視頻度アラート閾値の例対応アクション
FPR毎時学習時 +2σ 超閾値再キャリブレーション
陽性率毎時過去 7 日平均から ±30%入力ドリフト調査
PSI日次PSI > 0.2特徴量分布の変化を分析
KS 統計量日次D > 0.1分布ドリフト評価
サブグループ FPR週次群間差 > 2 倍公平性レビュー実施
Calibration Error週次ECE > 0.05Isotonic 再校正

🛠 実装 Tips — FP を減らすための 10 戦術

  1. 確率校正を必ず実施 — Platt / Isotonic で出力確率を「実際の頻度」に近づける。
  2. 閾値を ROC ベースで選ぶ — 0.5 は意味を持たない。 Youden's J や F-beta で選ぶ。
  3. class_weight='balanced' — 多くの sklearn 分類器でデフォルトで試す価値あり。
  4. SMOTE は訓練のみ適用 — テストデータに掛けると評価が壊れる。
  5. cost-sensitive learning — FP コスト・FN コストを損失関数に直接組み込む。
  6. ensemble で分散を減らす — RandomForest や XGBoost の bagging 効果。
  7. 特徴量設計を見直す — leakage や ノイズ特徴量が FP の主因のことが多い。
  8. サブグループ別評価 — 全体 FPR が低くても群差大ならアウト。
  9. 多重比較補正 — 多検定なら必ず BH 法か Bonferroni。
  10. 不確実性を伴って提示 — 単点推定でなく、 信頼区間・事後分布で報告。

❓ 追加 FAQ — 実務でよく聞かれる 15 問

Q31. FPR と「α エラー」「Type I error」の違いは?
本質的に同じ概念。 統計検定の文脈では α エラー / Type I error、 分類モデルの文脈では FPR と呼ぶことが多い。 ともに「帰無仮説が正しい(陰性)のに棄却(陽性とする)してしまう」誤り。
Q32. anomaly detection と分類で FP の意味は同じ?
概念は同じだが運用が異なる。 anomaly detection は「正常」のみ学習し、 そこから外れたものを陽性とするので、 訓練データに偽陽性ラベルが存在しない。 評価は監督ラベルが手に入った時点で混同行列を作る。
Q33. 多クラス分類での FP はどう定義する?
クラスごとに OvR(one-vs-rest)で 2 値問題に直して、 クラス c に対する FP_c を「c でないのに c と予測した数」と定義する。 全体指標は macro / weighted で平均する。
Q34. 時系列分類での FP はどう扱う?
時系列の依存性を考慮し、 train/test を時系列カットで分割する。 さらに「警報が連続した場合は 1 件と数える」など、 業務に即したカウント方法(event-wise vs sample-wise)が必要。
Q35. 「FP=0 を目指せ」と言われたら?
理論上不可能。 FPR=0 にすると TPR も 0 になる(誰も陽性にしない)。 「FPR を 1% 以下に抑えつつ recall を最大化」のように制約付き最適化として再定義する。
Q36. PR-AUC と ROC-AUC のどちらを優先?
陽性率(base rate)が極端に低い不均衡データなら PR-AUC、 中程度なら ROC-AUC。 PR-AUC は陽性率に依存するため絶対値比較は要注意。
Q37. ラベルノイズが FP 評価に与える影響は?
ラベル誤りがあると真の TN がラベル上 FP になる。 ラベルノイズ率 ε が小さくない場合、 観測 FPR は真 FPR より高く出る。 ラベル監査やラベル平滑化、 noisy-label-robust loss を検討。
Q38. SSDSE データで FPR を可視化するには?
sklearn.metrics.roc_curve で FPR と TPR を得て matplotlib でプロット。 さらに auc() で面積、 RocCurveDisplay で凡例も自動表示できる。
Q39. データリーケージで FPR が改善することは?
「テスト時にだけわかる情報」を訓練に混ぜると、 訓練時の FPR は非常に低くなるが本番では崩壊する。 リーケージ検出は cross-validation の fold 間で評価指標を比較するのが基本。
Q40. recall 100% 達成すれば FP は気にしなくてよい?
逆。 recall を 100% にすれば多くの場合 FP は爆発する。 precision とのトレードオフを必ず取る。
Q41. 業務で「アラート疲れ(alert fatigue)」とは?
偽陽性アラートが多すぎてオペレータが本当のアラートを軽視する状態。 セキュリティ運用や医療監視で深刻。 閾値の動的調整・優先度付き通知・サマリー表示で軽減する。
Q42. FPR が低くても「使えない」モデルとは?
precision は高いが recall が極端に低いケース。 たとえば 1000 件中 5 件しか陽性出力しないなら、 ほぼ全件見逃している。 FPR だけ見て判断しないこと。
Q43. SHAP で FP 個別ケースを分析するには?
FP に該当するサンプルのみ抽出し、 shap_values を計算して force_plot や waterfall で寄与の大きい特徴量を可視化する。 共通パターンが見えれば特徴量改善のヒントになる。
Q44. オンライン学習で閾値はどう更新する?
指数移動平均で base rate を追跡し、 目標 FPR を維持する閾値を周期更新する。 過去 24h の予測スコア分布の分位点を採用する simple な方法も有効。
Q45. なぜ「偽陽性ゼロ」と謳う医療機器広告は誤り?
実用上 FPR=0 は不可能。 仮に検査の specificity が 100% でも、 サンプル/前処理エラー・装置不調等で FP は発生する。 「FPR<1%」「PPV X%」など定量明示すべき。

📖 拡張ミニ辞典(追加 15 項)

用語英語説明
Youden's JYouden indexJ = TPR - FPR、 ROC 上で最大点を閾値に
事前確率prior probabilitybase rate と同義、 Bayes 計算の出発点
事後確率posterior probability検査結果を踏まえた更新後の確率
アラート疲れalert fatigueFP 多発によるオペレータ感度低下
α エラーalpha errorType I error の別名
β エラーbeta errorType II error の別名
PSIPopulation Stability Index分布の変化を測る、 ドリフト検知の標準
KS 距離Kolmogorov-Smirnov分布間距離、 ドリフト検知に利用
Brier スコアBrier score確率予測の二乗誤差、 校正評価
ECEExpected Calibration Error校正誤差の平均、 0 に近いほど良い
disparate impact不利益的影響米国法で公平性違反の指標、 4/5 ルール
cost matrixコスト行列FP/FN それぞれにコスト割当
Platt 校正Platt scalingロジスティック回帰で確率校正
Isotonic 校正Isotonic regression単調回帰で確率校正
事例ベース監査case-based auditFP 事例の質的分析

📖 物語で理解する FP — 3 つのケース

ストーリー 1: 健康診断の不安

健康診断で「腫瘍マーカー陽性」と通知された 40 代男性。 病院での精密検査の結果、 良性であった。 これが偽陽性の典型例。 罹患率 0.5%、 感度 80%、 特異度 90% の検査ならば PPV ≈ 3.9%。 つまり陽性通知を受けた人のうち約 96% は実際には罹患していない。 検査前にこの数字を知っておけば、 不必要な不安は減らせる。 医療リテラシーとして PPV を知る意味は大きい。

ストーリー 2: スパムメールの誤判定

大手 EC 企業の重要な確認メールが、 顧客の Gmail スパムフォルダに自動振り分けされ続けた。 これは顧客側スパム分類器の偽陽性。 顧客から「届かない」と苦情が続出。 SPF / DKIM / DMARC を整え、 送信ドメインの reputation を高めることで FPR を下げた。 メール業界では「FP 0.1% でも 100 万通中 1,000 通が誤判定」と認識する。

ストーリー 3: 顔認証の入退室管理

オフィスの顔認証ゲートで、 双子の弟が兄として誤認識(FP)された。 セキュリティ部門は「FPR < 0.001%」を保証していたが、 双子のような外れ値で破綻。 解決策はマルチモーダル認証(顔+IC カード)と、 サブグループ別 FPR の継続監査。 「全体平均」だけ見ても安全とは言えない好例。

⚠ アンチパターン集 — 偽陽性を悪化させる 8 つの間違い

アンチパターンなぜダメか代わりに
accuracy だけで評価不均衡で誤導的F1, PR-AUC, MCC を併用
閾値 0.5 固定業務コスト無視コスト最適化で決定
テスト側にも SMOTE評価が壊れる訓練のみに適用
校正なしの確率閾値出力確率が信頼できないPlatt / Isotonic 校正
多重比較補正なしFP が量産されるBonferroni / BH 法
全体 FPR のみ公開サブグループ格差を隠蔽group-wise FPR を必須報告
本番でも訓練時閾値固定ドリフトで FPR 上昇定期再校正
「FPR=0」と宣伝物理的に不可能定量的に明示する

🏭 産業別ケーススタディ — 12 業界での FP の意味

「偽陽性」という言葉は同じでも、 産業によってその意味と扱いは大きく異なる。 ここでは 12 業界での代表例を表でまとめる。 自分の業界がどこに該当するかを意識し、 「許容できる FPR の水準」と「FP の社会的・経済的コスト」を見極める素材として使ってほしい。

業界陽性の意味FP の主なコスト許容 FPR の目安
医療診断疾患疑い精密検査負担・心理的不安5-15%
医薬品開発候補化合物無駄な開発費(億単位)1% 以下
クレジット不正疑わしい取引確認電話・顧客不満0.5-2%
マネロン検知SAR 報告候補調査工数増1-5%
サイバーセキュリティ攻撃疑いアラート疲れ0.1-1%
スパムフィルタスパム判定重要メール紛失0.01-0.1%
空港セキュリティ危険物疑い追加検査・遅延5-20%
司法 AI(再犯予測)再犯リスク不当な拘束・倫理問題慎重設計必須
採用 AI不適合候補差別・機会損失公平性監査必須
広告ターゲティング関心ありユーザー配信費の無駄業務 ROI 次第
天気予報(豪雨)豪雨警報警報疲れ・経済損失10-30%
天文学(系外惑星)候補天体追跡観測の浪費5-15%

💡 同じ「偽陽性 5%」でも、 医療スクリーニングなら許容範囲、 マネロン検知なら過大、 採用 AI なら社会問題。 数字だけで評価せず、 「業界規範」「規制」「ユーザー体験」を踏まえる必要がある。

🗺 概念マップ — 偽陽性の位置づけ

偽陽性 (False Positive, FP) は混同行列の 4 セルのうちの 1 つで、 「実際は陰性なのに陽性と予測した」誤りを指す。 同義: Type I Error、 α エラー、 False Alarm。 SSDSE-B-2026 を題材にすれば、 「失業率の高い県」と予測したが実際は中程度だった、 などが FP に該当する。

混同行列と FP の位置づけ 予測: 陽性 (+) 予測: 陰性 (-) 実際: 陽性 (+) 実際: 陰性 (-) TP 真陽性 正しく陽性 FN (Type II) 偽陰性 見逃し FP (Type I) ★ 偽陽性 (本ページ) False Alarm TN 真陰性 正しく陰性 Precision = TP/(TP+FP) ・ FPR = FP/(FP+TN) ・ FDR = FP/(TP+FP)
【混同行列 (Confusion Matrix) の 4 セル】

                  予測: 陽性 (+)            予測: 陰性 (-)
              ┌─────────────────────┬─────────────────────┐
 実際: 陽性  │ TP (真陽性)         │ FN (偽陰性 / Type II) │
              │ 正しく陽性と予測    │ 陽性を見逃した        │
              ├─────────────────────┼─────────────────────┤
 実際: 陰性  │ FP (偽陽性) ★      │ TN (真陰性)          │
              │ 本ページ            │ 正しく陰性と予測      │
              │ 陰性を陽性と誤判定  │                      │
              └─────────────────────┴─────────────────────┘

【FP と関連指標の対応】
偽陽性数 FP ──┬─→ FPR = FP / (FP + TN)        ─ 特異度 = 1 - FPR
              ├─→ Precision = TP / (TP + FP)  ─ FP 増 → Precision 低下
              ├─→ Type I Error 確率 α          ─ 統計検定: 帰無棄却の誤り
              ├─→ ROC 曲線 X 軸               ─ FPR をプロット
              └─→ FDR = FP / (TP + FP)        ─ 多重検定での累積誤発見率

【上位概念ツリー】
分類モデルの誤り
├─ 偽陽性 (FP) ★ 本ページ              ─ Type I / α エラー / False Alarm
│  ├─ Bonferroni 補正                  ─ 多重検定での α 調整
│  ├─ Holm 法                          ─ 段階的 α 調整
│  └─ FDR (BH 法)                      ─ 累積偽陽性率制御
└─ 偽陰性 (FN)                          ─ Type II / β エラー / Miss
   ├─ 検出力 (Power = 1-β)
   └─ 標本サイズ設計

【ドメイン別の許容 FP】
医療スクリーニング ─ 高 FP 許容 (見逃し回避優先)
詐欺検知           ─ 低 FP 必須 (顧客体験悪化)
天文台候補天体     ─ 中 FP 許容 (追跡観測で再確認)
迷惑メール判定     ─ 極低 FP 必須 (重要メール紛失回避)

要点: FP は単独で良し悪しが決まらない。 「FN とのトレードオフ」「ドメインのコスト構造」「閾値選択」を同時に語ってはじめて意味を持つ。 SSDSE-B のような小標本 (47 県) では FP 1 件で指標が大きく動くため、 信頼区間と併記する。

🗺 学習ロードマップ — 偽陽性を 8 週間で習得する

学習内容演習関連ページ
1混同行列の 4 セルを定義し、 TP/TN/FP/FN を SSDSE データで計算本ページ Q1-Q3 を解く混同行列
2precision / recall / F1 を計算、 不均衡データの落とし穴scikit-learn classification_report適合率 / 再現率
3ROC 曲線・AUC・PR 曲線を読み解くRocCurveDisplay で可視化ROC 曲線 / AUC
4Bayes の定理で PPV を計算、 base rate の支配力を体験本ページ Q4-Q5特異度
5多重比較補正(Bonferroni / BH 法)statsmodels multipletests多重比較 / FDR
6確率校正と閾値最適化CalibratedClassifierCVロジスティック回帰
7公平性指標 (Equalized Odds, Predictive Parity)サブグループ別 FPR 監査公平性
8ドリフト検知と MLOps での FP モニタリングPSI / KS / 再キャリブレーション設計クラス不均衡

✅ レビュー用 12 チェックリスト

  1. 混同行列の 4 セル(TP/TN/FP/FN)を提示しているか
  2. FPR と specificity を 1-FPR の関係で説明しているか
  3. base rate を明示し、 PPV/NPV を計算しているか
  4. 不均衡時の accuracy の誤導性に言及しているか
  5. ROC / PR 曲線とその AUC を併記しているか
  6. 閾値選択を業務コストに基づいて議論しているか
  7. 多重比較補正の必要性(Bonferroni / BH)を述べているか
  8. 確率校正(Platt / Isotonic)を扱っているか
  9. サブグループ別 FPR 監査の重要性を伝えているか
  10. ベイズ的アプローチで不確実性を表現しているか
  11. 本番運用でのドリフト検出ポリシーがあるか
  12. SSDSE-B-2026 などの実データで数値を再現可能にしているか

🔮 ベイズ深掘り続編 — 検査陽性後の事後オッズ計算

偽陽性に強くなる最短の道は、 「検査陽性時の事後オッズ」を即座に概算できるようになることだ。 ベイズの定理を「事前オッズ × 尤度比 = 事後オッズ」の形に書き換えると、 暗算でほぼ正しい PPV が出る。 ここでは 4 つの典型シナリオで実演する。

シナリオ事前確率事前オッズLR+事後オッズ事後確率 (PPV)
無症状一般人0.5%0.005:1100.05:14.8%
家族歴あり5%0.053:1100.53:134.6%
症状あり30%0.43:1104.3:181.1%
高リスク群50%1:11010:190.9%

💡 LR+=10(感度 90% / FPR 9% 程度)の検査でも、 事前確率 0.5% の集団では陽性者の 95% が偽陽性。 同じ検査を症状ありの集団に使えば PPV は 81%。 「検査の精度」よりも「対象集団の選択」が PPV を決める。

📓 拡張クックブック — FP 制御のための関数 15 個

#関数用途
01RocCurveDisplay.from_predictionsROC 可視化
02PrecisionRecallDisplay.from_predictionsPR 可視化
03ConfusionMatrixDisplay.from_predictions混同行列可視化
04CalibrationDisplay.from_predictions校正曲線
05scipy.stats.binomtest(fp, fp+tn, p=0.05)FPR=5%の検定
06scipy.stats.beta(1+fp,1+tn).interval(0.95)FPR の 95% CrI
07multipletests(pvals, method='fdr_bh')FDR 制御
08multipletests(pvals, method='holm')Holm 法
09sklearn.metrics.det_curveDET 曲線(信号検知)
10imblearn.over_sampling.ADASYN適応的 SMOTE
11fairlearn.metrics.MetricFramegroup-wise metrics
12fairlearn.postprocessing.ThresholdOptimizer公平性閾値最適化
13evidently.metrics.DataDriftPresetドリフト検知
14alibi-detect.cd.KSDriftKS ドリフト検知
15shap.Explainer(clf)(X[fp_idx])FP の SHAP 分析

⚖ 政策・倫理 — 偽陽性をめぐる 6 つの社会的論点

  1. 司法 AI: 再犯予測の FP(実は再犯しない人を高リスク判定)は不当な保釈拒否につながる。 ProPublica の COMPAS 報道が議論を引き起こした。
  2. 採用 AI: 「不適合候補」と判定された応募者は説明責任の対象。 EU AI Act では high-risk AI 該当。
  3. 医療 AI: FP の通知が患者に与える心理的負担も「医療上の害」として扱われる。 informed consent が必須。
  4. 顔認証監視: 公共空間での FP は人権問題に直結する。 サンフランシスコ等は警察利用を禁止。
  5. 信用スコア: 自動審査での FP(実は返済能力ある人を否認)は公平性規制の対象。
  6. テロ予測: FPR=1% でも 1 万人検査で 100 人の誤検知。 過剰監視を生む。

🗾 SSDSE-B-2026 深堀り演習 — 都道府県データで FP を体感する 5 題

最後に SSDSE-B-2026(都道府県別データ)を用いた実演 5 題で FP の感覚を仕上げる。 演習はすべて実データ前提で、 合成データは使わない。 ノートブックで pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1]) を実行してから順に解いていく。

演習 1. 「総人口が前年比減少」を陽性、 「合計特殊出生率が 1.3 未満」を陽性予測としたとき、 全国 47 都道府県での FPR と PPV を計算せよ。
ヒント: confusion_matrix で 4 セル取得 → FPR=FP/(FP+TN), PPV=TP/(TP+FP)。
結果の読み方: 出生率は人口減少の予測としては弱く、 FPR は中-高、 PPV は低めになる。 「相関と予測力は別物」を再確認するための演習。
演習 2. 47 都道府県をブロック(8 地域)に分けて、 演習 1 と同じ予測の ブロック別 FPR を計算し、 群間差を可視化せよ。
ヒント: df.groupby('ブロック').apply(...) で各ブロックの FPR を計算、 棒グラフ。
結果の読み方: 関東・近畿では人口増加県があるため FP が増えやすい。 全国一律閾値が地域差を生む様子が見える。
演習 3. 演習 1 のスコア(出生率)に対する ROC 曲線と AUC をブートストラップで 95% 信頼区間つきで計算せよ。
ヒント: roc_auc_score を 1000 回ブートストラップ、 np.percentile で 2.5%-97.5%。
結果の読み方: 47 件のサンプルしかないので CI は幅広い。 単点 AUC では「予測力あり」と誤判断しがちなことを実感する。
演習 4. 「高齢化率 35% 以上」「総人口減少率 -0.5% 以下」「合計特殊出生率 1.4 未満」の 3 特徴量でロジスティック回帰を学習し、 校正前後で PPV/FPR を比較せよ。
ヒント: CalibratedClassifierCV(method='isotonic', cv=3)
結果の読み方: 校正後は確率の解釈が物理的に正しくなり、 業務閾値の選定が容易になる。 校正前は閾値 0.5 が機能していないことが多い。
演習 5. 演習 4 のモデルで FPR 目標値を 5% / 10% / 20% に設定したとき、 それぞれの閾値と TPR を求めよ。 さらに「FP 1 件あたり 100 万円の精査費用、 FN 1 件あたり 500 万円の人口流出損失」を仮定して、 期待総コストを最小化する閾値を提示せよ。
ヒント: fpr, tpr, thr = roc_curve(y, prob)、 コスト=FP×100万+FN×500万 を計算、 argmin。
結果の読み方: コスト最適閾値は 0.5 とほぼ無関係に決まる。 業務コストを定義する習慣が偽陽性制御の核心。

🧭 全体振り返り — 偽陽性を語る 12 つのキーフレーズ

#キーフレーズ意味
1FP = Type I error分類と検定で同じ概念
2specificity = 1 - FPR2 指標は補集合
3base rate が PPV を決めるBayes の本質
4accuracy ≠ 良いモデル不均衡で誤導的
5閾値 0.5 は便宜的業務コストで決める
6校正なき確率は危険Platt / Isotonic 必須
7多重比較は補正必須BH 法が標準
8group-wise FPR を見る公平性の核心
9単点推定は弱いCI / 事後分布で報告
10ドリフトで FPR 変化本番モニタリング
11FP コストは業界で異なる「許容 FPR」を文脈で
12SHAP で FP を分解FP 主因の特徴量を発見

⚠ 偽陽性をめぐる 10 の典型的誤解

  1. 誤解 1: 「accuracy が 99% なら良いモデル」 → 不均衡時は陽性率 1% を全件陰性とするだけで accuracy 99% に達する。 PR-AUC / MCC を併用すること。
  2. 誤解 2: 「感度 99% の検査なら陽性結果は信頼できる」 → base rate が低い集団では PPV が 10% を切ることもある。 PPV を必ず計算する。
  3. 誤解 3: 「FPR を 0 にすればよい」 → 不可能。 FPR=0 にすると TPR=0 になる。 制約付き最適化として扱う。
  4. 誤解 4: 「閾値は常に 0.5」 → 校正されていない確率や不均衡データでは 0.5 はほぼ常に間違い。 業務コストで決める。
  5. 誤解 5: 「ROC-AUC さえ高ければよい」 → 不均衡時には PR-AUC、 確率解釈なら calibration、 多角的に評価。
  6. 誤解 6: 「多重比較補正は厳しすぎる」 → 補正しなければ FP が量産される。 BH 法(FDR)が現代の標準。
  7. 誤解 7: 「全体 FPR が低ければサブグループも大丈夫」 → 平均が低くても群間差が大きい場合あり。 必ず group-wise で見る。
  8. 誤解 8: 「学習時の閾値は本番でも有効」 → ドリフトで FPR が変動する。 定期再校正必須。
  9. 誤解 9: 「テストデータにも SMOTE を適用すれば公平」 → 評価が壊れる。 SMOTE は訓練のみ。
  10. 誤解 10: 「偽陽性は技術問題」 → 社会・倫理問題でもある。 公平性監査と informed consent を組み込む。

📖 用語対応表 — 検定 vs 機械学習

検定の用語機械学習の用語関係
帰無仮説 H₀陰性クラス「効果なし/陰性」が初期仮定
対立仮説 H₁陽性クラス「効果あり/陽性」を主張
α (有意水準)FPR の制約Type I error の上限
β (Type II 確率)FNR陽性を見逃す確率
検出力 (power)recall / TPR1-β に対応
p 値予測確率直接対応はしないが似た役割
FWERマクロ FPR家族全体で誤陽性確率
FDR1-precision陽性出力中の誤り割合

💡 同じ概念に対して統計検定と機械学習で異なる用語が使われるが、 計算式と意味は対応している。 「α=0.05」を設定することは「FPR を 5% 以下に抑える」と同義。 両分野の用語を行き来できるようになると、 ベイズ・頻度論・分類器の議論が一気にクリアになる。

📅 日常事例 — 身の回りの「偽陽性」を見つける 6 例

  1. 火災報知器: 料理の湯気で警報が鳴る。 specificity を上げる(煙の連続性を見る)ことで FPR を下げている。 ただし上げすぎると本当の火災を見逃す(FN 増)。
  2. スマートフォンの顔認証: 双子や似た顔で誤解除(FP)。 メーカーは「他人受け入れ率 1/1,000,000」を目標としており、 これが FPR の保証値。
  3. メールスパムフィルタ: 重要メールが迷惑メールに分類される(FP)。 GAFA は SPF/DKIM/DMARC + ML で FPR を 0.01% 以下にしている。
  4. クレジットカード不正検知: 海外出張時に「不正の疑い」で利用停止(FP)。 事前申告で base rate を下げ、 FPR を抑制する。
  5. 空港の金属探知機: ベルトのバックルで警報(FP)。 特異度を上げると武器を見逃すリスクがあり、 「FP を許容して FN を減らす」設計。
  6. 健康診断のマーカー陽性: 良性腫瘍で「要精密検査」(FP)。 PPV を理解することで、 不必要な不安を減らせる。

🧮 暗記すべき主要公式 — 5 つ

1. FPR = FP / (FP + TN) = 1 - specificity — 陰性のうち誤って陽性とした割合
2. PPV = sens × prior / (sens × prior + (1-spec) × (1-prior)) — Bayes による陽性的中率
3. LR+ = sens / (1-spec) = TPR / FPR — 陽性結果の尤度比
4. 事後オッズ = 事前オッズ × LR+ — 暗算 PPV のショートカット
5. Bonferroni 補正: α' = α / m — m 件の独立検定での補正水準

🔍 FP デバッグ戦略 — 「なぜ FP が多いのか」を 7 ステップで突き止める

  1. 陽性率(base rate)を確認: 訓練と本番で大きく差があれば閾値が機能していない。
  2. 校正曲線をプロット: 確率出力が単調・正確に並んでいない場合は Platt / Isotonic で校正。
  3. FP サンプルを抽出: X[fp_idx] を CSV に出して目視で共通点を探す。
  4. SHAP で寄与特徴量を分析: FP の主因となる特徴量が特定できる。
  5. ラベルノイズ監査: FP の一部が実は真陽性(ラベル誤り)の可能性。 サンプリングして手動確認。
  6. サブグループ別 FPR: 性別・年代・地域で群差があれば公平性設計を検討。
  7. ドリフト検知: PSI / KS 統計量で訓練 vs 本番の特徴量分布を比較。 違えば再学習。

💡 この 7 ステップは MLOps チームの「FP インシデント対応 SOP」として使える。 1-2 で「設定問題」を排除し、 3-5 で「データ問題」を疑い、 6-7 で「公平性・ドリフト問題」を確認する流れ。

📌 クイックリファレンス — 1 ページ早見表

定義: 偽陽性(False Positive, FP)= 陰性なのに陽性と判定された誤り。 統計検定では Type I error / α エラーと同義。
主要指標: FPR = FP/(FP+TN), specificity = 1-FPR, PPV = TP/(TP+FP), LR+ = TPR/FPR。
Bayes 早見: 事後オッズ = 事前オッズ × LR+。 検査特性が同じでも base rate が低ければ PPV は小さい。
閾値選択: ROC 曲線で目標 FPR を満たす最大 TPR を探す。 業務コスト最小化なら C = c_FP × FP + c_FN × FN を最小化。
多重比較: m 件の検定なら α' = α/m (Bonferroni) または BH 法で FDR 制御。
不均衡対策: class_weight='balanced' → SMOTE → cost-sensitive loss の順で試す。 評価は元分布で。
校正: CalibratedClassifierCV(method='isotonic', cv=5) で確率を物理量に近づける。
公平性: group-wise FPR を必ず報告。 Equalized Odds と業務目的の整合を検証。
本番: PSI / KS でドリフト監視、 月次再校正をルーチン化。
ライブラリ: sklearn.metrics, statsmodels.stats.multitest, imblearn, fairlearn, shap, evidently, alibi-detect。

🗾 日本における偽陽性の事例と政策的論点

日本でも偽陽性は医療・金融・公的サービスで議論される。 がん検診では「過剰診断」と呼ばれる FP 関連問題、 マイナンバー関連サービスでは本人確認の FPR が公共議論の対象になった。 自動運転車では歩行者検出の FP は急ブレーキの原因となり、 後続車事故リスクを生むため、 国土交通省のガイドラインで許容 FPR を設けている。 SSDSE-B-2026 の都道府県別データを使った人口減少県判定や、 出生率予測の演習も、 実は政策評価における偽陽性管理と直結しており、 都道府県別 FPR を見比べる思考は政策の説明責任を担保する重要な技法となる。

なお、 偽陽性は単に「数値を下げれば良い」ものではなく、 業務目的・社会的影響・関係者の同意とのバランスで設計する概念である。 本ページの各演習・ケーススタディを通じて、 計算技法だけでなく「FP の意味と扱い方」を文脈で理解できるようになっていれば幸いである。 SSDSE-B-2026 の都道府県データを使った演習をすべて手元で再現すれば、 自分の業務領域に応用するための土台が整う。

🎓 最終まとめ — 偽陽性に強くなるための 5 原則

  1. 「精度」だけ見ない — 不均衡時の accuracy は誤導的。 必ず混同行列ベースで多角的に評価する。
  2. base rate を必ず確認 — PPV は base rate に支配される。 Bayes の定理で見積もる癖をつける。
  3. 閾値は業務コストで決める — FP コスト vs FN コストの比で最適閾値を選ぶ。 0.5 は意味を持たない。
  4. 多重比較は必ず補正 — 1000 検定で α=0.05 なら 50 件は誤陽性が出る。 Bonferroni か BH 法を必ず適用。
  5. 公平性監査を組み込む — group-wise FPR を確認し、 Equalized Odds と業務目的の整合を取る。

本拡張深掘りは SSDSE-B-2026 都道府県データに基づく実演を中心に構成し、 合成データは用いていない。 練習問題と図解で「偽陽性をどう減らすか」を実装レベルで把握できるはずである。 関連用語リンクから次の学習トピックへ進んでほしい。

🧮 数式に値を入れて手で計算する: 偽陽性率 (FPR)

合成データで陰性 1,000 件中の偽陽性件数から FPR を計算する。

Step 1: 検査結果

区分件数
真陰性 TN950
偽陽性 FP50
合計陰性1,000

Step 2: 指標

FPR = FP/(FP+TN) = 50/1000 = 0.050 (5%) Specificity = TN/(FP+TN) = 0.950 (95%) FPR + Specificity = 1.0 ✓

🐍 Python で再現

1
2
3
4
5
tn, fp = 950, 50
fpr = fp/(fp+tn)
spec = tn/(fp+tn)
print(f"FPR: {fpr}")
print(f"Specificity: {spec}")

📤 実行結果

FPR: 0.05 Specificity: 0.95

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

🌳 手法選択フロー

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

  1. ステップ 1: FP コスト > FN コストか確認 (スパム判定・差止判決など)
  2. ステップ 2: Precision または Specificity を主指標に
  3. ステップ 3: 閾値を上げる・BH 法で FDR 制御

多重検定では FP が累積するため、 仮説数 m=10 で α=0.05/m=0.005 の Bonferroni 補正、 m=数千で BH 法 (FDR<0.05)、 m=数十万でも Storey の q 値、 と m に応じた補正を選ぶ。 GWAS や fMRI では 10⁵ 以上の同時検定で BH 法が標準。

状況第一選択第二選択避ける
スパムフィルタ (FP=正常メール誤判定)Precision 0.99 + 閾値高め2 段階判定 (LLM レビュー)Recall だけ最適化
医療スクリーニング (FP=陰性者を陽性)Specificity 重視、 確定検査を二段感度高め + 二次精査Accuracy だけ報告
クレジット不正検知 (FP=正当取引ブロック)Precision@k + 人手レビュー枠cost-sensitive 学習閾値固定 0.5
少数仮説 (m<20) の同時検定Bonferroni (α/m)Holm-Bonferroni無補正
大量仮説 (GWAS / fMRI m>10³)BH 法で FDR<0.05BY 法 (依存性あり)Bonferroni (保守的すぎ)

🔗 隣接手法への橋渡し

「偽陽性 (FP, 第 I 種の過誤)」は分類性能評価の出発点であるが、 実務で意味を持たせるには隣接手法と接続・統合・比較の三視点で運用する必要がある。 章 10 が分類体系上の位置づけを示すのに対し、 章 14 は「業務でいつ何に切替えるか」という運用判断の橋渡しを担う。

① 接続 (パイプライン上で前後に位置する手法)

② 統合 (組み合わせて使うことで効果が増す手法)

③ 比較 (代替・競合する手法といつ切替えるか)

切替先FP からこちらへ切替える場面
偽陰性 (FN)癌スクリーニング・侵入検知など「見逃しコスト >> 誤検出コスト」の業務
適合率陽性予測の「正しさ」をユーザに説明する必要 (スパム判定・推薦)
ROC-AUC閾値を固定せず全閾値での総合性能でモデル比較したい場面
FDR数千件の同時検定 (GWAS / A/B テスト多変量) で Bonferroni が保守的すぎる場面
コスト感応学習FP と FN のコストが事前に数値化されており、 損失関数に直接組込みたい場面

運用判断は (1) 業務コスト比の数値化 → (2) FN とのペア管理 → (3) 多重検定なら FDR 統合 → (4) 全閾値評価なら AUC 切替、 の 4 軸で整理する。 スパム判定・差止判決・医薬品承認のように False Alarm コストが高い領域では Precision/Specificity を主指標、 癌検診・侵入検知のように見逃しコストが高い領域では FN/Recall を主指標とし、 章 10 (分類体系) と章 14 (運用判断) を併読することで「どの指標を選ぶか」と「いつ切替えるか」の両方を把握できる。

🎮 触って理解する

偽陽性は「言葉」で覚えるより「動かして」体感するのが早い。 下の図には 陰性群(本当は無関係・正常な人/県)と 陽性群(本当に該当する人/県)の 2 つの分布が重なって描かれている。 検査は「スコアがしきい値以上なら陽性」と判定する。 スライダー(または図を直接ドラッグ/タップ)でしきい値を左右に動かすと、 偽陽性 FP(陰性なのに陽性判定=陰性分布のうちしきい値の右側)偽陰性 FN(陽性なのに陰性判定=陽性分布のうち左側)の領域がリアルタイムに増減する。 しきい値を緩める(左へ)と FP が増え、 締める(右へ)と FN が増える——このトレードオフを指先で確かめてほしい。

陰性群 800 人・陽性群 200 人・標準偏差 12 の正規分布を仮定した教育用モデル(実在データではなく形状理解のための概念図)。 図の縦点線がしきい値。 その右側を陽性と判定する。

偽陽性 FP
人(陰性→陽性の誤り)
真陰性 TN
人(正しく陰性)
偽陰性 FN
人(陽性→陰性の見逃し)
真陽性 TP
人(正しく陽性)
偽陽性率 FPR = FP / (FP + TN)
= 本来陰性の集団を誤って陽性にする割合(有意水準 α に対応)

💡 直感:しきい値は「疑いの厳しさ」のつまみ

しきい値を下げると「少しでも怪しければ陽性」と判定するので見逃し(FN)は減るが、 無実の陰性まで巻き込んで 偽陽性 FP が急増する。 逆に上げると FP は減るが見逃しが増える。 FP と FN を同時にゼロにはできない——2 つの分布が重なっている限り、 一方を減らせば他方が増える。 これが分類・検定の根本的トレードオフである。 上のスライダーで「重なり」を大きく(陽性群の平均を左へ)すると、 どのしきい値でも FP と FN の両方が高止まりすることも体感できる。

⚠️ よくある落とし穴

🚀 発展

しきい値を 10→90 まで全て動かしたときの (FPR, TPR) の軌跡が ROC 曲線 であり、 その曲線下面積が AUC。 FP と FN のコストが非対称なら、 最適しきい値は t* = cFP/(cFP+cFN) で与えられる(コスト感応学習)。 多数の同時検定で偽陽性を統制したい場面では FDR 制御多重比較の補正を、 検定の枠組みでは 第一種の過誤有意水準の関係を、 判定表の全体像は 混同行列を、 それぞれ併読するとよい。

🔍 深掘り解説(追補)── 基準率とスクリーニングのパラドックス

既存セクションでは偽陽性(False Positive=本当は陰性なのに陽性と判定する誤り/第一種の過誤)の定義・FPR・ROC を扱いました。ここでは重複を避け、「検査そのものは変えていないのに、狙う陽性がまれになるほど適合率(陽性的中率 PPV)が崩壊する」という基準率(base rate)の効き方だけに絞って締めくくります。姉妹ページが扱った「偽陰性の沈黙」「多重比較での誤報増殖」とは別角度です。本節の実測値は公的データ data/raw/SSDSE-B-2026.csv(統計センター)を pd.read_csv(encoding='cp932', skiprows=[1]) で読み、df[df['SSDSE-B-2026']==2023] の 47 都道府県から集計したものです。合成データには「架空」と明記します。

🎨 直感 ── 「陽性と出た」からといって「本当に陽性」ではない

偽陽性の怖さは FPR(陰性を誤って陽性にする率)だけでは伝わりません。実務で問われるのは逆向きの確率、「陽性と判定された中で本当に陽性の割合=適合率 PPV」です。両者は別物で、両者を橋渡しするのが基準率です。狙う陽性がまれだと、陰性の母数が桁違いに大きいため、たとえ 1 件あたりの誤り率が小さくても、湧き出す偽陽性の総数が真陽性を軽く上回ります。「陽性という結果」は「陽性という真実」より、いつも水増しされて出てくる、と身構えるのが正しい直感です。

⚠️ 落とし穴(重要)

❌ 「感度(再現率)が高い=陽性判定が信頼できる」という取り違え。 感度と適合率は独立です。下の実データでは、テストが真陽性を 100% 取りこぼさない(再現率 1.00)のに、陽性と判定した県の4 分の 3 は空振り(PPV 0.25)でした。感度をいくら上げても、基準率が低いままなら陽性判定の的中率は上がりません。感度と適合率は必ず両方見ること。

❌ FPR が同じでも、基準率が下がると PPV は下がる。 FPR は「陰性の中での誤り率」なので基準率に不変です。ところが陽性的中率は基準率に強く依存します。同じ検査を回したまま狙う陽性を珍しくしていくと、真陽性(分子)が痩せ、偽陽性(分母の大半)は残るため、検査を一切いじっていないのに PPV だけが崩れます。「テストは変えていないから精度は同じはず」という思い込みが、まれ事象のスクリーニングを失敗させます。

🚀 発展 ── 実データで見る PPV 崩壊(SSDSE-B-2026 の 2 値化)

設定(架空の意思決定・数値はすべて実測): 「人が集まる県か」を安く見分けたい。真の陽性=社会増(日本人の転入超過)県と定め、A5101(転入者数)− A5102(転出者数)> 0 で判定すると、2023 年に社会増だったのは 6 県(千葉・埼玉・大阪・東京・神奈川・福岡)=基準率 6/47 = 12.8% というまれな陽性です。
そこへ安価な代理指標「商業地の標準地価 C5403 が全国中央値(81,000 円/㎡)以上なら“集まる県”と判定」というスクリーニングを当てます。すると陽性判定は 24 県、混同行列は次の通り(すべて 2023 年 47 都道府県・skiprows=[1]・in-sample の記述統計)。

真:社会増(6県) 真:社会減(41県)
地価≥中央値と判定 TP = 6 FP = 18 24
地価<中央値と判定 FN = 0 TN = 23 23

再現率(感度)= 6/6 = 1.00(真の集まる県を 1 つも逃さない完璧な網)。ところが適合率 PPV = 6/(6+18) = 0.25。陽性と判定した 24 県のうち 18 県は偽陽性(京都・兵庫・北海道・和歌山・奈良・宮城・岐阜・岡山…=地価は高いが社会減)。感度 100% でも、陽性判定の的中は 4 件に 1 件。偽陽性が真陽性の 3 倍湧いています。

決定打は、検査(陽性判定 24 県)を固定したまま、狙う陽性の基準率だけを下げる実測です。真の陽性の定義を「社会増の勢い」で絞り込むと(同じ地価テストを適用):

真陽性の定義 陽性県数 基準率 TP FP PPV
転入超過 > 060.1286180.250
転入超過 > 2万人20.0432220.083
転入超過 > 6万人00.0000240.000

テストは 1 行も書き換えていない(常に陽性 24 県)のに、基準率が 12.8%→4.3%→0% と痩せるほど PPV は 0.25→0.08→0 へ崩壊し、24 県すべてが偽陽性に振り切れます。これがスクリーニングのパラドックスです。まれな陽性を追うほど、偽陽性が真陽性を圧倒する——検査の良し悪しではなく、母集団の基準率が支配します。実務では、事前に基準率で対象を絞る/二段階検査で確定検査を重ねる、が定石です。

【架空デモ・数式で一般化】 感度 90%・特異度 90% の固定した仮想検査(実データではない架空の想定)を、有病率 p の集団に当てると PPV = (0.9·p) ÷ (0.9·p + 0.1·(1−p))。p=50% なら PPV=0.90 だが、p=1% では PPV≈0.083、p=0.1% では PPV≈0.009。検査は同じでも、まれになるほど「陽性の 99% が偽陽性」に達します。下のスライダーで体感できます。

▶ 架空インタラクティブ:感度・特異度を固定し、有病率(基準率)だけを動かすと PPV がどう崩れるか。バーをドラッグ(マウス/タッチ)または下のスライダーで操作。

有病率 p = 1.00% (0.1%〜50%)
感度 90% 特異度 90%

🔗 関連ページ