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

[R실습]PSI 산출하기

by 찐남 2021. 7. 7.

1. PSI 개념


신용평가모형의 안정성을 검증하는 지표는 모집단의 안정성을 검증하는 PSI(모집단안정성지수, Population Stability Index)와 평가항목의 안정성을 검증하는 CAR(항목안정성지수, Characteristic Analysis Report) 지표가 있다.

이번 포스팅에서는 PSI에 대해서 알아보자. PSI는 신용평가모형 개발 당시의 신용등급별 분포와 실제 운영할 때의 신용등급별 분포가 유사한지, 아니면 등급의 분포가 변화되었는지 검증하는 중요 지표다.

 

 



 

 

2. PSI 산출식


PSI는 아래의 수식으로 산출된다.
PSI = sum((개발당시 등급별 분포 - 실제 운영 시 등급별 분포) * ln(개발당시 등급별 분포 / 실제 운영 시 등급별 분포))
산식을 보면 알겠지만, PSI값이 커질수록 등급의 변동성이 크다는 것을 알 수 있다.

3. PSI가 중요한 이유


그럼 PSI 지표가 왜 중요할까?

일반적으로 금융기관에서는 신용등급이 일정 수준 이하일 경우(Ex. 신용등급 8등급 이하 등) 대출이 거절되거나, 신용카드 발급이 제한된다.

모형 개발 당시에는 8등급이하가 전체 모집단의 5%이하일 것으로 예상이 되어서, 전체 고객 중 95%이상이 대출이 취급되거나, 신용카드가 발급될 것으로 예측했다고 하자.

개발된 모형을 지속적으로 운영하면서 8등급이하가 10%로 상승했다고 하자. 그럼 금융기관의 입장에서는 리스크가 매우 높아지게 되고, 과거 개발 당시의 시뮬레이션 수치에 신뢰성이 떨어진다.

반대로 8등급이하 3%로 하락했다고 하자. 그럼 금융기관의 입장에서는 동일 리스크 수준을 감안할 때,
8등급은 대출을 취급하거나 신용카드를 발급해도 감내할 수준이었을 것이다.

그렇기 때문에 모형 개발 후에는 지속적으로 등급별 분포의 변동성을 검증하는 것이 필요하다.

 

 

 



 

 

 

4. PSI 산출 실습


자! 그럼 이제 R코드를 활용하여 PSI를 산출해 보자!


install.packages("dplyr") # dplyr 패키지 설치(이미 설치되어 있다면, 해당 코드는 제외)
library(dplyr) # dplyr 패기지 로딩

본인 PC에 D드라이브에 첨부 예제 파일을 저장하자.

test_psi.csv
0.00MB


test_psi <- read.csv("D:/test_psi.csv") # D드라이브에 저장되어 있는 test_psi.csv 파일을 test_psi R object에 저장
head(test_psi) # 상위 6개 데이터 확인

# test_psi.csv 데이터는 총 4개의 항목으로 구성되어 있음
# kind: 개발/검증시점 (개발시점: 2015년 12월, 검증시점: 2016년 12월)
# id: id
# grade: 신용등급

# 1. 개발시점 신용등급별 분포 계산 -----------------------------------------------------
dev_grade_dist <- test_psi %>% # test_psi 라고 하는 데이터 프레임에 대해서
filter(kind == 201512) %>% # 개발시점 데이터만 가져와서
group_by(grade) %>% # grade(신용등급) 별로
summarise(cnt = n()) # 건수를 계산

# 개발시점 등급별 분포 계산
dev_grd_pct <- dev_grade_dist$cnt / sum(dev_grade_dist$cnt)
#--------------------------------------------------------------------------------------------

# 2. 운영시점 신용등급별 분포 계산 -----------------------------------------------------
val_grade_dist <- test_psi %>% # test_psi 라고 하는 데이터 프레임에 대해서
filter(kind == 201612) %>% # 검증시점 데이터만 가져와서
group_by(grade) %>% # grade(신용등급) 별로
summarise(cnt = n()) # 건수를 계산

# 운영시점 등급별 분포 계산
val_grd_pct <- val_grade_dist$cnt / sum(val_grade_dist$cnt)
#--------------------------------------------------------------------------------------------

# PSI 산출
psi <- sum((dev_grd_pct - val_grd_pct) * log(dev_grd_pct / val_grd_pct))

# 산출된 PSI 출력
print(psi)

PSI는 0.02166085로 매우 낮음을 알 수 있다.
즉, 개발시점과 실제 운영시점의 등급 변동성이 매우 작음을 알 수 있다.

 

 

 

 

반응형

댓글