paper2skills Playbook

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 卡片。