客户流失分析预测案例 -- 机器学习项目基础篇(7)

news2024/12/28 10:46:47

客户流失

它是指现有的客户、用户、订阅者或任何类型的回头客停止与公司开展业务或结束与公司的关系。

客户流失的类型

  • 合同客户流失:当客户签订了服务合同并决定取消服务时,例如有线电视,SaaS。
  • 自愿流失:当用户自愿取消服务时,例如手机连接。
  • 非合同流失:当客户未签订服务合同并决定取消服务时,例如零售商店中的消费者忠诚度。
  • 非自愿流失:当客户在没有任何请求的情况下发生流失时,例如信用卡过期。

自愿流失的原因

  • 缺乏使用
  • 服务差
  • 更优惠的价格

导入电信客户流失数据集

# Import required libraries
import numpy as np
import pandas as pd
  
# Import the dataset
dataset = pd.read_csv('telcochurndata.csv')
  
# Glance at the first five records
dataset.head()
  
# Print all the features of the data
dataset.columns

在这里插入图片描述
在这里插入图片描述

电信客户流失数据集的探索性数据分析

查找数据集中的流失者和非流失者的数量:

# Churners vs Non-Churners
dataset['Churn'].value_counts()

在这里插入图片描述
按流失率对数据进行分组并计算平均值,以确定流失者是否比非流失者拨打更多的客户服务电话:

# Group data by 'Churn' and compute the mean
print(dataset.groupby('Churn')['Customer service calls'].mean())

在这里插入图片描述
好耶!也许不足为奇的是,流失者似乎比非流失者打更多的客户服务电话。

找出一个州是否比另一个州有更多的流失者。

# Count the number of churners and non-churners by State
print(dataset.groupby('State')['Churn'].value_counts())

在这里插入图片描述
虽然California 是美国人口最多的州,但在我们的数据集中,来自California 的客户并不多。例如,Arizona (AZ)有64个客户,其中4个最终流失。相比之下,California有更高数量(和百分比)的客户流失。这对一个公司来说是非常有用的信息。

探索数据可视化:了解变量如何分布

# Import matplotlib and seaborn
import matplotlib.pyplot as plt
import seaborn as sns
  
# Visualize the distribution of 'Total day minutes'
plt.hist(dataset['Total day minutes'], bins = 100)
  
# Display the plot
plt.show()

在这里插入图片描述
可视化客户流失者和非流失者之间的客户服务呼叫差异

# Create the box plot
sns.boxplot(x = 'Churn',
            y = 'Customer service calls',
            data = dataset,
            sym = "",                  
            hue = "International plan") 
# Display the plot
plt.show()

在这里插入图片描述
看起来那些确实流失的客户最终会留下更多的客户服务电话,除非这些客户也有国际计划,在这种情况下,他们留下更少的客户服务电话。这种类型的信息对于更好地理解客户流失的驱动因素非常有用。现在是时候学习如何在建模之前预处理数据了。

电信客户流失数据的预处理

许多机器学习模型对数据如何分布做出了某些假设。其中一些假设如下:

  • 特征呈正态分布
  • 特征的比例相同
  • 特征的数据类型为数值

在电信公司流失数据中,Churn, Voice mail plan和International plan是二进制特征,可以很容易地转换为0和1。

# Features and Labels
X = dataset.iloc[:, 0:19].values
y = dataset.iloc[:, 19].values # Churn
  
# Encoding categorical data in X
from sklearn.preprocessing import LabelEncoder
  
labelencoder_X_1 = LabelEncoder()
X[:, 3] = labelencoder_X_1.fit_transform(X[:, 3])
  
labelencoder_X_2 = LabelEncoder()
X[:, 4] = labelencoder_X_2.fit_transform(X[:, 4])
  
# Encoding categorical data in y
labelencoder_y = LabelEncoder()
y = labelencoder_y.fit_transform(y)

使用One hot encoding的编码状态功能

# Removing extra column to avoid dummy variable trap
X_State = pd.get_dummies(X[:, 0], drop_first = True)
  
# Converting X to a dataframe
X = pd.DataFrame(X)
  
# Dropping the 'State' column
X = X.drop([0], axis = 1)
  
# Merging two dataframes
frames = [X_State, X]
result = pd.concat(frames, axis = 1, ignore_index = True)
  
