본문 바로가기
@ OO의 이해/분할표와 ROC curve의 이해

[분할표와 ROC curve의 이해] 6. ROC curve 그려보기

by bigpicture 2020. 9. 15.
반응형

우리가 풀고 있는 문제는 아래와 같습니다.

 

우리는 A라는 병을 진단하는 진단키트를 개발하는 연구원입니다. 혈액에서 채취한 어떤 수치 k가 병과 연관이 있었고, k를 이용해서 병을 진단하려고 시도하는 상황입니다. 정상인과 병에 걸린사람을 각각 5명식 모집하고, 수치 k를 측정하였습니다. 결과는 아래와 같습니다. (사람 수가 작은 이유는 손으로 풀기 위함입니다.)

 

정상 : 3.3, 3.6, 5.2, 4.6, 4.9

환자 : 5.3, 6.8, 7.7, 8.3, 4.7

 

진단 기준이 되는 k값 몇으로 해야할까요?

 

k를 바꿔가면서 민감도와 특이도를 구했고, 결과는 아래와 같습니다. 

 

 k 범위  환자 양성/정상 양성
환자 음성/정상 음성
민감도  특이도 
 k<3.3 5/5
0/0
1 0
 3.3≤k<3.6 5/4
0/1
1 0.2
 3.6≤k<4.6 5/3
0/2
1 0.4
 4.6≤k<4.7 5/2
0/3
1 0.6
4.7≤k<4.9  4/2
1/3
0.8 0.6
 4.9≤k<5.2 4/1
1/4 
0.8 0.8
 5.2≤k<5.3 4/0
1/5
0.8 1
 5.3≤k<6.8 3/0
2/5
0.6 1
 6.8≤k<7.7 2/0
3/5
0.4 1
 7.7≤k<8.3 1/0
4/5
0.2 1
 8.3≤k 0/0
5/5
0 1

 

최적의 k값은 민감도와 특이도의 합이 최대가되는 값으로 정하기로 했습니다. k를 구하려면 먼저 위 표를 그래프로 그려야 합니다. x축을 특이도, y축을 민감도로 하여 그래프를 그려보겠습니다. 11개의 점을 찍을 수 있습니다.

 

 

만약 데이터가 더 많았다면, 점들 사이가 더 세분화 되어 있을 것입니다. 점과 점 사이를 선으로 보간하겠습니다. 

 

 

 

각 점에 해당되는 k값도 표시해줍시다. 

 

위 그래프에서 x축을 specificity가 아니라, 1-specificity 로 바꾼 것이 'ROC curve' 입니다. 이름의 뜻은 다음 글에서 알아보도록 하고, 일단 ROC curve를 그려봅시다.

위와 같이 ROC curve는 x축을 1-specificity 로 하고, y축을 sensitivitiy 로 하는 그래프입니다. 다음 글에서는  ROC curve를 이용하여 최적의 k값을 찾아보도록 하겠습니다. 

 

아래는 ROC curve 를 그리는데 사용된 R 코드입니다. 

 

#code
 
plot.new()
plot.window(xlim=c(0,1),ylim=c(0,1))
 
title(xlab="Specificity",ylab="Sensitivity")
 
x_axis_tick=seq(0,1,by=0.2)
y_axis_tick=seq(0,1,by=0.2)
 
axis(side=1,at=x_axis_tick)
axis(side=2,at=y_axis_tick)
 
pointlist=list()
 
pointlist[[1]]=c(1-1,0)
pointlist[[2]]=c(1-1,0.2)
pointlist[[3]]=c(1-1,0.4)
pointlist[[4]]=c(1-1,0.6)
pointlist[[5]]=c(1-0.8,0.6)
pointlist[[6]]=c(1-0.8,0.8)
pointlist[[7]]=c(1-0.8,1)
pointlist[[8]]=c(1-0.6,1)
pointlist[[9]]=c(1-0.4,1)
pointlist[[10]]=c(1-0.2,1)
pointlist[[11]]=c(1-0,1)
 
for (i in 1:11){
points(pointlist[[i]][1],pointlist[[i]][2],pch=20,cex=2,col="red")
}
 
for (i in 1:10){
lines(c(pointlist[[i]][1],pointlist[[i+1]][1]),c(pointlist[[i]][2],pointlist[[i+1]][2]))
}
 
text(pointlist[[1]][1],pointlist[[1]][2],"k<3.3",pos=4)
text(pointlist[[2]][1],pointlist[[2]][2],"3.3≤k<3.6",pos=4)
text(pointlist[[3]][1],pointlist[[3]][2],"3.6≤k<4.6",pos=4)
text(pointlist[[4]][1]+0.02,pointlist[[4]][2],"4.6≤k<4.7",pos=3)
text(pointlist[[5]][1],pointlist[[5]][2],"4.7≤k<4.9",pos=4)
text(pointlist[[6]][1],pointlist[[6]][2],"4.9≤k<5.2",pos=4)
text(pointlist[[7]][1],pointlist[[7]][2],"5.2≤k<5.3",pos=3)
text(pointlist[[8]][1],pointlist[[8]][2],"5.3≤k<6.8",pos=3)
text(pointlist[[9]][1],pointlist[[9]][2],"6.8≤k<7.7",pos=3)
text(pointlist[[10]][1],pointlist[[10]][2],"7.7≤k<8.3",pos=3)
text(pointlist[[11]][1]-0.02,pointlist[[11]][2],"8.3≤k",pos=3)
 
box("plot",col="gray",lty=1)

 

반응형

댓글