SQL-计算留存率cohort
目录
1、留存率cohort介绍及其业务价值
2、计算思路
3、实操
3.1、日对日留存cohort
3.2、周对周留存cohort
3.3、月对月留存cohort
1、留存率cohort介绍及其业务价值
留存率cohort也叫做同期群留存分析,将同一时间范围内的用户分为一组,计算这批人在之后的留存情况,一般结果的样式如下(这里省略数值,):
新增留存
日期 | 新增客户数 | 次1日留存 | 次2日留存 | 次3日留存 | .... |
---|---|---|---|---|---|
20220101 | 1000 | 50% | 40% | 39% | |
20220102 | 981 | 59% | 50% | ||
20220103 | 819 | 61% |
老客留存(数据略)
日期 | 老客户数 | 次1留存 | 次2留存 | 次3留存 | .... |
---|---|---|---|---|---|
根据留存cohort图可以得到两方面的信息
1、从横向看,可以得到一批用户在长时间范围内的衰减情况
以上述示例来看:用户在新增后的前两天是快速衰减的(第一天之后有50%的用户不再来了,第三天又损失了40%),到第四天会逐步稳定下来,可见前三天是产品抓住用户的关键窗口期。
2、从纵向看,可以看出不同时间周期来的用户,他们的留存情况是否有改善
以上述示例来看:用户的次日留存在逐步改善(从50%-59%-61%)这可能是产品上做了优化调整,也可能是投放侧在用户的选择上更精准了(对应的用户新增数量也在减少)
2、计算思路
如果通过SQL得到留存cohort数据呢?
Step1:计算留存率分母数据,即每日的用户量
通常来说,新老用户的留存率差异是非常大的,所以需要进行区分。有现成的用户标签是最好的,如果没有可以用窗口函数计算用户是第几次来,第一次来的用户就是当日新增用户。
step2:计算留存率分子
这里计算的间隔时间可以是日,周,月各种时间粒度
关于SQL时间计算的相关知识点可以参考:
SQL-时间处理汇总_格勒王的博客-CSDN博客常见日期提取,日期格式转换,日期加减计算等时间处理方法汇总https://blog.csdn.net/weixin_47198715/article/details/130823960?spm=1001.2014.3001.5502
日期 | 间隔时间 | 留存客户数 |
---|---|---|
20220101 | 1 | 500 |
20220101 | 2 | 400 |
20220101 | 3 | 390 |
20220102 | ... | ... |
step3:将上面两步骤数据合并
3、实操
3.1、日对日留存cohort
with tmp as
(select date,--yyyy-mm-dd格式,如果是yyyymmdd需要转换user_id
from table_name
where is_new=1#筛选新用户
)select
a.date,
gap,
`客户数`,
`留存客户数`,
round(`留存客户数`/`客户数`,2) as `留存率`
from (--计算留存率分母SELECT DATE,COUNT(DISTINCT user_id) AS `客户数`FROM tmpGROUP BY DATE)a--计算每日新增客户数
LEFT JOIN (--计算留存率分子SELECTbegin_date,gap,count(distinct user_id) as `留存客户数`from (SELECTa.user_id,a.date as begin_date,b.date as stay_date,datediff(b.date,a.date)as gap--计算间隔天数from (select *from tmp)aleft join (select *from tmp)bon a.user_id=b.user_id)awhere gap>=1--筛选间隔天数大于等于1的记录group by begin_date,gap)b
on a.date=b.begin_date
3.2、周对周留存cohort
和日对日留存的区别在于,日对日留存只需要计算两次日期的间隔天数即可
而周对周的留存需要计算两个日期的间隔周
有两种方法可以实现周对周留存率的计算
1、先把每天的日期对应到当周的周一,再计算周一之间的日期差除以7
2、使用weekofyear函数,但是这里如果涉及到跨年,需要在处理的时候注意
weekofyear('yyyy-mm-dd')
两个日期周数相差:公式:(52-新增周)+(留存日年份-新增日年份)*留存日周数
如2022年第51周新增的用户,在2023年第1周的留存,计算两个日期的周数差:
(52-51)+(2023-2022)*1=2(也就是次2周留存)
我们以第一种方法示例
with tmp as
(select date,--yyyy-mm-dd格式,如果是yyyymmdd需要转换date_add(DATE,2-if(dayofweek(DATE)=1,8,dayofweek(DATE))) as monday,user_id
from table_name
where is_new=1#筛选新用户
)select
a.monday,
gap,
`客户数`,
`留存客户数`,
round(`留存客户数`/`客户数`,2) as `留存率`
from (--计算留存率分母SELECT monday,COUNT(DISTINCT user_id) AS `客户数`FROM tmpGROUP BY monday)a--计算每日新增客户数
LEFT JOIN (--计算留存率分子SELECTbegin_date,gap,count(distinct user_id) as `留存客户数`from (SELECTa.user_id,a.monday as begin_week,b.monday as stay_week,datediff(b.monday,a.monday)/7 as gap--计算间隔周数from (select *from tmp)aleft join (select *from tmp)bon a.user_id=b.user_id)awhere gap>=1--筛选间隔天数大于等于1的记录group by begin_date,gap)b
on a.monday=b.begin_week
3.3、月对月留存cohort
计算两个日期之间的月份差可以使用month_bvetween(date1,date2)函数,但是这里计算出来的月份差非整数,如20230301和20230430之间的月份差也是1
在计算月留存时,我们需要对其向下取整,即floor(month_bvetween(date1,date2))
with tmp as
(select date,--yyyy-mm-dd格式,如果是yyyymmdd需要转换substr(DATE,1,7) AS month,user_id
from table_name
where is_new=1#筛选新用户
)select
a.month,
gap,
`客户数`,
stay_num
from (--计算留存率分母SELECT month,COUNT(DISTINCT user_id) AS `客户数`FROM tmpGROUP BY month)a--计算每日新增客户数
LEFT JOIN (--计算留存率分子SELECTbegin_date,gap,count(distinct user_id) as `留存客户数`from (SELECTa.user_id,a.month as begin_month,floor(months_between(b.date,a.date))as gap--计算间隔天数from (select *from tmp)aleft join (select *from tmp)bon a.user_id=b.user_id)awhere gap>=1--筛选间隔天数大于等于1的记录group by begin_month,gap)b
on a.month=b.begin_month
SQL-计算留存率cohort相关推荐
- 如何用SQL做留存率分析
背景 APP分析中经常用到AARRR模型(海盗模型)用来分析APP的现状,其中一个重要节点就是提高留存(Acquisition),而留存率这个指标在这个阶段可以说是核心指标也不为过.那如何用SQL计算 ...
- mysql 留存_如何用SQL做留存率分析
背景 APP分析中经常用到AARRR模型(海盗模型)用来分析APP的现状,其中一个重要节点就是提高留存(Acquisition),而留存率这个指标在这个阶段可以说是核心指标也不为过.那如何用SQL计算 ...
- 【SQL屠夫系列】- 高频面试之SQL计算用户留存率
文章目录 指标背景 指标计算 真题 思路 开撸 拓展 在如今的程序员面试过程中,考察SQL部分能力,虽不是难点,但几乎是必考. 为检查思路盲点,避免翻船,各位看官也可以复盘下,如对你有一丝的帮助,欢迎 ...
- 如何用 SQL 做留存率分析?
无论是产品经理.产品运营还是数据分析师,在评估一个产品的用户使用情况时肯定离不开留存率.忠诚度等观测指标.这些指标可以反映用户对于产品的粘性.产品用户价值质量的高低,及时了解用户留存.流失趋势,有助于 ...
- 2021_lg_03.SQL实战:如何用sql计算用户留存问题
如何用sql计算用户留存问题 一.留存 1 .留存的含义: 留存:指基准日到APP的用户在之后的n日当天返回APP的人数: 留存率 = 基准日之后的n天当日返回的用户数 / 基准日的用户数 * 100 ...
- sql计算留存_SQL无所不能:DBA宝妈宝爸系列分享
原文链接:https://www.modb.pro/db/22315 目前程序从功能上其实已经完全满足客户(当然我这里的客户都是指媳妇儿)需求,具体可参考: 使用SQL计算宝宝每次吃奶的时间间隔 - ...
- SQL计算宝宝吃奶的时间间隔(二)
导读:之前,在"数据和云"公众号发表过一篇文章<如何使用SQL计算宝宝每次吃奶的时间间隔(分析函数的使用)>,本文为续篇,如何提升程序的易用性. 因为我工作繁忙,时常不 ...
- 如何使用SQL计算宝宝每次吃奶的时间间隔(文末含PPT)
编者的话:搞好SQL可以做很多事情,比如说可以解决海盗分金的问题,可以用SQL把大象装进冰箱,还可以用SQL解决环环相扣的刑侦推理问题,近期,有位读者朋友投稿了"使用SQL计算宝宝每次吃奶的 ...
- oracle 求一年多少天,SQL 计算一年有多少天
SQL 计算一年有多少天,计算当前年份有多少天. SQL 计算一年有多少天 问题描述 计算当前年份有多少天. SQL 计算一年有多少天 解决方案 计算当前年份有多少天,等同于计算下一年的第一天和当前年 ...
最新文章
- R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(自定义色彩、形状)实战
- QScintilla
- 【万字长文详解】Python库collections,让你击败99%的Pythoner
- Spring注解编程基石(三)
- TensorFlow CIFAR-10数据集
- SAP CRM Fiori应用Appointment startup parameters - 启动参数
- [CodeForces 1603C] Extreme Extension(贪心 + 数论分块优化dp)
- Linux 管理登陆的用户/查看/剔除
- 【算法分析与设计】最大连续子序列和问题
- hadoop-2.5安装与配置
- 转: JavaScript判断浏览器类型及版本
- 什么是最佳的视频用户体验?阿里云视频服务四大体验优化实践
- 2021腾讯算法大赛
- python 获取前几天的日期
- 产品硬件成本分析_硬件项目中的错误成本
- 打印机相关的c语言程序,VC下打印机的使用
- android 文件传输_使用“发送到”轻松将文件传输到您的Android设备
- 清华周界详解《基于图神经网络的事实验证》 | 百万人学AI
- windows xp下载python3.5.8_Python3.5中文版下载
- 武大计算机博士毕业生工资,北航、交大、武大…中国重点大学毕业生工资公布,你达标了吗?...