EDA는 기본적으로 데이터의 크기와 결측치, 통계량, column별 타입 등을 확인한다.
import missingno as msno
msno.bar(df=train.iloc[:,:], color=(0.1,0.6,0.8))
데이터 세부정보 확인 및 가공
train.descrihbe()
train[train['begin_month']>0]
train[train['DAYS_BIRTH']>0]
plt.subplots(figsize = (8,8))
plt.pie(train['credit'].value_counts(),labels = train['credit'].value_counts().index,
autopct="%.2f%%", shadow = True, startangle=90) # 비율 시작이 12시부터 시작.
plt.title('신용 등급 비율',size=20)
plt.show
categorical한 feature와 비교하여 credit 등급별로 상관성을 시각화 하기 위한 cat_plot 정의
train_0 = train[train['credit']==0.0]
train_1 = train[train['credit']==1.0]
train_2 = train[train['credit']==2.0]
def cat_plot(column):
f, ax = plt.subplots(1,3, figsize=(16,6))
sns.countplot(x = column,
data = train_0,
ax = ax[0],
order = train_0[column].value_counts().index)
ax[0].tick_params(labelsize=12)
ax[0].set_title('credit = 0')
ax[0].set_ylabel('count')
ax[0].tick_params(rotation=50)
sns.countplot(x = column,
data = train_1,
ax = ax[1],
order = train_1[column].value_counts().index
)
ax[1].tick_params(labelsize=12)
ax[1].set_title('credit = 1')
ax[1].set_ylabel('count')
ax[1].tick_params(rotation=50)
sns.countplot(x = column,
data = train_2,
ax = ax[2],
order = train_2[column].value_counts().index)
ax[2].tick_params(labelsize=12)
ax[2].set_title('credit = 2')
ax[2].set_ylabel('count')
ax[2].tick_params(rotation=50)
plt.subplots_adjust(wspace=0.3, hspace=0.3)
plt.show()
cat_plot("gender") # 남,여 성별로 비교.
여성사용자들이 많으며 credit별로 큰 차이는 존재하지 않는다. 다른 feature에서도 credit별 크게 유의미한 차이는 없는 것으로 확인된다.
f, ax = plt.subplots(1, 3, figsize=(16,6))
sns.countplot(y = 'occyp_type', data = train_0, order = train_0['occyp_type'].value_counts().index, ax=ax[0])
sns.countplot(y = 'occyp_type', data = train_1, order = train_1['occyp_type'].value_counts().index, ax=ax[1])
sns.countplot(y = 'occyp_type', data = train_2, order = train_2['occyp_type'].value_counts().index, ax=ax[2])
plt.subplots_adjust(wspace=0.5, hspace=0.3)
plt.show()
credit별로 숫자에 약간의 차이가 있을뿐 직업 분포는 비슷하다.
def num_plot(column):
fig, axes = plt.subplots(1, 3, figsize=(16,6))
sns.distplot(train_0[column],
ax = axes[0])
axes[0].tick_params(labelsize=12)
axes[0].set_title('credit = 0')
axes[0].set_ylabel('count')
sns.distplot(train_1[column],
ax = axes[1])
axes[1].tick_params(labelsize=12)
axes[1].set_title('credit = 1')
axes[1].set_ylabel('count')
sns.distplot(train_2[column],
ax = axes[2])
axes[2].tick_params(labelsize=12)
axes[2].set_title('credit = 2')
axes[2].set_ylabel('count')
plt.subplots_adjust(wspace=0.3, hspace=0.3)
num_plot('child_num') #아이들의 숫자를 나타내는 child_num을 credit별로 비교
마찬가지로 credit 등급별로 비슷한 양상을 보이고 있다.
categorical feature들을 제외하고 credit만 원핫인코딩으로 0,1,2로 구분한 뒤에 히트맵으로 상관관계를 확인하겠다.
trains = train # heatmap에 사용할 목적으로 새로운 train생성
drop_list=['gender','car','reality','income_type','edu_type','family_type','house_type','occyp_type']
category_cols = ['credit']
trains = pd.get_dummies(trains, category_cols)
plt.figure(figsize=(10,10)) # 도표 크기 설정
sns.heatmap(data = trains.corr(), annot=True, cmap='bwr',fmt = '.2f')
plt.show()