微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python生命线中的生存功能太乐观了?

如何解决python生命线中的生存功能太乐观了?

我是生存分析的新手,并使用 Python 的 Lifeline 快速编写了基线生存函数。但与我根据数据绘制的保留曲线相比,我得到的图表过于乐观。

下面是我根据我的数据制作的图表。它显示了来自不同群组的客户停留了多少周。很明显,来自比利时(红线)的人比来自荷兰的人停留的时间更长。 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])

如果客户不再订阅,则“停止”设置为 1。 'weeks_subscribed' 的平均长度为 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]

解决方法

两个图表不相似的可能原因有很多。

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

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

然后您还可以绘制取值为 0 和 1 的“addresses__address__country__name_Nederland”:

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()

这可能会让您更好地了解缺乏连贯性

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。