이탈고객 모형이란
- 이탈 고객이란 고객이 회사의 제품이나 서비스 사용을 중단하는 고객
- 이탈 고객 관리는 은행, 통신서비스, OTT, 보험 회사 등 온라인 서비스 제공하는 산업에서 매우 중요하며, 수익성에 영향을 미침
- 신규 고객을 확보하는 데는 기존 고객을 유지하는 것보다 최대 5배 이상의 비용이 소요되므로, 이탈 고객 분석은 비즈니스에 매우 중요하며 필수적 임
- 이탈 고객 분석을 통해 고객 만족도를 높이고 결과적으로 고객 유지율을 높일 수 있는 전략을 수립해야 함
목표
- 은행의 이탈고객을 이해하고 예측하는 것
- 탐색적 데이터 분석(EDA)을 수행하여 고객 이탈에 기여하는 요인을 식별하고 시각화하고, EDA를 바탕으로 고객이 이탈할지 여부를 예측하는 기계 학습 모델을 구축하는데 기반 임
- 분류모형이고, 이탈할 고객의 요소를 올바르게 분류하는 것이 중요함
- 기술통계 : 탐색적 데이터 분석, 데이터 시각화, 데이터 전처리(특성 선택, 범주형 특성 인코딩, 특성 스케일링) 등
- 분류모형 : KNN, 의사결정나무, 랜덤 포레스트 등
목차
- 이탈고객분석 개요
- 목표
- 데이터 이해
- 데이터 탐색
- 데이터 전처리
- 데이터모델링
- 모델평가
1. 데이터 이해
(1) 라이브러리 import
#사용할 Libraries를 import
import numpy as np
import pandas as pd
# Data Visualisation Libraries
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('darkgrid')
# Machine Learning
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score, cross_val_predict
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
#모델 평가
from sklearn.metrics import accuracy_score, recall_score, precision_score, auc, roc_auc_score, roc_curve
from sklearn.metrics import confusion_matrix
|
(2) 데이터 불러오기
- Kaggle에서 제공되는 bank_custormer.csv 파일을 사용합니다.
- https://github.com/sense64/data_viz/tree/main/data 접속하여 bank_custorm.csv파일을 다운로드하고, 데이터를 불러옵니다.
#데이터 읽어오기
bank_df = pd.read_csv("/content/drive/MyDrive/My Colab/working/bank_customer.csv")
print(bank_df.head())
|
(3) 데이터 설명
(4) 범주형 및 계량형 데이터를 확인
(5) 데이터 값을 변경
- Attrition_Flag은 0이면 유지, 1이면 이탈, Gender는 0이면 남, 1은 여로 레이블을 바꿉니다.
to_replace = sorted(bank_df['Attrition_Flag'].unique().tolist())
replacements = ["유지","이탈"]
bank_df['Attrition_Flag'].replace(to_replace, replacements, inplace=True)
to_replace = sorted(bank_df['Gender'].unique().tolist())
replacements = ["남","여"]
bank_df['Gender'].replace(to_replace, replacements, inplace=True)
|
(6) 타깃변수 분석
- 타깃변수의 빈도분석과 도수분포표 그리고 차트를 그립니다.
bank_df['Attrition_Flag'].value_counts()
|
bank_df['Attrition_Flag'].value_counts(normalize=True)*100
|
bank_df['Attrition_Flag'].value_counts().plot.bar()
|
* 한글이 깨진 경우 아래와 같이 코드 합니다.
#한글이 깨어지는 경우
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
|
위의 코드를 작성하고 코랩에서 런타임->런타임 다시 시작을 실행합니다.
!apt-get -qq install fonts-nanum
plt.rc('font', family='NanumGothic') #한글 폰트를 사용
|
2. 데이터 탐색
(1) 범주형 데이터 시각화
- 카테고리 변수에 대해 막대그래프를 작성합니다.
plt.figure(1)
plt.subplot(1, 2, 1)
a = bank_df['Gender'].value_counts(normalize=True).plot.bar(figsize=(16,4), title='Gender')
plt.bar_label(a.containers[0])
plt.subplot(1, 2, 2)
b = bank_df['Card_Category'].value_counts(normalize=True).plot.bar(title="Card_Category")
plt.bar_label(b.containers[0])
plt.show()
|
(2) 계량형 데이터 시각화
계량형 데이터 'Customer_Age'의 히스토그램과 boxplot을 그려서 전반적인 분포를 확인합니다.
#계량형 데이터 시각화
plt.figure(1)
plt.subplot(1, 2, 1)
sns.distplot(bank_df['Customer_Age'])
plt.subplot(1, 2, 2)
bank_df['Customer_Age'].plot.box(figsize=(16,4))
plt.show()
|
계량형 데이터 전체에 대해 히스토그램과 boxplot을 그려봅니다. 여기서는 seaborn.displot대신에 seaborn.histplot으로 코드 합니다.
#datatypedl int, float에 해당하는 columns를 num_col로 설정함
num_col = bank_df.select_dtypes(["int","float"]).columns print(num_col)
|
#계량형 데이터 시각화
for feature in num_col:
plt.figure(1)
plt.subplot(1, 2, 1)
sns.histplot(bank_df[feature], kde=True)
plt.subplot(1, 2, 2)
bank_df[feature].plot.box(figsize=(16,4))
plt.show()
|
(3) 고객이탈여부(타겟변수)에 따른 범주형 데이터 탐색
타깃변수별 범주형에 대한 교차표와 누적막대그래프를 작성하여, 이탈고객이 많은 특성은 무엇인지 확인합니다. 먼저 범주형(카테고리) 변수를 확인합니다.
bank_df.select_dtypes(["object"]).columns
|
for문을 사용하여 카테고리 변수에 대해 교차표와 누적막대차트를 작성합니다.
fig, axes = plt.subplots(1, 3)
cat_col = ['Gender','Income_Category', 'Card_Category']
col = 0
for feature in cat_col:
a = pd.crosstab(bank_df[feature],bank_df['Attrition_Flag'], normalize='index')
a.plot(kind="bar", figsize=(16,4), stacked=True, title=feature, ax=axes[col])
col = col + 1
print(a)
plt.show()
|
(4) 고객이탈여부(타겟변수)에 따른 계량형 데이터 시각화
타깃변수별 계량형 데이터의 기술통계량과 시각화를 하고자 합니다.
num_col_df = bank_df[num_col] #num_col(컬러명)에 해당하는 컬럼을 추출하여 num_col_df로 지정
num_col_df.describe() #데이터 프레임의 기술통계량
|
타겟별 계량형 데이터에 대한 막대그래프를 작성합니다.
for feature in num_col :
a = bank_df.groupby('Attrition_Flag')[feature].mean().plot.bar(title=feature)
plt.bar_label(a.containers[0])
plt.show()
|
(5) heatmap으로 계량형 데이터의 상관관계
계량형 데이터만 추출하여 히트맵을 작성합니다.
matrix = bank_df[bank_df.select_dtypes(["int","float"]).columns].corr()
f, axes = plt.subplots(figsize=(9, 6))
sns.heatmap(matrix, annot=True)
|
Customer_Age와 Months_on_book은 상관계수가 0.79로 양의 선형관계를 가지고, Total_Trans_Amt와 Total_Relationship_Count는 상관계수 -0.35로 음의 상관을 가집니다.
* 데이터 모델링은 다음 페이지에 제공됩니다.
'데이터이야기' 카테고리의 다른 글
의과대학생이 정신건강에 미치는 영향 (1) | 2024.10.16 |
---|---|
분류모형을 이용한 은행 고객 이탈 모형(02) (0) | 2023.11.14 |
데이터로 보는 고령자 디지털 정보 역량 군집화와 디지털 격차 해소 방안 (0) | 2023.10.09 |
데이터로 보는 고령자 디지털 격차 데이터전처리, 데이터탐색, 데이터시각화 (0) | 2023.10.03 |
데이터로 보는 고령자 디지털 격차 (0) | 2023.09.25 |