一、项目背景
近年来,不论是传统行业还是互联网行业,都面临着用户流失问题。研究表明,企业可以在一周内失去100个用户,而同时又得到另外一个用户,从表明上来看业绩没有受到任何影响,而实际上争取这些新用户所花费的宣传、促销等成本显然要比保持老用户昂贵的多,从企业投资回报程度的角度来看是非常不经济的。
维护好老用户的重要性主要体现在以下四个方面:
留住老用户可使企业的竞争更长久。
留住老用户还会使成本大幅度降低。
留住老用户,还会大大有利于发展新用户。用户口碑效应,如果1个满意的用户引发8笔潜在的生意,那么其中至少1笔成交。
获取更多的用户份额。忠诚的用户会更愿意购买企业的的产品,其支出也会比随意消费者大得多。
二、分析目的
本文将对流失用户做特征分析和流失原因分析,帮助运营商发现并改善用户体验,以及确定挽留目标用户并制定方案。
三、数据来源
此数据集来自kaggle电信用户流失数据集
四、提出问题
分析用户特征与流失的关系
从整体情况看,流失用户的普遍具有哪些特征?
尝试找到合适的模型预测流失用户。
针对性给出增加用户黏性、预防流失的建议。
五、分析流程
六、理解数据
1、采集数据
本数据集来自DF ,数据源地址:
https://www.datafountain.cn/dataSets/35/details#
本数据集描述了电信用户是否流失以及其相关信息,共包含7044条数据,共20个字段,介绍下各个字段:
customerID :用户ID。
gender:性别。(Female & Male)
SeniorCitizen :老年人 (1表示是,0表示不是)
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,No internetserive 三种)
OnlineBackup:是否开通在线备份业务(Yes,No,No internetserive 三种)
DeviceProtection:是否开通了设备保护业务(Yes,No,No internetserive 三种)
TechSupport:是否开通了技术支持服务(Yes,No,No internetserive 三种)
StreamingTV:是否开通网络电视(Yes,No,No internetserive 三种)
StreamingMovies:是否开通网络电影(Yes,No,No internetserive 三种)
Contract:签订合同方式 (按月,一年,两年)
PaperlessBilling:是否开通电子账单(Yes or No)
PaymentMethod:付款方式(bank transfer,credit card,electronic check,mailed check)
MonthlyCharges:月费用
TotalCharges:总费用
Churn:该用户是否流失(Yes or No)
2、导入包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
3、导入数据
data = pd.read_csv(r'D:\数据分析\telco-customer-churn\WA_Fn-UseC_-Telco-Customer-Churn.csv')
4.数据转化
data.columns=['用户ID','性别','老年人' ,'是否有配偶' ,'是否经济独立' ,'客户的入网时间','是否开通电话服务业务' ,'是否开通了多线业务'
,'是否开通互联网服务' ,'是否开通网络安全服务','是否开通在线备份业务','是否开通了设备保护业务','是否开通了技术支持服务','是否开通网络电视'
,'是否开通网络电影','签订合同年限' ,'是否开通电子账单','付款方式','月费用','总费用','该用户是否流失']
data.head()
#强制转换为数字,不可转换的变为NaN
data['总费用'] = pd.to_numeric(data['总费用'],errors='coerce')
test=data.loc[:,'总费用'].value_counts().sort_index()
print(test.sum())
#运行结果:7032
print(data.客户的入网时间[data['总费用'].isnull().values==True])
#运行结果:11
经过观察,发现这11个用户‘tenure’(入网时长)为0个月,推测是当月新入网用户。根据一般经验,用户即使在注册的当月流失,
也需缴纳当月费用。因此将这11个用户入网时长改为1,将总消费额填充为月消费额,符合实际情况。
#将总消费额填充为月消费额
#参数如下:
# df.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method=‘pad‘, axis=None)
# to_replace:被替换的值,value:替换后的值,inplace:是否要改变原数据,False是不改变,True是改变,默认是False
data.loc[:,'总费用'].replace(to_replace=np.nan,value=data.loc[:,'月费用'],inplace=True)#查看是否替换成功
print(data[data['该用户是否流失']==0][['该用户是否流失','月费用','总费用']])
#将‘tenure’入网时长从0修改为1
data.loc[:,'该用户是否流失'].replace(to_replace=0,value=1,inplace=True)
print(pd.isnull(data['总费用']).sum())
print(data['总费用'].dtypes)
七、用户流失分析
根据一般经验,将用户特征划分为用户属性、服务属性、合同属性,并从这三个维度进行分析。
# 查看流失用户数量和占比。
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.pie(data['该用户是否流失'].value_counts(),labels=['未流失','流失'],autopct='%.2f%%',explode=(0.1,0))
plt.title('用户流失占比')
#查看数量上的对比
churnDf=data['该用户是否流失'].value_counts().to_frame()
x=churnDf.index
y=churnDf['该用户是否流失']
plt.bar(x,y,width