# Final dataset with all numeric features
X = result

创建训练集和测试集

# Splitting the dataset into the Training and Test sets
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size = 0.2, 
                                                    random_state = 0)

缩放训练集和测试集的特征

# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

在训练集上训练随机森林分类模型

# Import RandomForestClassifier
from sklearn.ensemble import RandomForestClassifier
  
# Instantiate the classifier
clf = RandomForestClassifier()
  
# Fit to the training data
clf.fit(X_train, y_train)

预测

# Predict the labels for the test set
y_pred = clf.predict(X_test)

评估模型性能

# Compute accuracy
from sklearn.metrics import accuracy_score
  
accuracy_score(y_test, y_pred)

在这里插入图片描述
混淆矩阵

from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_test, y_pred))

在这里插入图片描述
从混淆矩阵中,我们可以计算以下度量:

  • 真阳性(TP)= 51
  • 真阴性(TN)= 575
  • 假阳性(FP)= 4
  • 假阴性(FN)= 37
  • 精确率= TP/(TP+FP)= 0.92
  • 召回= TP/(TP+FN)= 0.57
  • 准确度=(TP+TN)/(TP+TN+FP+FN)= 0.9385

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/839916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QtWebApp同时开启http服务和https服务,接受来自客户端的不同请求并进行相应的处理

零、前言 在 QtWebApp开发https服务器,完成客户端与服务器基于ssl的双向认证,纯代码操作 一文中已经用纯代码的形式完成了客户端和服务端的 https 协议交互。 不过,只是开放了https服务,更多情况下,http服务和https服…

解决 Android Studio 的 Gradle 面板上只有关于测试的 task

文章目录 问题描述解决办法 笔者出问题时的运行环境: Android Studio Flamingo | 2022.2.1 Android SDK 33 Gradle 8.0.1 JDK 17 问题描述 笔者最近发现一个奇怪的事情。笔者的 Android Studio 的 Gradle 面板上居然除了用于测试的 task 之外,其它什…

Spring Security6入门及自定义登录

一、前言 Spring Security已经更新到了6.x,通过本专栏记录以下Spring Security6学习过程,当然大家可参考Spring Security5专栏对比学习 Spring Security5专栏地址:security5 Spring Security是spring家族产品中的一个安全框架,核心功能包括…

驱动工作原理

驱动原理 在Linux操作系统中,硬件驱动程序中实现对硬件直接操作,而用户空间,通过通用的系统调用接口(open() 打开相应的驱动设备,ioctl()控制相应的功能等),实现对硬件操作,应用程序没有直接操作…

百度Apollo规划算法——OBB障碍物检测代码解析

百度Apollo规划算法——Box障碍物检测代码解析 前言代码代码分析f1f2f3f4f5f6 参考 前言 本文主要分析Apollo代码中函数bool Box::HasOverlap(const Box2d &box) const {}的数学原理。 在阅读此部分代码时,第一遍没看懂return的一堆什么意思,百度之后…

work weekly

每周汇报:围绕着项目范围及需求内容完成情况多少、人力资源情况、整体进度情况、成本情况、【范围】多少工作、【资源】投入多少人、【时间】花费多少时间、【成本】花了多少钱 【质量】一般没有特别要求的默认软件开发过程规范要求响应时间 【沟通】这里不说了 …

31 对集合中的字符串,按照长度降序排列

思路&#xff1a;使用集合的sort方法&#xff0c;新建一个Comparator接口&#xff0c;泛型是<String>&#xff0c;重写里面的compare方法。 package jiang.com; import java.util.Arrays; import java.util.Comparator; import java.util.List;public class Practice4 {…

ppt压缩文件怎么压缩最小?文件压缩技巧分享

在日常的工作和学习中&#xff0c;难免会遇到PPT太大&#xff0c;需要将其压缩变小的情况&#xff0c;但很多朋友还不知道怎么压缩PPT文件&#xff0c;下面就给大家分享几个简单的方法&#xff0c;分分钟缩小过大的PPT文件。 一、PowerPoint PowerPoint就是微软公司的演示文稿…

微信小程序的自定义TabBar及Vant的使用

