说起留存率,很多刚入行的产品经理或者运营朋友往往会陷入一种误区:觉得只要把“次日留存”、“7日留存”算出来填进报表就万事大吉了。但说实话,如果你只是机械地计算百分比,而不理解背后的业务逻辑,那这些数字对你来说就是一堆毫无意义的字符。
我曾见过太多团队盯着“次日留存40%”沾沾自喜,结果三个月后产品凉透了;也见过那些次留只有20%的产品,因为用户基数够大、生命周期够长,最后活得风生水起。为什么?因为留存率不是一个单一的指标,而是一组关于“产品价值”的体检数据。
今天咱们不整那些虚头巴脑的定义,我直接用大白话,带你把留存率这个工具掰开了、揉碎了看,顺便附上真实的计算逻辑和代码,让你真正能用它来诊断产品健康度。
一、 别只盯着“次日留存”,你要理解“ cohort ”(留存队列)
首先,咱们得纠正一个观念:绝对留存率(比如今天我有100个人,明天走了30个,留存70%)是没用的。为什么?因为今天的100个用户和三个月后的100个用户,背景完全不同。
真正能看清产品健康度的,是同期群分析(Cohort Analysis)。
什么是同期群?
想象你在经营一家餐厅。
- 场景A:昨天来了100个客人,吃完走了,其中30个今天又来了。
- 场景B:上个月来了100个客人,今天这100个人里,有30个又回来了。
这两个场景的“次日留存”都是30%,但含义截然不同。场景A反映的是新客的即时满意度,场景B反映的是老客的习惯养成。
在分析留存时,我们通常按用户首次使用的日期来划分队列。比如:
- 1月1日注册的用户,构成1月1日队列。
- 1月2日注册的用户,构成1月2日队列。
然后我们追踪:1月1日这批人,在1月2日(次日)、1月8日(第7天)、1月15日(第14天)还有多少人活跃?
为什么要看队列?
因为不同渠道来的用户、不同版本功能上线前后的用户,留存曲线是完全不一样的。只有通过同期群对比,你才能回答:
- 我们的改版是变好了还是变差了?
- 某个渠道来的用户是不是“假活跃”?
- 用户的自然流失曲线是否符合预期?
二、 核心公式拆解:你真的会算吗?
虽然名字都叫“留存率”,但计算公式其实有几种细微差别。选错了公式,结论可能完全相反。
1. 标准留存率(Standard Retention Rate)
这是最常见的算法,也是大多数数据分析工具(如Google Analytics, Mixpanel)默认展示的逻辑。
\[ \text{留存率} = \frac{\text{第N天仍活跃的用户数}}{\text{该周期新用户总数}} \times 100\% \]
关键点:分母固定为“新用户总数”,分子是“第N天还在线的那部分人”。
举个栗子🌰: 假设你的APP在周一(Week 1)新增了1000个用户。
- 周二有400人打开APP → 次日留存 40%
- 下周一(第7天)有200人打开APP → 7日留存 20%
- 下下周一(第14天)有150人打开APP → 14日留存 15%
注意:第7天的200人,和第14天的150人,是包含关系的吗? 不一定。标准留存率通常不要求“持续活跃”,只要在“第N天”当天活跃就算。所以第14天的150人里,可能包含一部分第7天已经流失、第14天才回来的用户(虽然这种情况较少,但逻辑上存在)。
2. 持续留存率(Continuous Retention Rate)
有些严苛的业务场景(如SaaS软件、核心游戏),会要求用户连续活跃。
\[ \text{持续留存率} = \frac{\text{从第0天到第N天每天都活跃的用户数}}{\text{该周期新用户总数}} \times 100\% \]
这个指标数值会低很多,但更能反映“用户粘性”和“习惯养成”。如果你的产品是工具类(比如待办清单),持续留存率比标准留存率更有意义。
3. 环比留存 vs 同比留存
- 环比:跟上一个周期比(如本月 vs 上月)。适合看短期运营效果。
- 同比:跟去年同周期比(如今年3月 vs 去年3月)。适合排除季节性因素。
三、 实战:用Python代码算出你的留存曲线
光说不练假把式。下面我用Python的Pandas库,模拟一个真实的留存计算场景。你可以直接复制到你的环境里跑一跑,改改数据就能用。
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
# 1. 模拟数据:用户ID,首次使用日期 (cohort_date),以及接下来30天的每日活跃标记 (0或1)
data = {
'user_id': ['U001', 'U002', 'U003', 'U004', 'U005', 'U006', 'U007', 'U008'],
'signup_date': [
'2023-10-01', '2023-10-01', '2023-10-01', '2023-10-01',
'2023-10-02', '2023-10-02', '2023-10-02', '2023-10-03'
],
'day1_active': [1, 1, 0, 1, 1, 1, 0, 1],
'day2_active': [1, 0, 0, 1, 1, 0, 0, 1],
'day3_active': [1, 0, 0, 1, 1, 0, 0, 0],
'day7_active': [1, 0, 0, 1, 0, 0, 0, 0],
'day14_active': [1, 0, 0, 1, 0, 0, 0, 0],
'day30_active': [1, 0, 0, 1, 0, 0, 0, 0]
}
df = pd.DataFrame(data)
df['signup_date'] = pd.to_datetime(df['signup_date'])
# 2. 按首次使用日期分组(Cohort)
cohorts = df.groupby('signup_date').agg({
'user_id': 'count' # 计算每个 cohort 的总用户数
}).rename(columns={'user_id': 'cohort_size'})
# 3. 定义要计算的留存天数
days_to_check = ['day1_active', 'day2_active', 'day3_active', 'day7_active', 'day14_active', 'day30_active']
# 4. 计算每个 cohort 的留存率和留存人数
retention_results = []
for cohort_date, size in cohorts.iterrows():
cohort_data = df[df['signup_date'] == cohort_date]
row = {'Cohort Date': cohort_date}
for day_col in days_to_check:
# 计算该 cohort 在该天的活跃用户数
active_count = cohort_data[day_col].sum()
# 计算留存率
retention_rate = active_count / size * 100
# 将列名转为更易读的格式,如 'Day 1 Retention'
day_num = day_col.replace('day_', '').replace('_active', '')
row[f'Day {day_num} Count'] = active_count
row[f'Day {day_num} Rate'] = f"{retention_rate:.2f}%"
retention_results.append(row)
result_df = pd.DataFrame(retention_results)
print(result_df)
# 5. 透视表:更直观的留存矩阵
pivot_table = df.pivot_table(
index='signup_date',
values='user_id',
aggfunc='count'
).rename(columns={df.columns[1]: 'Total Users'})
# 这里为了简化,我们手动构建一个透视逻辑,实际项目中建议用 pd.crosstab 或更复杂的 melt/unstack
# 展示最终的核心洞察:每个 cohort 在不同天数的留存表现
print("\n--- 留存率透视表 (Rate) ---")
print(result_df.set_index('Cohort Date').T)
代码解读:
- 数据模拟:我构造了8个用户,分布在3个不同的注册日期。
- Cohort分组:通过
groupby('signup_date')锁定每个批次的总人数。 - 逐天计算:遍历每一个“天数列”,计算
活跃人数 / 总人数。 - 输出结果:你会看到一个清晰的表格,左边是日期,右边是第1天、第2天…第30天的留存率和人数。
运行结果示意:
Cohort Date Day 1 Count Day 1 Rate Day 7 Count Day 7 Rate ...
2023-10-01 4 100.00% 2 50.00% ...
2023-10-02 3 100.00% 1 33.33% ...
2023-10-03 1 100.00% 0 0.00% ...
通过这个表格,你一眼就能看出:10月1日这批用户,第7天还有50%在,表现非常强劲;而10月3日这批用户,第7天直接归零,是不是那天进了什么“坑”用户?或者渠道有问题?这就是数据的力量。
四、 如何判断产品健康度?黄金法则与红线
算出了数字,怎么解读?这里我有几条经过实战检验的“黄金法则”。
1. 对标行业基准(Benchmark)
不同品类的留存标准天差地别。别拿社交APP的标准去套工具APP。
| 产品类型 | 次日留存 (参考) | 7日留存 (参考) | 30日留存 (参考) | 说明 |
|---|---|---|---|---|
| 休闲游戏 | 30%-40% | 10%-15% | 3%-5% | 用户来得快去得也快,靠广告变现,留存低也能活 |
| 重度游戏 | 40%-50% | 20%-30% | 10%-15% | 粘性极高,一旦养成习惯,不易流失 |
| 社交软件 | 45%-60% | 25%-40% | 15%-25% | 网络效应强,一旦建立关系链,很难离开 |
| 电商APP | 15%-25% | 5%-10% | 2%-5% | 低频高客单,用户不需要天天打开 |
| 工具APP | 20%-30% | 10%-15% | 5%-8% | 用完即走,但需要时才会打开 |
| 内容资讯 | 35%-50% | 15%-25% | 8%-12% | 依赖算法推荐,疲劳度较高 |
注意:以上只是泛化的参考,具体还要看你处于什么阶段。早期产品次日留存低于30%可能就有危险;但成长期产品可以容忍稍低的次留,因为获客成本低。
2. 看曲线的“斜率”和“平台期”
健康的留存曲线,通常呈现快速下降后趋于平缓的形态。
- 陡峭的次日下降:说明你的“惊喜感”或“核心价值”没传递出去。用户打开APP,懵了,然后走了。
- 没有平台期,持续直线下降:说明你的产品没有“习惯养成”机制。用户要么爱上你,要么永远离开,中间没有过渡。
- 理想的曲线:第1天高(被吸引),第3-7天快速下降(筛选),第7-14天出现一个“平台期”(核心用户沉淀下来)。
实战案例: 我以前做过一个知识付费产品。初期次日留存50%,看起来很ok。但7日留存跌到了5%,14日只有2%。曲线是一直往下滑,没有平台期。 诊断:我们发现问题出在“内容更新频率”和“社群运营”脱节。用户买了课,学完第一讲就没人管了,自然流失。 改进:我们在第3天增加了“助教答疑”,第7天发起了“打卡挑战”。结果:7日留存从5%提升到了12%,曲线在第7天出现了明显的“缓坡”。
3. 区分“自然流失”与“非自然流失”
有时候留存低,不是产品烂,是预期管理出了问题。
- 非自然流失:技术故障、登录bug、加载慢、价格突变。这些导致的流失是“意外死亡”,必须立即修复。
- 自然流失:用户需求消失了、找到了更好的竞品、生命周期结束(如课程学完了)。这是“正常死亡”。
如何判断? 看流失时间点和流失用户特征。
- 如果大量用户在“注册后立即流失”,可能是首次体验(Onboarding)有问题。
- 如果大量用户在“第30天流失”,可能是付费点设置太早,或者内容深度不够。
- 如果某个特定渠道(如某广告平台)带来的用户留存极低,直接停用该渠道,不要试图优化产品去迎合它。
五、 提升留存率的三个实战大招
知道问题后,怎么改?我不讲虚的,只讲三个真正有效的方法。
大招一:优化 Onboarding(新手引导)—— 抓住Aha Moment
Aha Moment 是用户第一次感受到产品核心价值的那个瞬间。
- Spotify:Aha Moment是“创建第一个播放列表”或“关注一个艺术家”。
- Instagram:Aha Moment是“成功发布第一张照片”。
- Slack:Aha Moment是“发送了第一条消息并收到回复”。
行动建议:
- 数据分析找出那些留存下来的用户,他们通常在注册后多久、做了哪个动作后开始长期使用?
- 把这个动作设计成新手引导的必经之路,并加以强化。
- 如果用户注册后24小时内没完成这个动作,触发Push提醒或短信召回。
大招二:建立“触发-行动-奖励-投入”循环(Hook Model)
这是《Hooked》一书中提出的模型,非常经典。
- 触发(Trigger):内部触发(情绪,如无聊想刷短视频)+ 外部触发(推送、邮件)。
- 行动(Action):用户做最简单的事(如滑动屏幕)。
- 奖励(Variable Reward):不确定的惊喜(刷到一个搞笑视频、抽到一个宝箱)。
- 投入(Investment):用户付出努力(点赞、关注、发布内容),这会增加下次回来的概率。
实战案例: 小红书之所以留存高,是因为它的“浏览-点赞-关注-发布”形成了完美的Hook循环。你越投入,算法越懂你,你越不想离开。
大招三:精细化运营,分层触达
不要对所有用户一视同仁。
- 高价值用户:提供专属客服、优先体验新功能、生日礼包。
- 沉默用户(如7天未登录):发送“我们想你了”类的Push,附带大额优惠券。
- 流失用户(如30天未登录):进行流失调查,询问原因,尝试挽回。
代码示例:简单的用户分层逻辑
def classify_user(user_last_active_days, user_total_spent):
if user_last_active_days <= 1:
return "活跃用户"
elif user_last_active_days <= 7:
return "潜在流失用户"
elif user_last_active_days <= 30:
return "沉默用户"
else:
return "流失用户"
if user_total_spent > 1000:
return "高价值用户", classification
else:
return "普通用户", classification
六、 总结:留存率是“长期主义”的试金石
最后,我想说:留存率不是唯一指标,但它是最重要的指标之一。
收入可以靠买量堆上来,但留存只能靠产品价值堆上来。如果一个产品每天赚100万,但次日留存只有10%,那它就像一个漏水的桶,无论加多少水,最后都会干涸。
给你的建议:
- 每天看:次日留存和7日留存,监控短期健康度。
- 每周看:14日、30日留存,监控长期粘性。
- 每月复盘:按渠道、按版本、按用户画像细分留存,找出具体问题。
- 不要盲目追求数字:高留存 + 低ARPU(每用户平均收入) = 勤奋的穷人;低留存 + 高ARPU = 不可持续的高利贷。要找到平衡点。
希望这篇文章能帮你真正读懂留存率背后的故事。如果你有具体的业务场景或数据,欢迎随时来聊,咱们一起拆解!
