Python環境を起動中... 初回のみ数秒かかります
Lesson 5 / 12

医療AIの評価指標 — 感度・特異度・ROC

このレッスンで学ぶこと

  • 感度・特異度・PPV・NPVを混同行列から計算し、意味を医療の言葉で理解する
  • 感度90%・特異度90%でも有病率1%ならPPVが約8%になる「有病率の罠」を体験する
  • predict_proba閾値を動かし、見逃しと過剰検出のトレードオフを設計する
  • ROC曲線・AUCでモデルを比較できるようになる

1. 4つの数字から4つの指標へ

レッスン4で、混同行列を TN・FP・FN・TPの4つに分けました。医療AIでは、この4つから 4つの指標を計算して性能を語ります。まず定義を図で押さえましょう。

混同行列と4つの指標。行がAIの判定(陽性・陰性)、列が実際の状態(疾患あり・なし)。感度と特異度は実際の列で、PPVとNPVは判定の行で割る
感度・特異度・PPV・NPVの定義。行が「AIの判定」、列が「実際の状態」(疫学で使う2×2表の並び。scikit-learnのconfusion_matrixは行=実際・列=予測なので配置が異なる点に注意)
指標定義意味(医療の言葉)
感度(再現率)TP / (TP + FN)病気の人のうち、正しく陽性にできた割合。見逃さない力
特異度TN / (TN + FP)健康な人のうち、正しく陰性にできた割合。過剰検出しない力
PPV(適合率)TP / (TP + FP)陽性と判定された人のうち、本当に病気だった割合
NPVTN / (TN + FN)陰性と判定された人のうち、本当に健康だった割合

レッスン4のロジスティック回帰の結果(TN=106・FP=1・FN=4・TP=60)から、実際に計算してみます。

sample_1.py
Ctrl+Enter
出力

感度0.938・特異度0.991。 「このデータでは」悪性の94%を拾い、良性の99%を正しく陰性にできています。 正解率という1つの数字では見えなかった「見逃しやすさ/過剰検出しやすさ」が、 2つの指標に分かれて見えるようになりました。

2. 有病率の罠 — 同じモデルでもPPVは激変する

ここが、医療AIで最も誤解されるポイントです。 感度と特異度はモデルの性能ですが、PPV(陽性判定の的中率)は「有病率」に大きく左右されます。 有病率=その集団に病気の人がどれくらいいるか、です。

感度90%・特異度90%という「そこそこ良い」モデルを、有病率1%の集団 (健診のふるい分けなど、ほとんどが健康な集団)に使うと何が起きるでしょうか。 10,000人で計算してみます。

sample_2.py
Ctrl+Enter
出力

⚠ PPVわずか8.3%: 感度も特異度も90%あるのに、陽性と判定された1080人のうち、本当に病気なのは90人(約8%)だけ。 残り990人は健康なのに「陽性」と言われた人(偽陽性)です。 これは、もともと病気の人がごく少ない(1%)ため、90%の特異度でも取りこぼす健康な人の絶対数が病気の人を圧倒するから。 これが有病率の罠で、その正体はベイズの定理です (E資格でも頻出のテーマ。理論は E資格対策ページへ)。

💡 開発者への教訓: 論文やデータセット上での高いPPVは、そのデータの有病率のもとでの数字です。 レッスン3で触れたように、乳がんデータの悪性率は約37%と高めでした。 同じモデルを有病率0.5%の検診に持ち込めば、PPVは大きく下がります。 「どの集団で使うか」を抜きに的中率を語れない——現場でAIの結果を伝えるときの必須知識です。

3. 閾値を動かす — 見逃しと過剰検出を設計する

レッスン4で、predict は 「悪性の確率が0.5以上なら悪性」と判定していると学びました。 この0.5という閾値を自分で動かせます。閾値を下げれば「疑わしきは陽性」に寄り、 見逃しは減るが過剰検出は増える。この綱引きを実際に見てみましょう。

sample_3.py
Ctrl+Enter
出力

閾値を 0.5 → 0.1 と下げるにつれ、見逃し(FN)は 4 → 2 → 1 と減り、 代わりに過剰検出(FP)は 1 → 1 → 7 と増えていきます。 感度が上がって特異度が下がる——この綱引きを、用途に合わせて設計するのが医療AIの腕の見せどころです。

💡 閾値をどう決める?: 「見逃しが許されないスクリーニング」なら閾値を下げて感度重視、 「陽性なら侵襲的な精密検査に進む」なら閾値を上げて特異度・PPV重視。 正解は1つではなく、臨床の目的とコストで決まりますpredict の0.5は単なる初期値にすぎない、と覚えておきましょう。

4. ROC曲線とAUC — 閾値によらずモデルを比べる

