医療統計や機械学習において、複数の予測モデルの性能を比較する際、ROC曲線(受信者動作特性曲線)を1つのグラフに重ねて描画することは、視覚的な評価において極めて重要である。
本記事では、Rの標準的なパッケージであるpROCを用い、1本から3本、さらにはそれ以上のROC曲線を同一グラフ上に描画する手順を詳説する。
ROC曲線の基礎知識
ROC曲線は、判別モデルの閾値を変化させた際の「感度(Sensitivity)」と「1-特異度(1-Specificity)」の軌跡をプロットしたものである。
- 縦軸(感度): 陽性のものを正しく陽性と判定する割合。
- 横軸(1-特異度): 陰性のものを誤って陽性と判定してしまう割合。
グラフが左上隅に近ければ近いほど、そのモデルは優秀である。この曲線の下側の面積をAUC(Area Under the Curve)と呼び、この値が1に近いほど高精度であることを意味する。
事前準備:パッケージのインストール
ROC曲線を扱うための強力なパッケージ pROC をインストールして読み込む。
# パッケージのインストール(初回のみ)
install.packages("pROC")
# ライブラリの読み込み
library(pROC)
今回は、パッケージに付属している練習用データ aSAH(くも膜下出血のデータ)を使い、3つの予測指標(s100b, ndka, wfns)を比較する。
基本:ROC曲線を1本だけ書く
まずは基本の1本である。roc() 関数でデータを計算し、plot() で描画する。
# データの準備(例:s100bという指標で結果を予測)
data(aSAH)
roc1 <- roc(aSAH$outcome, aSAH$s100b)
# 描画
plot(roc1, col="blue", main="ROC曲線")

※ ここでは、roc() 関数でROCオブジェクトを作成し、それを plot() に渡すという基本の流れを理解することが肝要である。
応用:2本のROC曲線を重ねる
2本目を重ねる際のポイントは、2回目のplot関数で add = TRUE という引数を追加することである。
# 2本目の計算(ndkaという別の指標)
roc2 <- roc(aSAH$outcome, aSAH$ndka)
# 1本目を描画(凡例のために少し余白を意識)
plot(roc1, col="blue", main="ROC曲線の比較")
# 2本目を重ねる
plot(roc2, col="red", add = TRUE)

※ add = TRUE を指定することで、新しいグラフを作成するのではなく、現在表示されているグラフの上に重ね書きを行う。これを忘れると、1本目のグラフが消えて新しいグラフに上書きされてしまうため注意が必要である。
本題:3本以上のROC曲線を1つにまとめる
3本以上になっても、基本は「2本目以降に add = TRUE を繰り返す」だけである。最後に凡例(Legend)を付け、どの色がどのモデルに対応するかを明示する。
# 3本のデータを準備
roc1 <- roc(aSAH$outcome, aSAH$s100b)
roc2 <- roc(aSAH$outcome, aSAH$ndka)
roc3 <- roc(aSAH$outcome, aSAH$wfns)
# 1本目:グラフの枠組みと最初の曲線を作成
plot(roc1, col="blue", lwd=2, main="3つのモデル比較")
# 2本目以降を重ねる
plot(roc2, col="red", lwd=2, add=TRUE)
plot(roc3, col="green", lwd=2, add=TRUE)
# 凡例を追加して分かりやすく
legend("bottomright",
legend = c("S100B", "NDKA", "WFNS"),
col = c("blue", "red", "green"),
lwd = 2)

さらに見栄えを良くするコツ
実務や論文に掲載する場合、視認性を高めるために以下の設定を推奨する。
- AUCを表示する:
print.auc = TRUEを使うと、グラフ内に数値を表示できる。 - 線を太くする:
lwd = 2などで視認性を向上させる(上記ですでに組み込み済み)。 - 格子線を入れる:
grid = TRUEで値が読み取りやすくなる。
# 数値表示を含めた例
plot(roc1, col="blue", lwd=2, print.auc=TRUE, print.auc.y=0.3, grid=TRUE, main="3つのモデル比較")
plot(roc2, col="red", lwd=2, print.auc=TRUE, print.auc.y=0.2, add=TRUE)
plot(roc3, col="green", lwd=2, print.auc=TRUE, print.auc.y=0.4, add=TRUE)
※ print.auc.y は、AUCの数値が重ならないよう表示する高さを調整するための引数である。

まとめ
Rで複数のROC曲線を1つのグラフにまとめる手順は以下の通りである。
roc()で各モデルのデータ(ROCオブジェクト)を作成する。- 1本目を
plot()関数で描画する。 - 2本目以降は
add = TRUEを付加してplot()を実行する。 legend()で凡例を添える。
これにより、複数の手法の性能差をひと目で比較できる。解析の目的に応じて、色の使い分けやAUC値の表示を組み合わせて活用していただきたい。
おすすめ書籍
誰も教えてくれなかった 医療統計の使い分け〜迷いやすい解析手法の選び方が,Rで実感しながらわかる!




コメント