上篇
1.数据基本情况探索
2.数据来源及预处理
3.数据相关性探索
下篇
1.Cox风险比例模型建模
2. Cox风险比例模型效果评估
3.Cox风险比例模型预测流失用户
4.改善运营策略,防止用户流失
生存分析(survivalanalysis)源于生物医学,早期主要是是对生存时间进行分析,后来该方法也应用于各类商业分析,主要研究用户从一种状态转变到另一种状态所经历的时间。举个例子来说,在互联网行业,用户流失是较为常见的分析主题,生存分析法就可以运用于探究用户从进入互联网产品到流失这一过程的转变时长。这一期内容,小编会运用生存分析方法通过Python预测用户流失周期。
1
数据基本情况探索
此处笔者使用IBM用户流失数据集,该数据及来源于Kaggle,包括每个客户所签署的服务、客户账号信息以及用户个人信息等多个维度的用户属性数据。在该数据集中,流失用户的定义为在上个月之内离开的用户,数据集已经给出用户流失标签。
在正式作数据预处理之前,数据分析师需要了解数据的基本情况,比如查看数据有哪些字段、各个字段是什么类型、有没有缺失值、异常值等情况。数据分析师对数据的基本情况做到心中有底对后续的数据预处理和分析都是有极大帮助的。首先,通过如下代码读入数据并且查看基本情况。
#导入此次分析所需要的包
importmath as mt
importnumpy as np
importpandas as pd
fromscipy.stats import norm
importscipy
importmatplotlib.pyplot as plt
importseaborn as sns
survival_data=pd.read_csv("survival_ananlysis_data.csv")
survival_data.info()
<class'pandas.core.frame.DataFrame'>
RangeIndex:7043 entries, 0 to 7042
Datacolumns (total 21 columns):
Column Non-Null Count Dtype
customerID 7043 non-null object
gender 7043 non-null object
SeniorCitizen 7043 non-null int64
Partner 7043 non-null object
Dependents 7043 non-null object
tenure 7043 non-null int64
PhoneService 7043 non-null object
MultipleLines 7043 non-null object
InternetService 7043 non-null object
OnlineSecurity 7043 non-null object
OnlineBackup 7043 non-null object
DeviceProtection 7043 non-null object
TechSupport 7043 non-null object
StreamingTV 7043 non-null object
StreamingMovies 7043 non-null object
Contract 7043 non-null object
PaperlessBilling 7043 non-null object
PaymentMethod 7043 non-null object
MonthlyCharges 7043 non-null float64
TotalCharges 7043 non-null object
Churn 7043 non-null object
dtypes:float64(1), int64(2), object(18)
memoryusage: 1.1+ MB
由上述的结果可知,IBM用户流失数据集中,包括了数值变量,也包括了分类变量。对于数值变量来说,数据分析师需要了解数值变量的数值范围,而对于分类变量来说,数据分析师则需要知道分类变量有多少种类别。在数值类型字段中,'TotalCharges'字段不仅存在缺失值,而且不是数值类型,所以需要先填补缺失值并将其转换为数值形式。如下代码实现了'TotalCharges'缺失值的填补、数值类型的转换以及数值变量基本信息的展示。
survival_data['TotalCharges']= survival_data[['TotalCharges']].replace([' '], '0')
survival_data['TotalCharges']= pd.to_numeric(survival_data['TotalCharges'])
survival_data.describe().transpose()
count mean std min 25% 50% 75% max
SeniorCitizen 7043.0 0.16 0.37 0.00 0.00 0.00 0.00 1.00
tenure 7043.0 32.37 24.56 0.00 9.00 29.00 55.00 72.00
MonthlyCharges 7043.0 64.76 30.09 18.25 35.50 70.35 89.85 118.75
TotalCharges 7043.00 2279.73 2266.79 0.00 398.55 1394.55 3786.60 8684.80
了解了数值变量的基本信息,如下代码实现了分类变量的基本信息的展示。
survival_data.describe(include='object').T
count unique top freq
customerID 7043 7043 6128-AQBMT 1
gender 7043 2 Male 3555
Partner 7043 2 No 3641
Dependents 7043 2 No 4933
PhoneService 7043 2 Yes 6361
MultipleLines 7043 3 No 3390
InternetService 7043 3 Fiberoptic 3096
OnlineSecurity 7043 3 No 3498
OnlineBackup 7043 3 No 3088
DeviceProtection 7043 3 No 3095
TechSupport 7043 3 No 3473
StreamingTV 7043 3 No 2810
StreamingMovies 7043 3 No 2785
Contract 7043 3 Month-to-month 3875
PaperlessBilling 7043 2 Yes 4171
PaymentMethod 7043 4 Electronic check 2365
Churn 7043 2 No 5174
对于较为重要的字段,我们进行数据可视化展示,如下代码实现了用户留存时间、每月付费、总付费三个字段在流失用户和留存用户之间的差异对比以及整个数据集中流失和留存用户的数量展示。
fig,axes= plt.subplots(nrows=2,ncols=2, figsize=(10,8))
keyvalue= survival_data[['tenure','MonthlyCharges','TotalCharges']]
for ax,column in zip(axes.ravel(),keyvalue):
sns.boxplot(x=survival_data['Churn'],
y=keyvalue[column], ax=ax)
plt.tight_layout()
sns.countplot(x=survival_data['Churn'],alpha=.95)
如图1所示,该数据集中留存用户远远多于流失用户,留存用户的留存时间、总消费金额长于流失用户,但留存用户的月付费金额少于流失用户。
图1流失与费流失用户各个特征对比