用户留存率计算

本文详细解释了用户留存率的概念及其在手机应用和游戏领域的具体应用。通过实例展示了如何计算用户留存率,并提供了一个MySQL存储过程作为参考。
做企业级报表的人经常会遇到留存率的概念。对于不同的项目,留存率的概念也会有所不同。针对我所在的手机应用、手机游戏方向的用户留存率统计,在此做一些简要的说明。

用户留存率这个概念在网上没有搜到其具体的定义,在此仅对我公司的计算模式进行简要整理:用户留存率是只某一基础用户群在特定的一段时间内使用某一应用(游戏)的比率。需要注意两个概念:

1、基础用户群:是指按照给定要求规范出的特定群体。例如,我们要统计2月份《二战风云》的日留存,统计的基础用户群是指2月1日全天使用了《二战风云》这一游戏的所有玩家。

2、特定的一段时间内使用:这个概念对不同的人可能有不同的两种理解。一是连续的时间内,每天都在使用该应用;二是在特定的时间段内,不定期的使用该应用。这里,我们统计采用的是后者。

现在举例说明该统计所要达到的效果:

第一天 第二天 第三天 第四天 第五天 第六天 第七天

访问量 100 110 120 130 140 150 160

留存量 100 90 80 70 60 50 40
对于以上数据进行说明:我们以第一天访问的总人数100作为基数统计日留存。可以看到,虽然每天的用户访问量是在递增的,但是用户留存量是递减的(用户留存当然是越来越少喽!)。其计算方法我想大家也就可以看出一二了吧!对,第二天的留存量是指在第一天基数的100人中,有90人第二天又使用了该应用;而第三天的留存量是指在第一天基数的100人中,有80人第三天又使用了该应用,以此类推……

可能有人会问,第三天的80人为什么不是以第二天的90人作为基数呢?我个人认为第二种方式在统计上是存在弊端的。举例说明:如果一个用户第二天没有使用该应用,但以后的每天都在使用,在这种情况下,我们可以确定的是:该用户是活跃用户;但如果用第二种方法统计的话,该用户就不会在我们统计的数据内。

现就以上所述方法的统计流程进行简单介绍:

1、抽取基础数据作为统计基数

2、抽取第二天访问数据数据,并以该数据与抽取的基础数据做交集,得到第二天留存量

3、用留存量/基础数据得出第二天的留存率

4、以上方法每天循环,提取每天的用户留存数据

一下是用户日留存的存储过程,仅供参考(mysql)



CREATE PROCEDURE `PRO_REMAIN_USER_BY_DAY`(in in_day dateTime)
begin
declare Ttime datetime;
declare Tflag int;
declare TtemFlag int;
declare TdayFlag2 varchar(20);

declare Tnum int;
declare Tnum1 int;
declare Tcount int;
set in_day=ifnull(in_day,adddate(current_date(),-1));

set Tcount=(select count(1) from remain_user_data where addTime =in_day );
if Tcount =0 then
insert into remain_user_data(addTime) values(in_day);
end if;
set Tflag=1;
set TtemFlag=0;
set Ttime=in_day;

CREATE TEMPORARY TABLE tempTable(id bigint );
while Tflag<30 do

truncate table tempTable;

#抽取基础数据
insert into tempTable
select player_id from day_logout_notify where logout_time>=Ttime and logout_time<adddate(Ttime,1);


set Tnum=(select ifnull(count(distinct id),0) from tempTable );

if Tnum>0 then
#抽取第 Tnum天留存量
set Tnum1=(select ifnull(count(distinct p.player_id),0)
from tempTable t join day_logout_notify p on t.id=p.player_id
where p.logout_time>=in_day and logout_time<adddate(in_day,1) );
if Tflag=1 then
set Tnum=1;
end if;
set TdayFlag2=concat( 'data',Tflag);

#计算留存率 并更新
set @sqlstr=concat('update remain_user_data set ',TdayFlag2,'=',Tnum1/Tnum,' where addTime=',concat('\'',DATE(Ttime),'\''));
prepare stmt from @sqlstr;
execute stmt;
end if;

#时间加1,循环
set Ttime=adddate(Ttime,-1);
set Tflag=Tflag+1;
end while;
drop table tempTable;
end;



