モデル全体の AUC が高くても、特定のサブグループで性能が低いことがあります。高齢者・女性・重症例・特定施設・希少疾患・評価が難しい患者群で性能が落ちると、臨床実装時に不利益が 集中 します。医療AIでは、平均性能だけではなく、誰に対して性能が低いのか を確認する必要があります。
公平性は倫理だけの話ではなく、モデルの 安全性と外部妥当性 の問題でもあります。性能低下が集中するサブグループでは、臨床判断の質が下がり、過小診断・過剰介入・治療遅延が起こりやすくなります。さらに、性能差は 09·07 ドメインシフト・09·08 ショートカット学習・09·06 欠測バイアス の影響を受けるため、公平性は他のピットフォールと地続きです。
本稿は、第9部「医療AI研究の落とし穴と対策」の第10記事です。リハビリ領域では、年齢・性別・疾患重症度・施設・評価時期・認知機能・補助具使用などで性能差が出る可能性があります。TRIPOD+AI[3] と PROBAST+AI[2] は、サブグループ性能の報告を強く推奨しています。前段として 14·04 DCA デモ・14·02 交差検証デモ も併せて参照すると、サブグループ別評価の意義が立体的に理解できます。
// 01 · LEARN OUTCOMESこの記事で学ぶこと
- 全体性能とサブグループ性能の違いを説明し、performance gap・calibration gap を区別できる。
- equal opportunity / equalized odds / demographic parity / predictive parity / calibration parity の違いと、医療文脈での選び方を整理できる。
- 公平性指標の同時達成不可能性(incompatibility theorem)を理解する。
- 小規模サブグループ解析の不確実性を、症例数・信頼区間・bootstrap で扱える。
- 性能差が見つかったときの 4 段階の対策(データ・学習・閾値・運用)を選択できる。
- Fairlearn / aif360 を用いた実装の基本パターンと、論文での書き方を整理できる。
// 02 · CONCLUSIONまず結論
// 03 · FIGURE医療AIの公平性とバイアスを図で理解する
まず、全体性能の高さが サブグループの性能低下を覆い隠す 構造を確認します。「overall AUC = 0.84」という単一の数字の裏で、施設や性別のサブグループでは大きく異なる性能が出ていることがあります。
次に、複数の公平性指標を整理します。どの指標を「公平」と呼ぶか で対策が変わるため、定義と数学的関係を理解することが重要です。Chouldechova[6] らが示したように、複数の指標を同時に完全達成することは数学的に不可能な場合があります(incompatibility theorem)。
最後に、AUC が群間で同じでも 較正が群間でずれる 例を示します。確率を臨床判断に使う場合は、群別 Calibration plot を必ず確認します。
// 04 · CLINICALリハ・神経・整形領域での具体例
高齢患者は併存疾患や認知機能低下が多く、若年群中心で学習したモデルがそのままでは当てはまらないことがあります。FIM 予後予測では、75 歳以上のサブグループで AUC が 10 ポイント以上下がることがあります。原因は、サンプル不足/併存疾患による多様性/フレイル等のアウトカム修飾因子の未調整など複数あり、年齢階層別の Table 1 と群別性能表を併記して原因を特定します。
同じ予測確率でも、施設ごとの退院支援体制により自宅退院率が異なる場合があります。施設 A では予測 60 % が真の自宅退院率 60 % に対応しても、施設 B では真の 40 % に過ぎないことがあります。これは 09·07 施設差 で扱った calibration ドリフトの特殊形であり、施設別の Calibration plot と閾値再調整 が必要です。
軽症例が多いデータで学習すると、重症例の予測が不安定になります。重症例こそ介入判断が重要な場面で性能が落ちると、最も注意したい患者群で誤分類が増えるという最悪のパターンになります。重症度階層別の AUC ・感度・PPV を必ず確認し、不足する場合は加重サンプリングや別モデルの併用を検討します。
整形外科 AI(骨格 X 線、関節形態評価)や心血管リスク予測で、女性のサブグループで性能が落ちる例が報告されています[5]。原因は、訓練データの男性偏重・症状提示の性差・診断遅延の構造的差などです。性差を「真の生物学的差」と「データ収集や運用の偏り由来」に分けて議論しないと、対策を誤ります。
// 05 · THEORY公平性指標と incompatibility theorem
主要な公平性指標
| 指標 | 定義 | 医療での意味 |
|---|---|---|
| Demographic Parity | P(ŷ=1 \| A=a) = P(ŷ=1 \| A=b) | 群間で 陽性予測率 を均等。真のリスク差を消すため医療では不適 |
| Equal Opportunity[7] | 群間で 感度 を均等 | 見逃しを避けたいスクリーニング系で第一選択 |
| Equalized Odds | 群間で 感度と特異度 をともに均等 | ROC が群間で揃う。多くの医療シナリオで妥当 |
| Predictive Parity | 群間で PPV を均等 | 同じ予測値が同じ実発生率を意味する |
| Calibration Parity | 群別 calibration plot が一致 | 確率を意思決定に使う場面で必須 |
Incompatibility theorem
Chouldechova 2017[6]、Kleinberg et al. 2016 が示したように、群間で陽性率(base rate)が異なる場合、Equalized Odds と Predictive Parity を同時に完全達成することは数学的に不可能です。
もし base rate が群間で違うなら:
P(y=1 | A=a) ≠ P(y=1 | A=b)
このとき、次の 3 つを同時に達成することはできない:
▸ Calibration parity (群別較正一致)
▸ Equal FPR (特異度均等)
▸ Equal FNR (感度均等)
→ どれを優先するかは、臨床的なコスト構造(見逃し vs 過剰介入)
と社会的な意味づけで決める。「すべてを公平に」は数学的に不能。
性能差の原因を分解する
性能差を見つけたら、即座に「差別」と断定するのではなく、原因を 4 つに分けて検討します[1]。
| 原因 | 具体例 | 主な対策 |
|---|---|---|
| サンプル不足 | 少数群の症例数が少ない | データ収集の追加・能動的サンプリング |
| 測定差 | 機器・評価者・撮影条件が群で異なる | 測定標準化・施設別調整 |
| 運用差 | 診療プロセス・退院支援が群で異なる | 運用ルール調整・群別閾値 |
| 真の生物学的差 | 解剖・生理・薬物動態の差 | 群別モデル・個別化・併用評価 |
4 段階の対策階段
Level 1 : DATA — 少数群のサンプル追加・能動的収集
Level 2 : LEARNING — 再重み付け / focal loss / class_weight / SMOTE
Fairlearn の reductions / GridSearch
Level 3 : THRESHOLD — サブグループ別の閾値最適化
Hardt et al. の post-processing
Level 4 : OPERATION — 特定群には別評価を併用 / 人間のレビュー追加
Model card に適用範囲と限界を明記
低レベルから順に検討し、不要な複雑化を避けます。Level 3 の 群別閾値 は、医療では論争のあるアプローチですが、見逃しを避けたい場面では正当化されることもあります。論文では、選択理由と倫理的考察を併記します。
// 06 · IMPLEMENTATION実装:サブグループ性能表・Bootstrap CI・Fairlearn
実装の中心は、サブグループ別の性能を表として出すことと、その不確実性を bootstrap で示すことです。Fairlearn や aif360 を使うと、複数指標を一度に評価できます。
# ============================================================
# 1) サブグループ性能表 + Bootstrap CI
# ============================================================
import numpy as np
import pandas as pd
from sklearn.metrics import roc_auc_score, recall_score, precision_score
from sklearn.metrics import confusion_matrix, brier_score_loss
def auc_with_ci(y, p, n_boot=1000, seed=0):
rng = np.random.default_rng(seed)
aucs = []
for _ in range(n_boot):
idx = rng.integers(0, len(y), len(y))
if len(np.unique(y[idx])) < 2:
continue
aucs.append(roc_auc_score(y[idx], p[idx]))
return np.mean(aucs), np.percentile(aucs, [2.5, 97.5])
def subgroup_table(df, y_col, pred_col, group_col, threshold=0.5):
rows = []
for g, sub in df.groupby(group_col):
y = sub[y_col].values
p = sub[pred_col].values
if len(np.unique(y)) < 2:
continue
auc_mean, ci = auc_with_ci(y, p)
yhat = (p >= threshold).astype(int)
tn, fp, fn, tp = confusion_matrix(y, yhat).ravel()
rows.append({
"group": g,
"N": len(sub),
"events": int(y.sum()),
"AUC": f"{auc_mean:.3f} [{ci[0]:.3f}, {ci[1]:.3f}]",
"Sens": tp / (tp + fn) if (tp+fn) > 0 else np.nan,
"Spec": tn / (tn + fp) if (tn+fp) > 0 else np.nan,
"PPV": tp / (tp + fp) if (tp+fp) > 0 else np.nan,
"Brier": brier_score_loss(y, p),
})
return pd.DataFrame(rows)
# 例: 性別・年齢階層・施設で並列に
for col in ["sex", "age_group", "site_id"]:
print(f"\n=== Subgroup analysis by {col} ===")
print(subgroup_table(df, "outcome", "pred_prob", col).to_string(index=False))
# ============================================================
# 2) 群別 Calibration と calibration slope/intercept
# ============================================================
from sklearn.calibration import calibration_curve
from sklearn.linear_model import LogisticRegression
def cal_intercept_slope(y, p):
p = np.clip(p, 1e-6, 1 - 1e-6)
z = np.log(p / (1 - p)).reshape(-1, 1)
lr = LogisticRegression().fit(z, y)
return lr.intercept_[0], lr.coef_[0, 0]
cal_rows = []
for g, sub in df.groupby("sex"):
y, p = sub["outcome"].values, sub["pred_prob"].values
inter, slope = cal_intercept_slope(y, p)
prob_true, prob_pred = calibration_curve(y, p, n_bins=10)
cal_rows.append({
"group": g,
"intercept": inter, # 理想 0
"slope": slope, # 理想 1
"max_gap": np.max(np.abs(prob_true - prob_pred)),
})
print(pd.DataFrame(cal_rows))
# ============================================================
# 3) Fairlearn で複数公平性指標を一括評価
# ============================================================
from fairlearn.metrics import (
MetricFrame, true_positive_rate, false_positive_rate,
selection_rate, equalized_odds_difference,
)
yhat = (df["pred_prob"] >= 0.5).astype(int)
sensitive = df["sex"]
mf = MetricFrame(
metrics={
"TPR": true_positive_rate,
"FPR": false_positive_rate,
"selection": selection_rate,
},
y_true=df["outcome"], y_pred=yhat, sensitive_features=sensitive,
)
print(mf.by_group)
print("equalized odds diff:", equalized_odds_difference(
df["outcome"], yhat, sensitive_features=sensitive
))
# ============================================================
# 4) サブグループ別の閾値最適化 (Level 3 対策)
# ============================================================
from sklearn.metrics import roc_curve
# 目標: 各群で感度 0.85 以上を確保する閾値を見つける
thresholds = {}
for g, sub in df.groupby("sex"):
fpr, tpr, thr = roc_curve(sub["outcome"], sub["pred_prob"])
# 感度 ≥ 0.85 のうち、最大の閾値(特異度を犠牲にしすぎない)
ok = tpr >= 0.85
if ok.any():
thresholds[g] = float(thr[ok][-1])
print(thresholds)
# 注意: 群別閾値は倫理的・運用的に正当化が必要
# 論文では理由・代替案・限界を明記する
「サブグループ間で性能差が見えなかった = 公平である」と断定しない。 少数サブグループでは推定の信頼区間が広く、差を検出する検出力が不足します。「差が統計的に有意ではなかった」「差の点推定は X ポイントで 95% CI は [−Y, +Z]」という形で報告し、症例数の限界を Discussion に明記します。
// 07 · MYTHS誤解と訂正
「全体 AUC が高いから公平性は確認不要」
全体性能は、特定サブグループの性能低下を平均で覆い隠します。年齢・性別・人種・施設・重症度・疾患型などの主要サブグループごとに AUC・感度・特異度・PPV・Calibration を確認し、performance gap と calibration gap を表で示します。これは倫理だけでなく安全性の問題です。
「すべての公平性指標を同時に達成すべき」
群間で陽性率が異なるとき、Equalized Odds と Predictive Parity を同時に完全達成することは数学的に不可能です(Chouldechova 2017)。臨床的コスト構造と社会的意味づけから、優先する指標を選ぶ必要があります。「全部公平」は実現できないトレードオフを隠す表現になります。
「性能差が見えなかったから公平」
少数サブグループでは検出力が不足し、差があっても見えないことがあります。「差が有意でなかった」と「差が存在しない」は同義ではありません。点推定と信頼区間を併記し、症例数とイベント数を Table に示します。サブグループ症例数が極端に少ない場合は、「公平性は十分に検証できなかった」とする方が誠実です。
「性能差はモデルの差別の証拠」
性能差の原因は、サンプル不足・測定差・運用差・真の生物学的差など複数あります。即座に「差別」と断定せず、原因を分解して対策を選びます。たとえば「女性で性能が低い」が、訓練データ偏重なら追加サンプリング、症状提示差なら別モデル、運用差なら閾値調整、と対策は異なります。
// 08 · WRITING医療AI・リハビリ研究論文での書き方
Methods に書くこと
- 事前に定義した主要サブグループ(性別・年齢階層・施設・重症度・疾患型 等)
- 採用した公平性指標と選択理由(equal opportunity / equalized odds / predictive parity 等)
- 群別性能の推定方法(bootstrap CI・信頼区間・補正の有無)
- 性能差が見つかった場合の対策計画(再重み付け・群別閾値・運用ルール)
- Fairlearn / aif360 などのツールを使った場合のバージョン
Results に書くこと
- サブグループごとの症例数・イベント数・AUC・感度・特異度・PPV・Calibration(slope/intercept)
- 性能差の点推定と 95% 信頼区間(差の方向と大きさ)
- 群別 Calibration plot(Supplementary でも可)
- 採用した公平性指標の数値と、群間差
Discussion に書くこと
- 性能差の原因(サンプル不足・測定差・運用差・真の生物学的差)の議論
- 同時達成不可能性に基づく指標選択の根拠
- 群別閾値・運用ルールの倫理的・実務的考察
- Limitations:サブグループ症例数不足・検出力不足・未測定の保護属性
- Model card による適用範囲と限界の明示[8]
Methods 例:「主要サブグループとして、性別(男性・女性)、年齢階層(65 歳未満・65–74 歳・75 歳以上)、施設、重症度(NIHSS ≥ 16 / < 16)を事前に定義した。各群で AUC・感度・特異度・PPV・calibration slope/intercept を bootstrap 1000 回で 95% 信頼区間とともに推定した。公平性指標は equalized odds difference を主指標とし、Fairlearn 0.10 を用いて計算した。」
Discussion 例:「75 歳以上のサブグループで AUC が 0.71(95% CI 0.65–0.78)と全体(0.84)より低下していた。原因として、訓練データにおける高齢者比率(22 %)、認知機能評価の欠測率の高さ、併存疾患の多様性が考えられる。今後は能動的サンプリングによる高齢者データの追加と、年齢階層別の閾値調整を検討する。本研究では、equalized odds と predictive parity の同時達成不可能性を踏まえ、見逃しコストを優先する観点から equalized odds を主指標とした。」
// 09 · CHECKLIST投稿前チェックリスト
解析開始時・投稿前の双方で確認したい項目です。
- 01主要サブグループを 事前に 定義した(後付けで増やしすぎない)
- 02各サブグループの症例数とイベント数を Table 1 に示した
- 03AUC だけでなく感度・特異度・PPV・NPV・Calibration を比較した
- 04性能差の点推定と 95% 信頼区間(bootstrap 等)を示した
- 05群別 Calibration plot を確認した
- 06採用した公平性指標と選択理由を Methods に明記した
- 07指標の同時達成不可能性を Discussion で議論した
- 08性能差の原因(サンプル不足・測定・運用・生物学的差)を区別した
- 09サブグループ差を即「差別」と断定していない
- 10性能差がある場合の対策(4 段階)を Discussion に書いた
- 11少数サブグループの検出力不足を Limitations に明記した
- 12Model card / 適用範囲の限界を明示した
// 10 · QUIZミニクイズ
-
Q1全体 AUC が高いモデルで、公平性の観点から確認すべきことは?
- サブグループ別の性能と Calibration
- 訓練 AUC だけ
- 最良 fold だけ
- 背景因子は不要
SHOW ANSWER
A. 全体性能は、特定群での性能低下を覆い隠します。年齢・性別・施設・重症度などのサブグループで AUC・感度・特異度・PPV・Calibration を確認します。 -
Q2サブグループ解析の注意点として正しいものは?
- 症例数が減り推定が不安定になる(信頼区間を必ず示す)
- 必ず因果効果が分かる
- 信頼区間は不要
- 差が見えなければ即「公平」
SHOW ANSWER
A. 少数サブグループでは推定が不安定なので、bootstrap CI などで不確実性を示します。検出力不足は「差がない」を意味しません。 -
Q3Equalized Odds と Predictive Parity の関係として正しいものは?
- 群間で陽性率が異なるとき、同時に完全達成することはできない
- どちらも常に同時に達成できる
- Demographic Parity と同じ意味
- 医療では使えない
SHOW ANSWER
A. Chouldechova 2017 の incompatibility theorem により、群間で陽性率が異なる場合、Equalized Odds・Predictive Parity・Calibration を同時には完全達成できません。臨床コストから優先指標を選びます。 -
Q4サブグループで性能差が見つかったときの最初の対応として最も適切なのは?
- 原因(サンプル不足/測定/運用/生物学的差)を分解して対策を選ぶ
- 即「差別」と断定する
- サブグループ解析自体を取りやめる
- 論文には書かない
SHOW ANSWER
A. 性能差の原因は複数あり、対策も異なります。サンプル不足なら追加収集、測定差なら標準化、運用差なら閾値調整、生物学的差なら別モデル・個別化、というように原因に応じて選びます。
// 11 · FAQよくある質問
- 全体 AUC が高ければ公平性は確認しなくてよいですか?
- いいえ。全体性能は、特定サブグループの性能低下を平均で覆い隠します。年齢・性別・人種・施設・重症度・疾患型などの主要サブグループごとに AUC・感度・特異度・PPV・Calibration を確認し、performance gap と calibration gap を表で示します。医療AIでは、性能差が大きいサブグループに不利益が集中するため、倫理だけでなく安全性の問題です。
- どの公平性指標を使うべきですか?
- 単一の正解はありません。equal opportunity(感度均等)、equalized odds(感度・特異度両方)、demographic parity(陽性率均等)、predictive parity(PPV 均等)、calibration parity(較正均等)など、複数の指標を 同時に 完全達成することは数学的に不可能な場合があります(incompatibility theorem)。医療では、見逃しコストと過剰介入コストのバランスから、文脈ごとに優先する指標を選びます。
- 性能差が見つかったらどう対処しますか?
- 4 段階で考えます。Level 1: データ収集の偏りを修正する(少数群のサンプル追加)、Level 2: 再重み付け・SMOTE 等で学習時に補正する、Level 3: サブグループ別の閾値最適化、Level 4: 運用ルールで補完する(特定群には別評価を併用)。性能差そのものを「差別」と即断せず、原因(サンプル不足・測定差・運用差・真の生物学的差)を区別して対処します。
- 群別の閾値を変えることは倫理的に問題ありませんか?
- 論争があります。equal opportunity を優先する立場では正当化される場合がありますが、社会的にはトレードオフがあります。論文で群別閾値を採用する場合は、選択理由・代替案(共通閾値での性能)・倫理的議論・運用上の安全装置(人間レビュー)を併記します。Model card で適用範囲と限界を明示し、臨床現場の判断を支援する形にとどめます。
// REF参考文献
- Huang Y, et al. A scoping review of fair machine learning techniques when using real-world data in healthcare. J Biomed Inform 2024. — link
- Moons KGM, Wolff RF, Riley RD, et al. PROBAST+AI: an updated quality, risk of bias, and applicability assessment tool for prediction models using regression or artificial intelligence methods. BMJ 2025;388:e082505. — doi
- Collins GS, Moons KGM, Dhiman P, Riley RD, Beam AL, Van Calster B, et al. TRIPOD+AI statement: updated guidance for reporting clinical prediction models that use regression or machine learning methods. BMJ 2024;385:e078378. — doi
- World Health Organization. Ethics and governance of artificial intelligence for health: WHO guidance. 2021. — link
- Obermeyer Z, Powers B, Vogeli C, Mullainathan S. Dissecting racial bias in an algorithm used to manage the health of populations. Science 2019;366(6464):447-453. — doi
- Chouldechova A. Fair prediction with disparate impact: A study of bias in recidivism prediction instruments. Big Data 2017;5(2):153-163. — doi
- Hardt M, Price E, Srebro N. Equality of Opportunity in Supervised Learning. NeurIPS 2016. — link
- Mitchell M, Wu S, Zaldivar A, et al. Model Cards for Model Reporting. FAT* '19. — doi
- Fairlearn: A Python package for assessing and improving fairness in AI. — docs