Chapter 4 곡선아래면적(AUC) 구하기
4.1 간단한 예제에서 AUC 구하기
곡선아래면적(area uner curve)은 그야말로 곡선아래 면적이다. 전체 사각형의 가로축이 0-1 까지이고 세로축도 0-1까지이므로 사각형의 전체면적은 1이다. 이중 곡선아래 면적의 계산에는 약간의 산수가 필요하다. 쉽게 이해하기 위해 다음과 같은 데이터를 생각해보자.
이 데이터에서 x를 예측변수로, y를 종속변수로 하여 ROC 곡선을 그리려면 다음과 같이 할수 있다.
df=calSens(x,y)
df=df[order(df$x,decreasing=TRUE),]
ggplot(data=df,aes(x=fpr,y=sens))+
geom_point(col="red")+geom_line(col="red")
ROC 곡선 아래의 면적을 계산하기 위해 x축인 위양성률과 y축인 민감도의 지연차분을 계산해 곱함으로써 먼저 아래 그림의 노란색 사각형부분을 계산한다. 이후 보라색 삼각형부분을 계산한다.
df=df[order(df$x,decreasing=TRUE),]
df$FPR=df$fpr
df$TPR=df$sens
df$dFPR <- c(diff(df$FPR), 0)
df$dTPR <- c(diff(df$TPR), 0)
ggplot(data=df,aes(x=FPR,y=TPR))+
geom_rect(aes(xmin=FPR,ymin=0,xmax=FPR+dFPR,ymax=TPR),color="grey30",fill="cornsilk",alpha=0.5)+
geom_point(col="red")+geom_line(col="red")+annotate("text",x=0.4,y=0.9,label="sum(TPR * dFPR)",size=5)
ggplot(data=df,aes(x=FPR,y=TPR))+
geom_rect(aes(xmin=FPR,ymin=TPR,xmax=FPR+dFPR,ymax=TPR+dTPR),fill="blue",color="blue",alpha=0.5)+
geom_point(col="red")+geom_line(col="red")+annotate("text",x=0.4,y=0.9,label="sum(dTPR * dFPR)",size=5)
노란색 사각형부분은 sum(TPR * dFPR)로 계산할 수 있고 보라색 사각형부분의 절반은 sum(dTPR * dFPR)/2로 계산하여 더해주면 된다. multipleROC패키지의 simpleAUC()함수는 다음과 같이 전체 면적을 계산한다.
simpleAUC=function(df){
df=df[order(df$x,decreasing=TRUE),]
TPR=df$sens
FPR=df$fpr
dFPR <- c(diff(FPR), 0)
dTPR <- c(diff(TPR), 0)
sum(TPR * dFPR) + sum(dTPR * dFPR)/2
}
simpleAUC(df)
[1] 0.7083333
4.2 첫번째 ROC곡선 그림
첫번째 ROC 곡선 그림을 다시 살펴보자. 오른쪽 아래에 보면 곡선아래면적(area uner curve)와 p값이 표시되어 있다.
AUC값은 다음과 같이 구할 수 있다.
[1] 0.9510468
p값은 Wilcoxon Rank Sum test에서 나온 값으로 다음과 같다.
Wilcoxon rank sum test with continuity correction
data: radial$height and radial$male
W = 13110, p-value < 2.2e-16
alternative hypothesis: true location shift is not equal to 0
4.2.1 pROC::roc 객체로 변환
multipleROC함수로 만든 mulitpleROC 클래스의 객체는 multipleROC2roc() 함수를 사용하여 pROC::roc 객체로 변환할 수 있다. 변환된 객체의 AUC 값을 위에서 계산한 값과 비교해보면 같다는 것을 알 수 있다.
class(x)
multipleROC2roc=function(x){
pROC::roc(x$fit$y,x$fit$fitted.values,ci=T)
}
x2 <- multipleROC2roc(x)
class(x2)
x2$auc
[1] "multipleROC"
[1] "roc"
Area under the curve: 0.951