관리 메뉴

TEAM EDA

빅콘테스트 2018 본문

EDA Project/빅콘테스트

빅콘테스트 2018

김현우 2019. 9. 11. 15:46

기간 : 2018.07.10 ~ 2018.11.30 

멤버 : 김현우, 박주연, 이주영, 이지예, 민은주 

주제 : 금융 데이터를 활용한 “나의 금융생활정보 지수” 개발 

 

분석과정은 문제 정의, 분석을 위한 변수 처리, 그리고 네 문제에 대한 답변 순으로 진행됩니다.

 

첫 번째로 문제 정의 부분입니다. 분석 목적은 고객들이 비슷한 사람들의 금융생활정보를 참고할 수 있는 상담 시스템을 만들어 금융 생활에 도움을 주는 것에 있습니다. 다음으로 저희가 정의한 분석 대상은 ‘보통 사람’입니다. ‘보통사람’이란 일반적인 사람에게 기대되는 금융 상태를 가진 사람입니다. 또한 이러한 서비스를 포함하여 창구를 이용할 것이라고 예상되는 주요 이용 고객 층이라는 가정을 더했습니다 

 

 번째로 변수 처리 방법을 설명드리겠습니다먼저 저희는 전체 변수를  가지의 분석 가능한 형태로 처리하였고연속형 변수에 대해서는 단위를 10000원으로 통일하였습니다다음은 이상치 처리 방법입니다저희는 이상치를 저희가 가정한 ‘보통 사람에서 벗어나는 사람으로 정의했으며 처리 과정은 다음과 같습니다.

처음에는 총 자산, 총 부채, 월 총 저축액 이 세 가지 변수를 이상치 제거 기준으로 고려하였습니다. 그 이유는 위 세 변수가 다른 하위 변수들을 포괄하는 변수로서 대표성을 지니기 때문입니다. 하지만 이 중 두 개 이상의 변수를 선택할 시 너무 많은 데이터가 이상치로 제거되고, 변수 선택 순서에 따라 이상치가 다르게 지정되는 문제가 존재하였습니다. 따라서 저희는 다른 변수와의 상관관계가 높아 가장 대표성을 지니며, 개인 성향에 영향을 받지 않는 총 자산을 이상치 제거 기준으로 선택하였습니다. 이러한 총 자산의 분포를 왼쪽 그래프로 확인해봤을 때 왼쪽으로 크게 치우쳐 있는 모습을 볼 수 있었고, 오른 쪽 표를 보시면 같은 기본 정보를 가지고 있어도 총 자산이 940만원부터 7억 9천만원까지 큰 편차를 가지고 있음을 알 수 있습니다. 이는 대표값의 왜곡을 초래하므로 이상치 제거가 반드시 필요했습니다. 

먼저 왼쪽 표와 같이 총 자산의 상위와 하위 10%에 해당하는 수치를 확인하였고, 추가적으로 상위 10% 사람들이 전체 자산에서 차지하는 비중을 확인하여 백분위 수를 설정하였습니다. 하지만 이렇게 총 자산만을 기준으로 이상치를 제거하는 데는 문제점이 존재했습니다. 오른쪽의 그래프를 보시면 소득 분위가 높은 데이터가 대부분 이상치로 제거되는 것을 확인할 수 있습니다. 소득이 커서 총 자산의 값이 큰 것은 이상치가 아니기 때문에 추가적인 변수의 고려가 필요하다고 판단하였습니다.

이를 위해 XGBoost를 통한 변수 중요도를 확인하였고 왼 쪽 그래프를 통해 연령대와 소득 구간 변수가 다른 변수들에 비해 총 자산에 대한 영향도가 월등히 큰 두 변수임을 확인하였습니다. 일반적으로 생각했을 때도 연령대는 자산 축적 기간으로서, 소득은 그 양으로서의 의미가 존재하므로 이 두 변수를 함께 고려해주는 것이 적절하다고 판단하였습니다. 이에 따라 오른 쪽과 같이 두 변수에 대한 35가지 그룹을 생성하였습니다.

다음으로 이상치 제거 비율을 결정하기 위해 각 그룹에 대한 총 자산의 백분위수를 살펴보았습니다. 저희는 총 자산의 편차를 줄이면서 최대한 많은 사람들을 설명하는 비율을 찾고자 하였고, 이 때 통계청의 자료의 수치를 고려해주었습니다. 또한 데이터에서 총 자산이 저자산층에 분포가 쏠려있었다는 점과 창구를 이용할 것이라 예상되는 주 고객에 대한 가정을 고려해주었습니다. 이에 따라 상위 5%와 하위 1%를 적정 비율로 도출하였습니다.

