【机器学习案列-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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;包括其规则、类型以及实际应用。 一、变量作…