๐ชช HOME CREDIT #2:EDA
๊ฐ์ฅ ์ค์ํ ์ ์ฒ๋ฆฌ ๋จ๊ณ์ด๋ค.
๋ฐ์ดํฐ์ ํ์ง์ด ๋ชจ๋ธ์ ์ฑ๋ฅ์ ๊ฒฐ์ ํ๋ ๋งํผ, ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ธ์ ์ค๋ช
๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ์ค์ํ ๋งํผ,
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๊ณผ์ ์์ ๋๋๋ฅผ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ์๋ค.
๋ฐ์ดํฐ ํ์ธ
๋ฐ์ดํฐ ์ค๋ช ํ์ด์ง : https://www.kaggle.com/competitions/home-credit-default-risk/data
์ด๋ฒ ์ค์ต์์๋ application.csv ๋ง ์ฌ์ฉํ๋ค. ์ถํ์ SK_ID_CURR์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ค์ ํฉ์ณ๋ณผ ์์ ์ด๋ค.
TARGET์ ๋ถ๋/์ ์ ๋น์จ์
๋ถ๋ ๋น์จ: 8.07%
์ ์ ๋น์จ: 91.93%
์ญ์๋ ๋ถ๊ท ํ์ด ์ฌํ ๊ฒ์ ์ ์ ์๋ค.
๋ถ์ ์ ์ธ ๋ณ์
122๊ฐ์ ์ปฌ๋ผ ์ค 1์ฐจ์ ์ผ๋ก ํ์ ์๋ ์ปฌ๋ผ๋ค์ ์ ์ธ์์ผฐ๋ค.
- ๊ฒฐ์ธก์น ๋น์จ๋ก ๋ณ์ ๋ฒ๋ฆฌ๊ธฐ
๊ฒฐ์ธก์น๋ ์ดํ ๋ฐ๋ก ์ฒ๋ฆฌํ์ง๋ง ๊ทธ ์ ์ ๊ฒฐ์ธก์น๊ฐ ๋๋ฌด ๋ง์ ๋ณ์๋ค์ ๋ฏธ๋ฆฌ ์ ์ธํ๋ ค๊ณ ํ๋ค.
์ ์ฒด ๋ฐ์ดํฐ์์ ๊ฒฐ์ธก ๋น์จ์ด 60% ์ด์์ธ ๋ณ์๋ค์ ์ ์ธ์์ผฐ๋ค.
๋น์จ์ ๊ธฐ์ค์ ๋ํด์๋ ๋ณดํต 50% ์ด์์ด๋ฉด ์ ๋ขฐ๋ ๋ฌธ์ ๋ก ์ ์ธ์ํจ๋ค๊ณ ํ๋๋ฐ,
์ฌ์ฉํ๋ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ์๊ณ๊ฐ์ 50%๋ก ์ก์ผ๋ฉด ๋ณ์๊ฐ 14๊ฐ๊ฐ ๋ ๋ผ๊ฐ๋ค.
๊ทธ ์ค ์ค์ํด ๋ณด์ด๋ ๋ณ์๋ค์ด ๊ฝค ํฌํจ๋์ด ์์ผ์ ๊ทธ๋ฅ ๋ด ์์๋ก 60%๋ก ํ๋ค.
๋น ๋ถ๊ธฐ ํ๊ธฐ ๊ณต๋ถํ ๋๋ ์ฐ๊ตฌ์์ ์ฃผ๊ด์ด ๊ฐ์ ๋๋ ๋ถ๋ถ์ด ์ ์ฒ๋ฆฌ๋ผ๊ณ ํ์ผ๋ ๋ฌธ์ ์์ง ์์๊น… ์๊ฐํ๋ค.
def drop_null_cols(df, threshold=0.6):
"""
๋ฐ์ดํฐํ๋ ์์์ ๊ฒฐ์ธก์น ๋น์จ์ด threshold ์ด์์ธ ๋ณ์๋ฅผ ์ ๊ฑฐํ๋ ํจ์
"""
null_percent = df.isnull().mean()
drop_cols = list(null_percent[null_percent >= threshold].index)
df = df.drop(drop_cols, axis=1)
print(f"Dropped {len(drop_cols)} columns: {', '.join(drop_cols)}")
return df
# Dropped 6 columns: OWN_CAR_AGE, YEARS_BUILD_AVG, COMMONAREA_AVG, FLOORSMIN_AVG, LIVINGAPARTMENTS_AVG, NONLIVINGAPARTMENTS_AVG
- ์ค๋ณต๋๋ ์ง๊ณ ๋ณ์ ์ ๊ฑฐ
๋์ผํ ์ด๋ฆ์_AVG,_MEDI,_MODE๋ก ๊ตฌ๋ถ๋์ด ์๋ ๋ณ์๋ค์ด ์๋๋ฐ, ์ด๋ค ์คAVG๋ณ์๋ค๋ง ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค.
์ด๋_MODE๋ฐ์ดํฐ๋ฅผ ์ ์ธํ ๋ ์ฃผ์ํ ์ ์ด ์๋๋ฐ, ์ค์๊ฐ์ ์๋ฏธํ๋ ๋ณ์๊ฐ ์๋ ํ์ ์ ์๋ฏธํ๋_MODE๋ณ์๋ค์ด ์์ด์ ์ด ๋ณ์๋ค์ ์ ์ธํ์ง ์์์ผ ํ๋ค.
# ์ค๋ณต ์ ๋ณด ์ ๊ฑฐ (์ ๊ฑฐํ๋ฉด ์๋๋ MODE (์ค์๊ฐ ์๋๊ฑฐ))
get_base = lambda sfx: [c.replace(sfx, '') for c in df.columns if c.endswith(sfx)]
mode = get_base('_MODE')
medi = get_base('_MEDI')
avg = get_base('_AVG')
intersection = list(set(mode) & set(medi) & set(avg))
difference = list(set(mode) - set(medi) - set(avg))
mode_medi_cols = [col for col in df.columns if '_MODE' in col or '_MEDI' in col]
mode_medi_cols = [col for col in mode_medi_cols if col not in difference]
df.drop(columns=mode_medi_cols, inplace=True, errors='ignore')
# ์ ๊ฑฐ ์ ์ธ ๋ณ์:['EMERGENCYSTATE', 'TOTALAREA', 'FONDKAPREMONT', 'WALLSMATERIAL', 'HOUSETYPE']
์ด๊ธฐ์ 122๊ฐ์์ 34๊ฐ๋ฅผ ์ ์ธํ 88๊ฐ์ ์ปฌ๋ผ์ ๊ฐ์ง๊ณ ๋ณธ๊ฒฉ์ ์ธ ์ ์ฒ๋ฆฌ๋ฅผ ์งํํ๋ค.
1์ฐจ ๋ณ์ ์ฒ๋ฆฌ
๋ฐ์ดํฐ๋ค๊ณผ ๋ณ์ ์ค๋ช ์๋ฅผ ์ฝ์ผ๋ฉด์ ๋ฐ๋ก ํน๋ณํ ์ฒ๋ฆฌํด์ค์ผํ ๋ณ์๋ค์ ์์๊น ๊ณ ๋ฏผํด๋ดค๋ค.
๊ทธ ๊ฒฐ๊ณผ _DAYS ๋ณ์์ FLAG_DOCUMENT ๋ณ์๋ ๋์ค์ ๋ถ์์ ๋ ์ฉ์ดํ๊ฒ ๋ฏธ๋ฆฌ ๋ณ๋ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ ๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค๋ ํ๋จ์ ํ๋ค.
- _DAYS ๋ฐ์ดํฐ ๋ณํ
์ด ๋ฐ์ดํฐ์ ์ ํน์ง ์ค ํ๋๋ ๋ ์ง ๊ด๋ จ ๋ฐ์ดํฐ์ด๋ค.
DAYS_BIRTH, DAYS_REGISTRATION, DAYS_EMPLOYED ๋ฑ DAYS_๋ก ์์ํ๋ ๋ณ์๋ค์ด๋ค.
“time only relative to the application” ์ด๋ผ๊ณ ์ค๋ช ๋์ด ์๊ณ , ๋ฐ์ดํฐ๋ค์ ๋์ฒด๋ก ์์ ํํ์ด๋ค.
์ฆ, ๋ฐ์ดํฐ ์์ง์ผ์ (0) ๊ธฐ์ค์ผ๋ก ํด๋น ์ผ์๋ฅผ ์ญ์ผ๋ก ๊ณ์ฐํ๋ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค์ด ์์ง์ผ 30์ผ ์ ์ ์ง์ฅ์ ๊ตฌํ๋ค๋ฉด ํด๋น ๊ณ ๊ฐ์ ๋ฐ์ดํฐ๋ -30 ์ธ๊ฑฐ๋ค.
์ด๋ฌํ ํน์ง์ ํฅํ ๋ฐ์ดํฐ ํด์์ด๋ ํ์๋ณ์ ์์ฑ ์ ๋ถํธํจ์ ์ค ์ ์๊ธฐ์ ์ ๋๊ฐ์ผ๋ก ๋ณํํด ์์๋ก ๋ณํํ์๋ค.
๊ทธ๋ฌ๋ ๊ทธ ์ ์ ์ฃผ์ํด์ผํ ๋ถ๋ถ์ด ์๋ค.
DAYS_EMPLOYED์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ๋ฒ์๋ฅผ ์ดํด๋ณด๋ฉด ๋์ฒด๋ก ๋ค ์์์ด์ง๋ง ๊ฐํน 365243 ๊ฐ์ด ์ฐํ์๋ค.
์ด๋ ๋ฐ์ดํฐ ์
๋ ฅ์๊ฐ ๋ฌด์ง์ธ ๊ณ ๊ฐ์ ๊ตฌ๋ถํ๊ธฐ ์ํด ์์์ ์์๊ฐ์ ๋์
ํด๋ ๊ฒ์ด๋ผ๊ณ ํ๋ค.
๋ฐ๋ผ์ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๊ธฐ ์ ์ ํด๋น ๊ฐ์ ๋ค 0์ผ๋ก ์ฒ๋ฆฌํ์๋ค.(๊ทผ๋ฌด ์ผ์๊ฐ ์์) ๊ทธ๋ฆฌ๊ณ ๋ฌด์ง ์ฌ๋ถ๋ฅผ ํ์ ํ๋ ๋ณ๋์ ํ๋๊ทธ ๋ณ์๋ ์์ฑํด์คฌ๋ค.
๊ทธ๋ ๊ฒ ์์ ๋ ๋ฐ์ดํฐ์ ํํ๋ ์๋์ ๊ฐ๋ค.
- FLAG_DOCUMENT ์ฒ๋ฆฌ
๋ฐ์ดํฐ๋ฅผ ๋ณด๋ฉดFLAG_DOCUMENT๊ฐ 2๋ถํฐ 21๊น์ง ์๋๋ฐ(0:๋ฏธ์ ์ถ, 1:์ ์ถ), ์ ๋ฌธ์๋ค์ด ์ด๋ค ๋ด์ฉ์ธ์ง๋ ์ ์๊ฐ ์๋ค.
๊ทธ๋ ๊ธฐ์ ์ ๋ฌธ์๋ค์ ๋ค ๊ฐ์ง๊ณ ๋ถ์ํ๋ ๊ฒ ๋ณด๋ค๋ ๊ฐ๋ณ ๋ฌธ์ ์ ์ถ ํจํด๋ค์ ๋จผ์ ํ์ ํ๋ ๊ฒ ์ข๊ฒ ๋ค๊ณ ํ๋จํ๋ค.
๋ฌธ์ 3์ ๊ฒฝ์ฐ ๊ณ ๊ฐ์ 70%์ด์์ด ์ ์ถํ๊ฑธ๋ก ๋ณด์ ๋๋ฆ์ ํ์์๋ฅ? ์ธ๋ฏํ๋ค.
์ฐ์ ๊ฐ ๊ณ ๊ฐ์ด ์ ์ถํ ๋ฌธ์์ ์ดํฉ ๋ณ์๋ฅผ ์ถ๊ฐ๋ก ์์ฑํด์คฌ๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ ์๋ฅ๋ก ๋ณด์ด๋ 3๋ฒ ๋ฌธ์๋ฅผ ์ ์ธํ๊ณ ๋ ๋ฌธ์๋ฅผ ์ ์ธํ ๊ณ ๊ฐ์ด ์๋ค๋ฉด ํ๋๊ทธ ๋ณ์๋ก ๋ ๋ง๋ค์ด์ฃผ์๋ค.
๋ํ ์ ์ถ ๋น๋๊ฐ ๋๋ฌด ๋ฎ์ ์๋ฅ์ ๊ฒฝ์ฐ๋ ์คํ๋ ค ๋์์ด ์ ๋ ๊ฒ ๊ฐ์ ์ ๊ฑฐํด ์ฃผ์๋ค.
๋ฐ์ดํฐ ํ์ ๋ถ๋ฅ
๋ค์์ ๋ฒ์ฃผํ, ์์นํ์ผ๋ก ์ปฌ๋ผ์ ๊ตฌ๋ถํด์ผ ํ๋ค.
select_dtypes์ผ๋ก ์ซ์์ ๋ฌธ์์ด์ ๊ตฌ๋ถํ ์ ์์ง๋ง,
๋ฐ์ดํฐ ์ค์๋ ๊ฐ์ ์ซ์์ด์ง๋ง ์ฌ์ค์ ์๋ฏธ๋ ๋ฒ์ฃผํ์ธ ๋ณ์๋ค๋ ์๋ค.
์๋ฅผ ๋ค๋ฉด FLAG ํ์
์ ๋ณ์๋ค์ด๋ค.
๋ฐ๋ผ์ ์ด ๋ณ์๋ค์ ๋ณ๋๋ก ๋ฒ์ฃผํ ์ปฌ๋ผ ๋ฆฌ์คํธ์ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค.
๋ณ์๋ช ํ๋ํ๋ ์ฝ์ผ๋ฉด์ ๋ถ๋ฅํด๋ ๋์ง๋ง, ๋ ๋ง์ ๋ณ์๋ฅผ ๋ค๋ค์ผํ ๋๋ฅผ ๋๋นํด ์ฝ๊ฐ์ ํธ๋ฒ(?)์ ์ฌ์ฉํ๋ค.
๋ฐ์ดํฐ์ ๊ณ ์ ๊ฐ์ด ํน์ ๊ฐ์ ์ดํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฒ์ฃผํ์ผ๋ก ์ธ์ํ๋ ๊ฒ์ด๋ค.
# ๋ฒ์ฃผํ, ์์นํ ๋ณ์ ๋ถ๋ฅ
num_cols = df.select_dtypes(include=np.number).columns.tolist()
num_cols.remove('TARGET')
potential_cat_cols = []
# ๊ธฐ์ค ์ค์ : ์๋ฅผ ๋ค์ด ๊ณ ์ ๊ฐ์ด threshold ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ
threshold = 4
for col in num_cols:
if df[col].nunique() <= threshold:
potential_cat_cols.append(col)
num_cols = [c for c in num_cols if c not in potential_cat_cols]
cat_cols = df.select_dtypes(exclude=np.number).columns.tolist() + potential_cat_cols
print(f"์๋กญ๊ฒ ๋ถ๋ฅ๋ ๋ฒ์ฃผํ ๋ณ์: {potential_cat_cols}")
# ์๋กญ๊ฒ ๋ถ๋ฅ๋ ๋ฒ์ฃผํ ๋ณ์: ['FLAG_MOBIL', 'FLAG_EMP_PHONE', 'FLAG_WORK_PHONE', 'FLAG_CONT_MOBILE', 'FLAG_PHONE', 'FLAG_EMAIL', 'REGION_RATING_CLIENT', 'REGION_RATING_CLIENT_W_CITY', 'REG_REGION_NOT_LIVE_REGION', 'REG_REGION_NOT_WORK_REGION', 'LIVE_REGION_NOT_WORK_REGION', 'REG_CITY_NOT_LIVE_CITY', 'REG_CITY_NOT_WORK_CITY', 'LIVE_CITY_NOT_WORK_CITY', 'FLAG_DOCUMENT_3', 'FLAG_DOCUMENT_5', 'FLAG_DOCUMENT_6', 'FLAG_DOCUMENT_8', 'FLAG_DOCUMENT_9', 'FLAG_DOCUMENT_11', 'FLAG_DOCUMENT_13', 'FLAG_DOCUMENT_14', 'FLAG_DOCUMENT_15', 'FLAG_DOCUMENT_16', 'FLAG_DOCUMENT_18', 'DAYS_EMPLOYED_ANOM', 'DOCUMENT_3_AND_OTHERS']
๊ทธ ๊ฒฐ๊ณผ ์ด 46๊ฐ์ ๋ฒ์ฃผํ ๋ณ์์ 35๊ฐ์ ์์นํ ๋ณ์๋ก ๋ถ๋ฅํ์๋ค.
๋ณ์ ์์ฝํ
๋จผ์ ๋ฒ์ฃผํ ๋ณ์๋ค.
๊ทธ๋ฆฌ๊ณ ์์นํ ๋ณ์๋ค.
๊ฒฐ์ธก์น
์ด์ ์ ๋ง ์ค์ํ ๊ฒฐ์ธก์น ์ฒ๋ฆฌ.
๋ฒ์ฃผํ
๋ฒ์ฃผํ์ ๊ฒฝ์ฐ ๊ฒฐ์ธก๊ฐ ์์ฒด๋ ์๋ฏธ๊ฐ ์์ ์ ์๋ค๊ณ ํ๋ค.
์ฆ, “๊ณ ๊ฐ์ด ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง ์์๋ค” ๋ผ๋๊ฒ ์ ๋ณด๊ฐ ๋ ์ ์์ผ๋, ๊ฒฐ์ธก๊ฐ์ ‘Unknown’ ๋ฌธ์์ด๋ก ์ฑ์ ๋ค.
์์นํ
๋ค์์ ์์นํ์ธ๋ฐ ์ด๊ฒ ์ข ๊ณ ๋ฏผ์ด ๋์๋ค.
์ฐ์ ๋ณ์์ ํน์ง์ ๋ํ๊ฐ์ผ๋ก ๋์ฒดํ๊ธฐ ์ด๋ ค์ด ๋ณ์๋ค์ด ์์๋ค.
AMT_REQ_CREDIT_BUREAU ์ SOCIAL_CIRCLE ๊ฐ ๋ค์ด๊ฐ ๋ณ์๋ค์ด๋ค.
‘์ ์ฉ ์กฐํ ํ์’ ์ ‘์ฃผ๋ณ์ธ ์ฐ์ฒด ํ์’ ๊ฐ ๋น์ด ์๋ ๊ฒฝ์ฐ๋ 0์ผ๋ก , ์ฆ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒฝ์ฐ๋ก ๋ด๋ ๋์ง ์์๊น? ์๊ฐํ์๋ค.
๋ด ์๊ฐ์ด ํ๋นํ์ง ์ ๊ฒํ๊ธฐ ์ํด 0์ธ๊ฒฝ์ฐ์ ๋ถ๋ ๋น์จ๊ณผ Null์ธ ๊ฒฝ์ฐ์ ๋ถ๋ ๋น์จ์ ๋น๊ตํด๋ดค๋ค.
๊ทธ ๊ฒฐ๊ณผ ํ๊ท ์ ์ผ๋ก 4% ์ ๋์ ๋น์จ์ฐจ์ด๊ฐ ์์์ ํ์ธํ๋ค.
์ฌ์ค 4% ์ฐจ์ด๊ฐ ์ ์๋ฏธํ ์ฐจ์ด์ธ์ง๋ ๋ด๊ฐ ํ๋จํ๊ธฐ ์ด๋ ค์์ ์ฌ๋ฏธ๋ํํ ๋ฌผ์ด๋ดค๋ค.
๊ธ์ต ๋ฐ์ดํฐ(์ ์ฉ์นด๋, ๋์ถ ๋ฑ)์์ ์ ์ฒด ๋ถ๋์จ์ ๋ณดํต 5~10% ๋ด์ธ์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด๋ 4% ํฌ์ธํธ์ ์ฐจ์ด๋ ์๋์ ์ผ๋ก ๋งค์ฐ ํฐ ๋น์ค์ ์ฐจ์งํฉ๋๋ค.
0์ธ ๊ทธ๋ฃน: ์ค์ ๋ก ์กฐํ๊ฐ ๋ฐ์ํ์ผ๋ ํ์๊ฐ 0์ด๊ฑฐ๋, ์์คํ ์ ๊ธฐ๋ก๋ “์ ์์ ๋ฌด์ค์ ” ์ํ์ผ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
Null์ธ ๊ทธ๋ฃน: ๋จ์ํ ๋ฐ์ดํฐ ๋๋ฝ์ด ์๋๋ผ, “์ ๋ณด๊ฐ ์์(Unknown)” ์์ฒด์ ํน์ ํ ์๋ฏธ๊ฐ ์์ ์ ์์ต๋๋ค. (์: ์ ์ฉ ๊ฑฐ๋ ์ด๋ ฅ์ด ์์ ์๋ ์ ๊ท ๊ณ ๊ฐ์ด๊ฑฐ๋, ํน์ ๊ฒฝ๋ก๋ก ์ ์ ๋์ด ์ ๋ณด ์์ง์ด ์ ๋ ๊ณ ๊ฐ๊ตฐ)
๊ทธ๋ ๋จ๋ค. ๊ทธ๋์ ์ ๋ณด ์ฌ๋ถ ์์ฒด๋ฅผ ํ๋จํ๋ IS_NULL ๋ณ์๋ฅผ ๊ฐ๊ฐ ์ถ๊ฐ๋ก ์์ฑํด ์ค ํ ํด๋น ๋ณ์์ ๊ฒฐ์ธก๊ฐ์ 0์ผ๋ก ๋์ฒดํ์๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ ์ธ์ ์์นํ ๋ณ์ ์ฒ๋ฆฌ ๋ฐฉ์์ ํ๊ท ๊ฐ, ์ต๋น๊ฐ, ์ค์๊ฐ ๋ฑ ์ค์์ ๊ณ ๋ฏผ์ ํด๋ดค๋ค.
๊ฒฐ์ธก๊ฐ ๋น์จ์ด 40%๊ฐ ๋๋ ๋ฐ์ดํฐ๋ค์ ๋ถํฌ๋ฅผ ๊ทธ๋ ค๋ดค๋ค.
EXT_SOURCE1๋ฅผ ์ ์ธํ๋ฉด ๋ชจ๋ ํ์ชฝ์ผ๋ก ์น์ฐ์น ๋ถํฌ๋ฅผ ๋ ๊ณ ์๋ค.
ํ๊ท ๊ฐ์ผ๋ก ๊ฐ์ ๋์ฒดํ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ์๊ณก์ด ๋ฐ์ํ ๊ฒ ๊ฐ์๋ค.
๊ทธ๋์ ์ค์๊ฐ์ผ๋ก ๊ฒฐ์ธก๊ฐ์ ๋์ฒดํ๊ธฐ๋ก ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ๊ฒฝ์ฐ์๋
datetimeํํ์ ๋ฐ์ดํฐ๊ฐ ์์ง๋ง, ๋ง์ฝ ๋ ์ง์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๋ณ์๊ฐ ์๋ค๋ฉด ์์นํ์ผ๋ก ๋ค๋ฃจ๋ ๊ฒฐ์ธก๊ฐ์ Bfill์ด๋ Ffill๋ก ํด์ผํ์ง ์์๊น ์๊ฐ์ด ๋ค์๋ค.
ํ์๋ณ์
๊ทธ ๋ค์์ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด ํ์๋ณ์๋ฅผ ์์ฑํ๋ค.
์ด ๋ถ๋ถ์ ๋ค๋ฅธ ์ฌ๋ก์ ์ฌ๋ฏธ๋์ ๋์์ ์ข ๋ฐ์๋ค.
#8. ํ์๋ณ์ ์์ฑ
df['AGE'] = df['DAYS_BIRTH'] / 365
df['YEARS_EMPLOYED'] = df['DAYS_EMPLOYED'] / 365
df['REGISTRATION_BIRTH_RELA'] = df['DAYS_REGISTRATION'] / df['DAYS_BIRTH']
df['ID_PUBLISH_BIRTH_RELA'] = df['DAYS_ID_PUBLISH'] / df['DAYS_BIRTH']
# (1) ์๋ ๋ฐ ๋์ถ ๊ด๋ จ ๋น์จ
df['INCOME_CREDIT_PERC'] = df['AMT_INCOME_TOTAL'] / df['AMT_CREDIT']
df['INCOME_PER_PERSON'] = df['AMT_INCOME_TOTAL'] / df['CNT_FAM_MEMBERS']
df['ANNUITY_INCOME_PERC'] = df['AMT_ANNUITY'] / df['AMT_INCOME_TOTAL']
df['PAYMENT_RATE'] = df['AMT_ANNUITY'] / df['AMT_CREDIT']
df['LTV'] = df['AMT_CREDIT'] / df['AMT_GOODS_PRICE']
# (2) ์๊ฐ/๊ณ ์ฉ ๊ด๋ จ ๋น์จ
df['WORKING_LIFE_PERC'] = df['DAYS_EMPLOYED'] / df['DAYS_BIRTH']
df['ID_TO_BIRTH_PERC'] = df['DAYS_ID_PUBLISH'] / df['DAYS_BIRTH']
# (3) ์ธ๋ถ ์์ค ํตํฉ (NaN ์ ์ธ ์ฐ์ฐ)
df['EXT_SOURCES_MEAN'] = df[['EXT_SOURCE_1', 'EXT_SOURCE_2', 'EXT_SOURCE_3']].mean(axis=1)
df['EXT_SOURCES_NANPROD'] = df[['EXT_SOURCE_1', 'EXT_SOURCE_2', 'EXT_SOURCE_3']].apply(lambda x: np.nanprod(x), axis=1)
๋ง์ง๋ง์ผ๋ก ‘AMT_INCOME_TOTAL’, ‘AMT_CREDIT’, ‘AMT_ANNUITY’, ‘AMT_GOODS_PRICE’ ๋ณ์๋ค์ ๋ํด์๋ ๋ก๊ทธ ์ฒ๋ฆฌ๋ฅผ ํ์๋ค.
ํด๋น ๋ณ์๋ค์ ์๋ฌด๋๋ ์ด์์น ์์ฒด๊ฐ ํฐ ์๋ฏธ๋ฅผ ๊ฐ๊ธฐ ๋ณด๋ค๋ ์คํ๋ ค ์๊ณก์ ํ ์๋ ์๋ค๊ณ ํ๋จํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ ๋ณ์๋ค ๋ง๊ณ ๋ ์ถํ์ ๋ ๋ก๊ทธ๊ฐ์ผ๋ก ๋ณํํ ๋ณ์๋ฅผ ์ฐพ๊ฒ๋๋ฉด ์ถ๊ฐ๋ก ๊ธฐ์ ํ๊ฒ ๋ค.
์ต์ข ์ ์ผ๋ก ๋ฒ์ฃผํ 49๊ฐ, ์์นํ 50๊ฐ์ ๋ณ์๋ก ์ต์ข ๋ฐ์ดํฐ์ ์ ํ์ ํ์๋ค.
์๊ฐํ
์ ์ฒด ๋ณ์๋ ์๋๊ณ ์ ์ฌํ ๋ณ์ ํน์ ํ์๋ณ์๋ค์ ์๊ฐํ์์ ์ ์ธ์์ผฐ๋ค.
๋ฒ์ฃผํ์ ๊ฒฝ์ฐ,
FLAG_MOBIL, FLAG_CONT_MOBIL ์ ๊ฒฝ์ฐ ๋ถ๋/์ ์ ๊ทธ๋ฃน๊ฐ์ ์ฐจ์ด๊ฐ ์์ด๋ณด์ฌ์ ์ดํ ๋ถ์์์ ์ ์ธํ๊ธฐ๋ก ํ๋ค.
๋ค์์ ์์นํ
์กฐ๊ธ ์์ธ์๋๊ฑด, ๊ทผ์์ผ์๊ฐ ์๋ ๊ฒฝ์ฐ์ ์ ์ ๊ทธ๋ฃน๊ตฐ์ด ๊ฝค ๋ง๋ค๋ ์ ์ด๋ค.
์ด๋ ๊ฒ ํด์ ๋ชจ๋ธ๋ง์ ์ฌ์ฉํ ์ต์ข
๋ฐ์ดํฐ ์
์ ์ถ๋ ค์ก๋ค.
๋ค์ ๋จ๊ณ์์ ๋ณธ๊ฒฉ์ ์ผ๋ก OptBinning์ ํตํด ๋ชจ๋ธ๋ง ์์
์ ์งํํ๊ฒ ๋ค.
์ค์ต ์ฝ๋ :
EDA.ipynb
์๊ฐํ.ipynb