// PART 09 · ARTICLE 10 / 11
PITFALLS FAIRNESS SUBGROUP L2

公平性・バイアス

— 年齢・性別・施設で「誰に対して性能が低いか」を確認する

13 min read· L2· 2026.05.23 update· by Editor

モデル全体の AUC が高くても、特定のサブグループで性能が低いことがあります。高齢者・女性・重症例・特定施設・希少疾患・評価が難しい患者群で性能が落ちると、臨床実装時に不利益が 集中 します。医療AIでは、平均性能だけではなく、誰に対して性能が低いのか を確認する必要があります。

公平性は倫理だけの話ではなく、モデルの 安全性と外部妥当性 の問題でもあります。性能低下が集中するサブグループでは、臨床判断の質が下がり、過小診断・過剰介入・治療遅延が起こりやすくなります。さらに、性能差は 09·07 ドメインシフト09·08 ショートカット学習09·06 欠測バイアス の影響を受けるため、公平性は他のピットフォールと地続きです。

// CONTEXT

本稿は、第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」という単一の数字の裏で、施設や性別のサブグループでは大きく異なる性能が出ていることがあります。

// SUBGROUP PERFORMANCE · 平均は格差を隠す 0.90 0.80 0.70 0.60 AUC 0.84 overall N=820 0.86 male N=460 0.80 female N=360 0.72 75y+ N=180 0.66 site B N=85 overall AUC 0.84 の裏に、site B では 0.66 という性能ギャップが隠れている
Fig.1 サブグループ性能ギャップの典型例。全体 AUC が高くても、性別・年齢・施設などで性能が大きく低下することがあります。サブグループの症例数(N)を併記し、不確実性を意識させます。

次に、複数の公平性指標を整理します。どの指標を「公平」と呼ぶか で対策が変わるため、定義と数学的関係を理解することが重要です。Chouldechova[6] らが示したように、複数の指標を同時に完全達成することは数学的に不可能な場合があります(incompatibility theorem)。

// FAIRNESS CRITERIA · どれを公平と呼ぶか DEMOGRAPHIC PARITY P(ŷ=1 | A=a) = P(ŷ=1 | A=b) ▸ 群間で 陽性予測率 を均等にする ▸ 採用・与信などで使われる ▸ 医療では真のリスク差を消す → 医療には適用しにくい EQUAL OPPORTUNITY P(ŷ=1 | y=1, A=a) = P(ŷ=1 | y=1, A=b) ▸ 陽性例での 感度 を均等にする ▸ Hardt et al. 2016 ▸ 見逃しを避けたい医療場面に親和 → スクリーニング系で第一選択 EQUALIZED ODDS 感度 と 特異度 をともに均等 ▸ equal opportunity の 強い版 ▸ 見逃しも過剰介入も均等にしたい ▸ ROC 曲線が群間で揃うことに対応 → 多くの医療シナリオで妥当 PREDICTIVE PARITY / CALIBRATION PPV 均等 / 群別の calibration ▸ 同じ予測値が、同じ実発生率を意味する ▸ 確率を 意思決定に使う 場面で重要 ▸ Chouldechova 2017 → 群間 calibration plot を必ず確認 陽性率が群間で異なるとき、Equalized Odds と Predictive Parity を 同時に 達成することはできない
Fig.2 主要な公平性指標 4 つ。Demographic Parity は医療には適用しにくく、Equal Opportunity(感度均等)・Equalized Odds(感度+特異度均等)・Predictive Parity(PPV/Calibration 均等)から、臨床的優先度に応じて選びます。群間で陽性率が異なるとき、これらを同時には完全達成できない(incompatibility theorem)[6]

最後に、AUC が群間で同じでも 較正が群間でずれる 例を示します。確率を臨床判断に使う場合は、群別 Calibration plot を必ず確認します。

// CALIBRATION GAP · 同じ AUC でも確率の意味が群で違う DISCRIMINATION (ROC) どちらの群も AUC ≈ 0.83 1 − Specificity Sensitivity Group A Group B CALIBRATION Group B は予測確率が過大 Predicted probability Observed y = x A (ok) B (over-predict)
Fig.3 較正ギャップ。AUC が群間で揃っていても、Calibration plot は y=x から外れることがあります。同じ「予測 50 %」が、Group A では真の発生率 50 %、Group B では真の発生率 30 %、というような乖離は、意思決定に深刻な影響を与えます。DCA でも群別評価を行います。

// 04 · CLINICALリハ・神経・整形領域での具体例

// CASE 1 · 高齢者での性能低下

高齢患者は併存疾患や認知機能低下が多く、若年群中心で学習したモデルがそのままでは当てはまらないことがあります。FIM 予後予測では、75 歳以上のサブグループで AUC が 10 ポイント以上下がることがあります。原因は、サンプル不足/併存疾患による多様性/フレイル等のアウトカム修飾因子の未調整など複数あり、年齢階層別の Table 1 と群別性能表を併記して原因を特定します。

// CASE 2 · 施設別の閾値差

同じ予測確率でも、施設ごとの退院支援体制により自宅退院率が異なる場合があります。施設 A では予測 60 % が真の自宅退院率 60 % に対応しても、施設 B では真の 40 % に過ぎないことがあります。これは 09·07 施設差 で扱った calibration ドリフトの特殊形であり、施設別の Calibration plot と閾値再調整 が必要です。

