1. Qiita
  2. 投稿
  3. Python

【統計学】ROC曲線とは何か、アニメーションで理解する。

  • 185
    いいね
  • 3
    コメント
この記事は最終更新日から1年以上が経過しています。

統計学、パターン認識等で、ROC(Receiver Operating Characteristic;受信者動作特性)曲線という概念が出てきます。また、データ分析・予測のコンペティションサイトKaggleでも、提出されたアルゴリズムの識別性能評価にこのROC曲線に基づくAUC(Area Under the Curve)というものを使っています。(例えばココ

このROC曲線、ちょっとわかりにくいので、まとめてみました。また、アニメーションでグラフを動かしてイメージを付けるということもやってみます。

1. ROC曲線に至る前説

まず、例として横軸に健康な人と、とある病気の人のγ-GTPのデータがあったとします。
健康な人のγ-GTPは平均25, 標準偏差2の正規分布に従い分布しています。(下記図の青い曲線)
病気の人は平均30、標準偏差4の正規分布に従い分布しています。(下記の図の緑の曲線)
あくまで例なので、医学的根拠がない適当な数値なのでご注意ください!
グラフにすると下記のような関係になります。

ROC_explanation-compressor.png

このようなデータを持っているときに、γ-GTPの値でその人が健康なのか、病気なのかを識別したい、というような問題を考えます。
例えば、「γ-GTPが27以下の場合は健康、27以上の場合は病気」、と判断するという基準を設定するとします。

その時、上記のグラフに照らし合わせると青い線のうち、水色で塗りつぶされた割合つまり、γ-GTP=27の縦線より左の面積は約0.9となり、健康な人たちのグループのうち90%を正しく「健康」と判断し、残りの10%の達は実際は健康だけれども、「病気」と判断されますね。

同じく、緑の曲線、病気の人達のグループを考えるとγ-GTP=27の縦線より左の緑色の面積は約0.3、つまり30%の人達は、実際は病気にもかかわらず「健康」と判断されてしまいます。
また、残りの70%の人達は実際は病気で、判断結果も「病気」と正しく判断されます。

  判定結果
健康と判断 病気と判断
真の状態 健康な人グループ 真陽性 (90%) 偽陰性 (10%)
病気の人グループ 偽陽性 (30%) 真陰性 (70%)

なので、水色の面積(真陽性:健康な人を「健康」と判断)をなるべく大きくして、緑の面積(偽陽性:病気の人を「健康」と判断してしまう)を小さくすると、識別の性能が高いと言えます。

以上のデータからROC曲線を描くと下記のグラフになります。
これがどういうものかを、次項より説明していきます。
ROC_Curve-compressor.png

また、今回識別境界をx=27においていますが、これは最初のグラフの2つの分布を引き算したグラフをかいてみるとわかります。正しい判定(水色面積:健康な人を健康と判断)を増やし、誤った判断(病気の人を健康と判断)を少なくするので、水色の面積は+、緑色の面積はーとなるので、水色から緑を引いた曲線を書けば面積が最大のところは下記のとおりx=27のところということがわかります。

ROC_diff-compressor.png

2. ROC曲線の書き方

分布の密度関数、累積密度関数、ROC曲線、と3つのグラフの関係性からまず説明したいと思います。

1段目のグラフは先ほどの健康な人の分布と、病気の人のγ-GTPの値の分布です。
識別境界がγ-GTP=27の場合、水色の面積が真陽性の割合を表し0.09です。緑の面積が偽陽性の割合で0.280です。

その面積をグラフにしたのが2段目のグラフで、累積密度関数のグラフになっています。1段目の面積と2段目の点が連動しています。

で、3段目はというと、この真陽性=0.909と偽陽性=0.280を1つの点としてプロットしたものになっています。(0.280, 0.909)の点としてプロットしています。
ROC_exp.png
これをさらに分かりやすいようにアニメーションでグラフを書いてみます。この動いている縦線が識別境界を表しており、この線の左側は健康な人と判断、右側は病気の人と判断、というのは前項と同じです。3段目のグラフに着目すると、この動いている点それぞれに対して全てプロットして繋いだ時にできる曲線が3つ目のROC曲線になるのです。
ROC_curve5-compressor.gif

3. ROC曲線の形状の考察

このROC曲線は、2つの密度関数の重なりが少ないほど、形状が左上方向にシフトします。この重なりが少ないほど識別境界の性能が良くなります。この左上のシフト具合を曲線の面積(下記の図の水色の面積)で表しAUC(Area under the curve)と呼びます。下記の例はAUC=0.867953です。

ROC_auc-compressor.png

次のROC曲線の形状が、何によって変化するのかを見ていきます。

最初に、分布の形状が同じで、平均のみ異なる場合です。2つの曲線が完全に一致するときに、ROC曲線が直線になります。
ROC_curve9-2-compressor.gif

次に分布の形状が異なる場合です。完全に直線にはなりませんが、 2つの曲線同士が近づくとROC曲線が右下にシフトしていることがわかります。
ROC_curve_auc1-compressor.gif

あとは、健康な人のサンプル数を増やすと分散を下げることができますので、それによりAUCの値を良くすることも可能ですね。(対象とする分布が平均値等、標準偏差がサンプル数に反比例しているものであれば)

ROC_curve_auc4-compressor.gif

Pythonコード

今回のグラフを書いたPythonコードの一部をGistにアップしています。

参考

書籍
「はじめてのパターン認識」平井 有三