隨著金融科技發展,理解並降低客戶流失率對銀行至關重要。本文利用 Kaggle 的銀行客戶流失資料集,進行資料清理、探索性資料分析和 K-Means 分群,探討客戶流失的關鍵因素。透過 Python 和相關函式庫,我們分析了客戶屬性(如信用評分、年齡、薪資)與流失的關聯性,並發現投訴行為與流失高度相關。此外,我們也觀察到年長客戶的流失率較低。利用 K-Means 分群,我們將客戶分為不同群體,進一步驗證了投訴與流失之間的強關聯性,這為制定更有效的客戶保留策略提供了資料基礎。

銀行客戶流失分析與資料處理

隨著金融科技的發展,銀行業面臨著日益激烈的競爭,客戶流失率成為銀行關注的重要指標。為了有效降低客戶流失率,銀行需要深入瞭解客戶行為並制定有效的忠誠度計劃和客戶保留策略。本文將根據Kaggle上的銀行客戶流失資料集進行探索性資料分析(EDA),並詳細介紹資料收集和處理的過程。

資料集內容

該資料集包含多個欄位,分別描述了客戶的不同特性和行為。以下是資料集中的主要欄位及其意義:

  • CreditScore:客戶的信用評分,信用評分較高的客戶通常不太可能流失。
  • Age:客戶年齡,年齡較大的客戶通常比年輕客戶更忠於銀行。
  • Tenure:客戶成為銀行客戶的年數,通常較老的客戶更忠於銀行。
  • Balance:客戶帳戶餘額,餘額較高的客戶通常不太可能流失。
  • NumOfProducts:客戶透過銀行購買的產品數量。
  • HasCrCard:客戶是否擁有信用卡,擁有信用卡的客戶通常更忠於銀行。
  • IsActiveMember:客戶是否為活躍客戶,活躍客戶通常不太可能流失。
  • EstimatedSalary:客戶的預估薪水,薪水較高的客戶通常不太可能流失。
  • Exited:客戶是否已經流失。
  • Complain:客戶是否曾投訴。
  • Satisfaction Score:客戶對投訴解決方案的滿意度評分。
  • Card Type:客戶持有的信用卡型別。
  • Points Earned:客戶使用信用卡所獲得的積分。

資料收集與處理

為了進行後續的分析,首先需要收集和處理資料。以下是具體步驟:

1. 安裝Kaggle環境

首先,需要註冊Kaggle帳號並建立API金鑰。安裝Kaggle函式庫並進行身份驗證:

# 安裝Kaggle函式庫
!pip install kaggle
import kaggle
kaggle.api.authenticate()

2. 下載資料集

使用Kaggle API下載銀行客戶流失資料集:

!kaggle datasets download -d radheshyamkollipara/bank-customer-churn

3. 解壓縮資料集

下載完成後,解壓縮zip檔案:

import zipfile
with zipfile.ZipFile('/content/bank-customer-churn.zip', 'r') as zip_ref:
    zip_ref.extractall('/content/')
print("File Unzipped!")

4. 載入資料集

將解壓縮後的CSV檔案載入到pandas DataFrame中:

import pandas as pd
file_path = '/content/Customer-Churn-Records.csv'
data1 = pd.read_csv(file_path)

5. 資料清理

丟棄不必要的欄位以最佳化資料大小:

# 丟棄不需要的欄位
data1.drop(columns=['RowNumber', 'Surname', 'Gender', 'Geography'], inplace=True)
data1

這些欄位不被需要的理由如下:

  • RowNumber:記錄編號,不影響輸出結果。
  • Surname:客戶姓氏,與客戶流失無直接關係,且需匿名化處理。
  • Gender:客戶性別,在現代社會中,消費者的認知和行為已經演變,保留此資訊並不一定能帶來額外的洞察。
  • Geography:客戶地理位置,可能會引入文化刻板印象,且需要額外的資訊來計算距離等。

6. 儲存處理後的資料

將清理後的資料儲存到安全的位置:

data1.to_csv('data1.csv', index=False)
!cp /content/data1.csv /content/drive/MyDrive/files/rag_c6/data1.csv

資料處理的優點