추가적으로 이 비율에 해당하는 각 그룹의 총 자산 수치를 확인해보았고, 여기서 문제점을 발견하였습니다. 왼 쪽의 표를 보시면 연령대가 증가함에 따라 해당하는 총 자산 수치가 함께 증가하지 않는 경우가 존재하는 것을 볼 수 있습니다. 저희는 이 문제가 35개 그룹에 대한 sample이 작기 때문에 발생한다고 판단하였고 sample의 신뢰성을 확보하기 위해 이를 조정해주었습니다. 예를 들어 소득구간이 5일 때 백분위수 1에 해당하는 수치가 190과 378의 평균인 284 수준이 되도록 제거 비율을 조정해주었습니다. 이처럼 저희는 ‘보통 사람’에 걸맞는 값을 얻기 위해 소득, 연령대 변수를 고려하였고, 그 그룹 별로 소득 증가에 따른 총 자산의 수치의 추세를 반영하여, 총 자산 상위 5%, 하위 1% 내외 수준에서 이상치를 제거하였습니다.

다음으로 결측치 처리 방법에 대해 말씀드리겠습니다. 결측치는 총 9개의 변수에서 존재하였고 추후 14만 개 유형의 데이터를 추정하기 위해서는 어느 정도의 결측치 처리가 필요했습니다. 먼저 맞벌이 여부 변수를 살펴보겠습니다. 오른쪽 그래프에서 결혼여부 변수와 함께 봤을 때 맞벌이 여부 변수는 미혼일 때 항상 결측치였고, 기혼일 때는 항상 값이 존재했습니다. 따라서 맞벌이 여부에서의 결측치는 미혼으로 인한 미응답이므로 따로 처리하지 않았습니다. 

다음은 청약 보유 여부와 청약 잔액 변수입니다. 왼쪽 그래프를 보시면 보유 여부가 결측치일 때 잔액도 결측치이며, 잔액 변수에서 0값이 존재하지 않는 것을 확인할 수 있습니다. 따라서 결측치는 모두 0으로 처리하였습니다.

다음으로 펀드 잔액, 적금 잔액 변수입니다. 두 표과 같이 해당 월 저축액 변수들과 함께 보았을 때 두 잔액 변수가 결측치일 때 두 월 저축액 변수가 모두 0이었습니다. 하지만 반대로 월 저축액 변수들이 0이어도 잔액 변수들에서 0 이상의 값이 존재하는 경우가 존재하였습니다. 이를 고려해 기본변수 기준 동일한 유형이 존재할 경우 평균으로 처리해주고, 없을 경우에는 0으로 처리하였습니다. 

다음으로 자녀 수 변수입니다. 왼쪽 그래프를 보시면, 자녀 수가 0인 답변이 없는 것으로 보아 결측치는 자녀가 없는 경우와 응답을 거부한 경우 이 두 유형으로 나뉩니다. 여기서 저희는 통계청 자료를 참고해 결측치를 자녀 수가 0인 것과 동일하게 판단했습니다. 그 이유는 다음과 같습니다. 오른쪽 표를 보시면 미혼이 결측치의 대부분이었고, 저희는 응답 거부 유형이 미혼인데 자식이 있을 때, 즉 한부모가정일 때 나타날 것이라 가정했습니다. 신한은행 데이터의 한부모가정 비율은 통계청 수치보다 1%p 많았기 때문에 응답 거부 유형은 극소수일 것이라고 결론내렸습니다. 

다음은 은퇴 후 필요 자금 변수입니다. 왼쪽 그래프를 보시면 20~30대 모두가 결측치인 것을 확인할 수 있었고 추후 14만 개 유형의 예측을 위해서 결측치 추정이 필요했습니다. 이를 위해 패키지 사용을 결정했고, 데이터의 특성을 고려해 4가지 패키지를 선택하였습니다. 먼저 데이터 내에 극단치가 많다는 점을 고려하여 트리 기반인 XGBoost와 decision tree를 사용하였습니다. 추가로 하나의 row에 대해 두 변수 이상에서 결측치가 존재한다는 점을 고려했을 때 다중대체법이 유리할 것이라고 생각하여  Amelia와 mice를 사용하였습니다. 네 패키지에 대해 rmse 값을 구했고, 가장 RMSE가 낮았던 amelia를 이용해 결측치를 채웠습니다. 이 외 결측치가 있는 타 금융 변수도 위 패키지를 이용해 추정을 시도했으나 천 만 단위 이상으로 오차가 발생하여 사용이 적합하지 않다고 판단했습니다.

