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

2021-07-29 16:33:16 浏览数 (1)

利用生存分析预测用户流失周期

上篇

1.数据基本情况探索

2.数据来源及预处理

3.数据相关性探索

下篇

1.Cox风险比例模型建模

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

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

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

完整代码已经汇总到知识星球,可以按需获取!

https://t.zsxq.com/VBYNrVR

Cox风险比例模型是用户流失分析中较为常用的方法,该模型不仅可以预测用户是否会流失,还能预测用户何时流失,下面一起来看看Cox风险比例模型如何预测用户流失。

1

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

经过上述一系列的铺垫,终于进入了Cox风险比例模型。首先,我们通过sklearn的train_test_split函数将数据集按照8:2的便利分为训练集和测试集;其次,利用lifelines包中的CoxPHFitter函数实现数据拟合,如下代码是Cox风险比例模型建模的过程。

代码语言:javascript复制
fromsklearn.model_selection import train_test_split
train_data,test_data = train_test_split(data, test_size=0.2)
fromlifelines import CoxPHFitter
 
formula= 'MultipleLines_No  `MultipleLines_No phone service`  MultipleLines_Yes InternetService_DSL  `InternetService_Fiber optic`  InternetService_No  OnlineSecurity_No `OnlineSecurity_No internet service`  OnlineSecurity_Yes `Contract_Month-to-month`  `Contract_One year`  `Contract_Two year` OnlineBackup_No  `OnlineBackup_No internet service`  OnlineBackup_Yes DeviceProtection_No  `DeviceProtection_No internet service` DeviceProtection_Yes  TechSupport_No  `TechSupport_No internet service` TechSupport_Yes  StreamingTV_No  `StreamingTV_No internet service` StreamingTV_Yes  StreamingMovies_No  `StreamingMovies_No internet service` StreamingMovies_Yes  `PaymentMethod_Bank transfer (automatic)` `PaymentMethod_Credit card (automatic)`  `PaymentMethod_Electronic check` `PaymentMethod_Mailed check`  gender  Partner  Dependents  PhoneService PaperlessBilling  MonthlyCharges  TotalCharges'
model =CoxPHFitter(penalizer=0.01, l1_ratio=0)
model =model.fit(train_data.drop("customerID",axis=1), 'tenure',event_col='Churn',formula=formula)
model.print_summary()

模型的汇总信息如下所示,生存模型中我们输入的生存时间列为'tenure',观察的事件列为'Churn',代表用户是否流失。在训练集中一共有5634个样本,其中观察到1478个流失事件。

代码语言:javascript复制
model                                       lifelines.CoxPHFitter
durationcol                                       'tenure'
eventcol                                           'Churn'
penalizer                                           0.01
l1 ratio                                               0
baselineestimation                                  breslow
numberof observations                               5634
numberof events observed                            1487
partiallog-likelihood                             -9985.37

模型的效果相关的指标,包括了一致性指数(Concordance Index)、赤池信息量准则(Akaike information criterion)以及似然比检验(Likelihood ratio test)等等指标。一致性指数最大值为1,此处生存分析模型的一致性指数高达93%,说明Cox风险比例模型效果还是不错的。

代码语言:javascript复制
Concordance                                    0.93
PartialAIC                                     20046.74
log-likelihoodratio test                       4270.54 on 38 df
-log2(p)of ll-ratio test                       inf

部分特征的模型系数如下图所示,如果系数是正的,那么该特征更容易是客户流失;如果是负的,那么拥有该特征客户则不太容易流失。模型还给出了特征的显著性。从分析结果来看,签署两年合同,即‘Contract_Two year’特征对于用户的留存是具有积极正向作用的,且在95%的置信度下是具有显著性的,这个分析结果和之前相关分析的结果是一致的。除此之外,‘同伴’即‘Partner’这个特征对用户留存也是具有积极的影响,同样在95%的置信度下也是显著的。

2

Cox风险比例模型效果评估

(1)一致性指数

Cox风险比例模型的评判标准是一致性指数(Concordance Index),该指标是针对模型内不一致性的评估。对于Cox风险比例模型的一致性可以这样理解,如果某个特征的风险增加了,那么具有该特征的观察结果风

险会高。如果Cox回归模型满足上述原则,那么模型一致性会上升;如果不是,一致性会下降。如下代码绘制了Cox风险比例模型风险比例。

代码语言:javascript复制
plt.figure(figsize= (8,10))
model.plot(hazard_ratios=True)
plt.xlabel('HazardRatios (95% CI)')

Cox风险比例模型的一致性趋势如图1所示,分析结果显示该模型满足一致性原则。

图 1 Cox比例风险模型的一致性检验

最后,输出Cox模型的一致性指数,实现过程如下代码所示。

代码语言:javascript复制
from lifelines.utils import concordance_index
C_index =concordance_index(train_data['tenure'],-model.predict_partial_hazard(train_data.drop('customerID',axis=1)),train_data['Churn'])
print('The concordance of the Cox model on the testsubsample is: ', round(C_index*100),'%')
 
The concordance of the Cox model on the testsubsample is:  93 %

(2)校准曲线(Calibration )

校准曲线是使用连续数据离散化的方法判断模型的预测概率是否接近于真是概率。理想情况下,校准曲线是一条对角线,即预测概率等于真是概率。Cox风险比例模型的校准曲线可以通过如下代码实现。

代码语言:javascript复制
from sklearn.calibration import calibration_curve
plt.figure(figsize=(10, 10))
ax1 = plt.subplot2grid((3, 1), (0, 0), rowspan=2)
ax1.plot([0, 1], [0, 1], "k:",label="Perfectly calibrated")
probs =1-np.array(model.predict_survival_function(test_data).loc[13])
 
actual = test_data['Churn']
fraction_of_positives, mean_predicted_value =calibration_curve(actual, probs, n_bins=10, normalize=False)
 
ax1.plot(mean_predicted_value,fraction_of_positives, "s-", label="%s" %("CoxPH",))
ax1.set_ylabel("Fraction of positives")
ax1.set_ylim([-0.05, 1.05])
ax1.legend(loc="lower right")
ax1.set_title('Calibration plots (reliabilitycurve)')

如图2所示,Cox风险比例模型的校准曲线接近对角线,但在曲线底端高估了用户的留存概率,即低估了流失率;而在曲线的上端则低估了用户的留存概率,即高估了流失率。

图2 Cox风险比例模型的校准曲线

0 人点赞