利用决策树模型分析电信客户流失预测项目

首先这是一个比较经典的项目了,自己先拿到数据源是一个csv格式的时候,想清楚出发点是什么,项目背景是怎样的,以哪个为切入点。

1. Tableau做猜想预测

分成两大块,从人口特征和消费服务特征来做分析
利用Tableau做项目预测猜想,因为这个项目是一个简单的二分类,分类标准是Churn是否会流失,所以Churn是标签类别
在这里插入图片描述在这里插入图片描述得出结论:
1、没有子女、没有伴侣的老年用户流失率比较高
2、老年用户中流失用户的月度平均消费均比未流失用户要高17%的总价
3、从流失的人群中发现平均使用的时间占比少、月度花费比较高
4、流失的客户中大多数都是使用Fiber optic的网络服务、DSL的电话服务,进一步推断Fiber optic的网络服务的故障率比较高,加强客户售后意识,定期查询网络故障并及时修复。
5、流失的客户里面大部分都不使用OnlineBackup、DeviceProtection、OnlineSecurtiy、TechSupport服务
6、流失的人群里面大多数都是用月度支付的无纸化电子支票的支付方式,进一步推断由于支付方式比较繁琐,导致客户支付不便利。

对于上述观点,我采用了以下的数学模型来做分析依据:

其中由于决策树更加直观可以看到客户流失与哪些相关因素有关,下面是对上述分析的佐证。

2、代码实现

数据集分类:
数据划分处理:将数据分为3类
1、二分类数据:Yes/No转换为1/0,Yes=1/No、No services=0
在这里插入图片描述在这里插入图片描述2、离散型标签分类:将标签重新开设一列,作为0/1分类的标准
在这里插入图片描述
3、数值型分类,其数据内容具备顺序以及加减运算的数值意义。目前属于这类特征的变量有:已使用年限,月消费。我打算采用连续特征离散化的处理方式。原因是离散化后的特征对异常数据有更强的鲁棒性,降低过拟合的风险,模型会更稳定,预测的效果也会更好。

数据离散化也称为分箱操作,其方法分为有监督分箱(卡方分箱、最小熵法分箱)和无监督分箱(等频分箱、等距分箱)。本次为采用无监督分箱中的等频分箱进行操作。下图以Tenure为例
在这里插入图片描述

#将CSV数据集导入
from sklearn import datasets
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
#整理数据

TargetData=pd.read_csv('telecom_churn.csv')
#数据集大小
print(TargetData.shape)
#数据集是否有缺失值
print(TargetData.isnull().sum())
#检查数据类型
print(TargetData.dtypes)
#检查数据是否包含空字符
print(TargetData[TargetData['TotalCharges'].isin([' '])])
#修复错误输入的数据集:
TargetData.replace(to_replace=r'^\s*$',value=np.nan,regex=True,inplace=True)
TargetData.dropna(axis=0, how='any', inplace=True)
TargetData['TotalCharges']=pd.to_numeric(TargetData['TotalCharges'])
TargetData.describe(include='all')

#将PaymentMethod ,OnlineSecurity,OnlineBackup,DeviceProtection ,TechSupport 转化为0-1编码
from sklearn.preprocessing import LabelEncoder
encoder=LabelEncoder()
colLabel=['gender','Partner', 'Dependents', 'PhoneService','PaperlessBilling','Churn']
for i in colLabel:
    TargetData[i]=encoder.fit_transform(TargetData[i])
#设定规则将3个不同类的设置为0-1数据
Dependents_mapDict={
   'Yes':1,'No':0,'No internet service':0}
for j in ['OnlineSecurity', 'OnlineBackup', 'DeviceProtection', 'TechSupport', 'StreamingTV', 'StreamingMovies']:
    TargetData[j]=TargetData[j].map(Dependents_mapDict)
TargetData.head()

OneHotLabel=['MultipleLines', 'InternetService'
  • 1
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值