埋点数据分析:路径漏斗与留存看板

FreeGuideOnline 15阅读 2026-07-02

python

df = df.drop_duplicates(subset=['user_id','event_name','timestamp_ms']) df = df[~df['user_id'].str.startswith('test_')] df['timestamp'] = pd.to_datetime(df['timestamp_ms'], unit='ms') df = df.sort_values(['user_id','timestamp'])

二、路径漏斗分析实战

2.1 漏斗的定义与步骤设计

路径漏斗是一系列有序的事件步骤,用户必须按顺序完成前一步才能计入下一步。例如电商转化漏斗:

浏览商品页 → 加入购物车 → 发起结算 → 支付成功

每一步都对应一个特定的埋点事件。设计漏斗时需注意:

  • 步骤之间一般有先后顺序约束,但可设定时间窗口(如用户需在30分钟内完成全流程)。
  • 避免步骤颗粒度过细导致漏斗断裂,也避免过粗失去洞察。

2.2 计算漏斗转化率

假设已获得每个用户的完整行为序列,计算整体及分步转化率:

整体转化率 = 完成最后一步的用户数 / 完成第一步的用户数
分步转化率 = 完成当前步骤的用户数 / 完成上一步的用户数

示例数据(用户数为独立用户计数):

步骤 完成用户数 分步转化率 整体转化率
浏览商品页 10,000 - 100%
加入购物车 3,500 35.0% 35.0%
发起结算 1,400 40.0% 14.0%
支付成功 980 70.0% 9.8%

直观发现:“浏览→加购”流失最大,仅35%用户点击了加购,是首要优化环节。

2.3 时间窗口与多路径分析

真实场景中用户可能跳出后返回,因此需要引入时间窗口。例如:设定用户开始第一步后24小时内完成后续步骤都算有效转化。超过窗口则视为流失。

实现方法:找到每个用户第一次触发第一步事件的时间T0,然后扫描在T0T0 + 窗口期内是否按顺序触发后续事件。

若产品存在多条转化路径(如社交媒体可通过搜索或推荐进入),建议分别建立漏斗,对比不同渠道质量。

2.4 使用 SQL 快速构建漏斗

以标准事件表events (user_id, event, timestamp)为例,计算当日“浏览→加购”的24小时窗口漏斗:

WITH step1 AS (
    SELECT user_id, MIN(timestamp) as t1
    FROM events
    WHERE event = 'page_view_product'
      AND DATE(timestamp) = '2025-01-01'
    GROUP BY user_id
),
step2 AS (
    SELECT DISTINCT s1.user_id
    FROM step1 s1
    JOIN events e2 ON s1.user_id = e2.user_id
    WHERE e2.event = 'add_to_cart'
      AND e2.timestamp BETWEEN s1.t1 AND s1.t1 + INTERVAL '24' HOUR
)
SELECT
    COUNT(DISTINCT s1.user_id) AS step1_users,
    COUNT(DISTINCT s2.user_id) AS step2_users
FROM step1 s1
LEFT JOIN step2 s2 ON s1.user_id = s2.user_id;

三、留存看板构建与解读

3.1 留存的三种定义

  • 新用户留存:以首次使用产品(新增)为起点,观察第N日后仍有活跃的用户比例。
  • 活跃用户留存:以某日活跃为起点,看后续持续活跃情况。常用于衡量功能粘性。
  • 自定义事件留存:例如完成“首次发布内容”后,有多少用户在7天内再次发布内容。

本教程以新用户留存为主,其经典指标为次日留存、7日留存、30日留存

3.2 留存表的准备

需要两张基础表:用户新增表new_users (user_id, first_active_date) 和用户每日活跃表active_days (user_id, active_date)。活跃可根据核心事件(打开App、浏览页面)定义。

计算逻辑:对于新增日期为D0的用户,检查在D0+N是否出现在活跃表中。公式:

N日留存率 = (在D0新增且在D0+N活跃的用户数) / D0新增总用户数

3.3 用 SQL 计算次日留存矩阵

以下SQL产出每个新增日期的次日、3日、7日留存率:

SELECT
    n.first_active_date,
    COUNT(DISTINCT n.user_id) AS new_users,
    COUNT(DISTINCT a2.user_id) * 100.0 / COUNT(DISTINCT n.user_id) AS retention_day2,
    COUNT(DISTINCT a3.user_id) * 100.0 / COUNT(DISTINCT n.user_id) AS retention_day3,
    COUNT(DISTINCT a7.user_id) * 100.0 / COUNT(DISTINCT n.user_id) AS retention_day7
FROM new_users n
LEFT JOIN active_days a2 ON n.user_id = a2.user_id
    AND a2.active_date = DATE_ADD(n.first_active_date, INTERVAL 2 DAY)
LEFT JOIN active_days a3 ON n.user_id = a3.user_id
    AND a3.active_date = DATE_ADD(n.first_active_date, INTERVAL 3 DAY)
LEFT JOIN active_days a7 ON n.user_id = a7.user_id
    AND a7.active_date = DATE_ADD(n.first_active_date, INTERVAL 7 DAY)
GROUP BY n.first_active_date
ORDER BY n.first_active_date;

对应可绘制留存曲线,观察长期衰减趋势。

3.4 留存看板可视化与监控

推荐用折线图呈现不同批次新增用户的留存率变化(同期群分析)。横轴为距首次活跃天数(Day0 ~ Day30),纵轴为留存率,每条线代表一个新增日期群组。

异常监控:

  • 若某日新增的次日留存突然下跌,排查当日渠道质量、是否有严重bug、新手引导是否改动。
  • 群组曲线后期翘尾可能意味着产品功能被重新发现或推送活动影响,需要区分自然留存与运营刺激。

四、从分析到行动:驱动优化

4.1 漏斗与留存联合诊断

将漏斗关键步骤的完成用户单独划分群组,比较其留存。例如对比“完成注册”和“未完成注册”的7日留存率,可量化注册墙对长期留存的影响,从而决定是否简化注册流程。

4.2 常见优化思路

  • 高流失步骤强化引导:如加购率低,可在商品页增加动态购物车按钮、显示限时优惠。
  • 缩短转化时间窗口:通过智能推荐让用户更快进入核心体验。
  • 新手期关键行为激励:促使新用户完成首次核心事件,能显著提升留存。
  • 流失用户召回:针对漏斗步骤中途放弃的用户,推送个性化消息或礼品,通过埋点标识其停滞节点。

4.3 进阶:用 Python 自动化分析

可构建自动化脚本,定时生成漏斗与留存报告。示例利用 Pandas 快速计算新用户次日留存:

import pandas as pd

# 读取活跃表
active = pd.read_csv('active_days.csv')
active['active_date'] = pd.to_datetime(active['active_date'])

# 新增用户表
new = pd.read_csv('new_users.csv')
new['first_active_date'] = pd.to_datetime(new['first_active_date'])

# 合并次日活跃
merged = new.merge(active, on='user_id')
merged['day_diff'] = (merged['active_date'] - merged['first_active_date']).dt.days
retention = merged[merged['day_diff'] == 1].groupby('first_active_date')['user_id'].nunique()
base = new.groupby('first_active_date')['user_id'].nunique()
retention_rate = (retention / base * 100).fillna(0)