Identity Fragmentation Debiasing(身份碎片化纠偏)
Skill-Identity-Fragmentation-Debiasing · 13-广告分析
1. 解决的问题
核心思想:用户在多设备间切换(手机看广告、电脑下单)导致底层 Cookie/IDFA 无法跨端串联,同一真实用户被拆分为多个"碎片化身份"。这使得广告平台看到的 ROAS 严重失真——有的记录"只有曝光没有购买",有的记录"只有购买没有广告"。算法通过 Stratified Aggregation(分层聚合) 在 Cohort 层面重建真实曝光与购买的对应关系,无需跨设备图谱,还原因果 ROI。
2. 核心算法逻辑
核心思想:用户在多设备间切换(手机看广告、电脑下单)导致底层 Cookie/IDFA 无法跨端串联,同一真实用户被拆分为多个"碎片化身份"。这使得广告平台看到的 ROAS 严重失真——有的记录"只有曝光没有购买",有的记录"只有购买没有广告"。算法通过 Stratified Aggregation(分层聚合) 在 Cohort 层面重建真实曝光与购买的对应关系,无需跨设备图谱,还原因果 ROI。
3. 业务应用场景
业务问题:女装独立站通过 Instagram(手机端)大量投放信息流广告。后台报表显示广告 CVR 极低(曝光了但转化接近 0),财务部门准备砍掉 Instagram 预算。真实情况是:高活跃用户在手机看到广告后,习惯切换到电脑上完成购买——这部分转化在设备级日志中被完全"断链",无法归因到 Instagram。
数据要求: - 字段:`user_id(或邮箱哈希/手机号哈希)| device_id | cohort(地区+时段) | exposed | converted` - 数据源:Instagram Ads API(曝光数据)+ Shopify 后台(订单数据,含 UTM 来源) - 如无 user\_id 关联能力,则退化为 Cohort 层面的聚合统计(不需要用户级关联)
预期产出: - 朴素设备级 ATE:≈ 0.016(严重低估) - Stratified Aggregation 纠偏后 ATE:≈ 0.055-0.065(接近真实效果) - 纠偏后 ROI 从 0.28 提升至 0.80+,揭示 Instagram 渠道被严重低估
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
未自动抽取;请查看原始 Skill 卡片。
7. 代码模板
代码块数量:1 · 路径:未检测到
from model import (
simulate_cross_device_logs,
naive_roi_estimate,
StratifiedAggregationDebiaser,
bias_decomposition_report,
)
# 1. 加载数据(或使用模拟数据)
df = simulate_cross_device_logs(
n_true_users=3000,
fragmentation_rate=0.40, # 40% 用户跨设备碎片化
ad_lift=0.06, # 真实广告提升效果 6pp(仅模拟用)
seed=2024,
)
# df = pd.read_csv("cross_device_log.csv") # 真实数据替换
# 2. 朴素估计(展示有偏结果)
naive = naive_roi_estimate(df, ad_spend=10000.0)
print(f"朴素 ATE: {naive['naive_lift']:.4f} 朴素 ROI: {naive['naive_roi']:.3f}")
# 朴素 ATE: 0.0164 朴素 ROI: 0.279 ← 严重低估(碎片化失真)
# 3. Stratified Aggregation 纠偏
debiaser = StratifiedAggregationDebiaser(cohort_col="cohort", min_cohort_size=20)
debiaser.fit(df) # 关键:内部自动按 user_id 聚合,恢复真实曝光/购买状态
corrected = debiaser.corrected_roi(ad_spend=10000.0, revenue_per_conversion=50.0)
print(f"纠偏 ATE: {corrected['corrected_ate']:.4f} 纠偏 ROI: {corrected['corrected_roi']:.3f}")
# 纠偏 ATE: 0.0548 纠偏 ROI: 0.821 ← 接近真实效果
# 4. Cohort 级别报告
cohort_df = debiaser.cohort_report()
print(cohort_df)
# cohort n_users n_exposed n_control cvr_exposed cvr_control ate ci_lower ci_upper
# C05 629 355 274 0.2901 0.1460 0.1442 0.0811 0.2072
# ...
# 5. 对比汇总
bias_df = bias_decomposition_report(naive, corrected, true_lift=0.06)
print(bias_df)
8. 论文来源
- 2008.12849