다음으로 추후 14만 개 유형의 예측을 위해 데이터에 존재하지 않는 선택지를 만들어주었습니다. 먼저 결혼 여부 변수의 경우 제공된 데이터에서는 결혼 여부에 결측치가 존재하지 않았으나 14만 개 유형에서는 결측치인 유형이 존재하였습니다. 때문에 이를 예측하기 위해 왼 쪽 그래프와 같이 결혼 여부에 값이 존재하는 유형들의 분포를 같은 분포로 가정하여 결측치 유형을 만들어주었습니다. 자녀 수의 경우 결측치를 모두 0으로 만들어주어 결측치가 없는 상황이었는데, 전 내용에서 결측치를 0으로 가정하였던 것을 따라 0인 유형의 분포로 결측치 유형을 만들어주었습니다.

세 번째로 분석 부분입니다. 먼저 문제 1번에 대한 답변입니다. 14만 개 유형의 결측치 추정 시에는 제공되지 않은 유형까지도 예측해야 한다는 문제점이 있었습니다. 그래서 유형이 없는 경우 rmse를 통해 중요하지 않은 변수의 순으로 변수를 제거하여 상위 유형을 만들었고, 상위 유형을 기준으로 같은 유형이 되었을 때 그 값을 해당 유형의 대푯값인 평균으로 채우는 방법을 선택하였습니다. 머신 러닝 기법도 고려해봤지만 아래 3가지 이유때매 쓰는 것이 적절하지 않다고 판단했습니다.

 

  • 첫째, 데이터의 금융 변수 간 상관성이 크다는 점,
  • 둘째, 정보가 제공되지 않는 유형이 더 많은 점.
  • 셋째, 기본 정보에 대한 금융 정보 수치의 편차가 너무 크다는 점

그럼 저희가 쓴 방법을 더 자세히 설명드리겠습니다. 가장 먼저 변수 제거 조합을 생성하였습니다. 아래 표는 변수를 1개 제거했을 경우의 8가지 조합인데, 이처럼 변수를 4개까지 제거할 때 가능한 모든 조합을 생성하였습니다

다음으로 제거하는 변수를 기준으로 상위 유형을 가정해같은 유형을 대푯값인 평균으로 처리하였습니다예를 들어 제공된 데이터에  1 해당하는 유형이 있지만  2 해당하는 유형이 없을 성별 변수를 제거하고  유형을 같다고 가정하여 해당 유형의 대푯값을  2 유형에 채워넣었습니다

다음으로 모든 조합에 대한 rmse를 통해 중요하지 않은 변수를 추출하였습니다. 이 때 rmse는 총 자산과 총 부채의 오차 합으로 하였는데, 이 이유는 앞에서 언급했듯 두 변수가 다른 하위 변수들을 포괄하는 대표적인 변수이기 때문이며 추가적으로 총 부채를 고려한 이유는 개인의 투자 성향을 반영하기 위해서입니다. 아래 표는 변수 하나를 제거한 조합들에 대한 rmse 값으로, 결혼 여부, 맞벌이 여부, 성별 등의 순으로 중요하지 않은 변수임을 알 수 있습니다.

마지막으로 값을 채워 넣는 부분입니다첫 째로 아래 표의 53번 인덱스처럼 기존 17000개의 제공된 데이터에 존재하는 유형은 대푯값을 이용하여 값을 채웠습니다.

 

둘 째로 97번 인덱스처럼 제공된 데이터에 유형이 존재하지 않는 경우 가장 rmse가 낮은 변수인 결혼을 제외한 상위 유형으로 대푯값을 만들어 채웠습니다. 

마찬가지로 두 번째의 과정을 다음으로 RMSE가 낮은 변수를 제거 변수로 하여 모든 유형의 값이 채워질 때까지 반복하였습니다.

 