透過丟棄不必要的欄位,可以有效減少資料的大小,進而最佳化後續儲存和查詢的效能。這對於擴充套件資料函式庫和降低成本具有重要意義。

#### 內容解密:

上述程式碼實作了銀行客戶流失資料的下載、解壓縮、載入、清理和儲存。具體步驟包括:

  1. 身份驗證:透過Kaggle API進行身份驗證。
  2. 資料下載:使用Kaggle API下載指定的資料集。
  3. 資料解壓縮:將下載的zip檔案解壓縮到指定目錄。
  4. 資料載入:將CSV檔案載入到pandas DataFrame中。
  5. 資料清理:丟棄不必要的欄位以最佳化資料。
  6. 資料儲存:將處理後的資料儲存到指定位置。

這些步驟為後續的探索性資料分析和模型建立奠定了基礎。

2. 探索性資料分析

在進行任何RAG技術與向量儲存應用之前,探索性資料分析(Exploratory Data Analysis, EDA)是至關重要的步驟。透過EDA,我們能夠深入瞭解資料中的潛在模式和趨勢。

資料集初步分析

我們的初步分析顯示,客戶投訴與客戶流失率之間存在直接相關性,意味著提出投訴的客戶更有可能離開銀行。此外,資料還揭示,50歲及以上的客戶相比年輕客戶較不容易流失。有趣的是,收入水平(尤其是100,000美元的門檻)似乎對客戶流失決策的影響並不明顯。

# 顯示DataFrame的欄位資訊
print(data1.columns)
print(data1.head())

# 欄位資訊
# Column           Non-Null Count  Dtype  
# ---              --------------  -----  
# 0   CustomerId      10000 non-null  int64  
# 1   CreditScore    10000 non-null  int64  
# 2   Age             10000 non-null  int64  
# 3   Tenure          10000 non-null  int64  
# 4   Balance         10000 non-null  float64
# 5   NumOfProducts   10000 non-null  int64  
# 6   HasCrCard       10000 non-null  int64  
# 7   IsActiveMember  10000 non-null  int64  
# 8   EstimatedSalary 10000 non-null  float64
# 9   Exited          10000 non-null  int64  
# 10  Complain        10000 non-null  int64  
# 11  Satisfaction Score 10000 non-null  int64  
# 12  Card Type        10000 non-null  object 
# 13  Point Earned    10000 non-null  int64

內容解密:

此段程式碼顯示了資料集的欄位資訊,包括每個欄位的非空值數量和資料型別。可以看到資料集中包含客戶ID、信用評分、年齡、餘額、產品數量、是否持有信用卡、是否為活躍會員、預估薪水、是否流失、投訴次數、滿意度評分、卡片型別和累積點數等欄位。

投訴與客戶流失的相關性分析

透過計算投訴客戶與流失客戶之間的比例,我們發現兩者之間存在極高的相關性。

# 計算投訴客戶與流失客戶的比例
sum_exited = data1['Exited'].sum()
sum_complain = data1['Complain'].sum()

if sum_exited > 0:
    percentage_complain_over_exited = (sum_complain / sum_exited) * 100
else:
    percentage_complain_over_exited = 0

print(f"Sum of Exited = {sum_exited}")
print(f"Sum of Complain = {sum_complain}")
print(f"Percentage of complain over exited = {percentage_complain_over_exited:.2f}%")

內容解密:

此段程式碼計算了流失客戶總數和投訴客戶總數,並進一步計算投訴客戶佔流失客戶的比例。結果顯示,投訴客戶佔流失客戶的比例高達100.29%,意味著大多數流失的客戶都曾提出投訴。

年齡與客戶流失的相關性分析

進一步分析顯示,50歲以上的客戶相比年輕客戶較不容易流失。

# 分析年齡與客戶流失的相關性
age_threshold = 50
sum_age_over_exited = data1[(data1['Age'] >= age_threshold) & (data1['Exited'] == 1)].shape[0]
percentage_age_over_exited = (sum_age_over_exited / sum_exited) * 100

print(f"Sum of Age {age_threshold} and Over among Exited = {sum_age_over_exited}")
print(f"Percentage of Age {age_threshold} and Over among Exited = {percentage_age_over_exited:.2f}%")

內容解密:

