关于 analyzing-funnel-correlation
用于在 PostHog 中分析与漏斗转化或流失相关的事件和属性值。它通过优势比比较成功与失败群体,并提醒相关性不能证明因果关系。
主要功能
- 01定义漏斗步骤和日期范围
- 02比较事件相关信号
- 03分析个人或事件属性
- 04呈现计数及信号注意事项
适用场景
- 01查找与漏斗转化相关的事件
- 02比较转化者和流失者的属性值
- 03筛选可通过实验验证的候选信号
MCP 相关
使用 PostHog 工具读取洞察和架构数据、运行漏斗与 SQL,并检查漏斗参与者。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ posthog/ ai-plugin --skill analyzing-funnel-correlation安装后在 Claude Code 中输入/analyzing-funnel-correlation确认已加载。
详细介绍
分析漏斗相关性
相关性会比较进入漏斗的两组人:完成最后一步的人(成功)和未完成的人(失败)。 对于每个候选事件或属性值,建立列联表并计算优势比。 优势比大于 1 表示该信号与转化有关,小于 1 表示该信号与流失有关。 比值越偏离 1,相关性越强。
相关性不代表因果关系。请告知用户这一点,并建议通过实验验证强信号。
工作流
- 获取漏斗定义:步骤事件、日期范围和转化窗口。
如果用户提到已保存的洞察,请使用
insight-get读取。 使用read-data-schema确认步骤事件。 - 使用
query-funnel运行漏斗,并记录进入人数和转化人数。 下方 SQL 得出的总数必须处于同一范围内。如果不一致,请先修正步骤筛选条件。 - 使用
execute-sql运行下方的事件相关性查询。 - 如果用户询问个人属性,请运行属性版本的查询。
- 报告与成功相关的主要信号和与失败相关的主要信号,并列出人数。
如需查看信号对应的人群,请使用
query-funnel-actors,或按该事件或属性筛选漏斗。
事件相关性
替换步骤事件、日期范围、转化窗口(windowFunnel 中的秒数,INTERVAL 中的天数)以及步骤数。
如需更多步骤,请在 windowFunnel 中添加更多 event = '...' 条件,并将 steps = N 设为最后一步。
WITH
funnel_actors AS (
SELECT
person_id AS actor_id,
windowFunnel(1209600)(toDateTime(timestamp), event = 'step one', event = 'step two') AS steps,
arraySort(groupArrayIf((toUnixTimestamp(timestamp), event = 'step two'), event IN ('step one', 'step two'))) AS step_events,
arrayReverseFill(t -> t > 0, arrayMap(x -> if(x.2, x.1, 0), step_events)) AS next_final,
arrayFirstIndex((x, t) -> NOT x.2 AND t > 0 AND t <= x.1 + 1209600, step_events, next_final) AS attempt,
toDateTime(if(attempt > 0, step_events[attempt].1, arrayFirst(x -> NOT x.2, step_events).1)) AS first_timestamp,
toDateTime(next_final[greatest(attempt, 1)]) AS final_timestamp
FROM events
WHERE event IN ('step one', 'step two')
AND timestamp >= now() - INTERVAL 30 DAY
GROUP BY actor_id
HAVING steps >= 1
),
totals AS (
SELECT countIf(steps = 2) AS success_total, countIf(steps < 2) AS failure_total
FROM funnel_actors
),
per_event AS (
SELECT
e.event AS name,
countDistinctIf(a.actor_id, a.steps = 2) AS success_count,
countDistinctIf(a.actor_id, a.steps < 2) AS failure_count
FROM events AS e
JOIN funnel_actors AS a ON e.person_id = a.actor_id
WHERE e.timestamp >= now() - INTERVAL 30 DAY
AND e.timestamp > a.first_timestamp
AND e.timestamp < if(a.steps = 2, a.final_timestamp, a.first_timestamp + INTERVAL 14 DAY)
AND e.event NOT IN ('step one', 'step two')
GROUP BY name
)
SELECT
name,
success_count,
failure_count,
success_total,
failure_total,
((success_count + 1) * (failure_total - failure_count + 1))
/ ((success_total - success_count + 1) * (failure_count + 1)) AS odds_ratio
FROM per_event
CROSS JOIN totals
WHERE success_count + failure_count >= least(25, 0.02 * (success_total + failure_total))
ORDER BY abs(log(odds_ratio)) DESC
LIMIT 20
此查询仅统计从漏斗进入到转化之间的事件。
step_events 按时间顺序保存第一步和最后一步的事件。next_final 一次性为每个事件提供下一个最后一步事件的时间。
对于已转化的人,attempt 会选择第一个在时间窗口内包含最后一步的进入记录,因此两个时间戳都来自同一次尝试。
对于更多步骤,请在 groupArrayIf 中只保留第一步和最后一步事件。这样,尝试会忽略中间步骤,因此时间间隔可能从早于成功转化的那次进入开始。
对于未转化的人,此查询会统计他们从首次进入到转化窗口结束期间的事件。
时间戳使用整秒,因为 windowFunnel 会比较整秒。请保持一致,否则某些转化记录将无法匹配到尝试。
此查询会排除漏斗步骤事件,因为根据定义,这些事件与转化相关。
属性相关性
如需比较个人属性值,请按属性对参与者分组,并跳过事件联接。
WITH
funnel_actors AS (
SELECT
person_id AS actor_id,
windowFunnel(1209600)(toDateTime(timestamp), event = 'step one', event = 'step two') AS steps,
any(person.properties.$browser) AS value
FROM events
WHERE event IN ('step one', 'step two')
AND timestamp >= now() - INTERVAL 30 DAY
GROUP BY actor_id
HAVING steps >= 1
),
totals AS (
SELECT countIf(steps = 2) AS success_total, countIf(steps < 2) AS failure_total
FROM funnel_actors
),
per_value AS (
SELECT
toString(value) AS name,
countIf(steps = 2) AS success_count,
countIf(steps < 2) AS failure_count
FROM funnel_actors
GROUP BY name
)
SELECT
name,
success_count,
failure_count,
((success_count + 1) * (failure_total - failure_count + 1))
/ ((success_total - success_count + 1) * (failure_count + 1)) AS odds_ratio
FROM per_value
CROSS JOIN totals
WHERE success_count + failure_count >= least(25, 0.02 * (success_total + failure_total))
ORDER BY abs(log(odds_ratio)) DESC
LIMIT 20
如需查看某个事件的属性,请将 per_event 筛选为该事件,并按 e.properties.<name> 分组。
谨慎解读结果
- 每个单元格中的
+ 1是先验值,可避免除以零,并降低小样本信号的影响。 WHERE筛选条件会排除少于 25 人或少于进入人数 2% 的信号。小群体会导致比值不稳定。- 如果一组人数超过另一组的 10 倍,比值就不太可靠。请告知用户。
- 如果
success_total或failure_total为 0,则没有可供比较的内容。 - 每个人都会发送的噪声事件(例如
$pageview、$pageleave或$feature_flag_called)可能会占满列表。如果它们掩盖了有用信号,请将其排除。 - 对于基于群组的漏斗,请将
person_id替换为$group_N,并将个人属性替换为群组属性。同时在漏斗步骤的WHERE子句中添加AND $group_N != ''。没有该群组的事件会有一个空键;如果不加此筛选条件,它们就会成为一个可能转化的虚假参与者。