Kaplan-Meier估计法(Kaplan-Meier Estimator):
- 一种非参数方法,用于估计生存函数。
- 通过计算在每个事件发生时间点的生存概率,并将这些概率连乘得到生存函数。
举例说明:会员用户的生存分析
通过举例说明Kaplan-Meier估计法在会员用户生存分析中的应用,可以帮助我们理解如何使用该方法分析和预测会员用户的留存时间。以下是具体步骤和示例:
示例背景
假设我们运营一个在线服务平台,想要分析会员用户的留存时间,即从注册会员到取消会员资格的时间。我们收集了若干会员用户的数据,包括他们的注册时间、取消会员资格的时间(若已取消),以及是否在观察期结束时仍然是会员。
数据示例
用户ID | 注册时间 | 取消时间 | 状态 |
---|---|---|---|
1 | 2022-01-01 | 2022-06-01 | 1(事件发生) |
2 | 2022-02-01 | - | 0(删失数据) |
3 | 2022-03-01 | 2022-05-01 | 1 |
4 | 2022-04-01 | 2022-07-01 | 1 |
5 | 2022-05-01 | - | 0 |
状态:1表示用户取消了会员资格,0表示用户在观察期结束时仍然是会员。
步骤
-
计算每个时间点的生存概率:
- 生存概率是指在某个时间点上会员用户仍然活跃的概率。
- Kaplan-Meier估计法通过累积每个时间点的生存概率来计算整体的生存函数。
-
构建Kaplan-Meier表格:
- 需要列出每个时间点的事件发生数量、风险集(还活跃的用户数量)、每个时间点的生存概率等。
计算过程
时间点(天) | 事件数量 | 风险集 | 生存概率 | 累积生存概率 |
---|---|---|---|---|
30(1月) | 0 | 5 | 1 | 1 |
60(2月) | 0 | 5 | 1 | 1 |
90(3月) | 1 | 5 | 0.8 | 1 * 0.8 = 0.8 |
120(4月) | 0 | 4 | 1 | 0.8 * 1 = 0.8 |
150(5月) | 1 | 4 | 0.75 | 0.8 * 0.75 = 0.6 |
180(6月) | 1 | 3 | 0.67 | 0.6 * 0.67 = 0.4 |
210(7月) | 1 | 2 | 0.5 | 0.4 * 0.5 = 0.2 |
Kaplan-Meier生存曲线
Kaplan-Meier生存曲线可以通过生存概率对时间绘制出来,曲线会在每个事件发生的时间点上下降,表明会员用户取消会员资格的累积影响。
解释
- 初始时刻(0天),生存概率为1,表示所有会员都还活跃。
- 在第90天,第一次事件发生(用户3取消会员),生存概率下降到0.8。
- 随着时间推移,每次事件发生,生存概率继续下降。
- 最终在第210天,生存概率降到0.2,表示在210天时,仍有20%的会员保持活跃。
应用价值
通过Kaplan-Meier估计法,我们可以:
- 了解会员用户的留存情况,识别会员用户流失的时间点和比例。
- 为制定会员保留策略提供数据支持,例如在关键时间点(如90天、180天)采取措施,提高会员留存率。
- 预测未来会员用户的生存时间,优化会员服务和营销策略。
Kaplan-Meier估计法是分析会员用户生存时间的一种有效工具,能够帮助企业更好地理解用户行为,提升会员保留率。
Python代码
import pandas as pd
import numpy as np
from lifelines import KaplanMeierFitter
# 示例数据集
data = {
'user_id': [1, 2, 3, 4, 5],
'start_time': ['2022-01-01', '2022-02-01', '2022-03-01', '2022-04-01', '2022-05-01'],
'end_time': ['2022-06-01', np.nan, '2022-05-01', '2022-07-01', np.nan],
'event': [1, 0, 1, 1, 0] # 1表示事件发生(取消会员),0表示右侧截尾(在观察期结束时仍为会员)
}
df = pd.DataFrame(data)
df['end_time'] = pd.to_datetime(df['end_time']) # 转换为日期时间格式
df['start_time'] = pd.to_datetime(df['start_time']) # 转换为日期时间格式
# 创建一个KaplanMeierFitter对象
kmf = KaplanMeierFitter()
# 对数据进行拟合
kmf.fit(df['end_time'], event_observed=df['event'])
# 绘制Kaplan-Meier曲线
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
kmf.plot()
plt.title('Kaplan-Meier Estimate')
plt.xlabel('Time')
plt.ylabel('Survival Probability')
plt.show()