Data Analysis & ML/Machine Learning

[Machine Learning][머신러닝] 대출위험도 예측모델링(데이터전처리)

YSY^ 2020. 9. 8. 18:57

모델링 개요

  • 데이터 탐색 (EDA)
    • 가지고 있는 데이터로부터 통찰력(Insight)을 얻는다.
  • 라벨(답)의 존재 유무
    • 지도학습/비지도학습 결정
  • 라벨의 형태
    • 분류/회귀 모델 결정
  • Base-Line 모델로 가장 간단한 머신러닝 모형 구현
    • 아무런 설정없이 생성한 모델
    • EDA 결과 확인을 위한 모델
    • 모델 선택, 튜닝의 기준이 될 모델
    • Base-Line 모델의 문제점을 파악하여 그것을 개선하는 방향으로 튜닝해 나간다.

문제에 대한 이해

  • 현재 수입, 지출 등의 데이터에 대해 은행 자체의 분석을 진행하여 대출자가 미래에 돈을 갚을 수 있는지 확인
  • 알고리즘 결과 : 일정 기간(2년) 내에 채무 불이행 여부
  • 평가 지표 : roc_auc 점수

데이터 속성에 대한 이해

  • SeriousDlqin2yrs
    • 목표 변수
    • 최근 2년 동안 90일 이상 연체한 적이 있는지 여부
    • 값: 1 (연체한 적 있음), 0 (연체한 적 없음)
  • RevolvingUtilizationOfUnsecuredLines
    • 부동산과 할부 부채(installment debit)를 제외한 보유 자산 및 신용 대비 현재 운용할 수 있는 돈의 비율
    • 전체 운용가능한 돈 대비 현재 운용가능한 돈의 비율
  • Age
    • 대출자의 나이
  • NumberOfTime30-59DaysPastDueNotWorse
    • 최근 2년 동안 30일 ~ 59일 연체한 횟수
  • DebtRatio
    • 전체수입 대비 월 부채 상환과 월 지출 합계의 비율
  • MonthlyIncome
    • 월 수입
  • NumberOfOpenCreditLinesAndLoans
    • 대출자가 보유중인 담보 대출 및 신용 대출 건수
  • NumberOfTimes90DaysLate
    • 과거 90일 이상 연체한 횟수
  • NumberRealEstateLoansOrLines
    • 주택 담보 대출을 포함한 부동산 담보 대출 건수
  • NumberOfTime60-89DaysPastDueNotWorse
    • 최근 2년간 60 ~ 89일 연체한 횟수
  • NumberOfDependents
    • 대출자를 제외한 부양가족 수

 

DATASET

cs_data.csv
7.21MB

데이터 불러오기

import pandas as pd
import numpy as np
data = pd.read_csv('data/cs_data.csv', encoding = 'utf-8', index_col=0)
data.info()

 

#칼럼명 소문자로 바꾸기
data.columns = [col.lower() for col in data.columns]
data.head(2)

데이터 전처리

결측값 처리

 

이상치 처리

IQR 기반 이상치 검출

  • IQR : 3분위수-1분위수
  • 이상치 기준 (rate는 일반적으로 1.5사용)
    • 1분위수 + IQR*rate 보다 작은수
    • 3분위 + IQR*rate 보다 큰수
def get_outlier(data, rate=1.5):
    q1 = np.quantile(data, q=0.25)
    q3 = np.quantile(data, q=0.75)
    IOR = q3-q1
    return (data > q1-IOR * rate) & (data<q3+IOR * rate)

컬럼별 이상치 처리

1. revolvingutilizationofunsecuredlines

2. age

3. numberoftime30-59dayspastduenotworse

  • 30 ~ 59 간 연체한 횟수
  • 96, 98 두개의 값을 가진 행을 제거

4. debtratio

  • 소득 대비 부채비율(대출상환금+생활비/소득)
  • 이상치가 아닌 값들 중 최대값으로 대체한다.

5. monthlyincome

  • 월간 소득
  • 이상치를 이상치 아닌 값들의 최대 값으로 대체한다.

6. numberofopencreditlinesandloans

  • 대출자가 보유중인 담보 대출 및 신용 대출 건수
  • 처리안함

7. numberoftimes90dayslate

  • 90일 연체 횟수

8. numberrealestateloansorlines

  • 주택 담보 대출을 포함한 부동산 담보 대출 건수
  • 이상치인 값 54 제거

9. numberoftime60-89dayspastduenotworse

  • 최근 2년간 60 ~ 89일 연체한 횟수
  • 처리안함

10. numberofdependents

  • 부양가족수
  • 이상치(20) 제거

 

종속변수별 상관관계 확인

import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(12,11))
ax = sns.heatmap(data.corr(), annot=True, fmt='.2f', linewidths=0.5, cmap='YlGnBu')
# print(ax.get_ylim())
ax.set_ylim(11,0)
plt.show()

 

삭제할 칼럼(타겟변수와 상관관계가 없는 변수)

  • numberoftime60-89dayspastduenotworse : 상관관계가 0이다.
data.drop('numberoftime60-89dayspastduenotworse', axis=1, inplace=True)
data.columns

 

전처리한 데이터 저장

data.to_csv('data/data-v01.csv', index=False)

 

728x90
반응형