๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ
<์ด์ ๊ธ>
https://silvercoding.tistory.com/71
[rossmann data]์์ ๋งค์ถ ์์ธก/ kaggle ์ถ์๋ฐ์ดํฐ
๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ <์ด์ ๊ธ> https://silvercoding.tistory.com/70 https://silvercoding.tistory.com/69 https://silvercoding.tistory.com/67 https://silvercoding.tistory.com/66 https://silvercoding.ti..
silvercoding.tistory.com
1. ๋ฐ์ดํฐ ์๊ฐ & ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
[ Home Credit Data ]
์๋ณธ ๋ฐ์ดํฐ: ์บ๊ธ
ํ์ต์ฉ ๋ฐ์ดํฐ: ๋ฌ๋์คํผ์ฆ ์ ๊ณต
- ๊ณ ๊ฐ์ ๋์ถ ์ํ๋ฅ๋ ฅ ์์ธก: ๊ณ ๊ฐ์ ์ธ์ ์ ๋ณด, ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ํด๋น ๊ณ ๊ฐ์๊ฒ ๋์ ๋น๋ ค์ฃผ์์ ๋ ์ด๋ฅผ ์ํํ ์ง ์ฌ๋ถ๋ฅผ ์์ธก
train.csv - ํ์ต ๋ฐ์ดํฐ
test.csv - ์์ธกํด์ผ ํ test ๋ฐ์ดํฐ
loan_before.csv - ๊ฐ ์ฌ๋์ด ์ด์ ์ ์งํํ๋ ๋์ถ์ ๋ํ ์์ธ ์ ๋ณด
import pandas as pd
import os
os.chdir('../data')
lb = pd.read_csv("loan_before.csv")
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
train.head()
lb.head()
- loan before ์ปฌ๋ผ ์ ๋ณด
์ ๋ํฌํ ์์ด๋ |
SK_ID_CURR |
ํด๋น ๋์ถ์ด home credit์ผ๋ก๋ถํฐ ๋ฐ์ ๋์ถ๋ณด๋ค ๋ฉฐ์น ์ด์ ์ ์ผ์ด๋ฌ๋์ง | DAYS_CREDIT |
๋์ถ ์ฐ์ฅ์ ๋ช ๋ฒ ํ๋์ง | CNT_CREDIT_PROLONG |
๋์ถ๊ธ์ก | AMT_CREDIT_SUM |
๋์ถ ์ ํ | CREDIT_TYPE |
- train, test ์ปฌ๋ผ ์ ๋ณด
์ ๋ํฌํ ์์ด๋ |
SK_ID_CURR |
ํ๊ฒ๊ฐ(0: ์ ์ ์ํ, 1: ์ฐ์ฒด ํน์ ๋ฌธ์ ๊ฐ ์๊ธด ๊ฒฝ์ฐ) | TARGET |
์ฑ๋ณ(0: ์ฌ์ฑ, 1: ๋จ์ฑ) | CODE_GENDER |
์ฐจ ๋ณด์ ์ฌ๋ถ(0: ์์, 1: ์์) | FLAG_OWN_CAR |
์ฃผํ ํน์ ์ํํธ ๋ณด์ ์ฌ๋ถ(0: ์์, 1: ์์) | FLAG_OWN_REALTY |
์๋ ์ | CNT_CHILDREN |
์์ | AMT_INCOME_TOTAL |
๋์ถ๊ธ์ก | AMT_CREDIT |
1๋ฌ๋ง๋ค ๊ฐ์์ผ ํ๋ ๊ธ์ก | AMT_ANNUITY |
๋์ถ์ ์ฒญ์ ํ ๋ ๋๊ฐ ๋ํํ๋์ง | NAME_TYPE_SUITE |
์ง์ ์ข ๋ฅ | NAME_INCOME_TYPE |
ํ์ | NAME_EDUCATION_TYPE |
์ฃผ๊ฑฐ ์ํฉ | NAME_HOUSING_TYPE |
์ง์ญ์ ์ธ๊ตฌ | REGION_POPULATION_RELATIVE |
๋์ด | DAYS_BIRTH |
์ธ์ ์ทจ์ ํ๋์ง(365243๋ ๊ฒฐ์ธก์น) | DAYS_EMPLOYED |
๊ณ ๊ฐ์ด ๋์ถ์ ์ ์ฒญํ ID ๋ฌธ์๋ฅผ ๋ณ๊ฒฝํ ๋ ์ง | DAYS_ID_PUBLISH |
๋ณด์ ํ ์ฐจ์ ๋์ด | OWN_CAR_AGE |
๊ฐ์กฑ ์ | CNT_FAM_MEMBERS |
์ธ์ ๋์ถ์ ์ฒญ์ ํ๋์ง ์๊ฐ | HOUR_APPR_PROCESS_START |
์ผํ๋ ์กฐ์ง์ ์ข ๋ฅ | ORGANIZATION_TYPE |
์ธ๋ถ ๋ฐ์ดํฐ1๋ก๋ถํฐ ์ ์ฉ์ ์ | EXT_SOURCE_1 |
์ธ๋ถ ๋ฐ์ดํฐ2๋ก๋ถํฐ ์ ์ฉ์ ์ | EXT_SOURCE_2 |
์ธ๋ถ ๋ฐ์ดํฐ3๋ก๋ถํฐ ์ ์ฉ์ ์ | EXT_SOURCE_3 |
๋ง์ง๋ง ํธ๋ํฐ์ ๋ฐ๊พผ ์๊ธฐ | DAYS_LAST_PHONE_CHANGE |
์ ์ฒญ ์ 1๋ ๊ฐ ์ ์ฉํ๊ฐ๊ธฐ๊ด์ ํด๋น ์ฌ๋์ ๋ํ ์ ์ฉ์ ๋ณด๋ฅผ ์กฐํํ ๊ฐ์ | AMT_REQ_CREDIT_BUREAU_YEAR |
1. ๋ฌธ์ ์ ์
์ง๋ฌธ 1 - ์ด๋ค ์์๊ฐ ๋์ถ๊ธ ์ํ ์ฌ๋ถ์ ํฐ ์ํฅ์ ์ฃผ๋๊ฐ?
์ง๋ฌธ 2 - ๊ทธ ์์๋ค์ด ์ํ์ฌ๋ถ์ ์ด๋ค ์ํฅ์ ์ฃผ๋๊ฐ?
2. ๋ฐฉ๋ฒ๋ก
- ๋ถ์ ๊ณผ์
์ง๋ฌธ์ ๋ํ ํด๋ต์ ์ป๊ธฐ ์ํด ํด์๊ฐ๋ฅํ ๋จธ์ ๋ฌ๋ (xAI) ํ์ฉ
(1) Feature Engineering
- AMT_CREDIT_TO_ANNUITY_RATIO ๋ณ์ ์์ฑ: ํด๋น ์ฌ๋์ด ๋ช๊ฐ์์ ๊ฑธ์ณ ๋์ ๊ฐ์์ผ ํ๋์ง
train['AMT_CREDIT_TO_ANNUITY_RATIO'] = train['AMT_CREDIT']/train['AMT_ANNUITY']
test['AMT_CREDIT_TO_ANNUITY_RATIO'] = test['AMT_CREDIT']/test['AMT_ANNUITY']
- lb๋ฐ์ดํฐ: groupby ํ ํ๊ท
- AMT_CREDIT_SUM (์ด์ ๋์ถ์ ๊ธ์ก)
- DAYS_CREDIT (train, test์ ๋์ถ๋ก๋ถํฐ ๋ฉฐ์น ์ ์ ์ด์ ๋์ถ์ ์งํํ๋์ง)
- CNT_CREDIT_PROLONG (๋์ถ์ฐ์ฅ์ ๋ช ๋ฒ ํ๋์ง)
train = pd.merge( train,lb.groupby(['SK_ID_CURR'])['AMT_CREDIT_SUM'].mean().reset_index(),on='SK_ID_CURR',how='left' )
test = pd.merge( test,lb.groupby(['SK_ID_CURR'])['AMT_CREDIT_SUM'].mean().reset_index(),on='SK_ID_CURR',how='left' )
train = pd.merge( train,lb.groupby(['SK_ID_CURR'])['DAYS_CREDIT'].mean().reset_index(),on='SK_ID_CURR',how='left' )
test = pd.merge( test,lb.groupby(['SK_ID_CURR'])['DAYS_CREDIT'].mean().reset_index(),on='SK_ID_CURR',how='left' )
train = pd.merge( train,lb.groupby(['SK_ID_CURR'])['CNT_CREDIT_PROLONG'].mean().reset_index(),on='SK_ID_CURR',how='left' )
test = pd.merge( test,lb.groupby(['SK_ID_CURR'])['CNT_CREDIT_PROLONG'].mean().reset_index(),on='SK_ID_CURR',how='left' )
- lb ๋ฐ์ดํฐ: groupby ํ ๊ฐฏ์
- count ์ปฌ๋ผ ์์ฑ: ํด๋น ์ฌ๋์ด ์ด์ ์ ๋์ถ์ ๋ช ๋ฒ ์งํํ๋์ง
train = pd.merge(train , lb.groupby(['SK_ID_CURR']).size().reset_index().rename(columns={0:'count'}),on='SK_ID_CURR', how='left')
test = pd.merge(test , lb.groupby(['SK_ID_CURR']).size().reset_index().rename(columns={0:'count'}),on='SK_ID_CURR', how='left')
- ๋ณ์ ์ ๊ฑฐ
ํด๋น ํ๋ก์ ํธ์ ๋ชฉ์ ์ ๋ชจ๋ธ ํด์์ด๊ธฐ ๋๋ฌธ์, ์ด์ ๋ฐฉํด๋ฅผ ์ฃผ๋ ๋ณ์๋ ๋ชจ๋ ์ ๊ฑฐ
์ ๊ฑฐ ๋ณ์๋ชฉ๋ก
- CODE_GENDER : ๋ฒ์ฃผํ ๋ณ์
- FLAG_OWN_CAR : ๋ฒ์ฃผํ ๋ณ์
- NAME_TYPE_SUITE : ๋ฒ์ฃผํ ๋ณ์
- NAME_INCOME_TYPE : ๋ฒ์ฃผํ ๋ณ์
- NAME_EDUCATION_TYPE : ๋ฒ์ฃผํ ๋ณ์
- NAME_HOUSING_TYPE : ๋ฒ์ฃผํ ๋ณ์
- ORGANIZATION_TYPE : ๋ฒ์ฃผํ ๋ณ์
- EXT_SOURCE_1 : ๋ณ์์ ์๋ฏธ๋ฅผ ์ ํํ ๋ชจ๋ฆ
- EXT_SOURCE_2 : ๋ณ์์ ์๋ฏธ๋ฅผ ์ ํํ ๋ชจ๋ฆ
- EXT_SOURCE_3 : ๋ณ์์ ์๋ฏธ๋ฅผ ์ ํํ ๋ชจ๋ฆ
del_list = ['CODE_GENDER','FLAG_OWN_CAR','NAME_TYPE_SUITE','NAME_INCOME_TYPE','NAME_EDUCATION_TYPE','NAME_HOUSING_TYPE','ORGANIZATION_TYPE',
'EXT_SOURCE_1','EXT_SOURCE_2','EXT_SOURCE_3']
train = train.drop(del_list,axis=1)
test = test.drop(del_list,axis=1)
train.columns
(2) ๋ชจ๋ธ๋ง
- ์๊ด๊ด๊ณ๊ฐ ๋์ input๋ณ์๋ ์ญ์ ํ๋ค.
: Input ๋ณ์๊ฐ ๋์ ์๊ด์ฑ์ ๋ ๋ shap value๋ ์ ๋๋ก ๋ ์ค๋ช ๋ ฅ์ ๋ฐํํ์ง ๋ชปํจ.
input_var = ['FLAG_OWN_REALTY', 'CNT_CHILDREN',
'AMT_INCOME_TOTAL', 'AMT_CREDIT', 'AMT_ANNUITY',
'REGION_POPULATION_RELATIVE', 'DAYS_BIRTH', 'DAYS_EMPLOYED',
'DAYS_ID_PUBLISH', 'OWN_CAR_AGE', 'CNT_FAM_MEMBERS',
'HOUR_APPR_PROCESS_START', 'DAYS_LAST_PHONE_CHANGE',
'AMT_REQ_CREDIT_BUREAU_YEAR', 'AMT_CREDIT_TO_ANNUITY_RATIO',
'AMT_CREDIT_SUM', 'DAYS_CREDIT', 'CNT_CREDIT_PROLONG', 'count']
ํ๊ฒ๋ณ์์ธ TARGET ์ ์ ์ธํ ๋ณ์๋ค์ input_var ์ ์ ์ฅํด์ค๋ค.
corr = train[input_var].corr()
corr.style.background_gradient(cmap='coolwarm')
์์ ๊ฐ์ ํํ์ ์๊ฐํ ๊ทธ๋ํ๊ฐ ๊ทธ๋ ค์ง๊ณ , ๋์ ์๊ด์ฑ์ ๋๋ ๋ณ์๋ค์ ๋์ดํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
[ ๋์ ์๊ด์ฑ์ ๋๋ ๋ณ์ ๋ชฉ๋ก ]
- CNT_FAM_MEMBERS & CNT_CHILDREN 0.883051
- AMT_CREDIT_TO_ANNUITY_RATIO & AMT_CREDIT 0.656337
- AMT_ANNUITY & AMT_CREDIT 0.770938
cf) ํผ์ด์จ ์๊ด๊ณ์์ ํด์
r์ด -1.0๊ณผ -0.7 ์ฌ์ด์ด๋ฉด, ๊ฐํ ์์ ์ ํ๊ด๊ณ,
r์ด -0.7๊ณผ -0.3 ์ฌ์ด์ด๋ฉด, ๋๋ ทํ ์์ ์ ํ๊ด๊ณ,
r์ด -0.3๊ณผ -0.1 ์ฌ์ด์ด๋ฉด, ์ฝํ ์์ ์ ํ๊ด๊ณ,
r์ด -0.1๊ณผ +0.1 ์ฌ์ด์ด๋ฉด, ๊ฑฐ์ ๋ฌด์๋ ์ ์๋ ์ ํ๊ด๊ณ,
r์ด +0.1๊ณผ +0.3 ์ฌ์ด์ด๋ฉด, ์ฝํ ์์ ์ ํ๊ด๊ณ,
r์ด +0.3๊ณผ +0.7 ์ฌ์ด์ด๋ฉด, ๋๋ ทํ ์์ ์ ํ๊ด๊ณ,
r์ด +0.7๊ณผ +1.0 ์ฌ์ด์ด๋ฉด, ๊ฐํ ์์ ์ ํ๊ด๊ณ
ํ๊ฒ ๋ณ์์์ ์๊ด์ฑ์ด ๋ ๋ฎ์ ๋ณ์๋ฅผ ์ ๊ฑฐํ๋ค.
print(train['CNT_FAM_MEMBERS'].corr(train['TARGET']))
print(train['CNT_CHILDREN'].corr(train['TARGET']))
0.018876651698723705
0.025357359317615676
del train['CNT_FAM_MEMBERS']
del test['CNT_FAM_MEMBERS']
CNT_FAM_MEMBERS๊ฐ TARGET๊ณผ์ ์๊ด๊ณ์๊ฐ ๋ ๋ฎ์ผ๋ฏ๋ก ์ ๊ฑฐํด ์ค๋ค.
print(train['AMT_CREDIT_TO_ANNUITY_RATIO'].corr(train['TARGET']))
print(train['AMT_CREDIT'].corr(train['TARGET']))
-0.024740288335190132
-0.02255843084934759
del train['AMT_CREDIT']
del test['AMT_CREDIT']
AMT_CREDIT๊ณผ TARGER์ ์๊ด๊ณ์๊ฐ ๋ ๋ฎ์ผ๋ฏ๋ก ์ ๊ฑฐํด ์ค๋ค.
input_var = ['FLAG_OWN_REALTY', 'CNT_CHILDREN',
'AMT_INCOME_TOTAL', 'AMT_ANNUITY', 'REGION_POPULATION_RELATIVE',
'DAYS_BIRTH', 'DAYS_EMPLOYED', 'DAYS_ID_PUBLISH', 'OWN_CAR_AGE',
'HOUR_APPR_PROCESS_START', 'DAYS_LAST_PHONE_CHANGE',
'AMT_REQ_CREDIT_BUREAU_YEAR', 'AMT_CREDIT_TO_ANNUITY_RATIO',
'AMT_CREDIT_SUM', 'DAYS_CREDIT', 'CNT_CREDIT_PROLONG', 'count']
์ ๊ฑฐํ ๋ณ์๋ค์ ์ ์ธํ ๋๋จธ์ง ๋ณ์๋ค์ input_var์ ๋ค์ ์ ์ฅํด ์ค๋ค.
-xgboost ๋ชจ๋ธ๋ง
: shap value๋ฅผ ํ์ฉํ๊ธฐ ์ํด์๋ ๋ชจ๋ธ์ด ๋๋ค ํฌ๋ ์คํธ ํํ์ treeํ ๋ชจ๋ธ์ด์ด์ผ ํ๋ค. ์ด ์ค xgboost๊ฐ ์๋๊ฐ ๋น ๋ฅด๋ฉด์ ๋์ ์ฑ๋ฅ์ ์ ์งํ๋ฏ๋ก ์ ํ.
from xgboost import XGBClassifier
model = XGBClassifier(n_estimators=100, learning_rate=0.1)
model.fit(train[input_var],train['TARGET'])
(3) shap value
import shap
shap_values = shap.TreeExplainer(model).shap_values(train[input_var])
shap.summary_plot(shap_values, train[input_var], plot_type='bar')
ํ๊ฒ๊ฐ์ ๊ฐ์ฅ ํฐ ์ํฅ์ ๋ฏธ์น๋ ์์ 5๊ฐ์ง ๋ณ์ ๋ชฉ๋ก
- AMT_CREDIT_TO_ANNUITY_RATIO
- DAYS_EMPLOYED
- DAYS_CREDIT
- DAYS_BIRTH
- DAYS_LAST_PHONE_CHANGE
(4) 5๊ฐ์ ์์ธก๋ณ์์ ํ๊ฒ๋ณ์(๋์ถ๊ธ ์ํ ์ฌ๋ถ) ์์ ๊ด๊ณ
-1. AMT_CREDIT_TO_ANNUITY_RATIO: ๋์ถ ์ํ ๊ธฐ๊ฐ
shap.dependence_plot('AMT_CREDIT_TO_ANNUITY_RATIO', shap_values, train[input_var])
ํด๋น ๊ทธ๋ํ๋ ์ธ๋ก์ถ์ ๊ฐ์ด ๋ฎ์ ์๋ก ๋์ถ ์ํ์ ์ ํ๋ค๊ณ ํด์(TARGET์ด 0์ผ ํ๋ฅ ์ด ๋์)ํ ์ ์๋ค. ๊ธฐ๊ฐ์ด 12-20๊ฐ์์ผ ๋ ์ํ์ ์ ํ์ง ๋ชปํ๋ฉฐ, 12๊ฐ์ ์ดํ, 20๊ฐ์ ์ด์์ผ ๋๋ ๋น๊ต์ ์ํ์ ์ ํ๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
- 2. DAYS_EMPLOYED: ์ธ์ ์ทจ์ ํ๋์ง
shap.dependence_plot('DAYS_EMPLOYED', shap_values, train[input_var])
๋์ถ์ผ ๊ธฐ์ค์ผ๋ก 9000์ผ ๋ณด๋ค ์ ์ ์ทจ์ ํ์ ๋ ๋์ถ ์ํ ๋ฅ๋ ฅ์ด ๊ธ ์์นํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
- 3. DAYS_CREDIT: ํด๋น ๋์ถ์ด home credit์ผ๋ก๋ถํฐ ๋ฐ์ ๋์ถ๋ณด๋ค ๋ฉฐ์น ์ด์ ์ ์ผ์ด๋ฌ๋์ง
shap.dependence_plot('DAYS_CREDIT', shap_values, train[input_var])
-3000์ผ ๋ถํฐ -2000์ผ๊น์ง ๋์ถ ์ํ ๋ฅ๋ ฅ์ด ์์นํ๋ค๊ฐ ๊ทธ ์ดํ๋ถํฐ ํ๋ฝํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ฆ ๋๋ฌด ์ค๋ ์ ์ ๋์ถ์ ๋ฐ์๊ฑฐ๋, ์ต๊ทผ์ ๋์ถ์ ๋ฐ์์ ๋ ๋์ถ ์ํ ๋ฅ๋ ฅ์ด ๋จ์ด์ง๋ค๊ณ ํ ์ ์๋ค.
- 4. DAYS_BIRTH: ๋์ด
shap.dependence_plot('DAYS_BIRTH', shap_values, train[input_var])
ํ์ด๋์ง ์ค๋ ๋์์ ์๋ก(๋์ด๊ฐ ๋ง์ ์๋ก) ๋์ถ์ํ์ ์ํ๋ ๊ฒฝํฅ์ ๋ณด์ธ๋ค.
- 5. DAYS_LAST_PHONE_CHANGE: ๋ง์ง๋ง ํธ๋ํฐ์ ๋ฐ๊พผ ์๊ธฐ
shap.dependence_plot('DAYS_LAST_PHONE_CHANGE', shap_values, train[input_var])
ํธ๋ํฐ์ ์ค๋ ์ ์ ๋ฐ๊พธ์์ ์๋ก ๋์ถ ์ํ์ ์ํ๋ ๊ฒฝํฅ์ด ๋ณด์ธ๋ค.
3. ๊ฒฐ๋ก
- ๋์ถ ์ํ ๊ธฐ๊ฐ์ด ์ํ์ฌ๋ถ์ ๊ฐ์ฅ ํฐ ์ํฅ์ ์ค๋ค. ํด๋น ์ํฅ์ ๋น์ ํ์ ๊ด๊ณ์ด๋ค. (์ํฅ์ด ํฌ๋ค๊ณ ํด์ ์ธ๊ณผ๊ด๊ณ๊ฐ ์๋ค๊ณ ๋จ์ ์ง๊ธฐ๋ ์ด๋ ต๋ค. )
- ์ฃผํ ๋ณด์ ์ฌ๋ถ์ ์์์ ์๋ ๋์ถ ์ํ๋ฅ๋ ฅ์ ์ํฅ์ ๊ฑฐ์ ๋ฏธ์น์ง ์๋๋ค.
- ์ต๊ทผ์ ์ทจ์ ํ์ ์๋ก, ์ต๊ทผ์ ๋์ถ์ ๋ฐ์์ ์๋ก, ์ต๊ทผ์ ํธ๋ํฐ์ ๋ฐ๊ฟจ์ ์๋ก, ๋์ด๊ฐ ์ด๋ฆด์๋ก ๋์ถ๊ธ ์ํฉ ๊ฐ๋ฅ์ฑ์ด ๋ฎ๋ค.
train['DAYS_EMPLOYED'].quantile(0.75)
-748.0
์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์์ 25%์ ๊ฐ์ ๊ตฌํ ์ ์๋ค. ์ด๋ฅผ ์ด์ฉํ์ฌ 4๊ฐ์ ๋ณ์์ ์์ 25% ์ด์ ๊ทธ๋ฃน๊ณผ ํ์ 25%๋ฏธ๋ง ๊ทธ๋ฃน์ ๋๋์ด ์๊ฐํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธ ํด ๋ณธ๋ค.
- ์์ 25%
group1 = train.loc[ (train['DAYS_EMPLOYED'].quantile(0.75)< train['DAYS_EMPLOYED']) &
(train['DAYS_CREDIT'].quantile(0.75)< train['DAYS_CREDIT']) &
(train['DAYS_LAST_PHONE_CHANGE'].quantile(0.75)< train['DAYS_LAST_PHONE_CHANGE']) &
(train['DAYS_BIRTH'].quantile(0.75)< train['DAYS_BIRTH']) ]
- ํ์ 25 %
group2 = train.loc[ (train['DAYS_EMPLOYED'].quantile(0.25)> train['DAYS_EMPLOYED']) &
(train['DAYS_CREDIT'].quantile(0.25)> train['DAYS_CREDIT']) &
(train['DAYS_LAST_PHONE_CHANGE'].quantile(0.25)> train['DAYS_LAST_PHONE_CHANGE']) &
(train['DAYS_BIRTH'].quantile(0.25)> train['DAYS_BIRTH']) ]
group1['group'] = 1
group2['group'] = 0
group1์ group๋ณ์์ 1์, group2๋ group ๋ณ์์ 0์ ๋ฃ์ด ์ค๋ค.
full = pd.concat([group1,group2],axis=0)
group1๊ณผ group2๋ฅผ ํฉ์ณ์ค๋ค.
import seaborn as sns
sns.barplot('group','TARGET',data=full)
group2 (group=0, ํ์ 25%) ์ Target๊ฐ์ด ๋ฎ์ ๊ฒ์ ๋ณผ ์ ์๋ค(0์ด ๋ง๋ค=์ ์ ์ํ). ๊ฐ ๋ณ์๋ค์ ๊ฐ์ด ์์ ์๋ก ๋์ถ ์ํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๋ ๊ฒฐ๋ก ๊ณผ ๊ฐ์์ ์ ์ ์๋ค.