(3-5) EDA project

Yongjoo Lee·2020년 12월 18일
0
post-thumbnail
post-custom-banner

Mission : It's Your Turn!

1. 본문에서 언급된 Feature를 제외하고 유의미한 Feature를 1개 이상 찾아봅시다.

  • Hint : Fare? Sibsp? Parch?
# 라이브러리 불러오기

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline

# 데이터 블러오기
# 동일 경로에 "train.csv"가 있는 경우

titanic_df = pd.read_csv("./train.csv")

1. SibSp + Fare

👉 형제자매나 배우자를 포함해서 3명이서 온 사람들 중에서 요금을 많이 지불한 사람이 많다.

# print(titanic_df.groupby(['SibSp'])['Fare'].min())
# print(titanic_df.groupby(['SibSp'])['Fare'].max())
# print(titanic_df.groupby(['SibSp'])['Fare'].sum())

sns.catplot(x='SibSp', y='Fare', kind='point', data=titanic_df)
plt.show()

sns.catplot(x='SibSp', y='Fare', data=titanic_df)
plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F78131a44-5490-465f-9742-6f2aaae61ca1%2Foutput_46_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F78131a44-5490-465f-9742-6f2aaae61ca1%2Foutput_46_0.png)

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Ff015212f-885b-49a8-a2ef-4108dce4600e%2Foutput_46_1.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Ff015212f-885b-49a8-a2ef-4108dce4600e%2Foutput_46_1.png)

2. SibSp + Survived

👉 2명 이하의 가족 단위로 온 사람들이 대체적으로 많이 생존했다.

fig, ax = plt.subplots(1, 1, figsize=(10, 5))
sns.kdeplot(x=titanic_df[titanic_df['Survived'] == 1]['SibSp'], ax=ax)
sns.kdeplot(x=titanic_df[titanic_df['Survived'] == 0]['SibSp'], ax=ax)

plt.legend(['Survived', 'Dead'])
plt.xticks(np.arange(0,8,1))

plt.show()

plt.hist(titanic_df['SibSp'])
plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F58f027b6-f443-4f03-b821-0a01be7ad219%2Foutput_48_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F58f027b6-f443-4f03-b821-0a01be7ad219%2Foutput_48_0.png)

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F4143af61-479f-4fb7-8263-67d01bfeaaac%2Foutput_48_1.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F4143af61-479f-4fb7-8263-67d01bfeaaac%2Foutput_48_1.png)

3. Fare + Age

👉 30대 중반과 60대 중반 사람들이 요금을 많이 지불했다.

# len(titanic_df['Age'].value_counts())

sns.catplot(x='Age', y='Fare', kind='violin', data=titanic_df)
plt.xticks(np.arange(0, 100, 10))
plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F1c20f577-f295-4498-9822-38250c714582%2Foutput_50_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F1c20f577-f295-4498-9822-38250c714582%2Foutput_50_0.png)

2. Kaggle에서 Dataset을 찾고, 이 Dataset에서 유의미한 Feature를 3개 이상 찾고 이를 시각화해봅시다.

  1. 라이브러리, 데이터 불러오기
  2. 분석의 목적과 변수 확인
  3. 데이터 전체적으로 살펴보기
  4. 데이터의 개별 속성 파악하기
# 라이브러리 불러오기

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# %matplotlib inline # default!

# 데이터 블러오기

bc_df = pd.read_csv("./BankChurners.csv")

1. 분석의 목적과 변수 확인 🔎

🤔 어떤 고객들이 카드를 해지할까?

💡 열이 너무 많으므로 14열까지만 가지고 분석하자!

bc_df.iloc[:, :15].head()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F4bf1293c-1b1d-430b-a686-355ae8cb902d%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F4bf1293c-1b1d-430b-a686-355ae8cb902d%2Fimage.png)

bc_df.iloc[:, :15].columns
Index(['CLIENTNUM', 'Attrition_Flag', 'Customer_Age', 'Gender',
       'Dependent_count', 'Education_Level', 'Marital_Status',
       'Income_Category', 'Card_Category', 'Months_on_book',
       'Total_Relationship_Count', 'Months_Inactive_12_mon',
       'Contacts_Count_12_mon', 'Credit_Limit', 'Total_Revolving_Bal'],
      dtype='object')
  • CLIENTNUM : 고객번호
  • Attrition_Flag : 계좌 해지 여부
  • Customer_Age : 나이
  • Gender : 성별
    • M=Male, F=Female
  • Dependent_count : 부양 가족 수
  • Education_Level : 학력
    • high school, college graduate, etc.
  • Marital_Status : 결혼 여부
    • Married, Single, Divorced, Unknown
  • Income_Category : 소득 분류
    • < \$40K, \$40K - 60K, \$60K - \$80K, \$80K-\$120K, \$120K >
  • Card_Category : 카드 등급
    • Blue, Silver, Gold, Platinum
  • Months_on_book : 은행과의 관계 기간
  • Total_Relationship_Count : 은행의 제품 수
  • Months_Inactive_12_mon : 지난 12개월 동안 비활성 상태인 개월 수
  • Contacts_Count_12_mon : 지난 12개월 동안 활동한 개월 수
  • Credit_Limit : 신용카드 한도
  • Total_Revolving_Bal : 신용카드 잔액
  • ...

