数据运营36计:生存分析与用户行为如何联系起来


     作者:糖甜甜甜

     来源:DataGo数据狗

1. 生存分析

生存分析主要用于医学研究,比如医疗方案对病人寿命的影响。后面用来探究所感兴趣的事件的发生的时间的统计方法。比如产品的寿命分析、工程中的失败时间分析等等。这里病人死亡、产品淘汰和工程失败等称为事件event。生存分析中有两个重要的概念,一是生存函数,二是风险函数。

生存函数的形式如下,表示为事件未发生的样本比例随时间变化的趋势,比如存活病人样本比例、可正常使用产品比例随时间的变化趋势等。

风险函数的形式如下,表示为事件发生概率的变化率。

两个函数之间的关系如下。

2. 用户行为

用户行为分析,特别是Customer Lifetime Value,对用户运营和用户增长工作尤为重要。了解用户在特定时间的行为程度更能帮助运营人员开展运营活动,提高用户价值。而常用的AB testing方法无法进行跨产品平台的定量分析,回归模型无法动态测量用户随时间变化的行为程度概率。因此借助生存分析可以进行用户留存、用户点击、用户购买等行为随时间变化的趋势。

比如以用户购买行为为例,一般的运营数据,直接进行用户分层查看其转化率,但是这样的数据无法知道用户的动态行为,比如在哪个时间点用户转化率会发生突变,产品的转化率会稳定在多少。生存分析以一个用户的单位,以用户注册时间为实验开始,数据采集截止时间(右删失)或用户转化时间为实验终止,用户最后是否发生购买行为为事件。

(1)数据集说明:

  • user_id:用户id

  • signup_time:注册时间

  • end_time:事件截止时间(购买时间,当购买时间为空时,以数据采集截止时间填充)

  • sex:性别

  • age:年龄

  • event:事件标志(用户有购买行为该值为1,否则为0)

  • duration:时间段(截止时间减去注册时间)

(2)转化率随时间变化趋势:

通过Kaplan-Meier无参估计方法绘制出生存估计量曲线发现,在50天前后转化率基本稳定在40%。即在注册后的50天内,这一批实验用户中大概有40%的用户有购买行为。再次减小时间间隔发现用户转化率在第10天基本无变化,因此运营需要在这个时间点开展运营或营销活动,促进用户转化。

图1 未转化率随时间的变化趋势

(3)转化率随时间变化的变化速率:

这里的生存分析是将转化率作为事件的发生标记,那么生存函数就描述了未转化率随时间的变化情况,所以转化率的变化率应该是风险率函数hazard rate function,即h(t)。这里用Nelson-Aalen无参估计方法绘制累积风险估计量曲线。可以发现转化率在前5天缓慢增大,但其后迅速减小。因此运营需要在用户注册后5天内采取措施提高用户满意度,促进转化,否则用户后期的购买意愿会减小。

图2 累积风险率随时间的变化趋势

(4)生存回归分析:

当需要了解一些例如性别、年龄等协变量是否影响生存时间时,可以用COX-PH回归分析变量的显著性,并且还可以根据回归模型预测用户是否会发生转化。通过建模结果发现年龄和性别均显著影响生存时间。结果中的coef就是公式中的回归系数,因此exp(coef)则是Cox模型中最主要的概念风险比(HR-hazard ratio):

  • HR = 1: No effect

  • HR < 1: Reduction in the hazard

  • HR > 1: Increase in Hazard

z值代表Wald统计量,其值等于回归系数coef除以其标准误se(coef),即z = coef/se(coef);有统计量必有其对应的假设检验的显著性P值,其说明coef是否与0有统计学意义上的显著差别。以性别变量举例,coef值小于0说明HR值小于1,而这里的Cox模型是group 1相对于group 0而言的,那么按照测试数据集来说:male=1,female=0,即男性的转化风险相比女性要低。exp(coef)等于0.9916,即风险比例等于0.9916,说明女性(female=0)增加了0.9916倍转化风险,将回归数据按性别分类指标进行分层发现,性别为女性的用户会更早做出购买行为。

n=10000, number of events=7683


              coef  exp(coef)  se(coef)       z      p  lower 0.95  upper 0.95     
birth_year -0.0084     0.9916    0.0010 -8.7945 0.0000     -0.0103     -0.0066  ***
sex        -0.1676     0.8457    0.0241 -6.9492 0.0000     -0.2149     -0.1203  ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 
Concordance = 0.528
Likelihood ratio test = 124.891 on 2 df, p=0.00000

图3 生存函数在性别上的差异

3. 学习资料

书籍推荐:John博士的 《survival analysis techniques for censored and truncated data》2E。该书可配合下面的视频一起使用,该书把入门的基本原理讲解得很透彻,并且有很多简单的例子帮助理解模型和推导。推荐只是使用生存分析做用户分析,看完前8章内容即可。

