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개 이상 찾고 이를 시각화해봅시다.
- 라이브러리, 데이터 불러오기
- 분석의 목적과 변수 확인
- 데이터 전체적으로 살펴보기
- 데이터의 개별 속성 파악하기
# 라이브러리 불러오기
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 : 성별
- 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 등급을 이용하는 고객이 압도적으로 많다.
⭐ 가설 세우기
- 상관계수에 따른 가설
- 보유한 제품 수가 적을 수록 해지하는 고객이 많을 것이다.
- 지난 12개월 동안 비활성 상태인 개월 수가 높을 수록 해지하는 고객이 많을 것이다.
- 신용카드 잔액이 적을 수록 해지하는 고객이 많을 수 있다.
- 개인적인 가설
- 소득 분류가 낮을 수록 해지하는 비율이 많을 것이다.
- 카드의 등급이 높을 수록 해지하는 비율이 많을 것이다.
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 의 해지 비율이 가장 높다.