데이터이야기

분류모형을 이용한 은행 고객 이탈 모형

상선약수64 2023. 11. 13. 16:53
반응형

이탈고객 모형이란 

  • 이탈 고객이란 고객이 회사의 제품이나 서비스 사용을 중단하는 고객 
  • 이탈 고객 관리는 은행, 통신서비스, 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) 데이터 불러오기

#데이터 읽어오기
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로 음의 상관을 가집니다.

 

* 데이터 모델링은 다음 페이지에 제공됩니다.