본문 바로가기
TIL

내배캠 TIL 37일차

by ColorConeHead 2024. 2. 8.
반응형

심화 프로젝트

1) 결측치 대치


근로기간이 "Unknown"인 것들을 어떻게 대치해야할까.

단순대치를 위해 다른 근로기간의 변수 분포와 비교해보았다.

아래 코드는 근로기간이 "Unknown"인 row의 category_feature의 분포가
어떤 근로기간과 비슷한지 알아본 코드다.

sse가 가장 작은 년도로 대치하려는 목적으로 이 코드를 작성했다.
결과는 5로 낙점.

regression 이랑 뭐가 다르냐고 할 수 있겠는데,
회귀결과가 5가 많이 나올 수도 있겠지만
5가 아닌 다른 값이 나올 수도 있기 때문에
다르긴 하다.

회귀를 하는 방식 또한 해볼 예정이다
df = pd.read_csv('train.csv')

df = df.drop(index=df[df['주택소유상태'] == 'ANY'].index)

df_un = df[df['근로기간'] == 'Unknown']
df_n = df[df['근로기간'] != 'Unknown']

len(df_un) # 5671
len(df_n)  # 90622

numeric_col = ['대출금액', '연간소득', '부채_대비_소득_비율', '총계좌수', '최근_2년간_연체_횟수', '총상환원금', '총상환이자', '총연체금액', '연체계좌수', '근로기간']
category_col = ['대출기간', '주택소유상태', '대출목적']

un_duration = (df_un['대출기간'].value_counts() / df_un['대출기간'].value_counts().values.sum()).sort_index()
un_house = (df_un['주택소유상태'].value_counts() / df_un['주택소유상태'].value_counts().values.sum()).sort_index()
un_purpose = (df_un['대출목적'].value_counts() / df_un['대출목적'].value_counts().values.sum()).sort_index()

un_feature = [un_duration, un_house, un_purpose]

for year in work_year:
    sse_list = []
    
    temp = df_n[df_n['근로기간'] == year]
    
    for i, col in enumerate(category_col):
        feature = temp[col]
        data = (feature.value_counts() / feature.value_counts().values.sum()).sort_index()
        
        error = data - un_feature[i]
        
        se = error ** 2
        
        sse_list.append(se.values.sum())
    
    print(f'{year} year sse : {sum(sse_list)}')

 

 

2) 이상치 제거


팀원분께서 맡아주신 부분이었다.

기존의 IQR을 사용하는 방법보다
ESD를 사용하는 법이 데이터 보존이 더 잘 됐다.

데이터를 관측했을 때, 
이상치라고 생각했던 것 또한
10~20개 내외로 생각했었기 때문에
괜찮을 거 같다.

 

 

3) 파생변수


일전에 randomforestclassifier를 이용해
등급을 내본적이 있는데
낮은 대출등급을 잘 맞추지 못하였다.

고로 낮은 대출등급을 잘 잡아낼 수 있는
파생변수를 고안하고 있다.

아래 코드는 대출등급이 'G'인 데이터의
category_feature의 분포를 살펴보는 코드다.

대출등급이 높을 수록 아래에 부합하는 데이터의 비율이 높았다.

대출기간 : 단기
근로기간 : 장기
주택상태 : 전세
대출목적 : 부채통합

하지만 G등급에서는 아래에 부합하는 것들이 가장 비율이 높았다.
고로 파생변수를 생성시에 상위 등급과 달라진 대출기간, 주택상태에 높은 비중을 두며,
대출기간과 연관되는 컬럼을 찾아서 같이 연관 짓는 것이 중요하다.

필자의 생각으로는 단기적인 상환 능력이 떨어지기 때문에 장기를 선택한 것으로 보이므로,
상환 능력에 관한 컬럼을 살펴볼 예정이다.

대출기간 : 장기
근로기간 : 장기
주택상태 : 월세
대출목적 : 부채통합

g = df_n[df_n['대출등급'] == 'G']

feature_col = ['대출기간', '주택소유상태', '대출목적', '근로기간']

for col in feature_col:
    print(col)
    display((g[col].value_counts()/len(g[col])).sort_values(ascending=False))​

할 것이 많으니
명절 연휴에도 마냥 쉴 수만은 없을 것이다
반응형

'TIL' 카테고리의 다른 글

내배캠 TIL 40일차  (0) 2024.02.15
내배캠 TIL 39일차  (0) 2024.02.14
내배캠 TIL 36일차  (1) 2024.02.07
내배캠 TIL 35일차  (0) 2024.02.06
내배캠 TIL 34일차  (1) 2024.02.05