【機器學習案列-25】電信用戶流失預測:從數據處理到模型評估

🧑 博主簡介:曾任某智慧城市類企業算法總監,目前在美國市場的物流公司從事高級算法工程師一職,深耕人工智能領域,精通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:用戶ID
  • gender:性別
  • 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 策略建議

  • 優化合同策略:鼓勵用戶簽訂長期合同,如兩年合同,以降低流失率。
  • 調整費用結構:對于新用戶,提供優惠的月度費用和總費用套餐,以吸引他們入網并長期使用。
  • 改善付款方式:提供更多的付款方式選擇,特別是銀行轉賬和信用卡支付,以提高用戶滿意度。
  • 增強互聯網服務:為用戶提供高質量的互聯網服務,特別是光纖互聯網服務,以提高用戶忠誠度。

希望這篇文章能幫助你更好地理解和分析電信用戶流失數據。如果你有任何問題或建議,歡迎在評論區留言!🎉


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916800.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916800.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916800.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【MATLAB代碼】灰色預測與多項式預測、指數平滑預測的對比,包含預處理、模型構建和和可視化輸出。模擬預測若干年的GDP,訂閱后可查看完整代碼,有中文注釋

代碼實現了灰色預測模型GM(1,1)在GDP預測中的應用,并結合線性回歸、二次多項式回歸和指數平滑模型進行對比分析。代碼包含數據預處理、模型構建、可視化輸出和誤差驗證四個核心模塊,實現了從數據輸入到預測結果展示的全流程。 文章目錄 運行結果 MATLAB源代碼 GM(1,1)模型數學…

搜索二維矩陣Ⅱ C++

編寫一個高效的算法來搜索 m x n 矩陣 matrix 中的一個目標值 target 。該矩陣具有以下特性&#xff1a; 每行的元素從左到右升序排列。 每列的元素從上到下升序排列。class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {i…

如何在 Apache Ignite 中創建和使用自定義 SQL 函數(Custom SQL Functions)

這段內容講的是 如何在 Apache Ignite 中創建和使用自定義 SQL 函數&#xff08;Custom SQL Functions&#xff09;。我們可以分步驟來理解它的含義和用法。&#x1f4da; 一、什么是 Custom SQL Function&#xff1f; Apache Ignite 的 SQL 引擎支持 標準 SQL 函數&#xff08…

Oracle 11g RAC數據庫實例重啟的兩種方式

Oracle 11g RAC數據庫實例重啟的兩種方式 使用SQLPlus重啟數據庫實例 使用SRVCTL重啟數據庫實例 Administrator-Managed還是Policy-Managed ?? 關于關閉RAC的數據庫實例: 在Oracle RAC中,單獨關閉一個實例不會影響到其他正在運行的實例。 要完全關閉Oracle RAC數據庫,需要…

分別使用 Java 8 和 Python 調用 Elasticsearch 接口簡單獲取數據

使用 Java 8 首先,確保在您的 pom.xml 文件中添加了正確的 Maven 依賴: <dependency><groupId>co.elastic.clients</groupId><artifactId>elastic

【通識】數據結構

數據結構邏輯結構物理結構&#xff08;存儲結構&#xff09;&#xff0c;數據結構是計算機中存儲、組織數據的方式。 其中物理結構是數據的邏輯結構在計算機中的存儲形式。而存儲器針對內存而言&#xff0c;像硬盤、軟盤、光盤等外部存儲器的數據組織常用文件結構描述。1. 基礎…

Ubuntu22.04提示找不到python命令的解決方案

Ubuntu22.04提示找不到python命令的解決方案 問題背景 在Ubuntu22.04中按照獲取Openharmony源碼中的如下命令&#xff1a; // 方式一&#xff08;推薦&#xff09;&#xff1a;通過repo ssh下載&#xff08;需注冊公鑰&#xff0c;請參考碼云幫助中心&#xff09;。repo in…

RabbitMQ面試精講 Day 6:消息確認與事務機制

【RabbitMQ面試精講 Day 6】消息確認與事務機制 開篇 歡迎來到"RabbitMQ面試精講"系列的第6天&#xff01;今天我們將深入探討RabbitMQ中確保消息可靠性的兩大核心機制&#xff1a;消息確認與事務機制。這兩個特性是面試中高頻出現的熱點問題&#xff0c;也是生產環…

被困擾的elementplus樣式修改問題:select選擇器修改和el-input修改

