์ด์ง ๋ก์ง์คํฑ ํ๊ท ๋ชจ๋ธ์ ์์์ ์ผ๋ก ๊ณก์ ์๋ ๋ฉด์ (AUC) ๋๋ c- ํต๊ณ๋์ ๊ณ์ฐํ๋ ๋ฐ ๊ด์ฌ์ด ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ์ดํฐ ์งํฉ์์ ์ข ์ ๋ณ์์ ๋ํ ์ค์ ๊ฐ, ๋ณด์กด (1 = ์ ์ง; 0 = ์ ์ง๋์ง ์์)์ ๋ค์๊ณผ ๊ฐ์ ๋ชจํ์ ์ฌ์ฉํ์ฌ ํ๊ท ๋ถ์์ ์ํด ์์ฑ ๋ ๊ฐ ๊ด์ธก์น์ ์์ธก ๋ณด์กด ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋ จ ์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ฉ๋๋ค (0์์ 1๊น์ง).
์ ์ ์ด๊ธฐ ์๊ฐ์ โ์ ํํโ๋ชจ๋ธ ๋ถ๋ฅ ์๋ฅผ ์๋ณํ๊ณ โ์ ํํโ๊ด์ธก ์๋ฅผ ์ด ๊ด์ธก ์๋ก ๋๋์ด c- ํต๊ณ๋์ ๊ณ์ฐํ๋ ๊ฒ์ ๋๋ค. โ์ ํํโ๊ธฐ์ค, ๊ด์ธก์น์ ์ค์ ๋ณด์ ์ํ๊ฐ 1์ด๊ณ ์์ธก ๋ ๋ณด์ ์ํ๊ฐ> 0.5์ด๋ฉด โ์ ํํโ๋ถ๋ฅ์ ๋๋ค. ๋ํ ๊ด์ธก์น์ ์ค์ ๋ณด์ ์ํ = 0์ด๊ณ ์์ธก ๋ ๋ณด์ ์ํ๊ฐ <0.5 ์ธ ๊ฒฝ์ฐ โ์ ํํโ๋ถ๋ฅ์ด๊ธฐ๋ํฉ๋๋ค. ์์ธก ๊ฐ์ด 0.5 ์ผ ๋ โtieโ๊ฐ ๋ฐ์ํ๋ค๊ณ ๊ฐ์ ํ์ง๋ง ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ์ดํฐ ์ธํธ์์ ํด๋น ํ์์ด ๋ฐ์ํ์ง ์์ต๋๋ค. ๋ฐ๋ฉด, โ์ ํํ์ง ์์โ๋ถ๋ฅ๋ ๊ด์ธก์น์ ์ค์ ๋ณด์ ์ํ = 1์ด๊ณ ์์ธก ๋ ๋ณด์ ์ํ๊ฐ <0 ์ธ ๊ฒฝ์ฐ์ ๋๋ค. 5 ๋๋ ๊ฒฐ๊ณผ์ ์ค์ ๋ณด์กด ์ํ๊ฐ 0์ด๊ณ ์์ธก ๋ณด์กด ์ํ๊ฐ> 0.5 ์ธ ๊ฒฝ์ฐ. ๋๋ TP, FP, FN, TN์ ์๊ณ ์์ง๋ง์ด ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ฉด c ํต๊ณ๋ฅผ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ ์์ง ๋ชปํฉ๋๋ค.
๋ต๋ณ
Hanley โs & McNeil์ 1982 ๋ ๋ ผ๋ฌธ โ ROC (์์ ๊ธฐ ๋์ ํน์ฑ) ๊ณก์ ์๋ ์์ญ์ ์๋ฏธ์ ์ฌ์ฉ โ์ ์ถ์ฒํฉ๋๋ค.
์
๋ค์๊ณผ ๊ฐ์ ์ง๋ณ ์ํ ๋ฐ ๊ฒ์ฌ ๊ฒฐ๊ณผ ํ๊ฐ ์์ต๋๋ค (์ : ๋ฌผ๋ฅ ๋ชจ๋ธ์ ์์ ์ํ์ ํด๋น). ์ค๋ฅธ์ชฝ์ ์ฒซ ๋ฒ์งธ ์ซ์๋ ์ค์ ์ง๋ณ ์ํ๊ฐ โ์ ์โ์ธ ํ์์ ์์ด๊ณ ๋ ๋ฒ์งธ ์ซ์๋ ์ค์ ์ง๋ณ ์ํ๊ฐ โ๋น์ ์โ ์ธ ํ์์ ์์ ๋๋ค .
(1) ํ์คํ ์ ์ : 33/3
(2) ์๋ง ์ ์ : 6/2
(3) ์์ฌ์ค๋ฌ์ด : 6/2
(4) ์๋ง๋ ๋น์ ์ : 11/11
(5) ํ์คํ ๋น์ ์ : 2/33
๋ฐ๋ผ์ ์ด 58 ๋ช ์ โ์ ์์ ์ธโํ์์ โ51โ์ ๋น์ ์์ ์ธ ํ์๊ฐ ์์ต๋๋ค. ์์ธก ๋ณ์๊ฐ 1, โ์ ํํ ์ ์โ์ธ ๊ฒฝ์ฐ ํ์๋ ์ผ๋ฐ์ ์ผ๋ก ์ ์์ด๋ฉฐ (36 ๋ช ์ ํ์ ์ค 33 ๋ช ์ ๋ํด ์ฐธ), 5 ์ผ ๋ โํ์คํ ๋น์ ์์ ์ธโํ์๋ ์ผ๋ฐ์ ์ผ๋ก ๋น์ ์์ ๋๋ค ( 35 ๋ช ์ ํ์), ์์ธก์๊ฐ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ 2, 3 ๋๋ 4 ์ ์ ํ์๋ฅผ ์ด๋ป๊ฒ ํ๋จํด์ผํฉ๋๊น? ๊ฒฐ๊ณผ ๊ฒ์ฌ์ ๋ฏผ๊ฐ๋์ ํน์ด์ฑ์ ๊ฒฐ์ ํ๊ธฐ ์ํด ํ์๋ฅผ ๋น์ ์ ๋๋ ์ ์์ผ๋ก ํ๋จํ๊ธฐ ์ํด ์ปท์คํ๋ฅผ ์ค์ ํ์ต๋๋ค.
๊ฐ๋์ ํน์ด์ฑ
๋ค๋ฅธ ์ปท์คํ์ ๋ํ ์ถ์ ๊ฐ๋ ๋ฐ ํน์ด๋๋ฅผ ๊ณ์ฐํ ์ ์์ต๋๋ค . (์ด์ ๋ถํฐ๋ โ๋ฏผ๊ฐ๋โ์ โํน์ด์ฑโ์ ์์ฑํ์ฌ ๊ฐ์ ์ถ์ ํน์ฑ์ ์์ํฉ๋๋ค.)
๊ฒ์ฌ ๊ฒฐ๊ณผ์ ์๊ด์์ด ๋ชจ๋ ํ์๋ฅผ ๋น์ ์์ผ๋ก ๋ถ๋ฅํ๊ธฐ ์ํด ์ปท์คํ๋ฅผ ์ ํํ๋ฉด (์ฆ, ์ปท์คํ 1+๋ฅผ ์ ํํ๋๋ผ๋) ๊ฐ๋๋ 51/51 = 1์ด๋ฉ๋๋ค. ํน์ด๋๋ 0์ ๋๋ค. / 58 = 0. ์๋ฆฌ๊ฐ ์ ๋ค๋ฆฌ์ง ์์ต๋๋ค.
์ด์ ๋ ์๊ฒฉํ ์ปท์คํ๋ฅผ ์ ํํ๊ฒ ์ต๋๋ค. ๊ฒ์ฌ ๊ฒฐ๊ณผ๊ฐ 2 ์ด์์ธ ํ์ ๋ง ๋น์ ์์ผ๋ก ๋ถ๋ฅํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ 3 ๋ช ์ ๋น์ ์ ํ์๋ฅผ ๊ทธ๋ฆฌ์ํ๊ณ 48/51 = 0.94์ ๊ฐ๋๋ฅผ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ 33/58 = 0.57์ ํจ์ฌ ๋ ๋์ ํน์ด์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ด์ ๋ค์ํ ์ปท์คํ (3, 4, 5,> 5)๋ฅผ ์ ํํ์ฌ์ด ์์ ์ ๊ณ์ํ ์ ์์ต๋๋ค. (๋ง์ง๋ง์ผ๋ก, ์ฐ๋ฆฌ๋ ๊ฐ๋ฅํ ๊ฐ์ฅ ๋์ ์ํ ์ ์๊ฐ 5 ์ธ ๊ฒฝ์ฐ์๋ ํ์๋ฅผ ๋น์ ์์ผ๋ก ๋ถ๋ฅ ํ์ง ์์ต๋๋ค .)
ROC ๊ณก์
๊ฐ๋ฅํ ๋ชจ๋ ์ปท์คํ์ ๋ํด์ด ์์ ์ ์ํํ๊ณ 1์์ ํน์ด์ฑ์ ๋บ ๋ฏผ๊ฐ๋๋ฅผ ํ๋กฏํ๋ฉด ROC ๊ณก์ ์ด ๋ํ๋ฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ R ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
# Data
norm = rep(1:5, times=c(33,6,6,11,2))
abnorm = rep(1:5, times=c(3,2,2,11,33))
testres = c(abnorm,norm)
truestat = c(rep(1,length(abnorm)), rep(0,length(norm)))
# Summary table (Table I in the paper)
( tab=as.matrix(table(truestat, testres)) )
์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
testres
truestat 1 2 3 4 5
0 33 6 6 11 2
1 3 2 2 11 33
๋ค์ํ ํต๊ณ๋ฅผ ๊ณ์ฐํ ์ ์์ต๋๋ค.
( tot=colSums(tab) ) # Number of patients w/ each test result
( truepos=unname(rev(cumsum(rev(tab[2,])))) ) # Number of true positives
( falsepos=unname(rev(cumsum(rev(tab[1,])))) ) # Number of false positives
( totpos=sum(tab[2,]) ) # The total number of positives (one number)
( totneg=sum(tab[1,]) ) # The total number of negatives (one number)
(sens=truepos/totpos) # Sensitivity (fraction true positives)
(omspec=falsepos/totneg) # 1 โ specificity (false positives)
sens=c(sens,0); omspec=c(omspec,0) # Numbers when we classify all as normal
์ด๋ฅผ ์ฌ์ฉํ์ฌ (์ถ์ ) ROC ๊ณก์ ์ ๊ทธ๋ฆด ์ ์์ต๋๋ค.
plot(omspec, sens, type="b", xlim=c(0,1), ylim=c(0,1), lwd=2,
xlab="1 โ specificity", ylab="Sensitivity") # perhaps with xaxs="i"
grid()
abline(0,1, col="red", lty=2)
AUC ์๋ ๊ณ์ฐ
์ฌ๋ค๋ฆฌ๊ผด ๋ฉด์ ์ ๋ํ ๊ณต์์ ์ฌ์ฉํ์ฌ ROC ๊ณก์ ์๋ ๋ฉด์ ์ ๋งค์ฐ ์ฝ๊ฒ ๊ณ์ฐํ ์ ์์ต๋๋ค.
height = (sens[-1]+sens[-length(sens)])/2
width = -diff(omspec) # = diff(rev(omspec))
sum(height*width)
๊ฒฐ๊ณผ๋ 0.8931711์ ๋๋ค.
์ผ์น ์ธก์
AUC๋ ๋ํ ์ผ์น ์ธก์ ์ผ๋ก ๋ณผ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ฐ๋ฅํ ๊ฑธ๋ฆด ๊ฒฝ์ฐ ์ ํ๋๊ฐ ์ ์์ด๊ณ ๋ค๋ฅธ ํ๋๋ ๋น์ ์์ด๋ค ํ์๋ฅผ, ์ฐ๋ฆฌ๋ (๊ฐ์ฅ ๋์ (๊ฐ์ฅ โ๋น์ ์ ๋ณด์ด๋โ)์ ํ ์คํธ ๊ฒฐ๊ณผ๊ฐ ๋น์ ์ ํ๋ ๋น๋๋ฅผ ๊ณ์ฐํ ์ ์์ต๋๋ค ๊ทธ๋ค์ ๊ฐ์ ๊ฐ์ด์๋ ๊ฒฝ์ฐ, ์ฐ๋ฆฌ ์ด๊ฒ์ โ์น๋ฆฌ์ ์ ๋ฐโ์ผ๋ก ์ธ์ญ์์ค).
o = outer(abnorm, norm, "-")
mean((o>0) + .5*(o==0))
๋ต์ ๋ค์ ROC ๊ณก์ ์๋ ์ธ 0.8931711์ ๋๋ค. ํญ์ ๊ทธ๋ ์ต๋๋ค.
์ผ์น์ ๊ทธ๋ํฝ๋ณด๊ธฐ
Harrell์ด ๊ทธ์ ๋ต๋ณ์์ ์ง์ ํ๋ฏ์ด ์ด๊ฒ์ ๊ทธ๋ํฝ์ผ๋ก ํด์๋ฉ๋๋ค. y ์ถ ์ ๋ํ ํ ์คํธ ์ ์ (์ํ ์ถ์ ์น) ์ x ์ถ ์ ๋ํ ์ค์ ์ง๋ณ ์ํ (์ฌ๊ธฐ์ ์ฝ๊ฐ์ ์ง ํฐ๋ง์ด ์์)๋ฅผ ํ์ํฉ๋๋ค.
plot(jitter(truestat,.2), jitter(testres,.8), las=1,
xlab="True disease status", ylab="Test score")
์ด์ ์ผ์ชฝ์ ๊ฐ ์ง์ ( โ์ ์โํ์)๊ณผ ์ค๋ฅธ์ชฝ์ ๊ฐ ์ง์ ( โ๋น์ ์โํ์) ์ฌ์ด์ ์ ์ ๊ทธ๋ฆฌ๊ฒ ์ต๋๋ค. ์์ ๊ธฐ์ธ๊ธฐ๋ฅผ ๊ฐ์ง ์ ์ ๋น์จ (์ฆ, ์ผ์น ์ ์ ๋น์จ )์ ์ผ์น ์ง์ (ํํํ ์ ์ โ50 % ์ผ์น โ๋ก ๊ณ์ฐ)์ ๋๋ค.
๋์ ์ (๋์ผํ ์ํ ์ ์)๋ก ์ธํด์ด ์์ ์ ์ค์ ์ ์ ์๊ฐํํ๋ ๊ฒ์ ์ฝ๊ฐ ์ด๋ ต์ง๋ง ์ฝ๊ฐ์ ์ง ํฐ๋ง๊ณผ ํฌ๋ช ์ฑ์ ํตํด ํฉ๋ฆฌ์ ์ธ ํ๋กฏ์ ์ป์ ์ ์์ต๋๋ค.
d = cbind(x_norm=0, x_abnorm=1, expand.grid(y_norm=norm, y_abnorm=abnorm))
library(ggplot2)
ggplot(d, aes(x=x_norm, xend=x_abnorm, y=y_norm, yend=y_abnorm)) +
geom_segment(colour="#ff000006",
position=position_jitter(width=0, height=.1)) +
xlab("True disease status") + ylab("Test\nscore") +
theme_light() + theme(axis.title.y=element_text(angle=0))
์ฐ๋ฆฌ๋ ๋๋ถ๋ถ์ ์ ์ด ์์ชฝ์ผ๋ก ๊ธฐ์ธ์ด ์ง์ ๋ฐ๋ผ ์ผ์น ์ง์๊ฐ ๋์์ง ๊ฒ์ ๋๋ค. ๋ํ ๊ฐ ์ ํ์ ๊ด์ธก ์์์ ์ง์์ ๋ํ ๊ธฐ์ฌ๋๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋๋ถ๋ถ์ ์ํ ์ ์๊ฐ 1 ์ธ ์ ์ ํ์์ ์ํ ์ ์๊ฐ 5 (1-5 ์) ์ธ ๋น์ ์ ํ์์ ์ง์ ์ด๋ฃจ๊ณ ์์ง๋ง, 1-4 ์๊ณผ 4-5 ์์์๋ ์๋นํ ๋ง์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฒฝ์ฌ ์ ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค์ ์ผ์น ์ง์๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ ๋งค์ฐ ์ฝ์ต๋๋ค.
d = transform(d, slope=(y_norm-y_abnorm)/(x_norm-x_abnorm))
mean((d$slope > 0) + .5*(d$slope==0))
๋๋ต์ ๋ค์ 0.8931711, ์ฆ AUC์ ๋๋ค.
WilcoxonโMannโWhitney ํ ์คํธ
์ผ์น ์ธก์ ๊ณผ WilcoxonโMann-Whitney ํ ์คํธ ๊ฐ์๋ ๋ฐ์ ํ ๊ด๋ จ์ด ์์ต๋๋ค. ์ค์ ๋ก ํ์๋ ์ผ์น ํ๋ฅ (์ฆ, ๊ฐ์ฅ โ๋น์ ์์ ์ธโํ ์คํธ ๊ฒฐ๊ณผ ๋ฅผ ๊ฐ๋ ์์์ ์ ์-๋น์ ์ ์ ์์ ๋น์ ์ ํ์ ์์ ํ์ธ)์ด ์ ํํ 0.5์ธ์ง ํ ์คํธํฉ๋๋ค. ํ ์คํธ ํต๊ณ๋์ ์ถ์ ๋ ์ผ์น ์ฑ ํ๋ฅ ์ ๊ฐ๋จํ ๋ณํ ์ผ๋ฟ์ ๋๋ค.
> ( wi = wilcox.test(abnorm,norm) )
Wilcoxon rank sum test with continuity correction
data: abnorm and norm
W = 2642, p-value = 1.944e-13
alternative hypothesis: true location shift is not equal to 0
๊ฒ์ ํต๊ณ๋ ( W = 2642
)์ ์ผ์น ์์ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๊ฐ๋ฅํ ์์ ์๋ก ๋๋๋ฉด ๊ฐ์กฑ ์๊ฐ ์๊น๋๋ค.
w = wi$statistic
w/(length(abnorm)*length(norm))
์, ROC ๊ณก์ ์๋ ์ธ 0.8931711์ ๋๋ค.
๋ณด๋ค ์ฌ์ด AUC ๊ณ์ฐ ๋ฐฉ๋ฒ (R)
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ ์์ ์ ์ํด ์ธ์์ ๋ ํธํ๊ฒํฉ์๋ค. ์ฐ๋ฆฌ๋ฅผ ์ํด ์๋์ผ๋ก AUC๋ฅผ ๊ณ์ฐํ๋ ๋ค์ํ ํจํค์ง๊ฐ ์์ต๋๋ค.
Epi ํจํค์ง
์ด Epi
ํจํค์ง๋ ๋ค์ํ ํต๊ณ (AUC ํฌํจ)๊ฐ ํฌํจ ๋ ๋ฉ์ง ROC ๊ณก์ ์ ๋ง๋ญ๋๋ค.
library(Epi)
ROC(testres, truestat) # also try adding plot="sp"
pROC ํจํค์ง
pROC
ROC ์ถ์ ์น๋ฅผ ๋งค๋๋ฝ๊ฒ ํ ์ ์๊ณ (๋งค๋๋ฌ์ด ROC๋ฅผ ๊ธฐ๋ฐ์ผ๋ก AUC ์ถ์ ์น๋ฅผ ๊ณ์ฐํ ์ ์๊ธฐ ๋๋ฌธ์) ํจํค์ง ๋ ์ข์ํฉ๋๋ค .
(๋นจ๊ฐ์ ์ ์ ์๋ ROC์ด๊ณ ๊ฒ์ ์ ์ ์ ๋งค๋๋ฝ๊ฒ ๋ ROC์ ๋๋ค. ๊ธฐ๋ณธ 1 : 1 ์ข ํก๋น์ ์ ์ํ์ญ์์ค. ๊ฐ๋์ ํน์ด๋๋ ๋ชจ๋ 0-1 ๋ฒ์์ด๋ฏ๋ก์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.)
ํํ ROC ์ ์ถ์ AUC ๋ 0.9107์ด๋ฉฐ ํํ ROC์ AUC ์ ๋น์ทํ์ง๋ง ์ฝ๊ฐ ๋ ํฝ๋๋ค (๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ ๋ ํฐ์ง ์ฝ๊ฒ ์ ์ ์์ต๋๋ค). (์ค์ ๋ก AUC๋ฅผ ๊ณ์ฐํ ์์๋ ๊ณ ์ ํ ํ ์คํธ ๊ฒฐ๊ณผ ๊ฐ์ด ๋๋ฌด ์ ์ต๋๋ค).
rms ํจํค์ง
ํ๋ ์ rms
ํจํค์ง๋ ์ฌ์ฉํ์ฌ ๋ค์ํ ๊ด๋ จ ์ฉ์ด ์์ธ ํต๊ณ๋ฅผ ๊ณ์ฐํ ์ ์์ต๋๋ค rcorr.cens()
๊ธฐ๋ฅ. C Index
๊ทธ ์ถ๋ ฅ์ AUC์ด๋ค :
> library(rms)
> rcorr.cens(testres,truestat)[1]
C Index
0.8931711
caTools ํจํค์ง
๋ง์ง๋ง์ผ๋ก caTools
ํจํค์ง์ colAUC()
๊ธฐ๋ฅ์ด ์์ต๋๋ค. ๋๋ก๋ ๋์์ด ๋ ?colAUC
์ ์๋ ๋ค๋ฅธ ํจํค์ง (์ฃผ๋ก ์๋ ๋ฐ ๋ค์ฐจ์ ๋ฐ์ดํฐ ์์
๊ธฐ๋ฅ โ ์ฐธ์กฐ )์ ๋นํด ๋ช ๊ฐ์ง ์ฅ์ ์ด ์์ต๋๋ค . ๊ทธ๋ฌ๋ ๋ฌผ๋ก ์ฐ๋ฆฌ๊ฐ ๋ฐ๋ณตํด์ ๊ณ์ฐ ํ ๊ฒ๊ณผ ๊ฐ์ ๋๋ต์ ์ ๊ณตํฉ๋๋ค.
library(caTools)
colAUC(testres, truestat, plotROC=TRUE)
[,1]
0 vs. 1 0.8931711
๋ง์ง๋ง ๋จ์ด
๋ง์ ์ฌ๋๋ค์ด AUC๊ฐ ์ํ์ด ์ผ๋ง๋ โ์ข์โ์ง๋ฅผ ๋งํด ์ค๋ค๊ณ ์๊ฐํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ค ์ฌ๋๋ค์ AUC๊ฐ ๊ฒ์ฌ๊ฐ ํ์๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋ถ๋ฅ ํ ํ๋ฅ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์์ด๋ค ์์ต๋๋ค . ์์ ์์ ๊ณ์ฐ์์ ๋ณผ ์ ์๋ฏ์ด AUC๋ ๊ฐ๋ฅํ ๊ฐ ์ปท์คํ๋ง๋ค ํ๋์ฉ ํ ์คํธ ํจ๋ฐ๋ฆฌ ์ ๋ํด ์๋ ค์ค๋๋ค .
AUC๋ ์ค์ ๋ก ์ฌ์ฉํ์ง ์๋ ์ปท์คํ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ณ์ฐ๋ฉ๋๋ค. โ๋ฌด์๋ฏธํโ์ฐจ๋จ ๊ฐ์ ๋ฏผ๊ฐ๋์ ํน์ด์ฑ์ ๊ด์ฌ์ ๊ฐ์ ธ์ผํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ฌ์ ํ AUC๋ (๋ถ๋ถ์ ์ผ๋ก) ๊ธฐ๋ฐ์ ๋๋ค. (๋ฌผ๋ก AUC๊ฐ 1์ ๋งค์ฐ ๊ฐ๊น์ฐ๋ฉด ๊ฑฐ์ ๋ชจ๋ ๊ฐ๋ฅํ ํ ์คํธ์ ํฐ ์ฐจ๋ณ ๋ ฅ์ด ์์ผ๋ฉฐ, ์ฐ๋ฆฌ๋ ๋ชจ๋ ๋งค์ฐ ํ๋ณต ํ ๊ฒ์ ๋๋ค.)
AUC์ โ๋ฌด์์ ์ ์-๋น์ ์โํ์ด ํด์์ ํ๋ฅญํฉ๋๋ค (์๋ฅผ ๋ค์ด ์์กด ๋ชจ๋ธ๋ก ํ์ฅ ๋ ์ ์์ผ๋ฉฐ, ์ฌ๊ธฐ์ ๊ฐ์ฅ ๋์ (์๋) ์ํ์ด์๋ ์ฌ๋์ด ๊ฐ์ฅ ๋นจ๋ฆฌ ์ฌ๋งํ๋์ง ํ์ธ). ๊ทธ๋ฌ๋ ์ค์ ๋ก๋ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ํ๋๋ ๋๋ฌธ ๊ฒฝ์ฐ์ ๋๋ค ์๊ณ ํ๋๊ฐ ํ๋์ ๊ฑด๊ฐํ๊ณ ํ๋ , ์ํ ์ฌ๋์ ๋ณ ํ๋์ ๋๋ค ์ฌ๋์ ์๊ณ ํ์ง ์์ผ๋ฉฐ, ์น๋ฃํ๋ ๊ทธ๋ค์ ๊ฒฐ์ ํด์ผํฉ๋๋ค. (์ด์จ๋ ๊ฒฐ์ ์ ์ฌ์ฐ๋ฏ๋ก ์ถ์ ์ํ์ด ๊ฐ์ฅ ๋์ ๊ฒฐ์ ์ ์ฒ๋ฆฌํ์ญ์์ค.)
๋ฐ๋ผ์ ์ค์ ROC ๊ณก์ ์ ์ฐ๊ตฌํ๋ ๊ฒ์ด AUC ์์ฝ ์ธก์ ๋ฒ์ ๋ณด๋ ๊ฒ๋ณด๋ค ๋ ์ ์ฉ ํ๋ค๊ณ ์๊ฐ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ROC ๋ฅผ ์คํ (false positive) ๋ฐ ์คํ (false negative ) ๋น์ฉ (์ถ์ ์น) ๊ณผ ํจ๊ป ์ฐ๊ตฌ ๋์์ ๊ธฐ๋ณธ ์์จ๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ด๋๊ฐ์ ๊ฐ ์ ์์ต๋๋ค.
๋ํ AUC๋ ๊ต์ ์ด ์๋ ์ฐจ๋ณ ๋ง ์ธก์ ํฉ๋๋ค. ์ฆ, ์ํ ์ ์์ ๋ฐ๋ผ ๋ ์ฌ๋ (ํ ์ฌ๋๊ณผ ๊ฑด๊ฐํ ์ฌ๋)์ ๊ตฌ๋ณ ํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ์ธก์ ํฉ๋๋ค. ์ด๋ฅผ ์ํด ๊ด์ฌ ์๋ ์ ๋ ๊ฐ์ด ์๋ ์๋ ์ํ ๊ฐ (๋๋ ์ ์ฝ์จ-๋งจ-ํํธ๋ ํ ์คํธ ํด์ ์ฐธ์กฐ) ๋ง ์กฐ์ฌ ํฉ๋๋ค . ์๋ฅผ ๋ค์ด, ๊ฐ ์ํ์ ๋๋๋ ๊ฒฝ์ฐ ๋ก์ง์คํฑ ๋ชจ๋ธ์์ 2๋ฅผ ์ถ์ ํ๋ฉด ์ ํํ ๋์ผํ AUC (๋ฐ ROC)๋ฅผ ์ป๊ฒ๋ฉ๋๋ค.
์ํ ๋ชจ๋ธ์ ํ๊ฐํ ๋๋ ๊ต์ ๋ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด๋ฅผ ๊ฒ์ฌํ๊ธฐ ์ํด ์ํ ์ ์ (์ : 0.7)๊ฐ์๋ ๋ชจ๋ ํ์๋ฅผ ์ดํด๋ณด๊ณ ์ด๋ค ์ค ์ฝ 70 %๊ฐ ์ค์ ๋ก ์ํ์ง ํ์ธํฉ๋๋ค. ๊ฐ๋ฅํ ๋ชจ๋ ์ํ ์ ์์ ๋ํด์ด ์์ ์ ์ํํ์ญ์์ค (์ผ๋ถ ์ค๋ฌด๋ฉ / ๋ก์ปฌ ํ๊ท ๋ถ์ ์ฌ์ฉ). ๊ฒฐ๊ณผ๋ฅผ ํ๋กฏํ๋ฉด ๊ทธ๋ํฝ ๋ณด์ ์ธก์ ๊ฐ์ ์ป๊ฒ ๋ฉ๋๋ค.
์ ๋ชจ๋ธ์ด์๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ข์ ๊ต์ ๊ณผ ์ข์ ์ฐจ๋ณ, ๋น์ ์ ์ข์ ๋ชจ๋ธ์ ๊ฐ์ง๊ณ ์์ํฉ๋๋ค. ๐
๋ต๋ณ
์ด ์ง๋ฌธ์ ์ดํด๋ณด์ญ์์ค : ROC ๊ณก์ ์ดํด
ROC ๊ณก์ ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ROC ๊ณก์ ๊ทธ๋ฆฌ๊ธฐ
์์ ๋ถ๋ฅ ๊ธฐ๊ฐ ์ฒ๋ฆฌ ํ ๋ฐ์ดํฐ ์ธํธ
- ์ ์ ๊ฐ์์ ๋ํ ์์ ํ ์คํธ ์
- ์์ ์์
(0,0)
x
x 1/pos
x 1/neg
pos
neg
์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๋ค์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ AUC ROC๋ฅผ ์๋์ผ๋ก ๊ณ์ฐํ ์ ์์ต๋๋ค.
auc = 0.0
height = 0.0
for each training example x_i, y_i
if y_i = 1.0:
height = height + tpr
else
auc = auc + height * fpr
return auc
์ด ๋ฉ์ง gif ์ ๋๋ฉ์ด์ ๊ทธ๋ฆผ์์ด ๊ณผ์ ์ ๋ช ํํ๊ฒ ์ค๋ช ํด์ผํฉ๋๋ค.
๋ต๋ณ
Karl์ ๊ฒ์๋ฌผ์๋ ํ๋ฅญํ ์ ๋ณด๊ฐ ๋ง์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ง๋ 20 ๋ ๋์ ๋๊ตฐ๊ฐ์ ์๊ฐ์ ์ข์ ๋ฐฉํฅ์ผ๋ก ๋ฐ๊พธ๋ ROC ๊ณก์ ์ ์๋ฅผ ์์ง ๋ณด์ง ๋ชปํ์ต๋๋ค. ๊ฒธ์ํ ๊ฒฌํด์์ ROC ๊ณก์ ์ ์ ์ผํ ๊ฐ์น๋ ๊ทธ ์์ญ์ด ๋งค์ฐ ์ ์ฉํ ์ผ์น ํ๋ฅ ๊ณผ ๊ฐ๋ค๋ ๊ฒ์ ๋๋ค. ROC ๊ณก์ ์์ฒด๋ ๋ ์๊ฐ ์ปท์คํ๋ฅผ ์ฌ์ฉํ๋๋ก ์ ํนํฉ๋๋ค.
c
Y=0,1
x
Y=1
y
Y=0
Y=1
n
R Hmisc
ํจํค์ง rcorr.cens
๊ธฐ๋ฅ์ ๊ฒฝ์ฐ ์ ์ฒด ๊ฒฐ๊ณผ๋ฅผ ์ธ์ํ์ฌ ์์ธํ ์ ๋ณด, ํนํ ํ์ค ์ค๋ฅ๋ฅผ๋ณด์ญ์์ค.
๋ต๋ณ
๋ค์์ ๋จ์ํ ์ฌ๋ค๋ฆฌ๊ผด ๊ท์น์ ์ฌ์ฉํ์ฌ ROC ๊ณก์ ์๋ ์์ญ์ ๊ฐ์ ธ ์์ AUC๋ฅผ ๊ณ์ฐํ๋ ์์ฐ์ค๋ฌ์ด ๋ฐฉ๋ฒ์ ๋์์ ๋๋ค.
AUC๋ ๋ฌด์์๋ก ์ํ๋ง ๋ ์์ฑ ๊ด์ธก์น๊ฐ ๋ฌด์์๋ก ์ํ๋ง ๋ ์์ฑ ๊ด์ธก์น๋ณด๋ค ์์ธก ํ๋ฅ (์์)์ด ํด ํ๋ฅ ๊ณผ ๊ฐ์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์์ฑ ๋ฐ ์์ฑ ๊ด์ธก ๊ฐ์ ์๋ณ ์กฐํฉ์ ํตํด ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ AUC๋ฅผ ๋งค์ฐ ์ฝ๊ฒ ๊ณ์ฐํ ์ ์์ต๋๋ค. ํ๋ณธ ํฌ๊ธฐ๊ฐ ๋๋ฌด ํฐ ๊ฒฝ์ฐ ๊ด์ธก์น๋ฅผ ๋ฌด์์๋ก ํ๋ณธ ์ถ์ถ ํ ์๋ ์์ต๋๋ค. ํ๊ณผ ์ข ์ด๋ฅผ ์ฌ์ฉํ์ฌ AUC๋ฅผ ๊ณ์ฐํ๋ ค๋ ๊ฒฝ์ฐ ์ํ์ด ์ ๊ฑฐ๋ ์๊ฐ์ด ๋ง์ง ์์ผ๋ฉด ์ด๊ฒ์ด ์ต์ ์ ๋ฐฉ๋ฒ์ด ์๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด R์์ :
n <- 100L
x1 <- rnorm(n, 2.0, 0.5)
x2 <- rnorm(n, -1.0, 2)
y <- rbinom(n, 1L, plogis(-0.4 + 0.5 * x1 + 0.1 * x2))
mod <- glm(y ~ x1 + x2, "binomial")
probs <- predict(mod, type = "response")
combinations <- expand.grid(positiveProbs = probs[y == 1L],
negativeProbs = probs[y == 0L])
mean(combinations$positiveProbs > combinations$negativeProbs)
[1] 0.628723
pROC
ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ํ์ธํ ์ ์์ต๋๋ค .
library(pROC)
auc(y, probs)
Area under the curve: 0.6287
๋ฌด์์ ์ํ๋ง ์ฌ์ฉ :
mean(sample(probs[y == 1L], 100000L, TRUE) > sample(probs[y == 0L], 100000L, TRUE))
[1] 0.62896
๋ต๋ณ
- ๊ด์ธก ๊ฐ์ ๋ํ ์ง์ ํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
- ์ฌํ ํ๋ฅ ์ ๊ณ์ฐ ํ ๋ค์์ด ํ๋ฅ ๋ก ๊ด์ธก ๊ฐ์ ์์๋ฅผ ๋งค ๊น๋๋ค.
P N
Sum of true ranksโ0.5PN(PN+1)PN(NโPN)