点击标题下「蓝色微信名」可快速关注
本文所有代码都通过运行!
将从以下方面进行分析: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']])