一、安装Vant 1、在 资源管理器 空白位置&#xff0c;点右键打开 在外部终端窗口打开 2、初始化NPM npm init -y 3、安装命令 npm i vant/weapp1.3.3 -S --production 4、构建NPM包 在 工具 里选择构建NPM包 5、删除style:v2 在app.json里&#xff0c;删除"style"…

【中断机制】什么是中断?使用中断的原因、注意事项

目录 一、为什么需要中断 二、什么是中断 1、中断的概念 2、中断的分类 3、中断的处理流程 三、中断处理程序要少用延时的原因 一、为什么需要中断 以网卡为例&#xff0c;CPU 如果要从网卡获取数据&#xff0c;不可能时时盯着网卡啥时候会有数据。当网卡收到数据时&…

炼钢工艺流程(2)

1. 轧制单元 更换前后两个工作辊之间的轧制对象称为轧制单元&#xff0c;对应一个轧制计划。两个 支撑辊之间的轧制对象是由多个轧制单元组成&#xff0c;称为轧制单元组&#xff0c;对应多个轧制计 划。 轧制单元的结构 每个计划开始的部分板坯按照宽度非减的方向排列来加热轧…

Linux中安装Node

安装 先从 官方网站 下载安装包&#xff0c;有时 node 版本太新会导致失败&#xff0c;详见下方的常见问题第2点 cd /home // 创建目录&#xff0c;将下载好的 node 安装包上传到此目录 mkdir Download mkdir /usr/local/lib/node解压 // 解压&#xff0c;前面是文件当前路径…

jenkins pipeline项目

回到目录 将练习jenkins使用pipeline项目&#xff0c;结合k8s发布一个简单的springboot项目 前提&#xff1a;jenkins的环境和k8s环境都已经安装完成&#xff0c;提前准备了gitlab和一个简单的springboot项目 创建一个流水线项目 流水线中选择git&#xff0c;并选择gitlab的…

运放电路之比较器的分析笔记

一、比较器 比较器分为同相比较器和反相比较器。 反相比较器电路如下&#xff1a; V11为固定值&#xff0c;这里设定的是2.5V&#xff0c;接到了运放的输入正&#xff08;V&#xff09;&#xff1b; V10为输入值&#xff0c;值可变&#xff0c;接到了运放的输入负&#xff08;V…

Python 开发工具 Pycharm —— 使用技巧Lv.2

pydoc是python自带的一个文档生成工具&#xff0c;使用pydoc可以很方便的查看类和方法结构 本文主要介绍&#xff1a;1.查看文档的方法、2.html文档说明、3.注释方法、 一、查看文档的方法 **方法1&#xff1a;**启动本地服务&#xff0c;在web上查看文档 命令【python3 -m…

人工智能编程软件 python,python人工智能编程入门

大家好&#xff0c;给大家分享一下人工智能python编程具体做什么&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 有不少同学学习 Python 的原因是对人工智能感兴趣&#xff0c;有志于从事相关行业。今天我们来聊聊这个方向所需要的一些技能…

一条sql语句在mysql中如何执行(查询+更新)

文章目录 一 MySQL 基础架构1.1 MySQL 基本架构1.2 Server 层基本组件介绍1) 连接器2) 查询缓存(MySQL 8.0 版本后移除)3) 分析器4) 优化器5) 执行器 二 语句分析2.1 查询语句2.2 更新语句为什么要用两个日志模块&#xff0c;用一个日志模块不行吗?为什么必须有“两阶段提交”…

基于Java+SpringBoot+SpringCloud+Vue的智慧养老平台设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

框架的前置学习-反射

运行java代码要经历的三个阶段 反射&#xff0c;程序框架设计的灵魂&#xff0c;将类的各个组成部分封装成其他对象&#xff0c;这就是反射机制。 框架&#xff1a;半成品的软件&#xff0c;在框架的基础上进行开发&#xff0c;可以简化编码 反射的好处&#xff1a; 可以在…

通过easyui实现动态控制表格字段显示、导出表格数据

前言 学过layui前端框架的都知道&#xff0c;layui默认帮我们实现了控制表格字段显示以及数据的导出功能。 1、控制表格字段显示 2、数据导出 3、导出为pdf&#xff1a;导出按钮的右边那个按钮就是打印pdf的 那么&#xff0c;easyui要怎么实现这些功能呢&#xff1f;这篇文章就…