728x90
💻목표 : 이탈 원인 파악해보기
📝원본 데이터 출처 : https://www.kaggle.com/competitions/playground-series-s4e1/overview
1. 우선 고객의 성별 및 연령별 데이터 확인
f, ax = plt.subplots(1, 2, figsize=(19, 8))
# 성별에 따른 파이 차트
gender_counts = train_data['Gender'].value_counts()
# 파이 차트 그리기
ax[0].pie(gender_counts, labels=gender_counts.index, autopct='%1.1f%%', startangle=90, colors=['skyblue', 'lightcoral'])
ax[0].set_title('연령별 분포')
# 연령별 회원수 계산
age_counts = train_data['Age'].value_counts().sort_index()
# 막대 그래프로 시각화
ax[1].bar(age_counts.index, age_counts.values)
ax[1].set_xlabel('Age')
ax[1].set_ylabel('회원수')
ax[1].set_title('연령별 회원수')
# 그래프 출력
plt.show()
- 성별 분포를 확인해 봤을 때, 남성이 소폭 더 많은 비중을 차지하고는 있으나, 남녀 거의 비슷한 비중을 보임
- 연령별 회원수를 확인해보니 30대에서 가장 많은 회원수를 보였으며 40대부터 회원수가 크게 줄어드는 추이 보임
2. 성별 및 연령별 이탈수 확인
연령별 이탈수를 확인하여 혹시 특정 연령대에서 이탈하는 추이를 보이는지 확인해 봄
import matplotlib.pyplot as plt
import seaborn as sns
# 피규어 및 서브플롯 설정
fig, axes = plt.subplots(1, 2, figsize=(15, 6))
# 성별에 따른 이탈 여부(countplot)
sns.countplot(data=train_data, x='Exited', hue='Gender', palette={'Male': 'skyblue', 'Female': 'lightcoral'}, ax=axes[0])
# x 축의 항목 이름 설정
axes[0].set_xticks([0, 1])
axes[0].set_xticklabels(['Not Exited', 'Exited'])
# 그래프 제목 설정
axes[0].set_title('성별에 따른 이탈 여부')
# 연령별 이탈 여부
sns.histplot(data=train_data, x='Age', hue='Exited', bins=50, kde=True, ax=axes[1])
# 그래프 제목 설정
axes[1].set_title('연령별 이탈 여부')
# 피규어 출력
plt.show()
- 연령별 이탈수를 확인해보니 유저 볼륨이 크게 줄어드는 40대부터 이탈수가 크게 증가하는 것을 확인
- 50대부터는 유저 볼륨 자체도 작으면서 이탈하지 않는 수보다 이탈하는 유저의 수가 더 큰 것을 확인
- 성별에 따른 이탈 여부 확인해 봤을 때, 이탈한 유저들 중에서는 여성의 수가 더 많고, 이탈하지 않은 유저들 중에서는 남성의 수가 더 많음
정확한 비교를 위해 이탈 유무에 따른 성별 비중 확인
# 'Exited'가 0인 값의 'IsActiveMember' 비율 계산
not_exited_counts = train_data[train_data['Exited'] == 0]['Gender'].value_counts()
# 'Exited'가 1인 값의 'IsActiveMember' 비율 계산
exited_counts = train_data[train_data['Exited'] == 1]['Gender'].value_counts()
# 파이 차트 그리기
fig, axes = plt.subplots(1, 2, figsize=(15, 6))
# 'Exited'가 0인 값의 파이 차트
axes[0].pie(not_exited_counts, labels=not_exited_counts.index, autopct='%1.1f%%', startangle=90, colors=['skyblue', 'lightcoral'])
axes[0].set_title('이탈하지 않은 유저')
# 'Exited'가 1인 값의 파이 차트
axes[1].pie(exited_counts, labels=exited_counts.index, autopct='%1.1f%%', startangle=90, colors=['lightcoral', 'skyblue'])
axes[1].set_title('이탈한 유저')
# 차트 제목 설정
fig.suptitle("이탈 유무에 따른 남녀 비중")
# 그래프 출력
plt.show()
- 비중으로 확인해 봤을 때에도 이탈하지 않은 유저들 중에 남성의 비율이 소폭 더 높고, 이탈한 유저들 중에서는 여성의 비율이 소폭 더 높음
- 차이가 나긴 하지만 비슷한 수준이며, 연령별 이탈에 비해 유의미하지 않은 결과인 것으로 보임
📌 40대 이후부터는 유저 볼륨 자체도 크게 줄어들면서, 이탈하는 비중이 커짐
성별에 따른 차이를 확인해 보았을 때는 남성의 이탈하지 않은 비중이 소폭 더 크긴하지만 거의 비슷한 수준
2. 상품 이용이 적어 이탈하지 않을까 생각되어 가입상품수별 이탈수와 연령별 가입상품수를 확인해 봄
f, ax = plt.subplots(1, 2, figsize=(19, 8))
sns.barplot(x='NumOfProducts', y='Exited', data=train_data, ax = ax[0])
ax[0].set_title('가입상품수별 이탈')
sns.histplot(data=train_data, x='Age', hue="NumOfProducts", bins=50, kde=True, ax = ax[1])
ax[1].set_title('연령별 상품가입수')
plt.show()
- 상품 가입을 1~2개만 한 사람보다 더 많은 상품 가입을 한 사람이 이탈자가 많은 것을 확인
- 다만, 연령대별로 상품가입수 확인해보니, 대체로 1-2개의 상품을 보유한 사람이 대부분이며 3-4개를 가지고 있는 사람은 미미하기 때문에 상품가입수가 이탈에 큰 영향을 끼친다고 보기 어려움
- 연령별 회원수 그래프에서 확인했듯이 40대부터 회원수가 줄어들었기에 상품 가입수 또한 크게 줄어든 추이를 보였으며, 전반적으로 상품 가입 수가 1-2개로 적긴하지만, 20-40에서 상품을 2개정도 가입한 비중이 많은 것에 비해 40대 이후부터는 상품을 1개만 가입한 사람들의 비중이 더 많음
📌 40대 이후에게 매력적인 상품이 없어 상품 가입수 자체가 줄어드는 것으로 예측되며, 상품가입의 감소가 이탈까지 이어지는지는 것으로 예측
📌결론
회원수 자체에 40대 이후의 비중이 적고, 해당 연령대에서 상품가입수 자체가 적음
해당 은행의 상품에는 40대가 매력을 느낄만한 상품이 없는 것으로 판단되며, 상품 미가입이 이탈까지 이어지는 흐름을 보이고 있다고 예측
이탈 방지를 위해서는 40대 이후 연령대를 타겟으로 하는 상품 개발하여 40대 이후 연령대의 이탈을 방지하고, 해당 연령대의 유저를 더욱 유입시켜 전반적인 유저풀을 늘리는 것을 제안
728x90
'Python > 데이터 시각화' 카테고리의 다른 글
Python - plotly Graph Objects & Plotly Express로 바그래프 만들어보기 (0) | 2024.01.09 |
---|---|
Python - [시각화] regplot, histplot, boxplot, swarmplot, countplot (1) | 2024.01.08 |
Python - [시각화] scatterplot & 다중차트 그리기 & 그래프 이미지 저장 (1) | 2024.01.08 |
Python - [시각화] Maplotlib Pyplot 모듈 활용 그래프 그리기 (plot / bar) (1) | 2024.01.05 |