此段程式碼計算了在流失客戶中,50歲及以上客戶的比例。結果顯示,50歲以上的客戶在流失客戶中的比例為31.11%,表明年長客戶較不容易流失。

相關係數熱力圖

為了更直觀地觀察各變數之間的相關性,我們繪製了相關係數熱力圖。

import seaborn as sns
import matplotlib.pyplot as plt

# 選擇數值型欄位
numerical_columns = data1.select_dtypes(include=['float64', 'int64']).columns

# 繪製相關係數熱力圖
plt.figure(figsize=(12, 8))
sns.heatmap(data1[numerical_columns].corr(), annot=True, fmt='.2f')
plt.title('Correlation Heatmap')
plt.show()

內容解密:

此段程式碼使用Seaborn函式庫繪製了相關係數熱力圖,展示了資料集中各數值型變數之間的相關係數。從熱力圖中可以看出,ComplainExited 之間存在高度正相關,進一步證實了投訴與客戶流失之間的強相關性。

K-Means 聚類別分析

在完成初步的資料分析後,我們將進一步使用K-Means聚類別演算法對資料進行深入挖掘。

# 複製資料集
data2 = data1.copy()

# 選擇特徵欄位
features = ['CreditScore', 'Age', 'EstimatedSalary', 'Exited', 'Complain', 'Point Earned']

# 進行K-Means聚類別
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, random_state=42)
data2['Cluster'] = kmeans.fit_predict(data2[features])

# 檢視聚類別結果
print(data2.head())

內容解密:

此段程式碼首先複製了原始資料集,並選擇了特定的特徵欄位進行K-Means聚類別分析。透過將客戶資料分成不同的群組,我們可以進一步分析不同客戶群體的特徵和行為模式。

3. 訓練機器學習模型

在進行了初步的資料分析和探索後,我們將進一步訓練機器學習模型,以更深入地挖掘資料中的模式和趨勢。

K-Means聚類別模型的應用

K-Means是一種無監督的機器學習演算法,能夠將資料集劃分為K個不同的、不重疊的叢集。透過最小化每個叢集內的變異數,K-Means演算法能夠有效地對資料進行分群。

# K-Means聚類別模型的實作
from sklearn.cluster import KMeans

# 選擇特徵
features = ['CreditScore', 'Age', 'EstimatedSalary', 'Complain', 'Point Earned']

# 初始化K-Means模型
kmeans = KMeans(n_clusters=3, random_state=42)

# 擬合模型並進行預測
data2['Cluster'] = kmeans.fit_predict(data2[features])

# 檢視聚類別中心
print(kmeans.cluster_centers_)

內容解密:

此段程式碼實作了K-Means聚類別模型,並對選定的特徵進行了聚類別分析。透過檢視聚類別中心,我們可以瞭解不同叢集的特徵和差異。

聚類別結果分析

透過分析聚類別結果,我們可以深入瞭解不同客戶群體的特性和行為模式,為後續的客戶管理和行銷策略提供依據。

# 分析不同叢集的客戶特徵
for cluster in range(kmeans.n_clusters):
    cluster_data = data2[data2['Cluster'] == cluster]
    print(f"Cluster {cluster} characteristics:")
    print(cluster_data.describe())

內容解密:

此段程式碼對每個叢集的客戶資料進行了描述性統計分析,幫助我們瞭解不同叢集的客戶特徵和分佈情況。

透過上述分析,我們能夠更全面地理解客戶資料中的模式和趨勢,為銀行業務決策提供有力的資料支援。接下來,我們將進一步探討如何將這些分析結果應用於實際業務場景中。

利用K-Means分群分析客戶流失與投訴的關聯性

在探討客戶流失(Churn)的問題時,瞭解客戶特徵與銀行服務之間的關聯性至關重要。本篇文章將透過K-Means分群演算法,分析客戶的信用評分(CreditScore)、年齡(Age)、預估薪資(EstimatedSalary)等特徵,進一步探討客戶流失與投訴之間的關聯。

資料預處理與特徵標準化

首先,我們需要對所選取的特徵進行標準化處理,以確保各特徵在相同的尺度上進行分析。使用StandardScaler進行標準化:

# 匯入必要的函式庫
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score, davies_bouldin_score

# 選取相關特徵
features = data2[['CreditScore', 'Age', 'EstimatedSalary', 'Exited']]

