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

[R실습]K-S 통계량 산출하기

by 찐남 2021. 7. 3.

1. K-S(Kolmogorov - Smirnov Statistics) 통계량

 

본래 K-S 통계량(Kolmogorov - Smirnov Statistics)은 서로 다른 두개의 집단이 동일한 분포를 이루고 있는지를
검증하는 검증지표로 통계학의 용어입니다.
K-S통계량은 두 집단에 대한 각각의 구성비를 누적해서 산출한 후
그 누적 구성비의 차이가 가장 많이 벌어지는 지점의 수치로 계산됩니다.

이런 통계학의 용어가 신용평가모형에 대한 성능을 측정하는 지표로 어떻게 사용되었을까요?

신용평가모형은 과거의 신용거래 행위를 기반으로 빌린 돈을 미래에 잘 상환할 가능성을 예측하는 통계적 모형입니다.
우리가 흔히 말하는 신용등급, 신용점수는 이러한 통계적 모형에 의해 산출된 확률(=빌린 돈을 미래에 잘 상환할 가능성)을 의미합니다.

만약에 A라는 고객이 B금융기관에서 돈을 빌렸다고 생각해 보죠.
B금융기관의 신용평가모형으로 신용점수와 신용등급을 산출해 보니, 신용도가 매우 우수하게 나왔습니다.
B금융기관은 A고객이 신청한 대출금액을 빌려주게 됩니다.

그런데, A고객이 빌려간 돈을 갚지 않는다면, 금융기관은 손실이 발생하게 될 것입니다.
신용평가모형에 의한 신용도는 매우 좋았는데, 결과적으로 빌린 돈을 갚지 않게 된 거죠.
모형이 예측을 잘못한 것이죠.

좋은 신용평가모형이라 함은 미래에 돈을 갚지 않은 고객들은 신용점수가 낮은 부분에 집중되어 있어야 하고,
반대로 미래에 돈을 잘 갚은 고객들은 신용점수가 높은 부분에 집중되어 있어야 하는 거죠.
결론적으로 미래에 돈을 갚지 않은 고객들의 분포와 미래에 돈을 잘 갚은 고객들의 분포가 많이 다를 수록
(미래에 돈을 갚지 않은 고객들은 신용도가 낮은 쪽으로 집중되고,
미래에 돈을 잘 갚은 고객들의 분포는 신용도가 높은 쪽으로 집중될수록)
신용평가모형은 좋은 성능을 가졌다고 말할 수 있습니다.

K-S 통계량으로 설명해 볼까요?
신용평가모형의 성능 지표로서 K-S 통계량은
미래에 돈을 잘 갚을 고객일확률값(=신용도가 좋다)이 증가함에 따른
실제 미래에 돈을 잘 갚은 고객군(우량한 집단)과
실제 미래에 돈을 잘 갚지 않은 고객군(불량한 집단)의 누적 구성비를 각각 산출한 후
누적구성비의 차이가 가장 큰 값으로 계산됩니다.

 

 

 

 

2. R을 활용한 K-S통계량 산출 실습

 

2.1. 사전 준비 작업

 

그럼 첨부되어 있는 test.csv 파일을 활용하여 K-S 통계량을 산출하는 R 코드를 작성해 보겠습니다.

test.csv
0.00MB


첨부 자료에 대한 간단한 데이터 처리를 위해 필요한 패키지를 설치합니다.

install.packages("dplyr") # 'dplyr' 라는 R 패키지 설치(기존에 dplyr 패키지가 설치되어 있으면 생략하시면 됩니다)
library(dplyr) # 'dplyr' 패키지 로딩

첨부파일(test.csv)을 D드라이브에 우선 저장해 놓아야 아래 프로그램이 잘 실행됩니다.
test <- read.csv("D:/test.csv") # D드라이브에 저장되어 있는 'test.csv' 파일을 test(=R object)에 저장


2.2. K-S 통계량 산출하기

 

K-S 통계량을 산출하려면 step1) 우량한 집단과 불량한 집단 각각에 대해 미래에 돈을 잘 갚을 확률별 고객 수를 산출합니다.step2) 미래에 돈을 잘 갚을 확률이 증가함에 따른 각 집단의 누적 고객수를 산출합니다.step3) 누적 고객수를 이용하여 누적 구성비를 산출합니다.step4) 두 집단의 누적 구성비를 산출하고, 가장 큰 차이를 보이는 구간의 값을 산출하면 됩니다.

 

Step 1. 미래에 돈을 잘 갚을 확률(prob)별 우량한 집단과 불량한 집단의 전체 수 산출

 

ks_table <-
test %>% # test 데이터 프레임에 대해서
group_by(prob) %>% # prob 별
summarise(t1_cnt = sum(ifelse(engine_type == 1,1,0)), # engine_type이 1인 집단의 전체 수 산출
t2_cnt = sum(ifelse(engine_type == 0,1,0))) # engine_type이 2인 집단의 전체 수 산출

 

Step 2. 미래에 돈을 잘 갚을 확률이 증가함에 따른 두 집단의 누적 전체 수 산출

 

cum_t1_cnt <- 0 # 집단1 초기 누적 전체 건수 값 셋팅
cum_t2_cnt <- 0 # 집단2 초기 누적 전체 건수 값 셋팅

for(i in 1:nrow(ks_table)){
if(i == 1){
cum_t1_cnt[i] <- ks_table$t1_cnt[i]
cum_t2_cnt[i] <- ks_table$t2_cnt[i]
}
else{
cum_t1_cnt[i] <- cum_t1_cnt[i-1] + ks_table$t1_cnt[i]
cum_t2_cnt[i] <- cum_t2_cnt[i-1] + ks_table$t2_cnt[i]
}
}

 

Step 3. 미래에 돈을 잘 갚을 확률이 증가함에 따른 두 집단의 누적 구성비 산출

 

cum_t1_pct <- cum_t1_cnt / max(cum_t1_cnt)
cum_t2_pct <- cum_t2_cnt / max(cum_t2_cnt)

 

Step 4. K-S 통계량 산출

 

ks_stats <- max(abs(cum_t1_pct - cum_t2_pct)) * 100 # 백분율로 변환
print(ks_stats) # K-S 통계량을 R Console 창에 출력하기

=> 상기의 모든 R코드를 실행시키면 K-S 통계량은 83.33333로 산출됨을 확인할 수 있습니다.
직접 산출해서 값을 확인해 보시죠.

 

MLmetrics 패키지 내 K-S산출 함수와 값 비교

 

이제 분류모델의 성능 검증지표 산출 함수가 내장되어 있는
패키지(MLmetrics)를 활용하여 값을 비교해 보면 결과가 동일함을 알 수 있습니다.

---------------------------------------------------------------------------------------------------------------------------
install.packages("MLmetrics") # 'MLmetrics' 라는 R 패키지 설치
library(MLmetrics) # 'MLmetrics' 패키지 로딩

# K-S통계량 확인
KS_Stat(y_pred = test$prob, y_true = test$engine_type)

 

산출된 2개의 값이 83.33333 동일함을 확인해 보았습니다.

 

 

 

반응형

댓글