閾値ごとに感度・特異度が変わるなら、「あらゆる閾値」でのバランスをまとめて見たくなります。 それがROC曲線です。横軸に「1−特異度(=偽陽性率)」、縦軸に「感度」をとり、 閾値を動かしたときの軌跡を描きます。曲線の下の面積がAUCで、 1に近いほど良い(0.5=でたらめ)です。

ROC曲線と閾値。左は概念図で、閾値を下げるほど曲線上を左下から右上へ進む。右は本レッスンの乳がんモデルの実測でAUC 0.998、閾値0.5は偽陽性率0.009・感度0.938、閾値0.05は偽陽性率0.131・感度1.0の位置
左:概念図。曲線上の各点が1つの閾値に対応し、左下(高い閾値)から右上(低い閾値)へ動く。 右:本レッスンのモデルの実測(sample_3・練習問題3と同じ計算)。AUCが0.998と高いため曲線は左上に張り付き、閾値0.5も0.05も左上の隅にある

🎛 閾値を動かして体感する: 閾値を上下させたとき、ROC曲線上の点・感度・特異度・AUCがどう変わるかは、 ROC曲線シミュレータで 実際にスライダーを動かして確かめられます(E資格対策の学習ツール・無料)。

sample_4.py
Ctrl+Enter
出力

AUCはロジスティック回帰0.998・ランダムフォレスト0.997。 どちらも非常に高く、閾値をどこに置くかによらず両クラスをよく分離できていることを表します。 roc_auc_score には predict(0/1)ではなく確率を渡すのがポイントです (閾値を動かして評価する指標なので、確率が必要)。

⚠ AUCも万能ではない: AUCは有病率の影響を受けにくい便利な指標ですが、 「実際に使う閾値でどうか」「PPVは実運用の有病率でどうか」までは教えてくれません。 AUCが高い=現場で使える、ではない。感度・特異度・PPVと合わせて多面的に見るのが基本です。

5. 練習問題

問題 1

感度と特異度、どっちがどっち?

「病気の人を見逃さない力」を表すのはどちらですか。また、その計算式は?

  • A. 特異度 = TN / (TN + FP)
  • B. 感度 = TP / (TP + FN)
  • C. PPV = TP / (TP + FP)
答えと解説を見る

正解:B. 感度 = TP / (TP + FN)

感度は「実際に病気の人(TP + FN)のうち、正しく陽性にできた(TP)割合」で、見逃し(FN)を分母に含むのが特徴です。 FNが増えれば感度は下がる——だから「見逃さない力」。 特異度は健康な人側の話、PPVは「陽性と判定された人」側の話で、主語が違います。

問題 2

有病率を10%にすると?

sample_2 の有病率を 0.01 から 0.10(10%)に変えると、 PPVはどうなるでしょうか。予想してから実行してください。

exercise_2.py
出力
ヒントを見る(答え+解説)
prevalence = 0.10       # 10%

PPVは 0.083 → 0.500 へ跳ね上がります。同じモデル(感度90%・特異度90%)なのに、 病気の人が多い集団(有病率10%)では、陽性判定の的中率が50%になります。 「AIをどの集団で使うか」でPPVは何倍にも変わる——有病率の罠の裏返しです。 だから同じAIでも、症状のある人を診る外来と、無症状の人を診る健診とでは、結果の重みが違います。

問題 3

見逃しゼロを狙う閾値

sample_3 を改造し、閾値 0.05 を試してください。見逃し(FN)を0にできますか。 その代わり過剰検出(FP)はどうなりますか。

exercise_3.py
出力
ヒントを見る(答え+解説)

閾値0.05では 見逃しFN=0・過剰検出FP=14。このデータ・この分割では、 見逃しをゼロにすることは実際にできます。 ただし引き換えに、過剰検出は閾値0.5のときの1件から14件へと14倍に増えました (良性の患者14人が「悪性の疑い」として精密検査に回ることになります)。 「見逃しゼロ」を機械的に追うとFPが膨らむ—— 現実には「感度を◯%以上に保ちつつFPを最小化する閾値」のように、両者のバランスで決めます

6. まとめ

このレッスンのポイント

  • 感度=見逃さない力(TP/(TP+FN))、特異度=過剰検出しない力(TN/(TN+FP))
  • PPV(陽性の的中率)は有病率に激しく左右される。感度・特異度90%でも有病率1%ならPPVは約8%(有病率の罠=ベイズ)
  • predict_proba閾値を動かすと、見逃しと過剰検出が綱引きする。用途に合わせて設計する
  • ROC/AUCは閾値によらずモデルを比較できる(1に近いほど良い)。roc_auc_score には確率を渡す
  • どの指標も単独では不完全。感度・特異度・PPV・AUCを合わせて、使う集団を意識して読む

これで診断支援モデル①は完成し、医療AI評価の核心を身につけました。 次のレッスンでは、少し毛色の違うモデル②「糖尿病進行度の予測」で、 回帰の医療応用と「結果を医師にどう説明するか」を学びます。

完了するとコース一覧に進捗が記録されます