生存分析和生成分析曲线图
生存分析和生成分析曲线图
生存分析是一种在时间维度上分析事件发生概率的统计方法,在客户流失预测中具有独特优势。本文将详细介绍生存分析的基本概念、关键方法,并通过电信和APP会员两个案例,展示如何使用Kaplan-Meier估计和Cox比例风险模型进行客户流失分析。
生存数据分析(Survival Analysis)是一种统计分析方法,主要用于分析时间到事件的数据。这里的“事件”可以是广义上的,比如在医疗研究中的死亡、疾病复发,或在市场分析中的客户流失、设备故障等。“生存”在这里不单指生命的存续,而是指某个特定状态或事件发生的时间。
而在实际工作中,主要是用于客户流失的分析。客户流失分析是企业用于评估和预测客户停止使用其产品或服务的倾向的过程。通过识别可能流失的客户,企业可以制定适当的保留策略来减少流失率。传统上,客户流失分析依赖于分类算法(如逻辑回归、决策树)来预测客户是否会流失。然而,这些方法通常忽略了时间因素。
生存数据分析能够在时间维度上对客户行为进行建模,识别客户在不同时间点上的流失概率。这种时间敏感的分析方法使企业能够制定更精准的干预策略,从而提升客户保留率。
生存分析与传统客户流失方法
- 时间因素:生存分析关注的是流失的时间,而不仅仅是流失的可能性;
- 处理截尾数据:生存分析能处理在观察期结束时仍未流失的客户数据;
- 动态风险分析:能够在不同时间点动态调整客户流失的风险评估。
生成分析的方法
生存时间和事件定义
- 生存时间:在客户流失分析中,生存时间是指从客户注册或开始使用服务到客户停止使用或取消订阅的时间。
- 事件:在客户流失分析中,事件通常被定义为客户取消订阅或停止使用服务。
截尾数据
- 右截尾数据:如果在分析期结束时客户仍在使用服务,则这些客户的数据被视为右截尾数据。
- 左截尾和区间截尾:在客户流失分析中应用较少。
生存函数和风险函数
- 生存函数(S(t)):表示客户在时间t之后仍在使用服务的概率。
- 风险函数(h(t)):表示客户在时间t流失的即时风险。
Kaplan-Meier估计
Kaplan-Meier估计是一种非参数方法,用于估计生存函数。它通过每个时间点的流失率来计算累积生存概率,是客户流失分析中常用的生存曲线绘制方法。
Cox比例风险模型
Cox比例风险模型是一种半参数模型,用于评估多个变量对生存时间的影响。它不需要假设生存时间的特定分布,适用于包含多个影响因素的客户流失分析。
客户流失应用场景
客户生命周期管理
通过分析不同时间点的客户流失概率,企业可以更好地管理客户生命周期,制定个性化的客户维系策略。
营销策略优化
生存分析可以帮助企业识别高流失风险的客户群体,从而优化营销资源的分配,集中在需要保留的客户上。
客户忠诚度评估
通过生存分析,企业可以定量评估不同群体的客户忠诚度,进而设计有效的客户忠诚度计划。
案例一
我们将使用一个模拟的电信公司客户流失数据集。数据集中包含客户的基本信息、服务使用情况以及是否流失的标记。
我们生成了一个包含500名客户的模拟数据集。tenure
列表示客户使用服务的时间长度,churn
列表示客户是否流失(1表示流失,0表示未流失)。segment
列表示客户分组(低消费组和高消费组),用以分析不同客户群体的生存情况。代码如下:
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体为黑体
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
import pandas as pd
import numpy as np
from lifelines import KaplanMeierFitter
n = 500
data = pd.DataFrame({
'customer_id': range(n),
'tenure': np.random.exponential(scale=10, size=n).astype(int), # 模拟客户使用时间
'churn': np.random.binomial(1, 0.3, size=n), # 模拟流失标记(1 表示流失,0 表示未流失)
'segment': np.random.choice(['低消费组', '高消费组'], size=n) # 模拟客户分组
})
kmf = KaplanMeierFitter()
# 绘制不同分组的生存曲线
plt.figure(figsize=(10, 6))
for name, grouped_df in data.groupby('segment'):
kmf.fit(grouped_df['tenure'], event_observed=grouped_df['churn'], label=name)
kmf.plot_survival_function()
plt.title('Kaplan-Meier 生成分析曲线 by 消费层级', fontsize=20) # 调整标题字体大小
plt.xlabel('计算月份', fontsize=14) # 调整 x 轴标签字体大小
plt.ylabel('留存概率', fontsize=14) # 调整 y 轴标签字体大小
plt.legend(title='消费层级', title_fontsize='13', fontsize='12')
plt.grid(True)
plt.show()
图中的生存曲线显示了两组客户的流失概率变化趋势。可以明显的看到,低消费组的曲线下降得更快,说明该组客户流失速度更快,价值相对更低。而高消费组在60%,18个月时候趋于稳定,可以考虑在这之前针对改组用户做一写活动;或者这段时间做一些激活的活动。
案例二
第二个案例是关于某APP会员的流失预测。数据集包括客户的注册时间、订阅时长、以及是否续订的信息。我们将使用Cox比例风险模型来评估影响客户流失的因素,并考虑客户的分组特征。
首先生成数据:
import pandas as pd
import numpy as np
from lifelines import CoxPHFitter
import matplotlib.pyplot as plt
n = 300
data = pd.DataFrame({
'customer_id': range(n),
'subscription_length': np.random.exponential(scale=8, size=n).astype(int) + 1, # 模拟订阅时长
'renewed': np.random.binomial(1, 0.4, size=n), # 模拟是否续订,0为流失,1为未流失
'age': np.random.randint(18, 65, size=n), # 客户年龄
'subscription_type': np.random.choice(['砖石会员', '基础会员'], size=n) # 订阅类型
})
# 设置分组差异
data.loc[data['subscription_type'] == '基础会员', 'subscription_length'] *= 0.5 # Premium订阅较短的时间
data.loc[data['subscription_type'] == '砖石会员', 'renewed'] = np.random.binomial(1, 0.8, size=sum(data['subscription_type'] == '砖石会员'))
使用CoxPHFitter
拟合模型,考虑年龄和订阅类型(使用C(subscription_type)
来处理分类变量)对续订行为的影响:
# 初始化CoxPHFitter
cph = CoxPHFitter()
# 拟合Cox比例风险模型
cph.fit(data, duration_col='subscription_length', event_col='renewed', formula='age + C(subscription_type)')
# 打印模型摘要
cph.print_summary()
绘制了不同订阅类型的生存曲线,展示订阅类型对客户续订概率的影响:
cph.plot_partial_effects_on_outcome(covariates='subscription_type', values=['砖石会员', '基础会员'], cmap='coolwarm')
plt.title('Survival Curves Based on Subscription Type')
plt.xlabel('Subscription Length (months)')
plt.ylabel('Survival Probability')
plt.grid(True)
plt.show()
从生存曲线的形状可以看出,砖石会员的曲线下降得比基础会员快,这表明基础会员的流失速度更快,需要特别关注。
最后解释一下cph.print_summary()
的输出结果如何看:
coef(回归系数)
回归系数代表每个自变量对因变量的影响强度和方向。具体来说,正的系数意味着随着这个变量的增加,生存时间的风险(即流失的可能性)增加;负的系数则表示随着变量的增加,生存时间的风险降低。
exp(coef)(风险比 / 相对风险)
exp(coef) 是对数回归系数的指数函数,表示相对风险(hazard ratio)。它量化了特定变量增加一个单位时,生存风险的变化。
- exp(coef) > 1:变量的增加会增加流失的风险。
- exp(coef) < 1:变量的增加会降低流失的风险。
p(p值)
p值用于检验系数的显著性。通常采用显著性水平 0.05,即 p 值小于0.05时认为该变量显著影响生存时间。
假设cph.print_summary()
的输出部分如下:
- age的系数是0.05,exp(coef)是1.051,表示年龄每增加一岁,客户流失风险增加约5%。p值为0.000,显著低于0.05,因此年龄对生存时间有显著的正向影响。
- subscription_type的系数是-0.70,exp(coef)是0.496,表示在砖石会员(作为基线)和基础会员之间,砖石会员的客户流失风险减少约50%。p值为0.000,显著低于0.05,表明订阅类型对生存时间有显著影响。
通过理解cph.print_summary()
的输出,数据分析师可以清楚地识别哪些因素显著影响客户的生存概率,以及这些因素如何影响客户流失风险。这对于优化客户维系策略、制定个性化营销方案以及提升客户满意度和忠诚度至关重要。