본문 바로가기
CSS(Credit Scoring System)/신용평가모형 검증지표

[R실습]AUROC 산출하기

by 찐남 2021. 7. 4.

1. AUROC(Area Under ROC Curve)


AUROC는 Area Under ROC(Receiver Operating Characteristic) Curve의 약어로, K-S통계량(자세한 설명은 K-S통계량 포스팅 참고)과 더불어 분류모델(Classificaiton Model)의 성능을 나타내는 주요 지표 중 하나입니다. AUROC는 어떤 이벤트가 발생할 확률에 따른 집단2의 누적구성비(X축)와 집단1의 누적구성비(Y축)가 그리는 그래프 아래쪽에 곡선형태의 면적을 의미하는데요(집단1: 이벤트 발생 집단, 집단2: 이벤트 미발생 집단). 말로 설명하니, 잘 와닿지 않는 것 같아요. 예를 들어 설명해 보도록 하겠습니다.

 

 



 

 

2. AUROC(Area Under ROC Curve) 산출하기


신용평가모형 역시 분류모델 중 하나입니다. 신용평점이 높을수록 신용도가 좋다는 의미이고, 반대로 신용평점이 낮을수록 신용도가 나쁘다는 의미입니다(이에 대한 쉽고 자세한 설명은 역시 K-S통계량 포스팅 참고하세요.)

신용평가모형이 좋은 성능을 보일려면, 신용평점이 낮은 구간에는 신용도가 안 좋은 고객(불량회원)이 많이 분포되어 있어야 합니다. 반대로 신용평점이 높은 구간에는 신용도가 좋은 고객(우량고객)이 많이 분포되어 있어야 합니다. 신용평점 기준 하위 5% 인 구간에는 우량회원 중에서 일부만 포함되고, 불량회원은 매우 많이 포함되어야 좋은 성능을 보입니다. 신용평점 하위 30%는 우량회원의 포함비율이 증가하고, 불량회원도 증가하게 되죠. 하위 100%면 모든 우량회원과 모든 불량회원이 포함됩니다. 이를 그림으로 그리면, 원의 1사분면 모양이 되고, 이 포물선이 좌측 상단으로 갈수록 모형의 성능은 올라가게 됩니다. 즉, 이 곡선의 아래면적이 커질수록 좋은 성능을 나타내는 모형이 됩니다.

 

3. AUROC 산출 실습


그럼 아래 첨부 파일과 R코드를 이용해서 실제 AUROC값을 산출해 보자.

test.csv
0.00MB


위의 첨부 파일을 D드라이브에 저장하고, 실습을 진행하자.

install.packages("dplyr") # dplyr 패키지 설치 (실습 pc에 이미 패키지가 설치되어 있다면, 실행할 필요 없음)
library(dplyr) # dplyr 패키지 로딩

# D 드라이브에 있는 test.csv 파일을 auroc_test 에 저장
auroc_test <- read.csv("D:/test.csv")

# 데이터의 구조가 어떻게 이루어져 있는지 상위 6개 데이터만 출력
head(auroc_test)


# prob: 이벤트 발생(engine_type = 1) 확률 값

# engined_type : 이벤트 발생 여부 (집단1: 이벤트 발생 집단, 집단2: 이벤트 미발생 집단)

auroc <- auroc_test %>% # auroc_test 라는 데이터에 대해서
group_by(prob) %>% # 이벤트 발생 확률별
summarise(t1_cnt = sum(ifelse(engine_type == 1,1,0)), # 이벤트 발생 집단의 전체 수 산출
t2_cnt = sum(ifelse(engine_type == 0,1,0))) %>% # 이벤트 미발생 집단의 전체 수 산출하여
arrange(desc(prob)) # 이벤트 발생 확률에 따라 오른차순으로 정렬

tot_t1_cnt <- sum(auroc$t1_cnt) # 이벤트 발생 집단의 전체 수 저장
tot_t2_cnt <- sum(auroc$t2_cnt) # 이벤트 미발생 집단의 전체 수 저장

t1_cnt_pct <- auroc$t1_cnt / tot_t1_cnt # 이벤트 발생 확률별 이벤트 발생 비율(구성비) 산출
t2_cnt_pct <- auroc$t2_cnt / tot_t2_cnt # 이벤트 발생 확률별 이벤트 미발생 비율(구성비) 산출

cum_t1_cnt <- 0 # 이벤트 발생 누적 구성비 저장을 위한 변수 초기값 셋팅
cum_t2_cnt <- 0 # 이벤트 미발생 누적 구성비 저장을 위한 변수 초기값 셋팅

# 이벤트 발생 확률에 따른 이벤트 발생/미발생 누적 건수 산출
for(i in 1:nrow(auroc)){
if(i == 1){
cum_t1_cnt[i] <- auroc$t1_cnt[i]
cum_t2_cnt[i] <- auroc$t2_cnt[i]
}
else{
cum_t1_cnt[i] <- cum_t1_cnt[i-1] + auroc$t1_cnt[i]
cum_t2_cnt[i] <- cum_t2_cnt[i-1] + auroc$t2_cnt[i]
}
}

cum_t1_pct <- cum_t1_cnt / tot_t1_cnt # 이벤트 발생 확률별 이벤트 발생 누적비율(누적구성비) 산출
cum_t2_pct <- cum_t2_cnt / tot_t2_cnt # 이벤트 발생 확률별 이벤트 미발생 누적비율(누적구성비) 산출

# AUROC 산출
auroc <- sum(0.5 * t2_cnt_pct * t1_cnt_pct + (1 - cum_t2_pct) * t1_cnt_pct)

# 결과 확인
print(auroc)

=> 예제 수행 결과 분류모델(classification mode)의 AUROC는 0.9484127로 매우 높음을 알 수 있다.

 

 



 

반응형

댓글