这样做留存分析,提升用户粘性不再难!
留存分析是一种用来分析用户参与情况以及活跃程度的分析模型。主要考察在某段时间内新使用产品(网站、APP等)的用户,经过一段时间后仍然在使用该产品,即有多少用户留存下来了。
企业可以通过留存分析衡量产品对用户价值的高低,找出增加用户粘性的解决方案。
01 留存分析案例展示
留存率曲线
留存率是留存分析的最核心指标。第N日留存率 = 第1天新增的用户中,第N天还使用产品的用户数/第1天新增的总用户数。使用产品的用户数可以按照业务需求定义,例如访问网站、打开App等。
做留存分析,首先是监控留存率曲线,评估产品对用户的粘性。留存率曲线的纵轴是留存率,横轴是时间。
以案例为例,一天过后,我们拉新获得的 100% 用户只留下 57%;第 7 天变成了15%;然后缓慢下降,到了第 30 天以后达到一个大约 5% 的效果。这个留存率有些低,需要想办法通过某些方面的改进让它逐步提升。

拆解分析问题
可以使用拆解分析法来分析问题所在。影响用户留存的重要因素包括用户属性、产品主线(业务流程)、运营活动、获客渠道等。
例如:将新增用户拆解到是哪个月新增的用户。如果某个月的留存率曲线较之前月份有所下降,那通过拆解分析就可以定位到是哪个月出现了问题。问题原因可能是某个产品功能改动或是某次运营活动。
再例如:将新增用户拆解到获客渠道,可以对比出哪个渠道是优质渠道,可以加强投入。

留存用户画像
想要提高留存曲线,可以改进拆解分析发现的问题,也可以利用用户的基础信息、用户的行为数据(新增用户的关键行为次数:登录次数、信息发送个数、关注人数、分享次数、点赞次数等)进一步对留存用户和流失用户做差异化行为分析。
例如,根据案例中的留存率曲线,我们发现1天内是产品的振荡器,3天是留存拐点,3天内是决策期,7天后是平稳期。我们可以重点关注这些日期的留存率。通过联动功能,获得对应的留存用户列表,做进一步的留存用户的用户画像分析。

02 ETL中做留存分析数据准备
数据源
数据源包含用户的基础信息(用户ID、来源渠道、年龄、性别),以及用户的注册日期和访问日期。一个用户有多次访问就记录多行。

ETL截图

详细步骤
◆ 筛选数据行:过滤注册日期 大于等于 2021-01-01;
◆ 添加"SQL输入"操作,并输入以下SQL。使用collect_list函数将每个用户的访问日期拼接为数组,并用array_sort函数对日期进行排序。
SELECT input1.`用户ID`,input1.`年龄`,input1.`性别`,input1.`来源渠道`,input1.`注册日期`,
array_sort(collect_list(input1.`访问日期`)) as `访问日期`
from input1
group by 1,2,3,4,5
——该步骤输出效果为每个用户只有一行数据。
◆ 添加计算列:
间隔天数:explode(sequence(1,30))
——使用sequence函数创建一个1到30的数组,并用explode函数将数组展开。该步骤输出效果为每个用户有30行数据。总数据量为用户人数*30,请预估数据量并在第一步对用户数做适当的过滤。
新增用户数:1
◆ 添加计算列:
留存日期:DATE_ADD([注册日期],[间隔天数])
今日:CURRENT_DATE()
◆ 筛选数据行:留存日期 小于等于 今日;
◆ 添加计算列:
留存人数:if(exists([访问日期], x -> x=[留存日期]),1,0)
——使用exists函数判断用户是否在对应的日期访问。
◆ 保存并且运行ETL就可以使用ETL的输出数据集制作案例展示的卡片啦。
ETL输出数据集

03 卡片上即席做留存分析
当不需要做留存率曲线,只需要检测重点日期的留存率时,可以直接在卡片上计算留存率。
最后需要注意,做新增用户30日留存曲线时,需要对新增用户的注册日期进行过滤,确保留存率计算中的分母(新增用户数)从注册日期开始算已经超过30日。例如今天是2022-09-15,若某个用户的注册日期为2022-09-01,统计用户30日留存曲线时需要排除该用户,因为该用户注册至今还不满30日。
图表1:留存漏斗图
◆ 展示随日期变化的留存人数和留存率。

◆ 使用数据源数据集新建卡片,并新建计算字段:
间隔天数:DATEDIFF([访问日期],[注册日期])
新增用户数:COUNT(DISTINCT([用户ID]))
1日留存人数:COUNT(DISTINCT(if([间隔天数]=1,[用户ID],null)))
3日留存人数:COUNT(DISTINCT(if([间隔天数]=3,[用户ID],null)))
7日留存人数:COUNT(DISTINCT(if([间隔天数]=7,[用户ID],null)))
30日留存人数:COUNT(DISTINCT(if([间隔天数]=1,[用户ID],null)))
◆ 选择可视化类型为漏斗图,将新增用户数、1日留存人数、3日留存人数、7日留存人数、30日留存人数拖入数值栏,即可得到左侧图形;
◆ 也可以直接新建计算字段来计算留存率:
1日留存率:[1日留存人数]/[新增用户数]
3日留存率:[3日留存人数]/[新增用户数]
...
图表2:留存分析手枪图
在月份维度计算月用户留存率。Y轴为新用户注册的月份,X轴为过去了几个月,单元格内可展示留存人数或者留存率。

◆ 例如注册月份2022-04对应的0月是2022-04当月,1月是2022-05,2月是2022-06,并以此类推。假设某个用户在2022-04-15首次注册,则在2022-04对应的0月记为1人;若该用户在2022-05-01到2022-05-31期间登录过,则在2022-04对应的1月记1人;并以此类推。
◆ 使用数据源数据集新建卡片,并新建计算字段:
注册月份:DATE_TRUNC('month',[注册日期])
1月后:ADD_MONTHS([注册月份],1)
2月后:ADD_MONTHS([注册月份],2)
3月后:ADD_MONTHS([注册月份],3)
4月后:ADD_MONTHS([注册月份],4)
5月后:ADD_MONTHS([注册月份],5)
6月后:ADD_MONTHS([注册月份],6)
◆ 新建计算字段来计算留存人数:
0月新增用户数:COUNT(DISTINCT([用户ID]))
1月留存人数:COUNT(DISTINCT(if([访问日期]>=[1个月后] AND [访问日期]<[2个月后],[用户ID],null)))
2月留存人数:COUNT(DISTINCT(if([访问日期]>=[2个月后] AND [访问日期]<[3个月后],[用户ID],null)))
3月留存人数:COUNT(DISTINCT(if([访问日期]>=[3个月后] AND [访问日期]<[4个月后],[用户ID],null))))
4月留存人数:COUNT(DISTINCT(if([访问日期]>=[4个月后] AND [访问日期]<[5个月后],[用户ID],null)))
5月留存人数:COUNT(DISTINCT(if([访问日期]>=[5个月后] AND [访问日期]<[6个月后],[用户ID],null)))
◆ 新建计算字段来计算留存率:
0月:[0月新增用户数]/[0月新增用户数]
1月:[1月留存人数]/[0月新增用户数]
2月:[2月留存人数]/[0月新增用户数]
3月:[3月留存人数]/[0月新增用户数]
4月:[4月留存人数]/[0月新增用户数]
5月:[5月留存人数]/[0月新增用户数]
◆ 选择可视化类型为表格,将注册日期(月)拖入维度栏,留存人数或者留存率的指标拖入数值栏;
◆ 设置条件格式 > 列规则:例如留存率≥25%的显示为橙色,其他显示为蓝绿色。