2. 데이터 전체적으로 살펴보기🔎

🔥
상관계수는 문자열 컬럼을 제외한 수치형 데이터만 보여준다.

그래서 문자열로 구성된 기준이 되는 계좌 해지 여부(Attrition_Flag) 컬럼을 보여주지 않는다.

따라서 문자열을 숫자형으로 바꿔서 다시 보자!

flag_unique = bc_df['Attrition_Flag'].unique()

print(flag_unique)

bc_df['Attrition_Flag'] = \\
bc_df['Attrition_Flag'].map({flag:i for i, flag in enumerate(flag_unique)})

print(bc_df['Attrition_Flag'].isnull().sum())
['Existing Customer' 'Attrited Customer']
0
  • Existing Customer : 0
  • Attrited Customer : 1
bc_df.describe().iloc[:, :6]

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F95266780-7994-4b1b-9e11-4cdabb6b20ec%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F95266780-7994-4b1b-9e11-4cdabb6b20ec%2Fimage.png)

bc_df.describe().iloc[:, 6:10]

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F016d2660-19cc-4472-a6be-8caea9b54075%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F016d2660-19cc-4472-a6be-8caea9b54075%2Fimage.png)

  • Attrition_Flag -> 평균이 0.16이므로 카드를 해지하는 고객이 굉장히 적다.
  • Customer_Age -> 40대의 고객이 많다.
  • Dependent_count -> 평균 2.3, 최대 5명
  • Months_on_book -> 평균 35개월, 최소 13 최대 56
  • Total_Relationship_Count -> 평균 3.8, 최소 1 최대 6
  • Months_Inactive_12_mon -> 평균 2.3, 최소 0, 최대 6
  • Contacts_Count_12_mon -> 평균 2.4, 최소 0, 최대 6
  • Credit_Limit -> 평균 8631.95, 편차 9088
    • 값들이 굉장히 넓게 분포되어있다. (이상치 존재 가능성)
  • Total_Revolving_Bal -> 평균 1162
  • ...
# 상관계수 확인
bc_df.corr().iloc[:10, :10]

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F97932a26-7f70-46e0-8efb-72309023cfdb%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F97932a26-7f70-46e0-8efb-72309023cfdb%2Fimage.png)

👉 데이터 살펴보기

  • Atrrition_Flag -> 수치에 따른 카드 해지 가능성
    • Total_Relationship_Count
      • 보유한 제품 수가 적을 수록 해지하는 고객이 많을 수 있다.
    • Months_Inactive_12_mon
      • 지난 12개월 동안 비활성 상태인 개월 수가 높을 수록 해지하는 고객이 많을 수 있다.
    • Contacts_Count_12_mon
      • 지난 12개월 동안 활동한 개월 수가 높을 수록 해지하는 고객이 많을 수 있다.
    • Total_Revolving_Bal
      • 신용카드 잔액이 적을 수록 해지하는 고객이 많을 수 있다.
  • Customer_Age - Months_on_book
    • 나이가 많을 수록 은행과의 관계 기간이 길다.
# 결측치 확인
bc_df.iloc[:, :15].isnull().sum()
CLIENTNUM                   0
Attrition_Flag              0
Customer_Age                0
Gender                      0
Dependent_count             0
Education_Level             0
Marital_Status              0
Income_Category             0
Card_Category               0
Months_on_book              0
Total_Relationship_Count    0
Months_Inactive_12_mon      0
Contacts_Count_12_mon       0
Credit_Limit                0
Total_Revolving_Bal         0
dtype: int64

👉 다행히(?) 결측치는 어떠한 컬럼에도 존재하지 않는다.

3. 데이터의 개별속성 파악하기🔎

Attrition_Flag

bc_df['Attrition_Flag'].value_counts()
0    8500
1    1627
Name: Attrition_Flag, dtype: int64
sns.countplot(x='Attrition_Flag', data=bc_df)
plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F2003b995-4dc0-4b8d-8fff-f66f3a9814af%2Foutput_72_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F2003b995-4dc0-4b8d-8fff-f66f3a9814af%2Foutput_72_0.png)

👉 해지하지 않은 고객의 데이터가 더 많다.

Customer_Age

fig, ax = plt.subplots(1, 1, figsize=(10, 5))
sns.kdeplot(x=bc_df[bc_df['Attrition_Flag'] == 1]['Customer_Age'], ax=ax)
sns.kdeplot(x=bc_df[bc_df['Attrition_Flag'] == 0]['Customer_Age'], ax=ax)

plt.legend(['Existing', 'Attrited'])

plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F8e9df623-a1e8-4e91-9de3-beade52ddf96%2Foutput_75_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F8e9df623-a1e8-4e91-9de3-beade52ddf96%2Foutput_75_0.png)

👉

  • 40대와 50대 중반에서 60대초반까지는 해지하지 않는 고객이 많고,
  • 20, 30대와 50대 초반, 그리고 60대 중반은 해지하는 고객이 많다.

Gender

sns.heatmap(bc_df[['Attrition_Flag', 'Gender']].groupby(['Gender']).mean(), annot = True)
plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F23f2b390-0458-4167-8b91-8e0006ff8fd9%2Foutput_78_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F23f2b390-0458-4167-8b91-8e0006ff8fd9%2Foutput_78_0.png)

👉 해지하는 고객의 비율은 남성보다 여성이 더 많다.

Card_Category

plt.pie(bc_df.groupby(['Card_Category'])['Attrition_Flag'].count(), 
        labels=bc_df['Card_Category'].unique())

plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F8133a163-ad9d-429c-96a3-52b9b0ac6387%2Foutput_81_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F8133a163-ad9d-429c-96a3-52b9b0ac6387%2Foutput_81_0.png)

👉 Blue 등급을 이용하는 고객이 압도적으로 많다.

⭐ 가설 세우기

  • 상관계수에 따른 가설
    1. 보유한 제품 수가 적을 수록 해지하는 고객이 많을 것이다.
    2. 지난 12개월 동안 비활성 상태인 개월 수가 높을 수록 해지하는 고객이 많을 것이다.
    3. 신용카드 잔액이 적을 수록 해지하는 고객이 많을 수 있다.
  • 개인적인 가설
    1. 소득 분류가 낮을 수록 해지하는 비율이 많을 것이다.
    2. 카드의 등급이 높을 수록 해지하는 비율이 많을 것이다.

1. 보유한 제품 수가 적을 수록 해지하는 고객이 많을 것이다.

sns.catplot(x='Total_Relationship_Count', y='Attrition_Flag', kind='point', data=bc_df)

plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F4508b245-dfc7-4304-8856-f56a128b2424%2Foutput_85_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F4508b245-dfc7-4304-8856-f56a128b2424%2Foutput_85_0.png)

⭕ 보유한 제품이 많아질 수록 해지하는 고객이 적어진다.

2. 지난 12개월 동안 비활성 상태인 개월 수가 높을 수록 해지하는 고객이 많을 것이다.

sns.catplot(x='Months_Inactive_12_mon', y='Attrition_Flag', hue='Gender', kind='point', data=bc_df)

plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fd64a241b-ce21-41d8-8dce-cbb15b6f84e6%2Foutput_88_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fd64a241b-ce21-41d8-8dce-cbb15b6f84e6%2Foutput_88_0.png)

🔺

  • 지난 12개월 동안 비활성 상태인 개월 수가 1~4 구간에서는 높아지면 해지하는 고객의 비율이 늘어나지만,
  • 그 이후로는 오히려 감소한다.

3. 신용카드 잔액이 적을 수록 해지하는 고객이 많을 수 있다.

fig, ax = plt.subplots(1, 1, figsize=(10, 5))
sns.kdeplot(x=bc_df[bc_df['Attrition_Flag'] == 1]['Total_Revolving_Bal'], ax=ax)
sns.kdeplot(x=bc_df[bc_df['Attrition_Flag'] == 0]['Total_Revolving_Bal'], ax=ax)

plt.legend(['Existing', 'Attrited'])

plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F8d08cb55-8f38-4a9a-817f-4b75a91f342c%2Foutput_91_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F8d08cb55-8f38-4a9a-817f-4b75a91f342c%2Foutput_91_0.png)

❌ 오히려 잔액이 많을 수록 해지하는 고객이 많다.

4. 소득 분류가 낮을 수록 해지하는 비율이 많을 것이다.

ax = sns.catplot(x='Income_Category', y='Attrition_Flag', kind='point', data=bc_df)
ax.fig.set_size_inches(10, 6)

plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F3e4c68c6-e479-48e4-9f07-c19f2d6f29a3%2Foutput_94_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F3e4c68c6-e479-48e4-9f07-c19f2d6f29a3%2Foutput_94_0.png)

❌ 소득 분류와 상관이 없어보인다.

5. 카드의 등급이 높을 수록 해지하는 비율이 많을 것이다.

sns.heatmap(bc_df[['Attrition_Flag', 'Card_Category']].groupby('Card_Category').mean(), annot = True)

plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F987753b7-6d09-4835-9eec-9a9af83f77f4%2Foutput_97_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F987753b7-6d09-4835-9eec-9a9af83f77f4%2Foutput_97_0.png)

⭕ 카드의 등급이 가장 높은 Platinum 의 해지 비율이 가장 높다.

profile
하나씩 정리하는 개발공부로그입니다.
post-custom-banner

0개의 댓글