实战 | 电信客户流失分析与预测

点击标题下「蓝色微信名」可快速关注本文所有代码都通过运行!将从以下方面进行分析:1.背景 2.提出问题 3.理解数据 4.数据清洗 5.可视化分析 6.用户流失预测 7.结论和建议本项目...
摘要由CSDN通过智能技术生成

点击标题下「蓝色微信名」可快速关注

本文所有代码都通过运行!

将从以下方面进行分析:1.背景 2.提出问题 3.理解数据 4.数据清洗 5.可视化分析 6.用户流失预测 7.结论和建议

本项目带你根据以上过程详细分析电信客户数据!

01

背景

关于用户留存有这样一个观点,如果将用户流失率降低5%,公司利润将提升25%-85%。如今高居不下的获客成本让电信运营商遭遇“天花板”,甚至陷入获客难的窘境。随着市场饱和度上升,电信运营商待解决增加用户黏性,延长用户生命周期的问题。因此,电信用户流失分析与预测至关重要。数据集为“电信运营商客户数据集”

02

提出问题

  1.分析用户特征与流失的关系

  2.从整体情况看,流失用户的普遍具有哪些特征? 

  3.尝试找到合适的模型预测流失用户。 

  4.针对性给出增加用户黏性、预防流失的建议。

03

理解数据

根据介绍,该数据集有21个字段,共7043条记录。每条记录包含了唯一客户的特征。我们目标就是发现前20列特征和最后一列客户是否流失特征之间的关系。

04

数据清洗

数据清洗的“完全合一”规则:

1、完整性:单条数据是否存在空值,统计的字段是否完善。

2、全面性:观察某一列的全部数值,通过常识来判断该列是否有问题,比如:数据定义、单位标识、数据本身。

3、合法性:数据的类型、内容、大小的合法性。比如数据中是否存在非ASCII字符,性别存在了未知,年龄超过了150等。

4、唯一性:数据是否存在重复记录,因为数据通常来自不同渠道的汇总,重复的情况是常见的。行数据、列数据都需要是唯一的。

导入工具包。

In [1]:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

导入数据集文件。

In [2]:

customerDF = pd.read_csv('WA_Fn-UseC_-Telco-Customer-Churn.csv')

查看数据集信息,查看数据集大小,并初步观察前10条的数据内容。

In [3]:

# 查看数据集大小
customerDF.shape
# 运行结果:(7043, 21)
#设置查看列不省略
pd.set_option('display.max_columns',None)
# 查看前10条数据
customerDF.head(10)

查看数据是否存在Null,没有发现。

In [4]:

# Null计数
pd.isnull(customerDF).sum()

查看数据类型,根据一般经验,发现‘TotalCharges’总消费额的数据类型为字符串,应该转换为浮点型数据。

In [5]:

# 查看数据类型
customerDF.info()#customerDf.dtypes

将‘TotalCharges’总消费额的数据类型转换为浮点型,发现错误:字符串无法转换为数字。

In [6]:

#customerDf[['TotalCharges']].astype(float)#ValueError: could not convert string to float:

依次检查各个字段的数据类型、字段内容和数量。最后发现“TotalCharges”(总消费额)列有11个用户数据缺失。

采用强制转换,将“TotalCharges”(总消费额)转换为浮点型数据。

In [7]:

#强制转换为数字,不可转换的变为NaN
customerDF['TotalCharges']=customerDF['TotalCharges'].convert_objects(convert_numeric=True)

转换后发现“TotalCharges”(总消费额)列有11个用户数据缺失,为NaN。

In [8]:

test=customerDF.loc[:,'TotalCharges'].value_counts().sort_index()
print(test.sum())
#运行结果:7032
print(customerDF.tenure[customerDF['TotalCharges'].isnull().values==True])
#运行结果:11

经过观察,发现这11个用户‘tenure’(入网时长)为0个月,推测是当月新入网用户。根据一般经验,用户即使在注册的当月流失,也需缴纳当月费用。因此将这11个用户入网时长改为1,将总消费额填充为月消费额,符合实际情况。

In [9]:

#将总消费额填充为月消费额
customerDF.loc[:,'TotalCharges'].replace(to_replace=np.nan,value=customerDF.loc[:,'MonthlyCharges'],inplace=True)#查看是否替换成功
print(customerDF[customerDF['tenure']==0][['tenure','MonthlyCharges','TotalCharges']])

In [10]:

# 将‘tenure’入网时长从0修改为1
customerDF.loc[:,'tenure'].replace(to_replace=0,value=1,inplace=True)
print(pd.isnull(customerDF['TotalCharges']).sum())
print(customerDF['TotalCharges'].dtypes)
0
float64

查看数据的描述统计信息,根据一般经验,所有数据正常。

In [11]:

# 获取数据类型的描述统计信息
custo
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值