mcpField
A
analyzing-funnel-correlation

analyzing-funnel-correlation

github.com/posthog数据与数据库9514 次安装今天更新
代码仓库

关于 analyzing-funnel-correlation

用于在 PostHog 中分析与漏斗转化或流失相关的事件和属性值。它通过优势比比较成功与失败群体,并提醒相关性不能证明因果关系。

主要功能

  1. 01定义漏斗步骤和日期范围
  2. 02比较事件相关信号
  3. 03分析个人或事件属性
  4. 04呈现计数及信号注意事项

适用场景

  1. 01查找与漏斗转化相关的事件
  2. 02比较转化者和流失者的属性值
  3. 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,相关性越强。

相关性不代表因果关系。请告知用户这一点,并建议通过实验验证强信号。

工作流

  1. 获取漏斗定义:步骤事件、日期范围和转化窗口。 如果用户提到已保存的洞察,请使用 insight-get 读取。 使用 read-data-schema 确认步骤事件。
  2. 使用 query-funnel 运行漏斗,并记录进入人数和转化人数。 下方 SQL 得出的总数必须处于同一范围内。如果不一致,请先修正步骤筛选条件。
  3. 使用 execute-sql 运行下方的事件相关性查询。
  4. 如果用户询问个人属性,请运行属性版本的查询。
  5. 报告与成功相关的主要信号和与失败相关的主要信号,并列出人数。 如需查看信号对应的人群,请使用 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 != ''。没有该群组的事件会有一个空键;如果不加此筛选条件,它们就会成为一个可能转化的虚假参与者。

评论

支持 Markdown