# 標準化特徵
scaler = StandardScaler()
features_scaled = scaler.fit_transform(features)

內容解密:

  1. 匯入函式庫:使用pandas處理資料、KMeans進行分群、StandardScaler進行特徵標準化、silhouette_scoredavies_bouldin_score評估分群品質。
  2. 特徵選取:選取與客戶流失相關的特徵,如信用評分、年齡和預估薪資。
  3. 標準化:透過StandardScaler將特徵縮放到相同的尺度,以避免某些特徵因尺度較大而主導分群結果。

選擇最佳分群數

為了確定最佳的分群數,我們實驗了不同的分群數(2至4),並使用輪廓係數(Silhouette Score)和Davies-Bouldin指數進行評估:

# 實驗不同的分群數
for n_clusters in range(2, 5):
    kmeans = KMeans(n_clusters=n_clusters, n_init=20, random_state=0)
    cluster_labels = kmeans.fit_predict(features_scaled)
    silhouette_avg = silhouette_score(features_scaled, cluster_labels)
    db_index = davies_bouldin_score(features_scaled, cluster_labels)
    print(f'For n_clusters={n_clusters}, the silhouette score is {silhouette_avg:.4f} and the Davies-Bouldin index is {db_index:.4f}')

內容解密:

  1. 輪廓係數(Silhouette Score):評估分群品質,範圍在-1到1之間。較高的值表示分群結果具有更好的區分度和內部凝聚力。
  2. Davies-Bouldin指數:評估分群結果的緊密程度和分離程度。較低的值表示分群結果更好。
  3. 實驗結果:透過實驗不同分群數,我們發現當分群數為2時,輪廓係數最高(0.6129),而Davies-Bouldin指數最低(0.6144),表明2個分群是最佳選擇。

K-Means分群結果分析

根據評估結果,我們選擇使用2個分群進行K-Means分群:

# 進行K-Means分群
kmeans = KMeans(n_clusters=2, n_init=10, random_state=0)
data2['class'] = kmeans.fit_predict(features_scaled)

# 顯示分群結果
print(data2.head())

內容解密:

  1. 分群結果:將客戶資料分為兩類別,分別對應不同的客戶特徵和行為模式。
  2. data2['class']:儲存每個客戶所屬的分群類別。

分析客戶流失與投訴的關聯性

進一步分析分群結果與客戶流失(Exited)和投訴(Complain)之間的關聯:

# 統計'class' == 0的客戶數量
sum_class_0 = (data2['class'] == 0).sum()
sum_class_0_complain_1 = data2[(data2['class'] == 0) & (data2['Complain'] == 1)].shape[0]
sum_class_0_exited_1 = data2[(data2['class'] == 0) & (data2['Exited'] == 1)].shape[0]

# 輸出結果
print(f"Sum of 'class' == 0: {sum_class_0}")
print(f"Sum of 'class' == 0 and 'Complain' == 1: {sum_class_0_complain_1}")
print(f"Sum of 'class' == 0 and 'Exited' == 1: {sum_class_0_exited_1}")

內容解密:

  1. sum_class_0:計算屬於第0類別的客戶數量。
  2. sum_class_0_complain_1:計算第0類別中投訴客戶的數量。
  3. sum_class_0_exited_1:計算第0類別中流失客戶的數量。
  4. 結果分析:結果顯示第0類別客戶中,投訴和流失的客戶比例極高,表明投訴與客戶流失有很強的相關性。

未來研究方向

未來可以進一步結合更多客戶特徵,並利用更先進的機器學習技術(如深度學習)進行更深入的分析,以獲得更準確的客戶行為預測。

  graph LR
    A[客戶資料] --> B[特徵選取]
    B --> C[特徵標準化]
    C --> D[K-Means分群]
    D --> E[評估分群結果]
    E --> F[分析客戶流失與投訴關聯]
    F --> G[結論與建議]

圖表翻譯: 此圖表展示了從客戶資料到結論與建議的整個分析流程。首先,從客戶資料中選取相關特徵,接著進行特徵標準化,然後使用K-Means進行分群,並評估分群結果。最後,分析客戶流失與投訴之間的關聯,並提出相應的結論與建議。