// CASE 3 · 重症例の過小評価

軽症例が多いデータで学習すると、重症例の予測が不安定になります。重症例こそ介入判断が重要な場面で性能が落ちると、最も注意したい患者群で誤分類が増えるという最悪のパターンになります。重症度階層別の AUC ・感度・PPV を必ず確認し、不足する場合は加重サンプリングや別モデルの併用を検討します。

// CASE 4 · 性差・解剖学的差

整形外科 AI(骨格 X 線、関節形態評価)や心血管リスク予測で、女性のサブグループで性能が落ちる例が報告されています[5]。原因は、訓練データの男性偏重・症状提示の性差・診断遅延の構造的差などです。性差を「真の生物学的差」と「データ収集や運用の偏り由来」に分けて議論しないと、対策を誤ります。

// 05 · THEORY公平性指標と incompatibility theorem

主要な公平性指標

指標定義医療での意味
Demographic ParityP(ŷ=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)
# 注意: 群別閾値は倫理的・運用的に正当化が必要
# 論文では理由・代替案・限界を明記する
// PITFALL

「サブグループ間で性能差が見えなかった = 公平である」と断定しない。 少数サブグループでは推定の信頼区間が広く、差を検出する検出力が不足します。「差が統計的に有意ではなかった」「差の点推定は X ポイントで 95% CI は [−Y, +Z]」という形で報告し、症例数の限界を Discussion に明記します。

// 07 · MYTHS誤解と訂正

// MYTH 01

「全体 AUC が高いから公平性は確認不要」

全体性能は、特定サブグループの性能低下を平均で覆い隠します。年齢・性別・人種・施設・重症度・疾患型などの主要サブグループごとに AUC・感度・特異度・PPV・Calibration を確認し、performance gap と calibration gap を表で示します。これは倫理だけでなく安全性の問題です。

// MYTH 02

「すべての公平性指標を同時に達成すべき」

群間で陽性率が異なるとき、Equalized Odds と Predictive Parity を同時に完全達成することは数学的に不可能です(Chouldechova 2017)。臨床的コスト構造と社会的意味づけから、優先する指標を選ぶ必要があります。「全部公平」は実現できないトレードオフを隠す表現になります。

// MYTH 03

「性能差が見えなかったから公平」

少数サブグループでは検出力が不足し、差があっても見えないことがあります。「差が有意でなかった」と「差が存在しない」は同義ではありません。点推定と信頼区間を併記し、症例数とイベント数を Table に示します。サブグループ症例数が極端に少ない場合は、「公平性は十分に検証できなかった」とする方が誠実です。

// MYTH 04

「性能差はモデルの差別の証拠」

性能差の原因は、サンプル不足・測定差・運用差・真の生物学的差など複数あります。即座に「差別」と断定せず、原因を分解して対策を選びます。たとえば「女性で性能が低い」が、訓練データ偏重なら追加サンプリング、症状提示差なら別モデル、運用差なら閾値調整、と対策は異なります。

// 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ミニクイズ

  1. Q1全体 AUC が高いモデルで、公平性の観点から確認すべきことは?
    • サブグループ別の性能と Calibration
    • 訓練 AUC だけ
    • 最良 fold だけ
    • 背景因子は不要
    SHOW ANSWER
    A. 全体性能は、特定群での性能低下を覆い隠します。年齢・性別・施設・重症度などのサブグループで AUC・感度・特異度・PPV・Calibration を確認します。
  2. Q2サブグループ解析の注意点として正しいものは?
    • 症例数が減り推定が不安定になる(信頼区間を必ず示す)
    • 必ず因果効果が分かる
    • 信頼区間は不要
    • 差が見えなければ即「公平」
    SHOW ANSWER
    A. 少数サブグループでは推定が不安定なので、bootstrap CI などで不確実性を示します。検出力不足は「差がない」を意味しません。
  3. Q3Equalized Odds と Predictive Parity の関係として正しいものは?
    • 群間で陽性率が異なるとき、同時に完全達成することはできない
    • どちらも常に同時に達成できる
    • Demographic Parity と同じ意味
    • 医療では使えない
    SHOW ANSWER
    A. Chouldechova 2017 の incompatibility theorem により、群間で陽性率が異なる場合、Equalized Odds・Predictive Parity・Calibration を同時には完全達成できません。臨床コストから優先指標を選びます。
  4. 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参考文献

  1. Huang Y, et al. A scoping review of fair machine learning techniques when using real-world data in healthcare. J Biomed Inform 2024. — link
  2. 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
  3. 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
  4. World Health Organization. Ethics and governance of artificial intelligence for health: WHO guidance. 2021. — link
  5. 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
  6. Chouldechova A. Fair prediction with disparate impact: A study of bias in recidivism prediction instruments. Big Data 2017;5(2):153-163. — doi
  7. Hardt M, Price E, Srebro N. Equality of Opportunity in Supervised Learning. NeurIPS 2016. — link
  8. Mitchell M, Wu S, Zaldivar A, et al. Model Cards for Model Reporting. FAT* '19. — doi
  9. Fairlearn: A Python package for assessing and improving fairness in AI. — docs