Cohort Retention Analysis for User Lifecycle
Skill-Cohort-Retention-Analysis · 14-用户分析
causalexperimentforecastingoptimizationmulti_agent广告与投放MAS与智能体工程WF-B 广告优化WF-H 复购增长
收录于用户增长决策手册
实现难度⭐⭐☆☆☆
业务优先级⭐⭐⭐⭐⭐
业务视角
适用角色运营负责人 / 用户增长负责人 · CMO · 产品经理
适用平台Amazon 买家分层 · DTC 站 LTV 预测 · Klaviyo/Brevo 邮件分群
什么情况下用有大量老客户,但不知道谁是高价值客户、谁快要流失;新客获取成本越来越高,老客复购却上不去
成功是什么样的用户按 RFM/LTV 分层精准触达,高价值用户留存率提升,老客贡献收入占比从 30% 提升到 50%
业务痛点
1. 解决的问题
核心问题:新用户来了之后,第7天还剩多少?第30天呢?第90天呢?不同月份来的用户,留存曲线一样吗?Cohort分析把用户按"首次活跃时间"分组,追踪每组的留存轨迹。
2. 核心算法逻辑
核心问题:新用户来了之后,第7天还剩多少?第30天呢?第90天呢?不同月份来的用户,留存曲线一样吗?Cohort分析把用户按"首次活跃时间"分组,追踪每组的留存轨迹。
3. 业务应用场景
业务问题:Momcozy 2025年1月新注册用户10,000人,D7留存15%,D30留存5%。行业标杆D7=25%,D30=12%。差距在哪?
| Cohort | D1 | D7 | D30 | 诊断 | |--------|-----|-----|-----|------| | 2024-10 | 35% | 22% | 10% | 基准 | | 2024-11 | 33% | 20% | 9% | 下降 | | 2024-12 | 30% | 18% | 8% | 继续下降 | | 2025-01 | 28% | 15% | 5% | 恶化明显 |
根因分析: - 渠道构成变化:1月新客中TikTok占比从20%提升到50%,TikTok用户质量较低 - Onboarding流程:1月更新了注册流程,但新用户引导缺失 - 首单体验:1月物流延迟增加,影响复购意愿
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
- ROI:D1留存提升5% → LTV提升20%,年增收百万级
- 难度:⭐⭐☆☆☆(2/5)— 主要是数据透视和可视化
- 优先级:⭐⭐⭐⭐⭐(5/5)— 衡量产品健康度的核心指标
7. 代码模板
代码块数量:1 · 路径:未检测到
"""
Cohort Retention Analysis — Cohort留存分析
支持:留存矩阵计算、留存曲线、幂律拟合、BG/NBD简化版
"""
import numpy as np
import pandas as pd
from datetime import datetime, timedelta
class CohortAnalyzer:
"""Cohort分析器"""
def __init__(self):
pass
def create_cohort_table(self, df, user_col, date_col, period='M'):
"""
创建Cohort留存表
Args:
df: DataFrame with user_id and activity_date
user_col: 用户ID列
date_col: 活跃日期列
period: 'D'=日, 'W'=周, 'M'=月
"""
df = df.copy()
df[date_col] = pd.to_datetime(df[date_col])
# 获取每个用户的首次活跃日期
user_first = df.groupby(user_col)[date_col].min().reset_index()
user_first.columns = [user_col, 'first_date']
# 合并
df = df.merge(user_first, on=user_col)
# 计算period
if period == 'M':
df['first_period'] = df['first_date'].dt.to_period('M')
df['activity_period'] = df[date_col].dt.to_period('M')
elif period == 'W':
df['first_period'] = df['first_date'].dt.to_period('W')
df['activity_period'] = df[date_col].dt.to_period('W')
else:
df['first_period'] = df['first_date'].dt.date
df['activity_period'] = df[date_col].dt.date
# 计算period_diff
df['period_diff'] = (df['activity_period'] - df['first_period']).apply(
lambda x: x.n if hasattr(x, 'n') else (x.days if hasattr(x, 'days') else 0)
)
# Cohort大小
cohort_sizes = user_first.groupby(
user_first['first_date'].dt.to_period('M') if period == 'M' else user_first['first_date'].dt.date
)[user_col].nunique()
# 留存矩阵
cohort_data = df.groupby(['first_period', 'period_diff'])[user_col].nunique().reset_index()
cohort_table = cohort_data.pivot(index='first_period', columns='period_diff', values=user_col)
8. 论文来源
未自动抽取;请查看原始 Skill 卡片。