视频资料:饺子博士(B站)

第一章 生存函数、风险函数 

https://www.bilibili.com/video/BV1WE411P78Z

第二章 删失数据 

https://www.bilibili.com/video/BV1WE411N7dd

其余章节待更新。。。

第五章 Cox回归

https://www.bilibili.com/video/BV1N741117G3

个人笔记:糖甜甜甜(知乎)

https://app.yinxiang.com/fx/34f33a79-999a-4dc6-b104-490bc9671838

4. 附件

Kaplan-Meier估计生存估计量原理:

Nelson Aalen估计累积风险率估计量原理:

COX-PH回归:

Cox模型的基本假设为:

    在任意一个时间点,两组人群发生时间的风险比例是恒定的;或者说其危险曲线应该是成比例而且是不能交叉的;也就是如果一个体在某个时间点的死亡风险是另外一个体的两倍,那么在其他任意时间点的死亡风险也同样是2倍。

Cox模型与Kaplan-Meier法比较:

  • Kaplan-Meier法是非参数法,而Cox模型是半参数法,一般来说在符合一定条件下,后者的检验效应要大于前者。

  • Kaplan-Meier法一般处理单因素对研究生存结局的影响,而Cox模型可以同时处理多个因素对生存结局的影响。

Cox model的形式:h0(t)和βk都是待估参数,Zk为协变量。

代码参考来源:

https://github.com/threecifanggen/lambda-and-tau/blob/master/%E7%94%9F%E5%AD%98%E5%88%86%E6%9E%90-%E4%B8%80%E4%B8%AA%E5%AE%9E%E4%BE%8B/survival_function_for_user_conversion.ipynb

◆ ◆ ◆  ◆ ◆

长按二维码关注我们


数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。

管理员二维码:

猜你喜欢

 笑死人不偿命的知乎沙雕问题排行榜

 用Python扒出B站那些“惊为天人”的阿婆主!

 全球股市跳水大战,谁最坑爹!

 上万条数据撕开微博热搜的真相!

 你相信逛B站也能学编程

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我理解你的问题了。首先,为了爬取懂车帝的某车型的用户问题数据,我们可以使用 Python 的 requests 和 BeautifulSoup 库来实现。 以下是一个简单的 Python 程序,可以爬取懂车帝网站中某一款车型的用户问题数据: ```python import requests from bs4 import BeautifulSoup # 设置请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} # 定义要爬取的车型的网址 url = 'https://www.dongchedi.com/qa/ask_list?brand_id=1&model_id=20' # 发送请求 res = requests.get(url, headers=headers) # 解析网页 soup = BeautifulSoup(res.text, 'html.parser') # 提取用户问题数据 questions = [] for question in soup.select('.qa-ask-list .qa-ask-item .qa-ask-title'): questions.append(question.text.strip()) # 打印结果 print(questions) ``` 该程序首先设置了请求头,然后定义了要爬取的车型的网址。接着,发送请求,然后使用 BeautifulSoup 解析网页,并提取用户问题数据。最后打印结果。 需要注意的是,懂车帝网站可能有反爬虫机制,因此在爬取数据时需要注意不要频繁发送请求。 接下来,为了分析用户问题数据,我们可以使用 Python 的 pandas 和 jieba 库来实现。 以下是一个简单的 Python 程序,可以对用户问题数据进行分词、统词频并生成词云图: ```python import pandas as pd import jieba import jieba.analyse import matplotlib.pyplot as plt from wordcloud import WordCloud # 加载停用词表 stopwords = pd.read_csv('stopwords.txt', index_col=False, quoting=3, sep='\t', names=['stopword'], encoding='utf-8') stopwords = stopwords['stopword'].values # 加载用户问题数据 df = pd.DataFrame({'question': questions}) # 对用户问题数据进行分词 def cut_words(text): words = jieba.cut(text) words = [word for word in words if word not in stopwords] return words df['cut_words'] = df['question'].apply(cut_words) # 统词频 all_words = [] for words in df['cut_words']: all_words.extend(words) word_count = pd.Series(all_words).value_counts() # 生成词云图 wc = WordCloud(font_path='msyh.ttc', background_color='white', max_words=2000, width=800, height=600) wc.generate_from_frequencies(word_count) plt.imshow(wc) plt.axis('off') plt.show() ``` 该程序首先加载了停用词表,然后加载了用户问题数据,并对用户问题数据进行了分词。接着,统了词频,并生成了词云图。 需要注意的是,由于中文分词的特殊性,需要使用 jieba 库进行分词,并且需要加载停用词表来过滤掉常用词汇。同时,生成词云图时需要指定字体文件,否则会出现乱码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值