本ページで扱うトピックの早見表。 各チップをクリックすると該当セクションへジャンプ。
AUC に関する用語を 曲線・指標・計算法・注意点 別に索引化します。AUC は「閾値を全部試したときの平均的な性能」を 1 つの数字にしたものだ、という一点を軸に整理すると混乱しません。
| カテゴリ | キーワード(日本語) | キーワード(英語) |
|---|---|---|
| 曲線 | ROC 曲線、 PR 曲線(適合率-再現率)、 較正曲線、 リフト曲線、 累積利得曲線 | ROC curve, PR curve, calibration curve, lift curve, gain curve |
| 軸になる指標 | 真陽性率(再現率)、 偽陽性率、 適合率、 特異度、 閾値 | TPR / recall, FPR, precision, specificity, threshold |
| 面積の指標 | ROC-AUC、 PR-AUC(平均適合率)、 部分 AUC、 Gini 係数(2·AUC−1) | ROC-AUC, PR-AUC / average precision, partial AUC, Gini coefficient |
| 計算のしかた | 台形則、 順位和との関係、 Mann-Whitney U 統計量、 ブートストラップ信頼区間 | trapezoidal rule, rank sum, Mann-Whitney U, bootstrap CI |
| 解釈 | 「無作為に選んだ陽性が陰性より高いスコアを持つ確率」、 0.5=当てずっぽう、 1.0=完全 | probabilistic interpretation, chance level, perfect separation |
| 注意点 | 不均衡データでの見かけ倒し、 PR-AUC との使い分け、 閾値を決めていない点、 較正との違い | class imbalance, PR-AUC preference, threshold-free, calibration vs discrimination |
| 実装 | roc_auc_score、 roc_curve、 average_precision_score、 RocCurveDisplay | roc_auc_score, roc_curve, average_precision_score, RocCurveDisplay |
🍰 まずはやさしく
分類の性能を測る点数のようなものです。
モデルがどれだけ正しく分けたかを知るために使います。
テストの点数で実力を比べる感覚に似ています。
ここではAUCの結論を短くまとめます。
ROC曲線下の面積(分類性能の総合指標)
「AUC」の核心を 15 個の一行表現で:
🍰 まずはやさしく
モデルの評価に使う道具の一つです。
他の指標と組み合わせて正解率を確認します。
スマホアプリの予測精度を測る場面などで使います。
この指標が全体のどこに位置するかを確認しましょう。
本ページは『モデル評価』カテゴリの中核指標。 ROC 曲線・混同行列・適合率/再現率/F1 と一体で学ぶ。 隣接ページ: ROC曲線・特異度・F1スコア・分類問題。
所属カテゴリ: モデル評価。 用語固有の深掘りに入る前に、 ここで全体の中での位置を確認してください。
🍰 まずはやさしく
正解を当てる確率のようなものです。
判定の基準を変えても使える強さを測ります。
部活のメンバーを能力順に並べるイメージです。
図を使って直感的に仕組みを解説します。
AUC (Area Under the Curve) は、 二値分類モデルの「閾値を変えても全体としてどれだけ良い分類器か」を 1 つの数値 (0〜1) で要約する指標。 直感的には「ランダムに選んだ陽性サンプルが、 ランダムに選んだ陰性サンプルより高いスコアを得る確率」と等価。
横軸に偽陽性率 (FPR)、 縦軸に真陽性率 (TPR) を取り、 分類の閾値を 0 から 1 まで動かしてプロットしたのが ROC 曲線。 閾値を緩めると TPR も FPR も上がるが、 良い分類器は TPR が早く 1 に近づき FPR は低く抑えられる → 曲線が左上に張り出す。 その曲線下の面積 (Area Under the Curve) が AUC。
1000 人の検査結果を「病気スコア」でランキングし、 真の陽性 (実病者) が高スコア側に固まっているか確認する。 完璧なら 病者全員が上位 → AUC = 1.0。 完全にランダムなら 病者が一様に分布 → AUC = 0.5。 0.5 を下回ると「予測を反転した方が良い」状態。
AUC は閾値非依存・クラス不均衡に対して比較的頑健である一方、 「実運用上の閾値」での性能は別途確認が必要。 本ページでは定義 → 計算 → Python 実装 → 落とし穴の順で詳しく見ていく。
🍰 まずはやさしく
グラフの下側の面積のことです。
分類の性能を一つの数字で表すために使います。
買い物のおすすめ機能が正しいか測る時に役立ちます。
詳しい計算方法や言葉の意味を学びましょう。
ROC曲線下の面積(分類性能の総合指標)
英語名 Area Under Curve。 同義・関連語:AUROC。
AUC (Area Under the ROC Curve) は、 ランダムに選んだ正例と負例のスコア順序が正しい確率と等価。
$$\text{AUC} = \int_0^1 \text{TPR}(\text{FPR}) \, d(\text{FPR})$$離散版 (Mann–Whitney U 統計量) では:
$$\text{AUC} = \frac{1}{N_+ N_-} \sum_{i \in P} \sum_{j \in N} \mathbb{1}[s_i > s_j] + \frac{1}{2} \mathbb{1}[s_i = s_j]$$| 記号 | 意味 | 範囲 |
|---|---|---|
| TPR | 真陽性率 = TP/(TP+FN) | 0–1 |
| FPR | 偽陽性率 = FP/(FP+TN) | 0–1 |
| $s_i$ | サンプル i の予測スコア | 実数 |
| $N_+, N_-$ | 正例・負例の総数 | 整数 |
| AUC | 面積 (=順位確率) | 0–1 (0.5=ランダム) |
「偽陽性を絶対許せない」運用、 たとえば がん検診の二次検査トリガー、 セキュリティの自動遮断、 詐欺の即時アラートでは、 全 FPR 領域を平均する AUC ではなく、 「FPR ≤ 0.1(あるいは 0.05)」だけの ROC 曲線下面積、 つまり部分 AUC(partial AUC, pAUC)を主指標にする。 sklearn の `roc_auc_score(..., max_fpr=0.1)` は McClish の補正を自動適用して、 通常の AUC と同じ [0.5, 1.0] レンジに正規化した「標準化 pAUC」を返す。 補正は $\frac{1}{2}(1 + \frac{\text{pAUC} - \text{pAUC}_{\min}}{\text{pAUC}_{\max} - \text{pAUC}_{\min}})$ という式で、 ランダム識別が 0.5、 完全分離が 1.0 になるように線形変換する。
pAUC は通常の AUC より分散が大きいため、 信頼区間は広くなる。 報告時は「pAUC(FPR ≤ 0.1)= 0.78 [95%CI: 0.70-0.85]」のように、 FPR 範囲も併記するのが標準作法。 また、 pAUC を最大化したい場合は、 通常の Logistic 損失ではなく、 低 FPR 領域を重視する重み付け損失や、 pAUC を直接近似する研究的損失関数(pAUCRanking など)が使われる。 業務で「偽陽性 5% 以下の領域での性能だけが重要」というケースでは、 pAUC を主指標とし、 AUC は補助指標として併走させるのが現実的。
なお、 pAUC と対になる概念として「TPR を一定範囲に絞った AUC」もあり、 こちらは「高感度領域での特異度を見たい」ケースで使われる。 sklearn には標準実装が無く、 自前で TPR ベースに ROC を反転して計算する必要がある。 医療分野では「感度 95% 固定時の特異度」を直接報告することも多く、 AUC・pAUC・固定感度時の特異度・固定特異度時の感度の 4 つを並べる報告様式が確立している。
AUC が同じ値でも、 ROC 曲線の形が違えば実運用での挙動は大きく異なる。 形を見るだけで分かるモデル特性を 6 パターン整理する。
この 6 パターンを意識しながら ROC 曲線を見ると、 「AUC 数値だけでは見えないモデルの個性」が分かるようになる。 特に「左上型」と「中央膨らみ型」の区別はアプリケーション選定で死活的に重要で、 同じ AUC=0.85 でも前者は医療向け、 後者はマーケ向けと完全に用途が変わる。
AUC は強力な指標だが、 誤読は実害をもたらす。 教育用ハンズオン教材として、 実際に起きた(または起こりうる)誤読事例を 5 件まとめる。 自分のプロジェクトで同じ罠に陥らないよう、 チェックリストとして活用してほしい。
ある病院で、 新しい血液検査スコアの AUC が 0.92 と報告された。 経営層は「優秀」と判断し全患者に導入したが、 有病率 1% の集団で閾値 0.5 を採用したところ偽陽性率が 8% に達し、 不必要な精密検査が殺到。 PPV(陽性的中率)が 11% しかなく、 「陽性と出ても 9 割は健康な人」という運用に陥った。 教訓:AUC だけでは閾値選択の妥当性は分からない。 有病率と合わせた PPV・NPV を計算し、 業務インパクトを試算してから導入する。
クレジット詐欺検知モデルが AUC=0.97 でモデル選定を勝ち抜き、 本番投入された。 ところが運用後、 オペレーターが調査する案件のうち真の詐欺が 15% しか無く、 残り 85% は無駄調査と判明。 PR-AUC を見るとわずか 0.15 で、 「陽性 0.05% という極端不均衡では AUC は楽観的すぎる」典型例。 教訓:陽性比率 1% 以下では必ず PR-AUC を主指標にする。
マーケティング応答予測で、 学習データに「未来のキャンペーン回数」を含めてしまった結果、 検証 AUC が 0.99 という異常値に。 本番投入後、 実 AUC は 0.62 まで落ち、 ターゲティング効率は事前評価より遥かに低かった。 原因はターゲット漏洩。 教訓:AUC が業界平均より大幅に高い場合、 まず時系列リークと特徴量漏洩を疑う。 評価は時系列 split で行う。
クロスバリデーション AUC が 0.85 だったモデルが、 ホールドアウトテストでは 0.68 に落ちた。 当初は「サンプル数の偶然」と片付けられたが、 後に CV の fold 分割で「同一顧客のデータが学習と検証に分散」していたことが判明。 顧客 ID で stratified group k-fold に変更したところ CV AUC が 0.70 まで落ち、 テストとほぼ一致。 教訓:データに「グループ構造」がある場合、 単純な k-fold は AUC を過大評価する。 GroupKFold を使う。
A/B テストでモデル A の AUC=0.82、 モデル B の AUC=0.84 と出て B を採用したが、 後で bootstrap で 95% 信頼区間を計算したところ A=[0.78, 0.86]、 B=[0.80, 0.88] と完全に重なっていた。 統計的にはほぼ同等で、 サンプル数 N=500 では 0.02 の差は誤差範囲内。 教訓:AUC は必ず信頼区間で報告し、 DeLong 検定または bootstrap で 2 モデル差の有意性を確認する。 微小差で意思決定しない。
AUC の離散版 $\text{AUC} = (1/N_+ N_-) \sum \mathbb{1}[s_i > s_j]$ を言葉で読み直す:
例: 正例 3 個・負例 5 個 → 全 15 ペア中 12 ペアで正例 > 負例 → AUC = 12/15 = 0.80。 AUC は『閾値を全範囲で動かしたときの平均的順位識別力』であり、 単一スコアで分類器の質を要約する強力な指標。 連続版 (積分) は閾値を連続的に動かしたバージョン。
合成データ(正例 3 件 + 負例 3 件、 多様な予測スコア)を用いて、 AUC = ∫TPR(FPR)dFPR を台形公式で計算する。 同じ計算を Python (sklearn.metrics.roc_auc_score) で再現し、 結果が完全一致することを確認する。
$$ \text{AUC} = \int_0^1 \text{TPR}(\text{FPR})\, d(\text{FPR}) \approx \sum_{k=1}^{K} \frac{\text{TPR}_{k-1} + \text{TPR}_{k}}{2} \cdot (\text{FPR}_{k} - \text{FPR}_{k-1}) $$
| サンプル | 真ラベル y | 予測スコア s |
|---|---|---|
| A | 0 (負例) | 0.1 |
| B | 1 (正例) | 0.8 |
| C | 0 (負例) | 0.4 |
| D | 1 (正例) | 0.9 |
| E | 1 (正例) | 0.7 |
| F | 0 (負例) | 0.3 |
N+ = 3 (正例 B, D, E)、 N- = 3 (負例 A, C, F)。
| しきい値 | TP | FP | FN | TN | TPR=TP/(TP+FN) | FPR=FP/(FP+TN) |
|---|---|---|---|---|---|---|
| +∞ (誰も陽性と判定しない) | 0 | 0 | 3 | 3 | 0/3 = 0.000 | 0/3 = 0.000 |
| ≤ 0.9 (D を陽性) | 1 | 0 | 2 | 3 | 1/3 ≈ 0.333 | 0/3 = 0.000 |
| ≤ 0.8 (D, B を陽性) | 2 | 0 | 1 | 3 | 2/3 ≈ 0.667 | 0/3 = 0.000 |
| ≤ 0.7 (D, B, E を陽性) | 3 | 0 | 0 | 3 | 3/3 = 1.000 | 0/3 = 0.000 |
| ≤ 0.4 (+C) | 3 | 1 | 0 | 2 | 3/3 = 1.000 | 1/3 ≈ 0.333 |
| ≤ 0.3 (+F) | 3 | 2 | 0 | 1 | 3/3 = 1.000 | 2/3 ≈ 0.667 |
| ≤ 0.1 (+A) | 3 | 3 | 0 | 0 | 3/3 = 1.000 | 3/3 = 1.000 |
FPR が 0 → 1/3 → 2/3 → 1 と動く 3 区間 (TPR は 3 区間とも 1.000 のまま) について台形面積を合計:
| 区間 | ΔFPR | TPR 平均 | 台形面積 |
|---|---|---|---|
| FPR: 0.000 → 0.333 | 1/3 | (1.000+1.000)/2 = 1.000 | 1/3 × 1.000 = 0.3333 |
| FPR: 0.333 → 0.667 | 1/3 | (1.000+1.000)/2 = 1.000 | 1/3 × 1.000 = 0.3333 |
| FPR: 0.667 → 1.000 | 1/3 | (1.000+1.000)/2 = 1.000 | 1/3 × 1.000 = 0.3333 |
| 合計 AUC | 1.0000 |
正例 3 件のスコア (0.9, 0.8, 0.7) がすべて負例の最大スコア (0.4) より大きいため、 完全に分離されており AUC = 1.0 となる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import numpy as np from sklearn.metrics import roc_auc_score, roc_curve y_true = np.array([0, 1, 0, 1, 1, 0]) y_score = np.array([0.1, 0.8, 0.4, 0.9, 0.7, 0.3]) # 1) sklearn の roc_auc_score (Mann-Whitney U 等価) auc_sklearn = roc_auc_score(y_true, y_score) # 2) 台形公式で手計算と同じ手順 fpr, tpr, thr = roc_curve(y_true, y_score) auc_trapz = np.trapz(tpr, fpr) print(f"FPR = {fpr}") print(f"TPR = {tpr}") print(f"AUC (sklearn) = {auc_sklearn:.4f}") print(f"AUC (台形公式 手計算) = {auc_trapz:.4f}") |
💬 手計算 (Step 3 合計 = 1.0000) と Python 出力 (sklearn = 1.0000、 np.trapz = 1.0000) が完全一致。 正例 3 件のスコアが負例の最大スコアより全て大きいため、 AUC は理論上限の 1.0 になる。
この用語を理解・使用するときは、 次のような前提を意識してください:
🎯 このコードでやること:SSDSE-B-2026 47 都道府県データで『高齢化県』(65 歳以上比率 30% 超) を二値分類するロジスティック回帰の AUC を実測する。 特徴量は総人口・出生数・転入者数。
📥 入力データ (data/raw/SSDSE-B-2026.csv (47 都道府県 × 12 年 = 564 行、 下表は 2023 年の例)):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score, roc_curve
from sklearn.model_selection import train_test_split
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=2,
header=None)
cols = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', nrows=0).columns.tolist()
df.columns = cols
# 高齢化県ラベル: 65 歳以上 / 総人口 > 0.30
df = df.dropna(subset=['A1101','A1303','A4101','A5101'])
df['aging_ratio'] = df['A1303'] / df['A1101']
df['y'] = (df['aging_ratio'] > 0.30).astype(int)
X = df[['A1101','A4101','A5101']].values
y = df['y'].values
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3,
stratify=y, random_state=42)
model = LogisticRegression(max_iter=1000).fit(X_tr, y_tr)
proba = model.predict_proba(X_te)[:, 1]
auc = roc_auc_score(y_te, proba)
print(f'AUC = {auc:.4f}')
print(f'正例数 (テスト): {y_te.sum()} / {len(y_te)}')
fpr, tpr, _ = roc_curve(y_te, proba)
print(f'ROC: FPR={fpr[:5].round(3)}, TPR={tpr[:5].round(3)}') |
📤 実行すると次の出力が得られる (実行結果 (実 47 県データ)):
💬 結果の読み方:AUC = 0.92 は『高齢化県』分類が極めて良好に機能していることを示す。 65 歳以上比率は人口総数・出生数・転入数と強く相関するため、 単純な 3 特徴量でも 92% の順位精度が出る。 AUC > 0.9 は実務的に十分な識別力 — モデル評価の標準指標として AUC を用いるのは、 閾値非依存で『順位の質』を測れるから。
「AUC」は学術用語に留まらず、 産業現場で日々使われている。 業界別の代表的活用例:
「AUC」と混同しやすい概念を整理:
| 指標 | AUC (ROC) | PR-AUC | Accuracy | F1-score | Log-loss |
|---|---|---|---|---|---|
| 閾値依存 | なし | なし | あり | あり | なし |
| 不均衡対応 | 弱い | 強い | 極めて弱い | 中程度 | 強い |
| 出力 | 順位スコア | 順位+precision | 0/1 判定 | 0/1 判定 | 確率 |
| 値域 | 0.5–1.0 | 正例比率–1.0 | 0–1 | 0–1 | 0–∞ |
| 解釈性 | 高 (順位確率) | 中 | 極めて高 | 中 | 低 |
| 代表用途 | 二値分類全般 | 不均衡データ | バランス分類 | 情報検索 | 確率校正 |
「AUC」の典型的な失敗パターン:
理解度確認用の演習問題:
よくある質問とその回答:
本ページと密接に関係する 10 用語の簡易定義:
🎯 このコードでやること:SSDSE-B-2026 で『出生率の高い県』を二値分類するモデルの AUC を、 単変量モデル・多変量モデル・GBM の 3 種で比較する。
📥 入力データ (data/raw/SSDSE-B-2026.csv (47 都道府県 × 12 年 = 564 行)):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import cross_val_score
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=2,
header=None)
cols = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', nrows=0).columns.tolist()
df.columns = cols
df = df.dropna(subset=['A1101','A1303','A4101','A5101','J2503','C3301'])
df['br'] = df['A4101'] / df['A1101'] * 1000
df['y'] = (df['br'] > df['br'].median()).astype(int)
X = df[['A1101','A1303','A5101','J2503','C3301']].values
y = df['y'].values
# 1. 単変量 (転入数のみ)
auc1 = cross_val_score(LogisticRegression(max_iter=1000),
df[['A5101']].values, y, cv=5, scoring='roc_auc').mean()
# 2. 多変量 LR
auc2 = cross_val_score(LogisticRegression(max_iter=1000),
X, y, cv=5, scoring='roc_auc').mean()
# 3. GBM
auc3 = cross_val_score(GradientBoostingClassifier(random_state=0),
X, y, cv=5, scoring='roc_auc').mean()
print(f'単変量 LR (転入のみ): AUC = {auc1:.3f}')
print(f'多変量 LR (5 変数): AUC = {auc2:.3f}')
print(f'GBM (5 変数): AUC = {auc3:.3f}') |
📤 実行すると次の出力が得られる (3 モデル AUC 比較):
💬 結果の読み方:単変量 0.48 → 多変量 LR 0.66 → GBM 0.48。 特徴量を増やすと AUC が上昇するが、 このデータでは多変量 LR が最良で GBM はむしろ低い。 AUC 差が業務的に意味あるかは別途検証 (DeLong test や cost analysis)。 564 行 (47 都道府県 × 12 年) でも出生率の中央値二値化は分離が難しく、 CV 分散も大きいため LOOCV 併用が望ましい。
📝 より正確な分析:上のコードを実データで実測すると、 単変量 LR=0.475・多変量 LR=0.664・GBM=0.483 となり、 「特徴量を増やし非線形の GBM にすれば単調に良くなる」わけではない。 むしろ最も単純な多変量ロジスティック回帰が最良で、 GBM は 5 変数・二値化ラベルの弱いシグナルに対して過学習気味で汎化 AUC が伸びない。 「複雑なモデルほど強い」という一般化は誤りで、 モデルの優劣は必ず交差検証で確認すべきである。 なお AUC の絶対値・順位は乱数シードや scikit-learn のバージョンで多少変動しうるため、 数値そのものより「単変量→多変量で改善、 GBM が万能ではない」という傾向を読むのが妥当。
🎯 このコードでやること:47 都道府県 × 12 年 (564 行) データで『高齢化進行県』(65 歳以上比率 > 中央値) のロジスティック回帰モデルを構築し、 訓練/テスト分割で AUC を測定。 特徴量重要度も SHAP 風に評価。
📥 入力データ (data/raw/SSDSE-B-2026.csv (47 都道府県 × 12 年 = 564 行)):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=2,
header=None)
cols = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', nrows=0).columns.tolist()
df.columns = cols
feats = ['A1101','A4101','A5101','C3301','J2503','J2505','J2506']
df = df.dropna(subset=feats + ['A1303'])
df['aging'] = df['A1303'] / df['A1101']
y = (df['aging'] > df['aging'].median()).astype(int).values
X = StandardScaler().fit_transform(df[feats].values)
aucs = []
for seed in range(20):
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3,
stratify=y, random_state=seed)
m = LogisticRegression(max_iter=1000).fit(Xtr, ytr)
aucs.append(roc_auc_score(yte, m.predict_proba(Xte)[:, 1]))
print(f'AUC: mean = {np.mean(aucs):.3f}, std = {np.std(aucs):.3f}')
print(f'95% range: [{np.percentile(aucs,2.5):.3f}, {np.percentile(aucs,97.5):.3f}]')
# 係数 (= 標準化特徴量の重要度)
m_full = LogisticRegression(max_iter=1000).fit(X, y)
for f, c in sorted(zip(feats, m_full.coef_[0]), key=lambda x: abs(x[1]), reverse=True):
print(f' {f}: coef = {c:+.3f}') |
📤 実行すると次の出力が得られる (AUC 分布 + 特徴量重要度):
💬 結果の読み方:20 回の異なる分割で AUC 0.909 ± 0.023 — 安定して高い識別力。 A4101 (出生数) が負の係数で最強 (出生数の少ない県ほど高齢化)、 A1101 (総人口) が正で次点。 AUC が >0.85 で安定するので、 この 7 特徴量モデルは実用化可能。
「AUC」を実際に運用している業界別 12 ケース:
🎯 このコードでやること:47 都道府県 × 12 年 (564 行) データで、 LogisticRegression / RandomForest / GBM の 3 モデルの AUC を Cross-validation で比較。 DeLong 検定 (簡易版) で差の有意性も確認。
📥 入力データ (data/raw/SSDSE-B-2026.csv (12 年・47 県 = 564 行)):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.model_selection import cross_val_score, StratifiedKFold
from sklearn.preprocessing import StandardScaler
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=2,
header=None)
cols = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', nrows=0).columns.tolist()
df.columns = cols
feats = ['A1101','A4101','A5101','J2503','J2505','C3301','E1101']
df = df.dropna(subset=feats+['A1303'])
df['aging'] = df['A1303'] / df['A1101']
y = (df['aging'] > df['aging'].median()).astype(int).values
X = StandardScaler().fit_transform(df[feats].values)
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
models = {
'LR': LogisticRegression(max_iter=1000),
'RF': RandomForestClassifier(n_estimators=100, random_state=0),
'GBM': GradientBoostingClassifier(random_state=0),
}
for name, m in models.items():
aucs = cross_val_score(m, X, y, cv=cv, scoring='roc_auc')
print(f'{name}: AUC = {aucs.mean():.3f} ± {aucs.std():.3f}') |
📤 実行すると次の出力が得られる (3 モデル CV AUC):
💬 結果の読み方:LR 0.893 → GBM 0.949 → RF 0.967。 非線形モデル (RF・GBM) が LR を上回り、 このデータではRF が最良。 標準偏差 (±0.02〜0.03) を考慮しても LR との差は明確だが、 RF と GBM の差は 1σ 前後で確定的ではない。 業務判断としては『RF/GBM 採用 + LR ベースライン併存』が安全。 どの非線形モデルが勝つかはシード・実装依存で変動しうる。
SSDSE-B-2026 のような公的統計データを Python で扱う際の基本パターン:
1 2 3 4 5 6 7 8 9 10 | import pandas as pd import numpy as np # データ読み込み # 先頭列名は 'SSDSE-B-2026'(=年度)。2 行目の和名見出しを skiprows=[1] で除き # 列コード(A1101 など)をヘッダにする。日本語 CSV なので encoding='cp932'。 df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023] # 最新年度(2023)に絞る print(df.shape) # -> (47, 112) 47 都道府県 × 112 列 print(df[['Prefecture', 'A1101', 'A4101']].head()) |
具体的なコードは 評価指標 を参照してください。
分析結果を報告するときに含めるべき情報:
AUC(ROC 曲線下面積)は、 一見すると「0 と 1 の間の数字」でしかない。 しかし実務では、 この 1 つの数字に「クラス不均衡への頑健性」「閾値非依存性」「ペアワイズ順序の正解率」「U 統計量との等価性」「キャリブレーションとの分離」など、 評価指標としての多くの性質が凝縮されている。 本節では SSDSE-B-2026 を用いて AUC のさまざまな顔を確認しながら、 「なぜ AUC を使うのか/どこで AUC を使ってはいけないのか」を相関ページと同じ深さで整理する。
AUC の最も直感的な解釈は「ランダムに選んだ正例のスコアが、 ランダムに選んだ負例のスコアより大きい確率」である。 これは Mann-Whitney の U 統計量を $n_+ \cdot n_-$ で割った値と数学的に同じであり、 「すべての正負例ペアについて、 何 % のペアで正しく順序付けできているか」を表す。 つまり AUC=0.85 は「100 ペアの正負例を取り出すと 85 ペアでは正例の方が高いスコアを得られる」ことを意味する。 散布図でクラス分布の重なりが少ないほど AUC は 1 に近づく。
Accuracy(正解率)や F1 スコアは「特定の閾値」での性能を測る。 そのため、 同じモデルでも閾値を 0.5 から 0.7 に変えるだけで Accuracy が動く。 一方 AUC は閾値を 0 から 1 まで連続的に動かしたときの ROC 曲線全体の面積なので、 「モデルが本質的にどれだけ正例と負例を分離できているか」だけを評価できる。 これがクラス比が変動するアプリケーション(例:詐欺検知、 医療スクリーニング、 マーケティング応答予測)で AUC が好まれる根本理由である。
複数モデルの AUC を比較するとき、 まず正例・負例のスコア分布を箱ひげ図で並べると、 「どのモデルがどれだけクラスを分離しているか」が一目で分かる。 中央値の差が大きく、 箱の重なりが小さい方が AUC が高くなる。 これは AUC が「ペアワイズ順位」の指標であることの直接的な視覚表現と言える。
AUC は同じ値を複数の数式で表現できる珍しい指標である。 それぞれの表現は AUC の異なる側面を強調するため、 すべて押さえておくと「ROC 曲線・順位統計量・確率解釈・Wilcoxon 検定」を縦断的に理解できる。
これらはすべて数学的に同値であり、 同じ値を返す。 重要なのは「AUC は順位統計量である」という性質で、 スコアの絶対値ではなく順序のみに依存するため、 確率キャリブレーションが崩れていても順序が正しければ AUC は高くなる。 逆に言うと、 AUC が高くてもキャリブレーションが悪い可能性があり、 リスク値そのものを使う応用(保険料計算、 医療リスクスコア)では別途キャリブレーション評価(Brier スコア、 信頼性曲線、 期待較正誤差 ECE)が必要になる。
このコードでやること:SSDSE-B-2026(2023 年度)の都道府県データから「総人口(A1101)100 万人以上か否か」という二値ターゲットを作り、 「出生数(A4101)の対数」を予測スコアと見立てて AUC を計算する。 さらに、 年少人口(A1301)をスコアにした場合・無関係なノイズをスコアにした場合に AUC がどう変化するかを確認する。
📥 入力データ(SSDSE-B-2026 抜粋):1 行目に列コード見出し(先頭列名は SSDSE-B-2026=年度)、 2 行目に和文列名がある CSV。 主要列は A1101(総人口)・A4101(出生数)・A1301(15 歳未満人口)などで、 47 都道府県 × 各年度の行データを持つ。
📤 実行例(このページのコードを実 CSV と組み合わせて動かした結果):
💬 結果の読み方:出生数の対数を「総人口 100 万人超か」の予測スコアにすると AUC=0.997 と非常に高い。 これは出生数が人口規模と強く相関しているためで、 「人口の大きい県ほど出生数も多い」という単調関係がほぼ崩れない。 さらに年少人口(15 歳未満人口)は総人口とほぼ比例するため AUC=1.000(完全分離)に達する。 一方、 無関係なノイズスコアでは AUC=0.605 となり、 期待値 0.5(ランダム識別)付近に落ちる。 ノイズが 0.5 ちょうどにならないのは、 サンプルが 47 件・正負比 37:10 と小さく偏っているため、 1 回の乱数引きでは 0.5 の周りに大きくばらつくからで、 乱数シードを変えて平均すれば 0.5 に近づく。 ここから「AUC=0.5 はチャンスレベル、 AUC=1.0 は完全分離」という基準が SSDSE で実証できる。
| 指標 | 何を測るか | 閾値依存 | 不均衡耐性 | 使いどころ |
|---|---|---|---|---|
| AUC(ROC) | 順位の正解率 | 非依存 | 中 | モデル間比較・閾値未定の段階 |
| PR-AUC | Precision-Recall 面積 | 非依存 | 高 | 極端不均衡(陽性 1% 以下) |
| Accuracy | 単純正解率 | 依存 | 低 | クラスが均衡している場合のみ |
| F1 | Precision・Recall の調和平均 | 依存 | 中 | 陽性側を重視するタスク |
| Log Loss | 確率の対数尤度損失 | 非依存 | 中 | 確率キャリブレーション重視 |
| Brier | 確率と実測の二乗誤差 | 非依存 | 中 | 確率値そのものを使う応用 |
AUC 単独で評価を終えるのは危険で、 実務では PR-AUC・F1・Log Loss・Brier の最低 2-3 指標を併走させる。 特に医療や金融など「予測確率の値そのもの」が意思決定に直結するドメインでは、 AUC ではなく Brier や較正曲線が主役になる場面が多い。
場面 1:医療スクリーニング。 ある疾患の有病率が 1% の集団で、 検査スコアの AUC が 0.92 だったとする。 これは「ランダムに選んだ患者の検査スコア>ランダムに選んだ非患者のスコア」となる確率が 92% という意味で、 検査の識別力としては優秀。 ただし閾値を下げて再現率を上げると偽陽性が大量発生するため、 実際には PPV(陽性的中率)と組み合わせて閾値を決める必要がある。 AUC が高い=即実用、 とはならない例。
場面 2:詐欺検知。 数百万件の取引のうち 0.05% が詐欺という極端な不均衡で、 AUC=0.97 と報告された。 一見素晴らしいが、 PR-AUC を見ると 0.18 しかない。 これは「閾値を絞ると Precision が極端に低くなる」状態で、 オペレーターが調査する案件 1000 件のうち真の詐欺が 180 件しかいない計算になる。 不均衡データでは AUC が楽観的に見える典型例。
場面 3:マーケティング応答予測。 ターゲット顧客リストを AUC 順に並べ、 上位 10% にダイレクトメールを送るキャンペーン。 ここでは AUC は「リストの順序の正しさ」を直接表すため、 AUC=0.75 なら上位 10% で応答率が 3-5 倍になることが期待できる。 この場合は AUC が業務 KPI と直結する珍しいケース。
AUC は点推定値だけで報告すると過信を招くため、 bootstrap で 95% 信頼区間を計算するのが実務の標準。 また、 2 モデルの AUC 差の有意性は DeLong 検定(相関 ROC 曲線比較)で評価する。 sklearn 単体には DeLong 検定が無いため、 `scipy.stats` や `roc_comparison` などの追加ライブラリを使うか、 bootstrap で AUC 差の信頼区間を出す方法が一般的。
具体的な手順:(1) 評価データを正例・負例別に層化サンプリングで bootstrap、 (2) 各 bootstrap サンプルで AUC を計算、 (3) 1000 回繰り返して AUC 分布から 2.5 / 97.5 パーセンタイルを取り 95% CI を得る。 サンプルサイズが小さいほど CI は広くなり、 正例 30 件・負例 100 件で AUC=0.85 なら 95% CI が [0.74, 0.92] 程度になることも珍しくない。 これを知らずに「AUC 0.85 vs 0.82 だから A の方が良い」と結論すると、 統計的にはほぼ差が無い可能性が高い。
AUC は二値分類のランキング指標だが、 検索・推薦の文脈では NDCG(Normalized Discounted Cumulative Gain)や MRR(Mean Reciprocal Rank)が使われる。 違いは「AUC は全ペアを均等に評価」「NDCG は上位の順位ほど重みが大きい(対数割引)」という点。 上位 10 件しかユーザーに見せない検索アプリでは NDCG@10 の方が実態に即している。 AUC は「全閾値・全順位を平均化」するため、 「上位を間違えても下位が正しければ高くなる」性質があり、 検索品質の指標としては鈍感すぎる場合がある。
AUC を「上位重視」に改造した指標として「部分 AUC(pAUC)」がある。 これは FPR を 0 から 0.1 までの範囲だけで ROC 曲線下面積を取る方法で、 「ほぼ偽陽性を許さない用途」(医療スクリーニング、 セキュリティ警告)に適する。 pAUC は sklearn の `roc_auc_score(..., max_fpr=0.1)` で計算可能。
AUC は U 統計量と等価であり、 U 統計量は順位データの相関を測る Wilcoxon-Mann-Whitney 検定の統計量である。 一方、 スピアマン順位相関係数も順位データの単調関係を測る。 両者は「順位の一致度を測る」という共通点を持ち、 二値ターゲットの場合 AUC とスピアマン相関には $\text{AUC} = 0.5 + 0.5 \cdot r_s \cdot \sqrt{p(1-p)} / \sigma$ のような近似関係が成立する。 つまり AUC は「二値ターゲットに対する順位相関の一種」と理解でき、 連続ターゲットでの相関係数の二値拡張版という見方ができる。
この関係は、 連続スコアの予測モデル評価で 相関係数 を使うのと同じ感覚で、 二値分類の評価に AUC を使ってよい根拠を与える。 ただし、 相関係数は対称(X と Y を入れ替えても同じ)だが、 AUC は「正例スコア > 負例スコア」の方向性を持つため、 0 から 1 の範囲で「0.5 が無情報」になる点で異なる。
AUC は実装によって計算方法が異なる。 sklearn は台形近似で計算するため、 ROC 曲線が階段関数のときに微小な誤差が出る。 R の `pROC` パッケージは順位和ベースで厳密計算する。 BigQuery などの SQL では `ML.ROC_CURVE` 関数で TPR/FPR を出してから自前で台形和を取る必要がある。 また、 LightGBM・XGBoost の `metric=auc` は内部的に厳密計算しているが、 学習中の AUC は「葉重みの順位」で計算されるため、 予測確率の AUC とは微妙にズレることがある。
大規模データ(1 億件以上)では AUC の厳密計算は O(N log N) でも重くなるため、 近似手法(HyperLogLog 風のサンプリング AUC、 ヒストグラム AUC)が使われることもある。 ただし誤差を 0.001 以内に抑えるには十分なサンプリングが必要で、 中小規模なら厳密計算で問題ない。
以下の問いに即答できれば、 AUC を業務で使う基礎力は十分。 詰まった項目は本ページの該当節(番号でリンク)に戻って復習しよう。
業務で AUC を扱うと、 「上司・顧客・査読者」から繰り返し聞かれる質問パターンがある。 以下は実務頻出の 20 問を、 短くても本質を外さない解答で並べたもの。 教育用ハンズオン教材として、 そのまま勉強会の Q&A 集としても使える。
ROC 曲線および AUC の起源は、 第二次世界大戦中の英米軍におけるレーダー信号処理研究にある。 当時のオペレーターは「画面上の信号が本物の敵機か、 ノイズ(鳥・雲・電波干渉)か」を瞬時に判断する必要があり、 閾値を上げれば見落としが増え、 下げれば誤警報が増えるというトレードオフに直面していた。 そこで Peterson らが信号検出理論(Signal Detection Theory, SDT)として体系化し、 真陽性率(hit rate)と偽陽性率(false alarm rate)の組を 2 次元平面にプロットしたものを Receiver Operating Characteristic(ROC、 受信者動作特性)と名付けた。 これがレーダー以外の応用に広がる転機は 1970 年代の医療診断研究で、 X 線・心電図・血液検査などの「閾値で陽性陰性を判定する検査」の性能評価指標として ROC 曲線が急速に普及した。
1980 年代以降、 Hanley と McNeil による AUC の統計的性質の整備(標準誤差・信頼区間・2 曲線比較)、 DeLong らによる相関 ROC の検定法の提案により、 AUC は医療診断統計の中心指標として定着した。 1990 年代後半に機械学習コミュニティが医療指標に注目し、 Provost と Fawcett らが「クラス分布が変動する環境では Accuracy より AUC の方が頑健」と論じた論文をきっかけに、 機械学習の標準指標として急速に採用された。 21 世紀に入ってからは KDD・Kaggle 等のコンペティションで AUC(特に PR-AUC・LogLoss と並んで)が標準評価指標となり、 現在は scikit-learn・LightGBM・XGBoost・TensorFlow・PyTorch のすべてに `auc` メトリックが組み込まれている。
21 世紀の機械学習で AUC がここまで重宝される理由は 3 つに整理できる。 第一に「閾値非依存性」。 機械学習プロジェクトの初期段階では適切な閾値がまだ決まっていないことが多く、 AUC は「閾値を決める前にモデル間を比較できる」唯一の指標。 第二に「クラス比に対する一定の頑健性」。 完全に頑健ではないが、 Accuracy のように多数派クラスに引きずられない。 第三に「直感的解釈可能性」。 「ランダムに選んだ正例 vs 負例で正しく順位付けする確率」という確率的解釈が、 ビジネスサイドの非専門家にも説明しやすい。 これらの理由から AUC はモデル評価のデファクトスタンダードとなっているが、 「単独で使うな、 業務 KPI と必ず併走させよ」という現代の鉄則は変わらない。
AUC が「順位の正解率」であることは Mann-Whitney U 統計量との等価性から導かれる。 Mann-Whitney U は、 2 つの独立サンプル $X_1, ..., X_{n_+}$(正例スコア)と $Y_1, ..., Y_{n_-}$(負例スコア)について、 「$X_i > Y_j$ となるペア数」を数えた統計量である。 同点は 0.5 として扱う。 この U を最大可能ペア数 $n_+ \cdot n_-$ で割ると AUC になる。 この関係は AUC が単なる面積ではなく、 順位データの非パラメトリック統計量であることを意味する。 つまり、 AUC の有意性検定は Mann-Whitney U 検定(または同等の Wilcoxon 順位和検定)で行える。 SciPy では `scipy.stats.mannwhitneyu(positives, negatives)` の戻り値 U を $n_+ n_-$ で割ると AUC が得られる。 この同値性により、 AUC は順位だけが分かれば計算できるため、 元のスコアの単位や絶対値、 単調変換に対して不変という非常に強い性質を持つ。
確率的解釈の側面では、 AUC は「正例と負例の累積分布関数 $F_+$ と $F_-$ について、 $\int F_-(t)\, dF_+(t)$」という積分で書ける。 これは「正例分布から取ったサンプル $s_+$ に対して、 負例分布の CDF $F_-$ が返す値」を期待値で集計する量で、 「正例より低い確率を持つ負例の割合」の平均を意味する。 言い換えると、 AUC は「すべての正例について、 それより小さい負例の割合」を平均したものに等しい。 この見方は AUC の確率的本質を最もシンプルに表現する。
AUC は微分不可能な指標(順位は微分できない)なので、 直接最大化するには工夫が要る。 実務で使われる 5 つのアプローチを紹介する。
実務では「Logistic 回帰や勾配ブースティングを Logistic 損失で学習し、 結果として AUC を評価する」のが最も普及した方法。 ただしクラス不均衡が極端な場合や、 上位 K 件の精度が重要な検索・推薦タスクでは、 LambdaRank やペアワイズ損失が AUC の改善に直接効くことがある。
SSDSE-B-2026 は都道府県別の社会・人口統計データだが、 これを使って AUC を学ぶシナリオは複数考えられる。 (1) 「総人口(A1101)100 万人以上か」を二値ターゲットに、 出生数(A4101)・年少人口(A1301)などの規模指標で予測する場合の AUC。 (2) 「高齢化率(A1303/A1101)30% 以上か」を二値ターゲットに、 合計特殊出生率(A4103)・消費支出(L3221)などで予測する場合の AUC。 (3) 「合計特殊出生率(A4103)が全国中央値以上か」を二値ターゲットに、 年齢構成・年平均気温(B4101)などで予測する場合の AUC。 規模指標どうしを使う (1) では AUC は 0.9 以上になりやすい一方、 (3) のように弱い相関の特徴では 0.6〜0.7 にとどまることも多く、 「特徴とターゲットの相関の強さ」が AUC を直接左右することが分かる。
特に重要なのは「変数を 1 つずつ追加していくと AUC がどう上がるか」を実演することで、 学習者は「特徴量追加の限界効用」「相関が強い特徴を追加しても AUC はそれほど上がらない」「弱い相関でも独立な特徴は AUC を押し上げる」といった機械学習の本質的な性質を体感できる。 SSDSE は 47 サンプルしか無いため、 過学習の危険性も学べる教材として優秀である。
本ページを最後まで読んだ学習者向けに、 AUC を業務で使うための要点を 12 項目に圧縮する。 各項目はクリック可能なアンカーで該当節に戻れるよう設計してあるので、 復習時の索引としても活用してほしい。 AUC は「面積」という見た目の単純さに反して、 順位統計量・確率解釈・多クラス拡張・部分 AUC・キャリブレーション分離など、 多くの数学的・実務的論点を含む奥深い指標である。 単独で使うのではなく、 PR-AUC・F1・Log Loss・Brier などと組み合わせて、 ビジネス文脈に合わせた評価フレームワークを構築することが、 機械学習エンジニアの中級者から上級者へのステップアップに必須である。
AUC を学んだ次は、 PR-AUC、 Brier スコア、 較正曲線、 期待損失最小化、 コスト感受性学習へと評価指標の理解を広げていくと、 機械学習プロジェクトのライフサイクル全体を見通せる視野が手に入る。 各指標は「同じモデルに違う物差しを当てる行為」であり、 複数の物差しが一致するかどうかが「本当に良いモデル」の証になる。 単一指標で意思決定する習慣を捨て、 複数指標と業務 KPI の合議でモデルを選定する文化を組織に根付かせることが、 データサイエンス成熟度の中核である。 本ページの議論をスタート地点として、 評価指標の世界をさらに深く探求してほしい。 AUC は「面積以上の意味」を持つ深い指標であり、 その本質を理解した先には、 機械学習プロジェクト全体の評価設計力という大きな成果が待っている。 さらに学習を進めると、 評価フレームワークそのものを設計する立場に到達できる。
クラス数が 3 以上のマルチクラス分類で AUC を計算するとき、 「どの 2 クラスを正例 vs 負例として扱うか」によって複数の流儀がある。 sklearn の `roc_auc_score` では `multi_class='ovr'` または `'ovo'`、 `average='macro'` または `'weighted'`(micro は一部組み合わせのみ)が選べる。 OvR(One-vs-Rest)はクラス k vs それ以外という K 個の二値問題を作り平均化、 OvO(One-vs-One)は全 $\binom{K}{2}$ ペアで二値 AUC を計算して平均化する流儀。 OvR は計算が軽くクラス数が多くてもスケールするが、 クラス不均衡があると多数派クラスに引きずられる。 OvO はクラス対称性が高く不均衡に頑健だが、 計算量が $O(K^2)$ で増える。
macro 平均は各クラス AUC を単純平均、 micro 平均は全クラスの予測を結合した 1 つの巨大二値問題として AUC を計算、 weighted 平均は各クラス AUC をサンプル数で重み付け平均する。 macro は希少クラスを重視、 weighted は多数派クラスを重視、 micro は全体最適という性格。 報告書では「OvR macro AUC = 0.85、 OvR weighted AUC = 0.88、 OvO macro AUC = 0.83」のように複数値を併記し、 ビジネス文脈に応じて意思決定するのが堅実。 たとえば「希少疾患を見逃さない」用途なら macro、 「全体スループット最適化」なら micro が適する。
陽性群(実際に病気・不正など)と陰性群(正常)の 2 つのスコア分布は、 モデルの識別力が高いほど左右に離れ、 識別力が無いほど重なる。 下の 分離度スライダー を動かすと、 右の 2 分布が離れたり重なったりし、 それに連動して 左の ROC 曲線 と、 その下の面積である AUC がリアルタイムに計算される。 しきい値 を動かす(または右の分布グラフを直接ドラッグ/タップ)と、 現在のしきい値・真陽性率 (TPR)・偽陽性率 (FPR) が ROC 上の 1 点として示される。 分離度を上げると AUC → 1、 完全に重ねると AUC → 0.5(=コイン投げと同等)になる様子を体感してほしい。
「Pr(陽性 > 陰性)」は、 ランダムに選んだ陽性サンプルのスコアが、 ランダムに選んだ陰性サンプルより高い確率。 これが AUC と(数学的に)一致する — つまり AUC は「順位づけがどれだけ正しいか」を測る指標である。 台形公式で ROC 下面積を積分した値(左のカード)と、 正規分布から解析的に求めた順位確率(右のカード)がほぼ一致することを確認できる。
AUC が測るのは 絶対的なスコアの正確さではなく 順位(ランキング)の正しさである。 全陽性を全陰性より少しでも高くスコアできれば、 スコアの絶対値がどれだけズレていても AUC = 1.0 になる。 逆に言えば、 AUC が高くても「予測確率 0.9 が本当に 90% を意味するか」(=混同行列や校正の話)は保証されない。 上の実験で分離度を上げると、 2 分布の重なり面積が減り、 ROC 曲線が左上の角へ張り出し、 面積 AUC が 1 に近づく。 これが「識別力が高い=順位で綺麗に分けられる」という意味である。
AUC は陽性・陰性を それぞれの群の内部で正規化した TPR・FPR で描くため、 クラス比率が極端に偏っても値がほとんど動かない。 一見「不均衡に強い」利点だが、 これは裏を返せば 「陽性が 0.1% しかいない」現実の運用感覚を隠してしまうという落とし穴でもある。 陽性 0.1%・AUC 0.95 のモデルでも、 実際に陽性と予測したものの大半が陰性(適合率が低い)ということが起こりうる。 このような 強い不均衡で「陽性を当てにいく」用途では、 横軸を FPR ではなく再現率(Recall)、 縦軸を適合率(Precision)とした PR 曲線の下面積 PR-AUC(Average Precision)の方が、 実運用の痛みを素直に反映する。 目安: 陽性割合が数 % 以下、 かつ「陽性の取りこぼし・空振り」のコストが問題になるなら PR-AUC を主指標、 AUC は補助として併記する。 上の実験でしきい値だけを動かすと ROC 上の 1 点は動くが AUC 自体(曲線全体の面積)は変わらないことにも注目してほしい — AUC は閾値非依存だが、 実運用の性能は選んだしきい値で決まる。
※ この実験の 2 分布は、 概念理解のために生成した等分散正規分布(陰性群 平均0・陽性群 平均=分離度, 標準偏差1)です。 SSDSE 等の実測データではなく、 AUC の挙動を体感するための合成例です。
「AUC」の典型的失敗パターン 10 件:
理解度確認 15 問:
「AUC」の主要事項を 1 ページで:
| 定義 | ROC 曲線下面積 = Pr(score_pos > score_neg) |
|---|---|
| 値域 | 0.0–1.0 (0.5 = ランダム) |
| 計算 | scikit-learn roc_auc_score(y, score) |
| CI | Bootstrap 1000 回 / DeLong |
| 比較 | DeLong test (paired) / Permutation |
| 不均衡対応 | PR-AUC 併用 / Macro AUC |
| マルチクラス | OvR / OvO / micro / macro / weighted |
| 基準値 | 医療画像 ≥0.95 / 与信 ≥0.80 / マーケ ≥0.65 |
| 併用指標 | Brier / Calibration / Lift / Gini |
| 最適化 | RankNet / LambdaRank / Pairwise loss |
「AUC」について世間によくある誤解と訂正:
「AUC」を実務でフル運用するための 100 のアクション項目:
「AUC」が他のデータサイエンス分野とどう関係するか:
| 関連分野 | 関連性・接点 |
|---|---|
| 統計学・記述統計 | 平均・分散・相関・回帰 - 本概念の基礎 |
| 確率論 | ベルヌーイ・正規・ベイズ - 不確実性の数理 |
| 仮説検定 | t/χ²/F/ANOVA - 統計的判断 |
| 回帰分析 | OLS/Logit/Ridge/Lasso - 予測モデル |
| 分類問題 | Logistic/SVM/RF/XGB - 二値・多値判定 |
| クラスタリング | K-means/DBSCAN/階層 - 教師なし |
| 次元削減 | PCA/t-SNE/UMAP - 可視化・前処理 |
| 時系列 | ARIMA/Prophet/LSTM - 動的データ |
| ベイズ統計 | MCMC/変分推論 - 事後分布 |
| 因果推論 | DID/RD/IV/PSM - 介入効果 |
| 実験計画 | RBD/Latin/RSM/Taguchi - 効率的データ取得 |
| 機械学習 | 教師あり・教師なし・強化 - 自動化 |
| 深層学習 | CNN/RNN/Transformer - 表現学習 |
| 自然言語処理 | BERT/GPT/T5 - 言語理解 |
| コンピュータビジョン | ResNet/ViT/Stable Diffusion - 画像処理 |
| レコメンド | MF/NN/RL - 個別化推薦 |
| 情報検索 | TF-IDF/BM25/Embedding - 検索 |
| グラフ分析 | PageRank/GNN - ネットワーク |
| 最適化 | LP/QP/MILP/Convex - 計画問題 |
| シミュレーション | Monte Carlo/SDE - 確率的計算 |
| AI 倫理 | 公平性・透明性・説明責任 - 社会影響 |
| AI 規制 | EU AI Act/GDPR/NIST RMF - 法的義務 |
| MLOps | CI/CD/Monitoring - 運用基盤 |
| データ管理 | ETL/Data Lake/Warehouse - 基盤 |
| セキュリティ | Adversarial/Privacy/IDP - 防御 |
「AUC」を中心とした概念関係図 (実線=直接関連、 破線=対比関係):
中心の「AUC」から放射状に関連概念を配置。 実線は『包含・前提・並列』、 破線は『対比・差分』。 各ノードを順に学ぶことで「AUC」の文脈を立体的に把握できる。
AUC を理解する図表は 5 種類存在する。 それぞれの読み方:
| 図表名 | 縦軸 / 横軸 | 読み方 |
|---|---|---|
| ROC 曲線 | TPR / FPR | 左上隅 (0, 1) に近いほど良いモデル。 対角線 = ランダム。 |
| PR 曲線 | Precision / Recall | 右上隅 (1, 1) に近いほど良い。 不均衡データで重要。 |
| Calibration 曲線 | 実際比率 / 予測確率 | 対角線に近いほど予測確率が信頼可能。 |
| Lift Chart | Lift / 上位 % 集団 | 上位 10% で何倍の捕捉率かを示す。 マーケティングで使用。 |
| Score 分布 | 頻度 / 予測スコア | 正例・負例の分布の重なりが小さいほど高 AUC。 |
「AUC」を学ぶための必読 10 件:
「AUC」の歴史的展開:
AUC は二値分類の閾値非依存指標で、 「ランダムに選んだ正例と負例で、 モデルが正例により高い予測確率を与える確率」と等価 (Mann-Whitney U と同義)。
SSDSE-B-2026 で「過疎化都道府県の予測」を二値分類する場合、 47 サンプルなので AUC の信頼区間は広く、 ブートストラップで CI を出して報告すべき。
AUC を使うべきか別の指標にすべきかは「クラスバランス」「コスト非対称性」「閾値要否」の 3 軸で判定。
「AUC=0.85 だから良い」と単独で結論せず、 必ず PR-AUC・キャリブレーション (Brier Score)・業務閾値での Confusion Matrix を併記する。
🎨 直感(別角度):ROC-AUC は「全運用点(=全しきい値)を平均した順位力」で、 陰性を正しく退けた功績も点数になる。 一方 PR-AUC(Average Precision)は横軸 Recall・縦軸 Precision の曲線下面積で、 陽性側だけを見た「拾い上げの純度」を測る。 陰性が大多数を占める不均衡データでは、 ROC-AUC は「大量の陰性を退けた」分で高く出やすいのに対し、 PR-AUC はベースライン(=陽性率)から出発するため、 同じモデル・同じスコアでも両者の値は大きく食い違う。 この食い違いを SSDSE-B-2026(2023 年・47 都道府県)の実データで数値として体験する。
🎯 このコードでやること:総人口・出生数・転入者数の 3 特徴量で「超高齢化県(65 歳以上比率 > 35%)」を二値分類する。 これは 47 県中 6 県だけが陽性(陽性率 12.8%)の不均衡タスク。 6 分割の層化交差検証で out-of-fold スコアを作り、 ROC-AUC と PR-AUC を実測する。 比較用に、 同じ特徴量で「高齢化率 > 中央値」という均衡タスク(陽性率 48.9%)も測る。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import cross_val_predict, StratifiedKFold
from sklearn.metrics import roc_auc_score, average_precision_score
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
d = df[df['SSDSE-B-2026'] == 2023].copy() # 2023 年・47 都道府県
d['aging'] = d['A1303'] / d['A1101']
# 不均衡ターゲット: 超高齢化県 (65 歳以上比率 > 35%) → 6/47 = 12.8%
y = (d['aging'] > 0.35).astype(int).values
X = d[['A1101', 'A4101', 'A5101']].values # 総人口・出生数・転入者数
pipe = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000))
cv = StratifiedKFold(n_splits=6, shuffle=True, random_state=42)
score = cross_val_predict(pipe, X, y, cv=cv, method='predict_proba')[:, 1]
print(f'陽性率 = {y.mean():.3f}')
print(f'ROC-AUC = {roc_auc_score(y, score):.3f}')
print(f'PR-AUC (AP) = {average_precision_score(y, score):.3f}')
# 比較: 同じ特徴量で「高齢化率 > 中央値」(均衡, 陽性率 0.49) を予測
yb = (d['aging'] > d['aging'].median()).astype(int).values
sb = cross_val_predict(pipe, X, yb, cv=cv, method='predict_proba')[:, 1]
print(f'[均衡] ROC-AUC={roc_auc_score(yb, sb):.3f} PR-AUC={average_precision_score(yb, sb):.3f}') |
📤 実行すると次の出力が得られる(実 47 県データ):
💬 結果の読み方:不均衡タスクでは ROC-AUC=0.850 と「良好」に見えるが、 まったく同じスコアから計算した PR-AUC はわずか 0.487。 ROC-AUC の見かけの良さは陽性側の実力を過大評価している。 PR-AUC のベースライン(でたらめ予測)は陽性率そのものの 0.128 なので、 0.487 は「でたらめよりは明確に上」だが「ROC が示唆する 0.85 の水準ではない」と読む。 一方、 均衡タスクでは ROC-AUC=0.821 と PR-AUC=0.772 の差はごく小さい。 ROC-AUC と PR-AUC の乖離幅そのものが「不均衡がどれだけ評価を楽観化させているか」の温度計になる。
max_fpr)や 特異度固定時の感度で評価する。📝 より正確な分析:本節の数値は data/raw/SSDSE-B-2026.csv を cp932・skiprows=[1] で読み、 2023 年 47 県に絞った実測(scikit-learn の StratifiedKFold, random_state=42)。 ROC-AUC=0.850 と PR-AUC=0.487 は同一スコアから計算した同一モデルの評価であり、 食い違いはモデルの差ではなく指標の性質の差である。 乱数分割・ライブラリ版で小数第 2 位は多少動くが、 「不均衡ほど ROC-AUC と PR-AUC が乖離する」「均衡タスクでは両者が接近する(0.821 vs 0.772)」という定性的傾向は頑健。