다음으로 문제 2번에 대한 답변입니다저희는 peer group 도출에서 기본 정보와 금융 정보를   고려해주기 위해 k-prototype 기법을 선택하였습니다만약 클러스터링  기본 변수만 사용한다면 금융 변수의 편차를 고려해주지 못합니다예를 들어 앞에서 언급했듯 같은 개인정보 유형 내에서도 8 가까이 편차가 존재하는데기본 정보만으로 군집화한다면 이런 부분을 고려하지 못합니다반대로 금융 정보만 사용한다면 기본 정보에 따르는 배경이나 환경을 고려해주지 못합니다예를 들어 같은 금융 상태를 가지고 있다고 해도 20대와 60대는 현재와 미래의 소비패턴이 다른데금융정보만으로 군집화하면 이를 고려하지 못합니다따라서 군집화  금융정보와 기본 정보를   사용하는 것이 적절하다고 판단하였습니다먼저 금융정보 변수 중에서는  자산과  부채 변수를 사용하였습니다 변수는 위에서 언급했듯 개인의 금융 정보를 담고 있는 가장 상위의 변수이기 때문에 해당 고객과 금융 생활이 가장 비슷한 사람들의 정보를 얻을  있을 것이라 판단했습니다.

다음으로 기본정보 변수는 가구 소득 구간, 연령대, 자녀 수 세 변수를 사용하였습니다. 앞에서 언급했듯 가구 소득 구간과 연령은 자산에 가장 큰 영향을 미치는 변수로 의미가 있고, 자녀 수의 경우 개인의 미래 소비를 예측할 수 있는 변수로 판단되어 사용하였습니다. 이를 바탕으로 군집 내 거리를 계산하는 elbow method를 수행하였고 90개를 최적 군집 개수로 도출하였습니다. 왼쪽의 그래프만 봤을 때에는 20에서 30개 정도가 최적 군집 개수라고 보여지나, 분산 내 거리의 수치를 확인했을 때 90개에서의 수치가 20개에 비해 약 23%로 큰 차이로 감소하는 것을 확인하였습니다. 또 50개와 100개 사이의 그래프를 참고했을 때 90개가 elbow 지점이었습니다. 따라서 이를 최적 군집 개수로 하여 peer group을 생성하였습니다.

다음으로 문제 3번입니다. 문제 2번에서 생성된 peer group으로 금융자산, 월 저축 금액, 월 소비 금액에 대한 분포를 백분위로 확인하였으며, 결과는 다음과 같습니다.

마지막으로 문제 4번입니다. 저희는 기본 정보 수집 최소화를 위해 all subset과 xgboost의 gain, rmse를 이용해 변수 중요도를 확인했습니다. 여기서 후진 제거법이 아닌 all subset 기법 사용하였는데 잘못 표기되어 이를 정정합니다. 먼저 all subset은 결정계수를 이용하여 변수의 유의미함을 판단하며, 총 자산의 경우 성별, 자녀 수, 직업 등의 순으로, 총 부채의 경우 성별, 나이, 직업 등의 순으로 중요하지 않습니다.

다음으로 Gain입니다. Gain은 XGBoost 모델에서 제공하는 변수 중요도 기준으로, 학습 시의 평균 교육 손실을 점수화한 결과입니다. 그래프를 살펴보면 총 자산의 경우 성별, 맞벌이, 결혼 등의 순으로, 총 부채의 경우 성별, 맞벌이, 결혼 등의 순으로 중요도가 낮게 나왔습니다.  번째로 아까 설명 드린 rmse 통한 결과입니다 자산과  부채 모두 결혼맞벌이성별의 순으로 중요도가 낮게 나왔습니다

마지막으로 이를 종합한 중요도 점수를 산출하였습니다. 총자산,총부채에 대해 각각 중요한 순으로 8점에서 1점까지 점수를 매겼고 두 점수를 더했습니다. All subset과 rmse의 경우 비슷한 과정으로 중요도를 판별하므로 각 점수에 0.5를 곱해 편향을 줄이도록 하였습니다. 이를 합산해 성별, 결혼, 자녀수, 맞벌이, 나이, 지역, 직업, 소득 순으로 중요하지 않다는 결과를 도출하였습니다. 이를 수집 정보 최소화를 위해 사용할 수 있습니다.

 

'EDA Project > 빅콘테스트 ' 카테고리의 다른 글

[빅콘테스트2019] 모델링  (0) 2019.09.24
[빅콘테스트 2019] 데이터 탐색  (0) 2019.09.22
빅콘테스트 2019  (0) 2019.09.11