python生命线中的生存函数是否过于乐观?

2024-06-11 12:24:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我不熟悉生存分析,并用Python的生命线快速编写了一个基线生存函数。但与我自己根据数据绘制的保留曲线相比,我得到的图表过于乐观

下面是我根据数据绘制的图表。它显示了来自不同群体的客户停留的时间。很明显,来自比利时(红线)的人比来自荷兰的人停留的时间更长。20周后,56%的比利时客户仍然在那里,而荷兰人只有43%

Retention curve 保留曲线

但是,当我使用Python的生命线CoxPHFitter绘制生存函数时,我得到了以下图表:

enter image description here

研究表明,比利时人和荷兰人在20周后“活着”的概率分别超过70%和50%

为什么这些数字不同?我是否曲解了其中一条曲线

这是我的代码:

cph = CoxPHFitter()  
cph.fit(dumies, 'weeks_subscribed', event_col='stopped')  
cph.plot_partial_effects_on_outcome('addresses__address__country__name_Nederland',values=[0,1])

其中,如果客户不再订阅,则“stopped”设置为1。“订阅周数”的平均长度为18周

编辑:

我手动计算保留图的方法如下:

def add_time_subscribed(rd):
    rd['weeks_subscribed'] = 0
    for index, row in rd.iterrows():
        if (not row['stopped']) and (not row['_paused']):
            end_date = datetime.now(tz=pytz.UTC)
        else:
            end_date = row['paused_at']
                
        rd.loc[index,'weeks_subscribed'] = (end_date - row['subscribed_at']).days/7
        

def stayers_per_week(rd):
    y_axis = np.zeros(int(rd['weeks_subscribed'].max())+1)
    for index, row in rd.iterrows():
        for i in range(int(row['weeks_subscribed'])+1):
            y_axis[i] += 1
    x_axis = [i for i in range(len(y_axis))]
    return x_axis, y_axis/y_axis[0]

Tags: inforindex客户图表绘制rd曲线
1条回答
网友
1楼 · 发布于 2024-06-11 12:24:39

这两张图不相似的原因有很多

我建议您绘制Kaplan meir拟合生存函数:

from lifelines import KaplanMeierFitter
kmf = KaplanMeierFitter()
kmf.fit(dummies['weeks_suscribed'], event_observed=dummies['stopped']) 
kmf.plot_survival_function()

然后,您还可以绘制“地址、地址、国家、名称、荷兰”的图,取值为0和1:

kmf = KaplanMeierFitter()
for value in [0,1]:      
    kmf.fit(dummies[dummies['addresses__address__country__name_Nederland']==value]['weeks_suscribed'], event_observed=dummies[dummies['addresses__address__country__name_Nederland']==value]['stopped']) 
    kmf.plot_survival_function()

这可能会让你对缺乏连贯性有更好的了解

相关问题 更多 >