DTC Customer Acquisition Attribution — 独立站全渠道获客归因:从首触到首单的因果追踪
Skill-DTC-Customer-Acquisition-Attribution · 06-增长模型
causalexperimentforecastingoptimization广告与投放客服与VOC推荐与搜索MAS与智能体工程WF-B 广告优化WF-C 客服分诊WF-H 复购增长WF-J DTC 独立站增长WF-L 内容营销增长
年化 ROI¥50-150 万
实现难度⭐⭐⭐☆☆
业务视角
适用角色CEO / 增长负责人 · CMO · 财务负责人
适用平台Amazon · TikTok Shop · DTC 独立站 · 多市场
什么情况下用公司增长放缓,不知道是市场饱和还是产品问题还是获客太贵;老板要 12 个月 GMV 预测,只能靠感觉
成功是什么样的建立增长拆解模型找到瓶颈,预测未来 6-12 个月营收区间,支撑融资/战略会议
业务痛点
1. 解决的问题
DTC独立站TikTok ROAS看起来亏损于是砍掉投放但整体流量随之崩塌——Shapley多触点因果归因揭示TikTok是Google搜索的上游触发器,正确预算分配后真实ROAS提升20-40%,年化保护GMV50-150万元
2. 核心算法逻辑
DTC 独立站的获客归因比 Amazon 更复杂:用户从 TikTok 看到广告 → Google 搜索品牌词 → 邮件召回 → 最终在独立站购买。LastClick 归因把全部功劳给邮件,导致砍掉 TikTok 预算后流量暴跌——却不知道原因。
3. 业务应用场景
业务问题:独立站月预算 $30K,TikTok $15K,Google $10K,Email $5K。GMO报告显示 TikTok ROAS 0.8(亏损),Google ROAS 4.2(盈利)。运营计划砍掉 TikTok——但这是 Last-Click 归因的错误判断,TikTok 实际上带来了大量首次曝光用户后来被 Google 转化。
数据要求: - 用户级别的触点序列(需要 UTM 参数 + 会话 ID 拼接) - 各渠道的曝光/点击/成本数据 - Shopify 订单数据(含订单 ID、用户 ID、时间戳)
预期产出: - Shapley 归因分配:各渠道真实边际贡献百分比 - 建议预算分配:基于因果 ROAS 而非 Last-Click ROAS - "切断后果"模拟:如果砍掉 TikTok,预测 Google 转化量会下降多少
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
- ROI 预估:
- 避免错误砍掉 TikTok 等上漏斗渠道:保护月 GMV ¥30-100 万
- 正确预算分配后真实 ROAS 提升 20-40%:月增利润 ¥5-20 万
- 新市场进入渠道决策准确:节省 ¥5-20 万的试错成本
- 年化综合 ROI:¥50-150 万
- 实施难度:⭐⭐⭐☆☆(需要 UTM 埋点体系 + Shopify API;Shapley 计算约 2-3 周工程量)
7. 代码模板
代码块数量:2 · 路径:未检测到
"""
DTC Customer Acquisition Attribution
多触点因果归因:Shapley值 + 马尔可夫链模型
"""
import numpy as np
from itertools import combinations
from collections import defaultdict
def generate_dtc_journey_data(n_users=500, seed=42):
"""生成模拟 DTC 独立站用户触点路径数据"""
np.random.seed(seed)
channels = ['TikTok', 'Google_Brand', 'Google_NonBrand', 'Email', 'SEO', 'Direct']
# 转化路径模板(模拟母婴独立站用户行为)
path_templates = [
(['TikTok', 'Google_Brand', 'Email'], 0.25), # TikTok引流→品牌搜索→邮件转化
(['Google_NonBrand', 'Google_Brand'], 0.20), # 搜索意图驱动
(['SEO', 'Email', 'Email'], 0.15), # SEO发现→邮件培育
(['TikTok', 'TikTok', 'Google_Brand'], 0.15), # 多次曝光→搜索
(['Google_Brand'], 0.10), # 直接搜索转化
(['Email'], 0.08), # 直接邮件转化
(['Direct'], 0.07), # 直接访问
]
journeys = []
for i in range(n_users):
rand = np.random.random()
cump = 0
for path, prob in path_templates:
cump += prob
if rand <= cump:
# 加噪声变化
actual_path = list(path)
if np.random.random() < 0.2:
extra = np.random.choice(channels)
actual_path.insert(np.random.randint(0, len(actual_path)), extra)
converted = np.random.random() < 0.15 # 15%转化率
journeys.append({'user_id': f'U{i:04d}', 'path': actual_path, 'converted': converted})
break
return journeys
def shapley_attribution(journeys):
"""
Shapley值多触点归因
计算每个渠道在所有可能子集中的边际贡献
"""
# 统计各渠道组合的转化率
combo_conversions = defaultdict(lambda: {'conversions': 0, 'total': 0})
for j in journeys:
channels_set = frozenset(j['path'])
combo_conversions[channels_set]['total'] += 1
if j['converted']:
combo_conversions[channels_set]['conversions'] += 1
# 转化率函数
def v(S):8. 论文来源
- 2312.09154