该存储过程已经过测试,可以放心使用。
<think> 首先,用户查询是:“我想查找实现滚动计算用户留存率的方法”。意思是“I want to find out how to implement rolling calculation of user retention rate.” 系统指令要求: - 所有行内数学表达式必须使用$...$格式。 - 独立公式单独成段,使用$$...$$。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 引用的段落末尾自然地添加引用标识。 用户提供了几个引用: - 引用[1]:定义了留存率,包括一日、三日、七日等留存率。 - 引用[2]:给出了计算每月留存率的例子和思路。 - 引用[3]:讨论了性能优化对用户留存的影响。 - 引用[4]:关于前端性能优化,如懒加载和代码分割,但似乎与留存率计算无关。 用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但在这个会话中,这是第一条消息,所以我需要参考上下文。用户提到“用户上一次的问题和你的回答”,可能指的是之前的会话,但在这个系统提示中,这是第一条消息。因此,我应该基于当前用户的查询来回答。 用户的核心需求是实现滚动计算用户留存率的方法。滚动计算意味着计算一个窗口内的连续留存率,比如每天或每周的滚动留存率。 从引用[2]中,有按月计算留存率的例子:计算每个月的用户在次月的留存。用户留存率通常是基于注册日期的活跃用户比例。 滚动计算可能涉及计算一个滑动窗口的留存率,例如,计算过去7天的每日滚动留存率。 我需要构建一个清晰的回答: 1. **理解滚动留存率**:解释什么是滚动计算用户留存率。 2. **方法实现**:提供计算步骤或伪代码。 3. **参考引用**:自然地引用提供的引用。 4. **生成相关问题**:在末尾添加相关问题。 **步骤:** - 介绍滚动留存率的概念。 - 描述如何实现滚动计算,使用SQL或其他工具示例。 - 确保中文回答。 - 添加相关问题。 引用[1]定义留存率:某日注册的用户,在之后几天是否活跃。一日留存率是注册后第二天活跃的比例。 引用[2]给出了月度留存计算的例子:month, 活跃用户数, 次月留存用户数。 滚动计算可能类似于时间序列的滚动窗口计算。 **实现方法:** 假设我们有一个用户活跃记录表,包含用户ID、注册日期、活跃日期。 滚动计算留存率: - 对于每个注册日期,计算注册后第N天的留存率(如一日留存)。 - 为了滚动,计算一个窗口(如过去7天)的平均留存率或每日滚动值。 例如: - 计算每日的一日留存率,然后对这个率滚动平均。 更常见的滚动留存是计算注册队列在后续日期的滚动活跃。 标准留存率计算是基于注册队列的:对于注册日期D,留存率在D+N天是(D注册的用户中在D+N天活跃的比例)。 滚动计算可能指的是计算连续的留存率,比如每天报告过去7天的平均留存率。 在引用[2]中提到“每个月的用户在次月的留存”,这不是滚动的;它是离散的按月。 用户说“滚动计算”,所以可能意味着连续计算,如滑动窗口。 在数据分析中,滚动计算通常使用窗口函数。 **SQL示例:** 假设表结构:user_activity(user_id, registration_date, activity_date) 首先,计算每个注册日期的每日留存: - 对于注册日期r_date,计算在r_date + N天活跃的用户数。 然后,为了滚动,计算过去W天的平均留存率。 例如: 1. 计算每日的一日留存率:对于每个注册日期,计算注册用户在注册后第二天活跃的比例。 2. 然后,对这个留存率序列进行滚动平均,例如7天滚动平均。 在SQL中,可以使用窗口函数。 伪代码: - 先计算每个注册日期的留存指标。 - 然后使用ROLLING或移动平均函数。 引用中提到“留存率”,所以重点在率。 **回答结构:** 1. 解释滚动计算用户留存率:滚动计算是指在时间序列上,使用一个滑动窗口来计算留存率的平均值或累计值,以平滑波动并提供趋势分析。 2. 方法步骤: - 步骤1: 准备数据:用户注册表和活跃记录。 - 步骤2: 计算基础留存率:对于每个注册日期,计算不同N的留存率。 - 步骤3: 应用滚动计算:使用窗口函数计算滚动平均。 3. SQL示例。 4. 引用相关引用:[1]定义留存率,[2]计算思路。 5. 生成相关问题。 确保使用中文。 最后添加相关问题。 </think> ### 实现滚动计算用户留存率的方法 滚动计算用户留存率是一种时间序列分析方法,用于在滑动窗口(如过去7天、30天)内连续计算平均留存率或其他聚合指标。这种方法能平滑短期波动,揭示长期趋势,常用于监控用户行为变化和产品健康度。下面我将基于您提供的引用内容(尤其是引用[1]和[2]的定义和思路),详细介绍实现步骤、SQL 示例及注意事项。留存率的核心定义为:某日注册的用户在注册后第 N 天活跃的比例,例如一日留存率是注册用户中第二天仍活跃的比例[^1]。滚动计算则在此基础上引入时间窗口进行聚合。 #### 滚动留存率的概念 - **滚动窗口**:选择一个固定大小的窗口(例如7天),计算该窗口内所有注册日期的平均留存率。例如,7日滚动三日留存率表示“过去7天注册的用户中,平均三日留存率”。 - **为什么需要滚动计算**:它能减少单日噪声(如节假日影响),提供更稳定的指标,帮助识别真实趋势[^2]。在性能优化场景中,这种分析可评估优化措施(如引用[4]提到的懒加载)对用户留存的持续影响[^3][^4]。 #### 实现方法步骤 滚动计算留存率分为两个阶段:先计算基础留存率(以注册日期为单位),再应用滚动窗口聚合。以下步骤基于标准SQL实现(其他工具如Python/Pandas类似),假设数据表结构为: - `user_registration` 表:用户ID (`user_id`)、注册日期 (`reg_date`) - `user_activity` 表:用户ID (`user_id`)、活跃日期 (`active_date`) **步骤1: 计算基础留存率** 针对每个注册日期和留存天数(如第1、3、7天),计算留存用户数和留存率留存率公式为: $$ \text{留存率} = \frac{\text{注册用户在注册后第N天活跃的人数}}{\text{注册用户总数}} $$ 在SQL中,使用自连接和日期函数实现: ```sql -- 示例:计算每日的一日留存率(其他天数类似) WITH retention_base AS ( SELECT r.reg_date, COUNT(DISTINCT r.user_id) AS total_users, COUNT(DISTINCT CASE WHEN a.active_date = DATE_ADD(r.reg_date, INTERVAL 1 DAY) THEN a.user_id END) AS retained_users_1d FROM user_registration r LEFT JOIN user_activity a ON r.user_id = a.user_id GROUP BY r.reg_date ) SELECT reg_date, total_users, retained_users_1d, -- 计算一日留存率 ROUND(COALESCE(retained_users_1d / NULLIF(total_users, 0), 0), 4) AS retention_rate_1d FROM retention_base ORDER BY reg_date; ``` 此步骤输出每个注册日期的留存率(如 `reg_date | total_users | retention_rate_1d`)。 **步骤2: 应用滚动窗口计算** 在基础留存率表上,使用窗口函数(如 `AVG() OVER()`)计算滚动平均。例如,计算7日滚动三日留存率: ```sql -- 假设已创建基础留存率表 retention_rates (包含 reg_date, retention_rate_3d等字段) SELECT reg_date, retention_rate_3d, -- 计算过去7天的滚动平均三日留存率 AVG(retention_rate_3d) OVER (ORDER BY reg_date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS rolling_7d_retention_3d FROM retention_rates ORDER BY reg_date; ``` - **关键参数**: - 窗口大小:`ROWS BETWEEN X PRECEDING AND CURRENT ROW` 定义滑动窗口(X为窗口天数减一,例如7日窗口用`6 PRECEDING`)。 - 留存天数:根据需要替换为 `retention_rate_1d`、`retention_rate_7d` 等。 - **输出**:每日的滚动留存率值,例如 `2023-01-10 | 0.45 | 0.48` 表示在2023-01-10,三日留存率为45%,过去7天平均三日留存率为48%。 #### 注意事项 1. **数据处理**: - 确保活跃日期精确到天,避免时区问题。使用 `DATE` 类型简化计算。 - 缺失日期处理:在步骤1中,通过 `LEFT JOIN` 和 `COALESCE` 处理无活跃数据的情况(留存率设为0)。 - 性能优化:对于大数据量,索引 `reg_date` 和 `active_date` 字段,确保查询效率(引用[4]强调了性能优化的重要性[^4])。 2. **滚动窗口选择**: - 常见窗口大小:7天(短期波动)、30天(中期趋势)、90天(长期分析)。根据业务需求调整,如引用[2]的月度留存计算可扩展为滚动月平均[^2]。 - 滚动类型:平均留存率(如上例)或滚动留存用户总数(使用 `SUM()` 替代 `AVG()`)。 3. **工具扩展**: - Python/Pandas:使用 `rolling()` 函数简化滚动计算(例如 `df['retention_rate_7d'].rolling(window=7).mean()`)。 - 可视化:在BI工具(如Tableau)中结合滚动留存率图表,监控趋势(引用[3]指出性能指标直接影响用户留存[^3])。 滚动计算留存率能帮助产品团队识别留存拐点(如新功能上线后的改善),但需结合具体场景解释结果——例如,滚动值的上升可能反映优化措施的有效性[^4]。如果您提供数据样本或更多细节,我可以进一步优化实现方案。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值