归因是增长分析里最容易踩坑、也最容易讲出差异化的话题。本文从理想汽车的实际问题出发,系统讲解四种归因模型及其选择逻辑。
归因要解决的问题:一笔转化(下单、成交、激活),应该"归功"于哪个渠道或触点?
之所以叫"跨天归因",是因为用户从第一次接触到最终转化,往往跨越多天甚至多周。这段时间里,用户可能接触了多种渠道:
这笔订单,应该归给广告、好友分享,还是 Push?不同的归因模型给出不同答案,进而影响渠道预算分配和运营策略优化方向。
汽车购买决策周期普遍在 3-6 个月,理想 L6/L7/L9 的主要客群决策周期甚至更长。
一个典型路径:
这笔订单:
规则:转化前最后一次触点获得 100% 归因。
优点:
缺点:
适用场景:
-- 末次触达归因核心逻辑
ROW_NUMBER() OVER (
PARTITION BY user_id, order_id
ORDER BY event_time DESC -- 最近的触点排第 1
) AS touch_rank
-- WHERE touch_rank = 1 即末次触达
规则:转化前第一次触点获得 100% 归因。
优点:
缺点:
适用场景:
ROW_NUMBER() OVER (
PARTITION BY user_id, order_id
ORDER BY event_time ASC -- 最早的触点排第 1
) AS touch_rank
-- WHERE touch_rank = 1 即首次触达
规则:所有触点平均分配归因权重,每个触点得到 1/N 的功劳。
优点:
缺点:
适用场景:
-- 线性归因:每个触点权重 = 1 / 触点总数
1.0 / COUNT(*) OVER (PARTITION BY user_id, order_id) AS linear_weight
规则:越接近转化的触点,获得越高的归因权重。通常使用指数衰减,半衰期可配置(常用 7 天)。
权重计算:
weight = (0.5) ^ (days_before_conversion / half_life)
如果半衰期 = 7 天:
每个订单的所有触点权重归一化后,分配对应比例的 GMV。
优点:
缺点:
适用场景:
-- 时间衰减归因:指数衰减权重
POW(0.5, DATEDIFF(order_date, event_date) / 7.0) AS decay_weight
-- 归一化后用于分配 GMV
以下面这个路径为例:
| 触点 | 渠道 | 距下单天数 | |---|---|---| | Touch 1 | 抖音广告 | 第 -20 天 | | Touch 2 | 社交分享 | 第 -10 天 | | Touch 3 | Push | 第 -1 天 |
| 模型 | 抖音广告 | 社交分享 | Push | |---|---|---|---| | 末次触达 | 0% | 0% | 100% | | 首次触达 | 100% | 0% | 0% | | 线性归因 | 33.3% | 33.3% | 33.3% | | 时间衰减(7天) | 7.7% | 22.3% | 70% |
时间衰减下,Push 权重最高(70%),但抖音广告和社交分享也获得了一定归因,不会被完全忽略。
归因窗口 = "从触点到转化,最多算多少天内的触点"。
| 业务类型 | 建议归因窗口 | 理由 | |---|---|---| | 快消品 / 日用品 | 7-14 天 | 决策快,窗口长了引入噪音 | | 服装 / 数码 | 30 天 | 中等决策周期 | | 汽车 / 房产 | 90-180 天 | 长决策周期,短窗口会漏掉早期触点 | | SaaS B2B | 60-90 天 | 企业采购周期长 |
在理想,我们用的是 90 天归因窗口,因为很多用户是 2 月看广告、5 月成交的。如果用 30 天窗口,就完全无法衡量品牌广告的长期价值。
归因模型只能处理有记录的触点。以下情况是归因的盲区:
1. 线下触点缺失:用户在线下看到户外广告、在朋友口头推荐下来购买,这些触点没有数字记录,无法纳入归因。在汽车行业这是常态,所以数字归因结果往往高估线上渠道的价值。
2. 跨设备身份断裂:用户在手机上看了广告,在 PC 端下单,但两个设备没有登录同一账号,触点和转化无法关联。
3. 有效触点和无效曝光的区分:广告展示给用户但用户根本没看到(广告位在首屏外),算不算触点?通常用"Viewable Impression"代替"Impression"作为触点标准,但实现成本高。
不存在"最正确"的归因模型,只有"最适合你业务问题"的模型。
选择框架:
实践建议:同时跑两种模型(如末次 + 时间衰减),对比结论是否一致。如果两种模型下渠道排名一致,结论更可信;如果排名出现大反转,说明不同渠道扮演不同角色,需要深入分析。
完整的 SQL 实现见 workflow/attribution-sql-cookbook.md,这里只说关键逻辑点:
1. JOIN 方向:从订单出发往前找触点(而不是从触点出发往后找订单),可以保证每笔订单都有归因结果。
2. 时间过滤:event_time <= order_date 确保只看下单前的触点,避免把下单后的行为当成触点。
3. 去重:同一用户同一天在同一渠道的多次触点,通常只算一次(避免重复刷广告被当成多个触点)。
4. NULLIF 保护:权重归一化时,如果某笔订单的触点权重之和为 0,会触发除零错误,需要 NULLIF(sum_weight, 0) 保护。
| JD 要求 | 归因经验如何覆盖 | |---------|---------------| | 深度参与公司核心业务,协同业务经营目标 | 归因模型直接影响渠道预算分配——选错模型=每年几十万的投放预算投错地方 | | 将业务语言转化为数据与AI解决方案 | 归因是典型的"业务直觉("抖音广告有用")→ 数据验证("首次触达贡献了 40% 转化")" | | 推动数据在业务中的实际落地 | 归因模型的结果直接指导投放团队的出价策略和渠道配比 |
在理想汽车,我们面对的核心问题是:用户从看广告到买车可能花 6 个月,中间经过抖音广告、车展留资、销售电话、到店试驾、公众号推文等 5-10 个触点。如果用常见的 30 天末次触达归因,品牌广告的价值会被完全低估。
我推动将归因窗口从 30 天扩展到 90 天,并引入时间衰减模型(半衰期 30 天),让早期品牌触点和晚期转化触点都能获得合理的功劳分配。这个改动直接影响了千万级投放预算的渠道分配决策。
这段经历让我掌握了归因模型的选择逻辑——不是找一个"最准确"的模型,而是选择最匹配业务特征(决策周期、触点密度、数据完整度)的模型,并用两种模型的交叉验证来提高结论可信度。
workflow/attribution-sql-cookbook.md:4 种归因模型的完整 SQL 实现learn/05-ab-experiment-governance.md:归因模型影响实验结论的情况learn/00-industry-mapping.md:汽车 90 天归因窗口 vs 电商 30 天窗口