前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python实战|利用生存分析预测用户流失周期(一)

Python实战|利用生存分析预测用户流失周期(一)

作者头像
数据万花筒
发布2021-07-29 16:31:58
1K0
发布2021-07-29 16:31:58
举报
文章被收录于专栏:数据万花筒
利用生存分析预测用户流失周期

上篇

1.数据基本情况探索

2.数据来源及预处理

3.数据相关性探索

下篇

1.Cox风险比例模型建模

2. Cox风险比例模型效果评估

3.Cox风险比例模型预测流失用户

4.改善运营策略,防止用户流失

生存分析(survivalanalysis)源于生物医学,早期主要是是对生存时间进行分析,后来该方法也应用于各类商业分析,主要研究用户从一种状态转变到另一种状态所经历的时间。举个例子来说,在互联网行业,用户流失是较为常见的分析主题,生存分析法就可以运用于探究用户从进入互联网产品到流失这一过程的转变时长。这一期内容,小编会运用生存分析方法通过Python预测用户流失周期。

1

数据基本情况探索

此处笔者使用IBM用户流失数据集,该数据及来源于Kaggle,包括每个客户所签署的服务、客户账号信息以及用户个人信息等多个维度的用户属性数据。在该数据集中,流失用户的定义为在上个月之内离开的用户,数据集已经给出用户流失标签。

在正式作数据预处理之前,数据分析师需要了解数据的基本情况,比如查看数据有哪些字段、各个字段是什么类型、有没有缺失值、异常值等情况。数据分析师对数据的基本情况做到心中有底对后续的数据预处理和分析都是有极大帮助的。首先,通过如下代码读入数据并且查看基本情况。

代码语言:javascript
复制
#导入此次分析所需要的包
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'缺失值的填补、数值类型的转换以及数值变量基本信息的展示。

代码语言:javascript
复制
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
 

了解了数值变量的基本信息,如下代码实现了分类变量的基本信息的展示。

代码语言:javascript
复制
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

对于较为重要的字段,我们进行数据可视化展示,如下代码实现了用户留存时间、每月付费、总付费三个字段在流失用户和留存用户之间的差异对比以及整个数据集中流失和留存用户的数量展示。

代码语言:javascript
复制
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流失与费流失用户各个特征对比

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据万花筒 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档