一、Select選擇器的原生樣式的本來面貌這是原生的沒有經過任何加工的面貌&#xff1a;這是沒有經過任何加工的選中時出現下拉框的面貌&#xff1a;這是沒有經過加工的懸浮下拉菜單的面貌&#xff1a;這是沒有經過加工的選中時的面貌&#xff1a;二、如何修改Select選擇器&#…

GO 從入門到精通2

Go語言的反射&#xff08;Reflection&#xff09;機制通過 reflect 包實現&#xff0c;允許程序在運行時動態檢查、修改和操作變量的類型信息和值。以下是反射的核心概念、用法及注意事項的詳細解析&#xff1a;一、反射的基本概念reflect.Type 表示變量的類型信息&#xff0c;…

常用設計模式系列(十二)—享元模式

常用設計模式系列&#xff08;十二&#xff09;—享元模式 第一節 前言 昏昏沉沉的兩天過去了&#xff0c;也不知道為什么&#xff0c;突然總覺得很困&#xff0c;可能之前熬夜熬的多了&#xff0c;所以現在可能年紀大了&#xff0c;需要蹦一蹦才能把自己從頹廢的邊緣拉扯回來&…

基于spring boot的醫院掛號就診系統(源碼+論文)

一、開發環境 技術/工具描述MYSQL數據庫1. 體積小&#xff0c;安裝便捷&#xff1a;MySQL數據庫體積小&#xff0c;占用內存小&#xff0c;不影響電腦上其他軟件的運行&#xff0c;并且不需要因為安裝維護MySQL數據庫而重裝系統。2. 適合老舊電腦&#xff1a;作為學習開發的電…

spring-security

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency>spring: security: user: name: root password: 123456 這個配置在訪問接口時候根據您提供的Spring Secur…

搭建一個自定義的 React 圖標庫

搭建一個自定義的 React 圖標庫可以讓你在多個項目中復用統一的圖標資源&#xff0c;同時支持按需加載、主題化和靈活的配置。以下是詳細的步驟指南&#xff1a; 1. 設計圖標庫結構 首先規劃圖標庫的目錄結構和功能&#xff1a; my-react-icons/ ├── src/ │ ├── ico…

寶塔面板如何升級OpenSSL

寶塔面板如何升級OpenSSL&#xff08;親測可用&#xff09;目前一些服務器的OpenSSL還是1.0.1e版本&#xff0c;今天進行服務器漏洞檢測出現OpenSSL存在漏洞&#xff0c;那只能升級OpenSSL了。1、登錄SSH&#xff0c;查看OpenSSL版本openssl version2、下載源代碼wget https://…

深入理解 C++ 紅黑樹:從理論到實踐

引言 在計算機科學領域&#xff0c;數據結構是構建高效算法的基石。而在眾多的數據結構中&#xff0c;平衡二叉搜索樹因其優秀的查找、插入和刪除性能而備受關注。紅黑樹&#xff08;Red-Black Tree&#xff09;作為一種自平衡的二叉搜索樹&#xff0c;更是在 C 標準庫&#x…

外星人筆記本裝win11哪個版本好_外星人筆記本裝win11專業版教程

外星人筆記本安裝win11哪個版本好&#xff1f;答&#xff1a;外星人筆記本還是建議安裝win11專業版。Win分為多個版本&#xff0c;其中家庭版&#xff08;Home&#xff09;和專業版&#xff08;Pro&#xff09;是用戶選擇最多的兩個版本。win11專業版在功能以及安全性方面有著明…

自學嵌入式 day37 HTML

HTML:超文本標記語言HyperText Markup Language一種用于創建網頁的標準標記語言HTML 運行在瀏覽器上&#xff0c;由瀏覽器來解析。https://www.runoob.com/html/html-tutorial.html1.格式 <!DOCTYPE html> <html><head><meta charset"utf-8"&g…

【車聯網kafka】Kafka核心架構與實戰經驗(第一篇)

目錄 一、我與kafka的緣分-初識Kafka 二、Kafka深入探討-了解kafka ?編輯2.1 kafka 生產者框架 2.1.1 生產者在生活中的實例 2.1.2 kafka生產者流程及框架 1. 主線程處理階段 2. Sender線程處理階段 設計優勢總結 2.2 kafka 生產者框架中的一些關鍵參數 2.3 kafka 生…

Go 語言變量作用域

Go 語言變量作用域 引言 在編程語言中&#xff0c;變量作用域是定義變量可以使用和不可使用的區域。在Go語言中&#xff0c;理解變量的作用域對于編寫高效且易于維護的代碼至關重要。本文將詳細介紹Go語言中的變量作用域&#xff0c;包括其規則、類型以及實際應用。 一、變量作…