隨著資料量的增長,傳統的客戶流失分析方法逐漸顯現出其侷限性。為了更有效地識別高風險客戶,需要藉助機器學習技術。本文將以 Python 為例,示範如何利用機器學習演算法,特別是 K-Means 聚類別,來預測和分析銀行客戶流失。首先,我們會進行資料收集和預處理,接著進行探索性資料分析,找出與流失相關的關鍵特徵。然後,我們會使用 K-Means 演算法對客戶進行分群,並評估模型的效能。最後,我們將探討如何使用 Pinecone 向量資料函式庫來進一步提升分析的效率和準確性,以便更精準地預測客戶流失風險。
第二步:初步資料檢視和探索性資料分析
在收集和簡化資料集之後,我們需要進行初步的資料檢視,以瞭解資料的結構和型別。這包括了檢視客戶投訴和流失之間的關係,年齡和薪水水平與客戶流失之間的關係等。另外,我們還需要生成一個熱圖,以視覺化數值特徵之間的相關性。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 載入資料集
data = pd.read_csv('bank_customer_churn.csv')
# 初步資料檢視
print(data.head())
# 檢視客戶投訴和流失之間的關係
complaints = data['complaints']
churn = data['churn']
plt.scatter(complaints, churn)
plt.xlabel('客戶投訴')
plt.ylabel('客戶流失')
plt.show()
# 檢視年齡和薪水水平與客戶流失之間的關係
age = data['age']
salary = data['salary']
plt.scatter(age, churn)
plt.xlabel('年齡')
plt.ylabel('客戶流失')
plt.show()
plt.scatter(salary, churn)
plt.xlabel('薪水')
plt.ylabel('客戶流失')
plt.show()
# 生成熱圖
corr_matrix = data.corr()
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', square=True)
plt.show()
第三步:訓練機器學習模型
在完成初步的資料檢視和探索性資料分析之後,我們可以開始訓練機器學習模型,以預測客戶流失。這個過程包括了選擇合適的模型、訓練模型和評估模型的效能等步驟。
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report
# 分割資料集為訓練集和測試集
X = data.drop('churn', axis=1)
y = data['churn']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 訓練隨機森林模型
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
# 評估模型效能
y_pred = model.predict(X_test)
print('準確率:', accuracy_score(y_test, y_pred))
print('分類別報告:\n', classification_report(y_test, y_pred))
內容解密:
在上面的程式碼中,我們首先載入了必要的函式庫,包括pandas、numpy、matplotlib和seaborn。然後,我們載入了銀行客戶流失資料集,並進行了初步的資料檢視。接下來,我們查看了客戶投訴和流失之間的關係,年齡和薪水水平與客戶流失之間的關係等。另外,我們還生成了一個熱圖,以視覺化數值特徵之間的相關性。最後,我們訓練了一個隨機森林模型,以預測客戶流失,並評估了模型的效能。
圖表翻譯:
上面的熱圖顯示了數值特徵之間的相關性。從圖中可以看出,客戶投訴和流失之間有著強烈的相關性,年齡和薪水水平也與客戶流失有著一定的相關性。這些資訊可以幫助我們更好地瞭解客戶流失的原因,並採取有效的措施來預防它。
資料準備與探索性資料分析
為了進行機器學習(ML)分析,我們需要準備好資料並進行探索性資料分析(EDA)。本文將介紹如何收集和處理銀行客戶流失資料集,並進行初步的EDA。
收集和處理資料集
首先,我們需要收集銀行客戶流失資料集。這個資料集包含了10,000筆客戶記錄,涵蓋了各種可能影響客戶流失的因素。資料集中的欄位包括:
- RowNumber:記錄編號,不影響輸出結果
- CustomerId:客戶ID,無實際影響
- Surname:客戶姓氏,不影響流失決策
- CreditScore:信用評分,高評分客戶較少流失
- Geography:客戶所在地,可能影響流失決策
- Gender:客戶性別,可能影響流失決策
- Age:客戶年齡,老年客戶較少流失
- Tenure:客戶與銀行的關係年限,長期客戶較忠誠
- Balance:客戶帳戶餘額,高餘額客戶較少流失
- NumOfProducts:客戶購買的產品數量
- HasCrCard:客戶是否持有信用卡
- IsActiveMember:客戶是否為活躍會員
- EstimatedSalary:客戶估計薪水,低薪水客戶較容易流失
- Exited:客戶是否已經流失
- Complain:客戶是否曾經投訴
- Satisfaction Score:客戶滿意度評分
- Card Type:客戶持有的卡片型別
- Points Earned:客戶所獲得的積分
安裝環境和收集資料集
為了收集資料集,我們需要安裝Kaggle環境並取得API金鑰。以下是安裝步驟:
- 註冊Kaggle帳號並取得API金鑰
- 安裝Kaggle環境並設定API金鑰
# 安裝Kaggle環境
!pip install kaggle
# 設定API金鑰
import os
os.environ['KAGGLE_USERNAME'] = 'your_username'
os.environ['KAGGLE_KEY'] = 'your_api_key'
載入資料集
載入資料集後,我們可以進行初步的EDA。
# 載入資料集
import pandas as pd
df = pd.read_csv('Customer-Churn-Records.csv')
# 顯示資料集前五行
print(df.head())
接下來,我們將進行更深入的EDA,包括資料視覺化和統計分析,以便更好地瞭解資料集的特性和模式。
使用Kaggle進行資料收集和分析
首先,我們需要安裝Kaggle並進行認證。為了完成這個步驟,我們需要先載入Kaggle的憑證檔案。
import json
import os
# 載入Kaggle憑證檔案
with open(os.path.expanduser("drive/MyDrive/files/kaggle.json"), 'r') as f:
kaggle_credentials = json.load(f)
# 取得Kaggle使用者名稱和金鑰
kaggle_username = kaggle_credentials["username"]
kaggle_key = kaggle_credentials["key"]
# 設定環境變數
os.environ["KAGGLE_USERNAME"] = kaggle_username
os.environ["KAGGLE_KEY"] = kaggle_key
接下來,我們需要安裝Kaggle並進行認證。如果Kaggle尚未安裝,則會自動安裝。
try:
import kaggle
except:
# 安裝Kaggle
!pip install kaggle
import kaggle
# 進行Kaggle認證
kaggle.api.authenticate()
現在,我們已經準備好收集Bank Customer Churn資料集。
收集資料集
我們將下載壓縮的資料集,解壓縮CSV檔案,然後將其載入pandas DataFrame中。
# 下載壓縮的資料集
!kaggle datasets download -d radheshyamkollipara/bank-customer-churn
下載完成後,我們可以解壓縮檔案。
import zipfile
# 解壓縮檔案
with zipfile.ZipFile('/content/bank-customer-churn.zip', 'r') as zip_ref:
zip_ref.extractall('/content/')
print("File Unzipped!")
最後,我們將CSV檔案載入pandas DataFrame中。
import pandas as pd
# 載入CSV檔案
data1 = pd.read_csv('/content/BankChurners.csv')
內容解密:
在這個步驟中,我們使用Kaggle API下載了Bank Customer Churn資料集,然後解壓縮並載入pandas DataFrame中。這些步驟為我們提供了資料分析的基礎。
圖表翻譯:
flowchart TD A[開始] --> B[下載資料集] B --> C[解壓縮檔案] C --> D[載入pandas DataFrame] D --> E[進行資料分析]
此圖表展示了我們收集和準備資料的過程。從下載資料集開始,到解壓縮檔案,然後載入pandas DataFrame,最終進行資料分析。
資料前處理與探索性資料分析
在進行資料分析之前,首先需要對資料進行前處理,以確保資料的品質和完整性。在這個案例中,我們從 CSV 檔案中讀取了客戶流失記錄資料,並將其儲存在 data1
DataFrame 中。
刪除不必要的欄位
為了簡化資料分析和避免過度擬合,我們刪除了以下四個欄位:
RowNumber
:因為我們將為每個記錄建立一個唯一的索引,因此不需要這個欄位。Surname
:為了匿名化資料,我們不會顯示姓氏。相反,我們將關注客戶的行為和特徵,例如投訴和信用卡消費(獲得的積分)。Gender
:由於消費者認知和行為在 2020 年代已經演變,因此在這個案例中,我們將忽略性別資訊,以避免任何潛在的偏見。Geography
:雖然地理位置在某些情況下可能很有趣,但在這個案例中,我們將忽略它,以避免根據文化刻板印象的過度擬合。此外,包含這個欄位需要更多資訊,例如計算送貨服務的距離。
刪除這些欄位後,我們更新了 data1
DataFrame。
# 刪除欄位並更新 DataFrame
data1.drop(columns=['RowNumber', 'Surname', 'Gender', 'Geography'], inplace=True)
儲存前處理後的資料
為了最佳化 Pinecone 索引(向量儲存)的大小,我們將前處理後的資料儲存到一個新的 CSV 檔案中。
# 儲存前處理後的資料
data1.to_csv('data1.csv', index=False)
探索性資料分析
在進行任何 RAG 技術之前,探索性資料分析(EDA)是一個關鍵步驟。它幫助我們瞭解資料中的底層模式和趨勢。在這個案例中,我們使用 pandas 定義的客戶資料進行 EDA。
初步分析顯示,客戶投訴和流失率之間存在直接相關性,表明曾經投訴的客戶更有可能流失。此外,資料顯示 50 歲以上的客戶不太可能流失,與年輕客戶相比。有趣的是,收入水平(特別是 10 萬美元的門檻)似乎對流失決策沒有顯著影響。
透過仔細檢查這些見解,我們將展示為什麼直接跳入複雜的機器學習模型(尤其是深度學習)可能不是總是必要或有效的方法。在資料中的關係明顯且模式簡單的情況下,更簡單的統計方法或甚至基本的資料分析技術可能更合適且資源高效。例如,K-means 叢集可以有效,我們將在本章的「訓練機器學習模型」部分實施它。
然而,這並不意味著高階 RAG 技術不強大。事實上,我們將在本章的「管道 2:擴充套件 Pinecone 索引(向量儲存)」部分探索它們,以揭示透過經典 EDA 不容易察覺到的更微妙的模式和複雜的關係。
如果我們顯示 DataFrame 的欄位,可以看到很難找到模式:
# 欄位 非空計數 資料型別
--- ------ -------------- -----
0 CustomerId 10000 non-null int64
1 CreditScore 10000 non-null int64
在下一步中,我們將繼續探索資料,並使用更先進的技術來揭示其模式和關係。
客戶流失分析:探索關鍵因素
在進行客戶流失分析時,瞭解影響客戶離開的因素至關重要。根據提供的資料,Age、EstimatedSalary 和 Complain 可能是決定客戶流失(Exited)的相關特徵。下面,我們將更深入地探討這些特徵與客戶流失之間的關係。
資料檢視
首先,讓我們觀察一下資料的概覽,以便更好地理解每個特徵的分佈情況。
特徵 | 數量 | 型別 |
---|---|---|
Age | 10000 | int64 |
Tenure | 10000 | int64 |
Balance | 10000 | float64 |
NumOfProducts | 10000 | int64 |
HasCrCard | 10000 | int64 |
IsActiveMember | 10000 | int64 |
EstimatedSalary | 10000 | float64 |
Exited | 10000 | int64 |
Complain | 10000 | int64 |
Satisfaction Score | 10000 | int64 |
Card Type | 10000 | object |
Point Earned | 10000 | int64 |
客戶流失與投訴之間的關係
投訴(Complain)似乎是客戶流失(Exited)的主要原因之一。為了量化這種關係,我們可以計算投訴客戶中流失的百分比。
# 計算流失客戶中有投訴的百分比
sum_exited = df['Exited'].sum()
sum_complain = df[df['Exited'] == 1]['Complain'].sum()
if sum_exited > 0:
percentage_complain_over_exited = (sum_complain / sum_exited) * 100
else:
percentage_complain_over_exited = 0
print(f"流失客戶中有投訴的百分比:{percentage_complain_over_exited}%")
這個指標可以幫助我們瞭解投訴對客戶流失的影響程度。
客戶流失與投訴分析
客戶流失(Churn)是銀行業的一個重要指標,瞭解客戶流失的原因和趨勢對於銀行的戰略決策至關重要。以下是對客戶流失和投訴資料的分析。
客戶流失與投訴資料
根據資料,客戶流失的總數為2038人,投訴的總數為2044人。計算出投訴與客戶流失的比例,結果顯示投訴與客戶流失的比例高達100.29%。這意味著絕大多數投訴的客戶最終都選擇了離開銀行。
# 計算客戶流失和投訴的比例
sum_exited = 2038
sum_complain = 2044
percentage_complain_over_exited = (sum_complain / sum_exited) * 100
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}%")
年齡與客戶流失
進一步分析年齡與客戶流失的關係,設定年齡閾值為50歲。結果顯示,50歲以上的客戶中,有634人選擇了離開銀行,佔所有離開銀行客戶的31.11%。
# 計算50歲以上客戶中離開銀行的人數
age_50_and_over_exited = 634
percentage_age_50_and_over_exited = (age_50_and_over_exited / sum_exited) * 100
print(f"Sum of Age 50 and Over among Exited = {age_50_and_over_exited}")
print(f"Sum of Exited = {sum_exited}")
print(f"Percentage of Age 50 and Over among Exited = {percentage_age_50_and_over_exited}%")
薪水與客戶流失
設定薪水閾值為100000,分析薪水與客戶流失的關係。結果顯示,薪水超過100000的客戶中,有1045人選擇了離開銀行,佔所有離開銀行客戶的51%。
# 計算薪水超過100000的客戶中離開銀行的人數
estimated_salary_over_100000_exited = 1045
percentage_estimated_salary_over_100000_exited = (estimated_salary_over_100000_exited / sum_exited) * 100
print(f"Sum of Estimated Salary over 100000 among Exited = {estimated_salary_over_100000_exited}")
print(f"Sum of Exited = {sum_exited}")
print(f"Percentage of Estimated Salary over 100000 among Exited = {percentage_estimated_salary_over_100000_exited}%")
熱圖分析
使用Seaborn函式庫繪製資料的相關性熱圖,結果顯示投訴與客戶流失之間具有最高的相關性。
import seaborn as sns
import matplotlib.pyplot as plt
# 選擇數字欄位進行相關性熱圖分析
numerical_columns = data1.select_dtypes(include=['float64', 'int64'])
# 繪製相關性熱圖
plt.figure(figsize=(12, 8))
sns.heatmap(data1[numerical_columns].corr(), annot=True, fmt='.2f')
plt.title('Correlation Heatmap')
plt.show()
這些分析結果為銀行提供了寶貴的洞察,幫助銀行了解客戶流失的原因和趨勢,從而制定有效的策略來降低客戶流失率和提高客戶滿意度。
執行機器學習模型訓練
在探索了資料集的各個特徵後,我們現在要進一步使用機器學習(ML)模型來深入分析資料。這一部分,我們將使用聚類別技術,特別是 k-means 聚類別,來探索資料集中的模式。首先,我們需要準備和處理資料以進行分析,然後應用聚類別演算法,最後使用不同的指標來評估結果。
k-means 聚類別演算法
k-means 是一種無監督的機器學習演算法,它將資料集分成 k 個不同的、不重疊的聚類別。這個演算法透過迭代地將資料點分配到 k 個聚類別中的其中一個,根據最近的均值(centroid)進行分配,直到收斂。
資料準備和聚類別
首先,我們需要複製資料集 data1
到 data2
,以便在需要時可以傳回原始資料。接下來,我們選擇了 'CreditScore'
、'Age'
、'EstimatedSalary'
、'Exited'
、'Complain'
和 'Point Earned'
這些特徵。
# 載入必要的函式庫
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score, davies_bouldin_score
# 假設你已經載入了名為 data1 的資料框
# 選擇相關特徵
features = data2[['CreditScore', 'Age', 'EstimatedSalary', 'Exited', 'Complain', 'Point Earned']]
標準化特徵
在執行機器學習模型之前,標準化特徵是一種常見的做法。
# 標準化特徵
scaler = StandardScaler()
features_scaled = scaler.fit_transform(features)
執行 k-means 聚類別
現在,我們可以執行 k-means 聚類別了。
# 執行 k-means 聚類別
kmeans = KMeans(n_clusters=5) # 選擇合適的聚類別數量
kmeans.fit(features_scaled)
labels = kmeans.labels_
評估聚類別結果
最後,我們可以使用不同的指標來評估聚類別結果,例如輪廓係數(silhouette score)和 Davies-Bouldin 指數。
# 評估聚類別結果
silhouette = silhouette_score(features_scaled, labels)
davies_bouldin = davies_bouldin_score(features_scaled, labels)
print(f"輪廓係數:{silhouette}")
print(f"Davies-Bouldin 指數:{davies_bouldin}")
圖表翻譯:
flowchart TD A[資料準備] --> B[特徵選擇] B --> C[標準化] C --> D[k-means 聚類別] D --> E[評估結果] E --> F[視覺化]
這個流程圖展示了從資料準備到評估結果的整個過程,包括特徵選擇、標準化、k-means 聚類別和結果評估。
使用 K-Means 演算法進行客戶分群分析
在進行客戶分群分析時,選擇合適的分群數量是非常重要的。為了找到最佳的分群數量,我們將嘗試使用 2 到 4 個分群,並評估每個分群的表現。
實驗不同數量的分群
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} and the Davies-Bouldin index is {db_index}')
輸出結果包含了不同分群數量下的分群表現評估,使用了兩個指標:輪廓係數(silhouette score)和 Davies-Bouldin 指數(Davies-Bouldin index)。
輪廓係數和 Davies-Bouldin 指數
輪廓係數衡量了每個點在同一分群中的接近度和與其他分群的平均距離。該指標的範圍從 -1 到 1,其中高值表示分群內部凝聚力強且分群間隔開明顯。
Davies-Bouldin 指數則評估了分群的品質,較低的值表示分群內部變異性較小且分群間隔開明顯。
分析結果
根據輸出結果,當分群數量為 2 時,輪廓係數最高,達到 0.6129,同時 Davies-Bouldin 指數也最低,為 0.6144。這些結果表明,使用 2 個分群可能提供了最有效的資料點分離。
執行 K-Means 分群
選擇了最佳的分群數量後,我們可以執行 K-Means 分群演算法:
kmeans = KMeans(n_clusters=2, n_init=10, random_state=0)
data2['class'] = kmeans.fit_predict(features_scaled)
然後,我們可以檢視資料框的前幾行,以驗證新增的 class
欄位:
print(data2.head())
分析客戶投訴和離開銀行的關聯
根據之前的探索性資料分析,客戶投訴和離開銀行之間存在相關性。現在,我們可以使用 K-Means 分群結果來進一步分析這種相關性:
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}')
這些結果可以幫助我們更好地瞭解客戶投訴和離開銀行之間的關聯,並為未來的業務決策提供依據。
客戶流失分析與 Pinecone 索引擴充套件
在前面的章節中,我們探討瞭如何使用傳統方法分析客戶流失的相關因素。然而,當面對大量的客戶資料時,傳統方法可能難以有效地找出能夠幫助我們留住客戶的特徵。因此,我們將採用一種新的策略,利用 OpenAI 將客戶記錄轉換為向量,並查詢 Pinecone 索引以發現資料集中的更深層次模式。
從技術架構視角來看,本文逐步展示瞭如何利用機器學習技術,特別是K-Means聚類別演算法,分析銀行客戶流失資料。從資料收集、預處理、探索性資料分析到模型訓練和評估,文章涵蓋了機器學習專案的完整流程。文中使用了多種技術手段,包括Python程式函式庫pandas、scikit-learn、seaborn和matplotlib,以及Kaggle平臺進行資料收集。技術堆疊的各層級協同運作中體現了資料分析的典型流程和方法。
透過多維度效能指標的實測分析,例如輪廓係數和Davies-Bouldin指數,文章驗證了K-Means演算法在客戶分群上的有效性。同時,文章也指出了僅依賴年齡、薪資和投訴等少數特徵進行客戶流失預測的侷限性,並提出了利用OpenAI和Pinecone向量資料函式庫進行更深層次模式挖掘的可能性,這也為後續的分析提供了方向。此外,文中清晰地闡述了資料預處理的重要性,例如刪除不相關欄位和標準化特徵,這些步驟對於提高模型效能至關重要。然而,文章並未深入探討不同機器學習模型的比較,例如邏輯迴歸、決策樹等,也未對模型的超引數調整進行詳細說明。
展望未來,將客戶記錄轉換為向量並利用向量資料函式庫進行相似性搜尋,將會是客戶流失分析的重要發展趨勢。這種方法可以有效地處理高維資料,並發現傳統方法難以察覺的隱藏模式。結合自然語言處理技術,例如OpenAI的嵌入模型,更可以將非結構化資料,例如客戶評論和客服記錄,納入分析範圍,進一步提升客戶流失預測的準確性和可解釋性。
玄貓認為,儘管K-Means聚類別提供了一定的客戶分群洞察,但更精細的分析和更全面的特徵工程仍然是提高客戶流失預測準確性的關鍵。向量資料函式庫和自然語言處理技術的應用,將為未來的客戶流失分析帶來更多可能性。對於希望深入瞭解客戶流失原因並制定有效留存策略的企業而言,探索這些新興技術將至關重要。