🧑 博主簡介:曾任某智慧城市類企業
算法總監
,目前在美國市場的物流公司從事高級算法工程師
一職,深耕人工智能領域,精通python數據挖掘、可視化、機器學習等,發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN人工智能領域的優質創作者,提供AI相關的技術咨詢、項目開發和個性化解決方案等服務,如有需要請站內私信或者聯系任意文章底部的的VX名片(ID:xf982831907
)
💬 博主粉絲群介紹:① 群內初中生、高中生、本科生、研究生、博士生遍布,可互相學習,交流困惑。② 熱榜top10的常客也在群里,也有數不清的萬粉大佬,可以交流寫作技巧,上榜經驗,漲粉秘籍。③ 群內也有職場精英,大廠大佬,可交流技術、面試、找工作的經驗。④ 進群免費贈送寫作秘籍一份,助你由寫作小白晉升為創作大佬。⑤ 進群贈送CSDN評論防封腳本,送真活躍粉絲,助你提升文章熱度。有興趣的加文末聯系方式,備注自己的CSDN昵稱,拉你進群,互相學習共同進步。
【機器學習案列-25】電信用戶流失預測:從數據處理到模型評估
- 一、引言
- 二、數據集介紹
- 三、環境準備
- 四、數據清洗與探索
- 4.1 數據加載與預處理
- 4.2 數據探索
- 4.3 缺失值處理
- 4.4 數據分布
- 4.5 特征分布
- 五、特征工程
- 5.1 啞變量轉換
- 5.2 特征選擇
- 六、模型構建與訓練
- 6.1 隨機森林模型
- 6.2 模型評估
- 6.3 特征重要性
- 6.4 ROC 曲線與 AUC 值
- 七、分析總結與策略建議
- 7.1 關鍵發現
- 7.2 策略建議
一、引言
??在電信行業,用戶流失是一個關鍵問題,因為它直接影響到公司的收入和市場份額。通過分析用戶流失的原因,我們可以制定有效的策略來減少流失率,提高用戶滿意度和忠誠度。本文將使用 Python 進行數據處理、可視化、特征工程和模型構建,最終實現用戶流失的預測。
二、數據集介紹
??數據集包含以下字段:
customerID
:用戶IDgender
:性別SeniorCitizen
:是否是老年人(1代表是)Partner
:是否有配偶(Yes or No)Dependents
:是否經濟獨立(Yes or No)tenure
:用戶入網時間PhoneService
:是否開通電話業務(Yes or No)MultipleLines
:是否開通多條電話業務(Yes、No or No phoneservice)InternetService
:是否開通互聯網服務(No、DSL數字網絡或fiber optic光線網絡)OnlineSecurity
:是否開通網絡安全服務(Yes、No or No internetservice)OnlineBackup
:是否開通在線備份服務(Yes、No or No internetservice)DeviceProtection
:是否開通設備保護服務(Yes、No or No internetservice)TechSupport
:是否開通技術支持業務(Yes、No or No internetservice)StreamingTV
:是否開通網絡電視(Yes、No or No internetservice)StreamingMovies
:是否開通網絡電影(Yes、No or No internetservice)Contract
:合同簽訂方式(按月、按年或者兩年)PaperlessBilling
:是否開通電子賬單(Yes or No)PaymentMethod
:付款方式(bank transfer、credit card、electronic check、mailed check)MonthlyCharges
:月度費用TotalCharges
:總費用Churn
:是否流失(Yes or No)
三、環境準備
??在開始之前,請確保安裝了以下庫:
pip install pandas numpy seaborn matplotlib scikit-learn
四、數據清洗與探索
4.1 數據加載與預處理
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, roc_curve, auc# 加載數據
data = pd.read_csv("WA_Fn-UseC_-Telco-Customer-Churn.csv")# 將列名轉換為中文
data.columns = ['用戶ID', '性別', '是否老年人', '是否有配偶', '是否經濟獨立', '用戶入網時間','是否開通電話業務', '是否開通多條電話業務', '是否開通互聯網服務', '是否開通網絡安全服務','是否開通在線備份服務', '是否開通設備保護服務', '是否開通技術支持業務', '是否開通網絡電視','是否開通網絡電影', '合同簽訂方式', '是否開通電子賬單', '付款方式', '月度費用','總費用', '是否流失'
]# 將總費用列轉換為浮點型
data['總費用'] = pd.to_numeric(data['總費用'], errors='coerce').fillna(0)# 將是否流失列轉換為數值型
data['是否流失'] = data['是否流失'].map({'Yes': 1, 'No': 0})
4.2 數據探索
# 查看數據基本信息
print(data.info())
print(data.describe())# 查看數據樣本
print(data.sample(5))
4.3 缺失值處理
# 檢查缺失值
print(data.isnull().sum())# 填充缺失值
data['總費用'] = data['總費用'].fillna(data['總費用'].median())
4.4 數據分布
# 用戶流失率
churn_rate = data['是否流失'].mean() * 100
print(f"用戶流失率: {churn_rate:.2f}%")# 繪制用戶流失率餅圖
plt.figure(figsize=(6, 6))
data['是否流失'].value_counts().plot.pie(autopct='%1.1f%%', colors=['#4CAF50', '#F44336'])
plt.title("用戶流失率")
plt.show()
4.5 特征分布
# 不同性別用戶流失率
gender_churn = data.groupby('性別')['是否流失'].mean().reset_index()
sns.barplot(x='性別', y='是否流失', data=gender_churn)
plt.title("不同性別用戶流失率")
plt.show()# 不同合同類型用戶流失率
contract_churn = data.groupby('合同簽訂方式')['是否流失'].mean().reset_index()
sns.barplot(x='合同簽訂方式', y='是否流失', data=contract_churn)
plt.title("不同合同類型用戶流失率")
plt.show()
??具體的數據特征分布,參考【數據可視化-74】電信用戶流失數據可視化分析:Python + Pyecharts 炫酷大屏(含完整的數據,代碼)文章即可;
五、特征工程
5.1 啞變量轉換
# 將分類變量轉換為啞變量
data = pd.get_dummies(data, columns=['性別', '是否有配偶', '是否經濟獨立', '是否開通電話業務', '是否開通多條電話業務','是否開通互聯網服務', '是否開通網絡安全服務', '是否開通在線備份服務','是否開通設備保護服務', '是否開通技術支持業務', '是否開通網絡電視', '是否開通網絡電影','合同簽訂方式', '是否開通電子賬單', '付款方式'
])# 查看轉換后的數據
print(data.head())
5.2 特征選擇
# 選擇特征和目標變量
X = data.drop(['用戶ID', '是否流失'], axis=1)
y = data['是否流失']# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
六、模型構建與訓練
6.1 隨機森林模型
# 創建隨機森林分類器
rf = RandomForestClassifier(random_state=42)# 定義超參數范圍
param_grid = {'n_estimators': [50, 100, 150],'min_samples_split': [2, 5, 10],'min_samples_leaf': [1, 2, 4]
}# 使用 GridSearchCV 進行超參數調優
grid_search = GridSearchCV(rf, param_grid, cv=5)
grid_search.fit(X_train, y_train)# 輸出最佳超參數組合
print("最佳超參數組合為:", grid_search.best_params_)# 使用最佳超參數組合重新訓練模型
best_rf = grid_search.best_estimator_
best_rf.fit(X_train, y_train)
6.2 模型評估
# 在測試集上進行預測
y_pred = best_rf.predict(X_test)# 計算評估指標
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)print(f"準確率: {accuracy:.4f}")
print(f"精確率: {precision:.4f}")
print(f"召回率: {recall:.4f}")
print(f"F1值: {f1:.4f}")# 繪制混淆矩陣
conf_matrix = confusion_matrix(y_test, y_pred)
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues')
plt.xlabel("預測值")
plt.ylabel("實際值")
plt.title("混淆矩陣")
plt.show()
6.3 特征重要性
# 獲取特征重要性
feature_importances = best_rf.feature_importances_
feature_names = X.columns# 繪制特征重要性柱狀圖
plt.figure(figsize=(12, 8))
sns.barplot(x=feature_importances, y=feature_names)
plt.title("特征重要性")
plt.show()
6.4 ROC 曲線與 AUC 值
# 計算 ROC 曲線和 AUC 值
y_prob = best_rf.predict_proba(X_test)[:, 1]
fpr, tpr, _ = roc_curve(y_test, y_prob)
roc_auc = auc(fpr, tpr)# 繪制 ROC 曲線
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC 曲線 (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlabel("假正率")
plt.ylabel("真正率")
plt.title("ROC 曲線")
plt.legend(loc="lower right")
plt.show()
七、分析總結與策略建議
7.1 關鍵發現
- 用戶入網時間:入網時間越短,流失率越高。
- 月度費用:月度費用越高,流失率越高。
- 總費用:總費用較低的用戶流失率較高。
- 合同類型:按月簽約的用戶流失率最高,而兩年簽約的用戶流失率最低。
- 付款方式:使用電子支票付款的用戶流失率最高,而使用銀行轉賬付款的用戶流失率最低。
- 互聯網服務類型:未開通互聯網服務的用戶流失率最高,而開通光纖互聯網服務的用戶流失率最低。
7.2 策略建議
- 優化合同策略:鼓勵用戶簽訂長期合同,如兩年合同,以降低流失率。
- 調整費用結構:對于新用戶,提供優惠的月度費用和總費用套餐,以吸引他們入網并長期使用。
- 改善付款方式:提供更多的付款方式選擇,特別是銀行轉賬和信用卡支付,以提高用戶滿意度。
- 增強互聯網服務:為用戶提供高質量的互聯網服務,特別是光纖互聯網服務,以提高用戶忠誠度。
希望這篇文章能幫助你更好地理解和分析電信用戶流失數據。如果你有任何問題或建議,歡迎在評論區留言!🎉