当前位置: 首页 > article >正文

从博弈论到广告归因:手把手拆解Shapley Value的Python代码与业务陷阱

从博弈论到广告归因手把手拆解Shapley Value的Python代码与业务陷阱在数字营销领域广告主常常面临一个核心难题如何公平评估各渠道对最终转化的贡献传统最后点击归因模型简单粗暴往往低估了用户旅程中早期渠道的培育作用。而Shapley Value这一源自博弈论的概念为多触点归因提供了数学上优雅的解决方案。本文将带您深入理解其博弈论本质剖析Python实现细节并揭示实际业务中那些容易被忽视的陷阱。1. 合作博弈Shapley Value的数学之美1953年诺贝尔经济学奖得主Lloyd Shapley提出Shapley Value时原本是为了解决合作博弈中的利益分配问题。想象三个广告渠道A、B、C就像三个玩家他们可以通过不同组合产生协同效应A单独投放带来10次转化B单独投放带来15次转化C单独投放带来20次转化AB组合带来30次转化AC组合带来40次转化BC组合带来50次转化ABC组合带来100次转化Shapley Value的核心思想是每个玩家的贡献等于其在不同联盟组合中的边际贡献的平均值。计算时需要遍历所有可能的加入顺序渠道A的贡献 (A加入空集的边际贡献 A加入{B}的边际贡献 A加入{C}的边际贡献 A加入{B,C}的边际贡献) / 排列总数具体计算过程如下表所示加入顺序A的边际贡献B的边际贡献C的边际贡献A→B→C1020 (30-10)70 (100-30)A→C→B1060 (100-40)30 (40-10)B→A→C15 (30-15)1570 (100-30)B→C→A50 (100-50)1535 (50-15)C→A→B20 (40-20)60 (100-40)20C→B→A50 (100-50)30 (50-20)20平均值25.8333.3340.83注意实际应用中通常使用权重公式 φ_i Σ [|S|!(n-|S|-1)!/n!] * (v(S∪{i}) - v(S)) 来优化计算效率这种分配方式满足三个重要公理对称性贡献相同的玩家获得相同报酬有效性所有玩家的Shapley值之和等于总收益可加性多个独立博弈的Shapley值可以相加2. Python实现从理论到代码让我们用Python实现一个基础的Shapley Value计算器。首先定义核心函数from itertools import combinations from math import factorial from collections import defaultdict def power_set(channels): 生成所有可能的渠道组合 s list(channels) return [frozenset(subset) for r in range(len(s)1) for subset in combinations(s, r)] def calculate_shapley(df, channel_colchannel, conv_colconversions): 计算各渠道的Shapley Value 参数 df: 包含渠道组合和对应转化的DataFrame channel_col: 渠道列名 conv_col: 转化数列名 # 将数据转换为字典格式 c_values df.set_index(channel_col).to_dict()[conv_col] # 获取所有独立渠道 unique_channels set() for combo in df[channel_col]: unique_channels.update(combo.split(,)) # 计算所有子集的价值函数 v_values {} for subset in power_set(unique_channels): key ,.join(sorted(subset)) v_values[key] c_values.get(key, 0) # Shapley值计算 n len(unique_channels) shapley defaultdict(float) for channel in unique_channels: for subset in v_values: if channel not in subset.split(,): subset_size len(subset.split(,)) if subset else 0 weight (factorial(subset_size) * factorial(n - subset_size - 1)) / factorial(n) subset_with_channel ,.join(sorted((subset , channel).split(,))) if subset else channel marginal_contribution v_values[subset_with_channel] - v_values[subset] shapley[channel] weight * marginal_contribution # 处理空集情况 shapley[channel] v_values.get(channel, 0) / n return dict(shapley)使用示例数据测试import pandas as pd data { channel: [A, B, C, A,B, A,C, B,C, A,B,C], conversions: [10, 15, 20, 30, 40, 50, 100] } df pd.DataFrame(data) results calculate_shapley(df) print(results) # 输出{A: 25.83, B: 33.33, C: 40.83}对于大规模数据我们可以采用蒙特卡洛模拟来近似计算import random def monte_carlo_shapley(channels, conversion_func, iterations10000): 蒙特卡洛方法近似计算Shapley值 n len(channels) shapley {channel: 0.0 for channel in channels} for _ in range(iterations): random_order random.sample(channels, n) subset set() prev_value conversion_func(subset) for channel in random_order: subset.add(channel) current_value conversion_func(subset) marginal current_value - prev_value shapley[channel] marginal prev_value current_value # 计算平均值 for channel in channels: shapley[channel] / iterations return shapley3. 业务陷阱当理论遇见现实尽管Shapley Value在理论上非常完美但实际应用中存在多个需要警惕的陷阱3.1 数据预处理的影响原始数据中的路径长度分布会显著影响结果。例如若数据中包含大量搜索→直接购买的短路径搜索渠道的贡献会被高估过滤掉这些短路径后其他渠道的贡献度可能突然提升建议分析前先检查转化路径长度分布考虑是否需要分层抽样3.2 渠道交互效应某些渠道组合可能产生非线性效应场景渠道A渠道B实际转化独立效应之和差异社交媒体搜索10015030025050展示广告邮件80120150200-50这种情况下简单的边际贡献计算可能掩盖真实的协同效应。3.3 时间衰减问题传统Shapley Value不考虑触点的时间因素# 添加时间衰减因子的改进版本 def time_decayed_shapley(df, decay_rate0.5): 考虑触点时间衰减的Shapley值计算 df[weighted_conv] df.apply(lambda x: x[conversions] * (decay_rate ** x[days_to_conv]), axis1) return calculate_shapley(df, conv_colweighted_conv)3.4 渠道定义粒度过于宽泛或精细的渠道分类都会影响结果过于宽泛社交媒体包含Facebook、Twitter等掩盖子渠道差异过于精细将每个广告活动单独计算导致数据稀疏4. 进阶应用有序Shapley Value当触点顺序对转化有重要影响时如用户通常先看展示广告再搜索可以扩展有序Shapley Valuedef ordered_shapley(journeys): 计算有序Shapley值 position_contribution defaultdict(lambda: defaultdict(float)) total_conversions sum(j[conversions] for j in journeys) for journey in journeys: path journey[path].split() conv journey[conversions] for i, channel in enumerate(path): weight 1 / (i 1) # 位置权重 position_contribution[channel][i] conv * weight # 归一化处理 results {} for channel in position_contribution: total sum(position_contribution[channel].values()) results[channel] total / total_conversions return results典型输出示例{ paid_search: 0.4376, display_ad: 0.2891, social: 0.2733 }与马尔科夫链归因相比维度Shapley Value马尔科夫链计算复杂度O(n!) → 需近似计算O(n^2) → 可并行化顺序敏感性可选(有序版本)内置数据需求需要所有组合数据需要完整路径数据解释性博弈论基础明确概率转移直观5. 实战建议与最佳实践基于实际项目经验分享几个关键建议数据准备阶段确保转化窗口一致如都采用30天回溯期处理重复触点如用户多次点击同一广告明确渠道定义规则如如何区分自然搜索和付费搜索模型选择原则def select_model(data): if len(data[channels].unique()) 10: return monte_carlo_shapley # 渠道多时用蒙特卡洛 elif data[path_length].max() 5: return ordered_shapley # 路径长时用有序版本 else: return calculate_shapley # 默认基础版本结果验证方法保留部分数据作为验证集对比Shapley分配与A/B测试结果检查各渠道的ROI是否与分配值匹配持续优化循环初始分配 → 2. 预算调整 → 3. 效果监测 → 4. 模型校准在最近一个电商项目中我们通过Shapley Value发现品牌展示广告对直接流量转化的间接贡献被严重低估。调整预算分配后在保持相同总预算下整体ROI提升了22%。

相关文章:

从博弈论到广告归因:手把手拆解Shapley Value的Python代码与业务陷阱

从博弈论到广告归因:手把手拆解Shapley Value的Python代码与业务陷阱 在数字营销领域,广告主常常面临一个核心难题:如何公平评估各渠道对最终转化的贡献?传统"最后点击"归因模型简单粗暴,往往低估了用户旅程…...

微博超话自动签到工具:终极懒人指南,3分钟掌握高效自动化管理

微博超话自动签到工具:终极懒人指南,3分钟掌握高效自动化管理 【免费下载链接】weibo_supertopic_sign 基于Python/Nodejs的微博超话签到脚本,支持云函数运行或青龙面板运行 项目地址: https://gitcode.com/gh_mirrors/we/weibo_supertopic…...

EmojiOne Color彩色字体:3分钟掌握1800+表情的终极解决方案

EmojiOne Color彩色字体:3分钟掌握1800表情的终极解决方案 【免费下载链接】emojione-color OpenType-SVG font of EmojiOne 2.3 项目地址: https://gitcode.com/gh_mirrors/em/emojione-color 想要在网站、应用或设计作品中添加生动有趣的彩色表情符号吗&am…...

YOLOv11涨点改进| SCI一区2026 | 独家创新首发、特征融合改进篇| 引入LCAFM轻量交叉注意力融合模块,增强小目标与细节感知能力,适合小目标检测,多模态融合目标检测,图像分割,高效涨点

一、本文介绍 🔥本文给大家介绍使用 LCAFM轻量交叉注意力融合模块 改进YOLOv11网络模型,通过跨模态引导注意力机制实现可见光与红外特征的深度融合,使模型在特征提取与融合阶段能够充分利用两种模态的互补信息,从而增强特征表达能力并缓解模态差异带来的干扰。通过双向引…...

从timerfd到epoll:手把手教你打造Linux C++高性能定时器管理器

从timerfd到epoll:构建Linux C高性能定时器管理器的工程实践 在游戏服务器、物联网网关或高频交易系统中,定时器管理往往是性能瓶颈的关键所在。想象一下,当你的服务器需要同时处理数万个玩家技能冷却、状态刷新或订单超时检测时,…...

Ollama环境变量全解析:从外网访问到模型路径设置,一篇搞定所有配置

Ollama环境变量全解析:从外网访问到模型路径设置,一篇搞定所有配置 最近在部署Ollama服务时,我发现很多开发者对环境变量的配置存在困惑。特别是在需要外网访问、自定义模型路径或优化性能时,正确的环境变量设置能节省大量调试时间…...

给Kylin V10 SP3虚拟机加块‘数据盘’:从VMware添加硬盘到fstab永久挂载/data的保姆级流程

麒麟V10 SP3虚拟机扩容实战:从VMware添加硬盘到永久挂载全指南 在虚拟化开发环境中,为运行中的麒麟系统动态扩容存储空间是运维工程师的常见需求。想象这样一个场景:你的Kylin V10 SP3虚拟机原本配置的存储空间已经捉襟见肘,而项目…...

从一次线上NPE排查说起:Java Stream的findFirst()遇到null值到底有多坑?

从线上NPE事故看Java Stream的findFirst()陷阱:一场关于null的深度防御战 凌晨三点,电商平台的订单履约系统突然告警——核心业务接口连续抛出NullPointerException。值班工程师紧急回滚代码后,发现罪魁祸首竟是一行使用了findFirst()的Strea…...

别再手动导数据库了!Go-Admin项目新手避坑指南:从GitHub克隆到一键启动的完整流程

Go-Admin项目零基础实战:从GitHub克隆到自动化部署的全链路指南 第一次接触Go-Admin这类全栈脚手架时,很多开发者会陷入"手动导入SQL→配置混乱→无法登录"的死循环。本文将彻底打破这种传统认知,展示如何通过自动化工作流规避90%的…...

Windows Cleaner:如何通过3个简单步骤解决C盘空间不足和系统卡顿问题

Windows Cleaner:如何通过3个简单步骤解决C盘空间不足和系统卡顿问题 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner Windows Cleaner是一款专为Windo…...

从‘撸树’到报错:一个老MC玩家重拾Minecraft时遇到的OpenGL驱动坑全记录

从‘撸树’到报错:一个老MC玩家重拾Minecraft时遇到的OpenGL驱动坑全记录 记得十年前那个夏天,我用一台二手笔记本顶着30帧的卡顿,在Minecraft里搭出了第一座木头房子。如今换了顶配游戏本,重新下载最新版准备怀旧时,屏…...

STC单片机蓝牙无线下载避坑指南:为什么你的STC15/STC8总是烧录失败?

STC单片机蓝牙无线下载避坑指南:为什么你的STC15/STC8总是烧录失败? 去年冬天的一个深夜,当我第37次点击STC-ISP软件的"下载"按钮,电脑屏幕依然冷冰冰地显示"正在检测目标单片机..."时,工作台上的…...

终极指南:如何免费解锁惠普游戏本全部性能潜力

终极指南:如何免费解锁惠普游戏本全部性能潜力 【免费下载链接】OmenSuperHub 使用 WMI BIOS控制性能和风扇速度,自动解除DB功耗限制。 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否厌倦了官方Omen Gaming Hub软件的资源占用…...

ODF配线架安装全流程实录:72芯高密度布线+光纤熔接避雷手册

ODF配线架高密度部署实战指南:72芯光纤熔接与布线工艺深度解析 在电信机房的基础设施建设中,ODF配线架作为光缆网络的核心枢纽,其安装质量直接影响着整个通信系统的稳定性和可维护性。面对72芯高密度光纤的布线挑战,工程师需要掌握…...

保姆级教程:在Fedora/CentOS上用QEMU-KVM跑起ARM64虚拟机(附Debian镜像下载)

在Fedora/CentOS上构建高性能ARM64虚拟化环境的完整指南 对于需要在x86架构上开发和测试ARM64应用的工程师来说,搭建一个稳定高效的虚拟化环境是刚需。本文将带你从零开始,在Fedora或CentOS系统上配置完整的QEMU-KVM虚拟化栈,并针对ARM64架构…...

2025最权威的六大AI辅助写作神器解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能技术飞速发展的当下,AI辅助学术写作成了研究热点,借助AI撰写…...

智能体开发路线:从 Demo 到生产环境完整路径

文章目录前言一、起点:清醒认知——Demo与生产的天壤之别1.1 三大核心差异:从理想照进现实(1)环境与数据:从"无菌室"到"野生丛林"(2)性能与稳定性:从"跑一…...

基于KITTI数据集:从LIO-SAM部署到EVO精度评估全流程解析

1. KITTI数据集准备与格式转换 KITTI数据集作为自动驾驶领域最经典的公开数据集之一,包含了丰富的传感器数据和多场景的道路环境信息。对于SLAM研究者来说,2011_09_30_drive_0016等序列常被用作算法测试基准。但原始数据需要经过格式转换才能在ROS环境中…...

第30篇文章:一个大三计科生的自白

这是我的第30篇文章。不出意外的话,这篇发出去之后,我这个账号的全网浏览量应该就能破10万了。我很清楚,这点数据对那些头部技术博主来说可能不算什么。但对我来说,这是一个挺重要的小节点,是我一点一点写出来的&#…...

ESP32物联网开发终极指南:从Arduino核心到智能硬件实战

ESP32物联网开发终极指南:从Arduino核心到智能硬件实战 【免费下载链接】arduino-esp32 Arduino core for the ESP32 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 想要快速构建物联网设备却担心开发难度?ESP32 Arduino核心为…...

Bilibili缓存视频合并:Android用户的终极离线观看解决方案

Bilibili缓存视频合并:Android用户的终极离线观看解决方案 【免费下载链接】BilibiliCacheVideoMerge 🔥🔥Android上将bilibili缓存视频合并导出为mp4,支持安卓5.0 ~ 13,视频挂载弹幕播放(Android consolidates and ex…...

别再被硬盘容量坑了!5分钟搞懂KB和KiB的区别(附Windows/Linux查看方法)

别再被硬盘容量坑了!5分钟搞懂KB和KiB的区别(附Windows/Linux查看方法) 刚买的新硬盘标称1TB,插上电脑却显示只有931GB——这种"缩水"现象困扰过无数用户。背后的根本原因,是计量单位标准的历史演变与行业实…...

终极指南:3分钟快速检测微信单向好友,轻松清理“僵尸“好友

终极指南:3分钟快速检测微信单向好友,轻松清理"僵尸"好友 【免费下载链接】WechatRealFriends 微信好友关系一键检测,基于微信ipad协议,看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/…...

视频硬字幕提取的技术实现与本地化解决方案

视频硬字幕提取的技术实现与本地化解决方案 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区域检测、字幕内容提取。A GUI tool for…...

2026免费AI降重软件怎么选?亲测好用不踩坑

对于赶论文的高校学生、需要产出学术成果的科研工作者来说,重复率超标、AI生成痕迹过审失败,绝对是定稿阶段最让人头疼的两大难题。纯人工修改动辄耗上三四个小时,结果要么重复率只降了两三个百分点,要么AI痕迹丝毫没减&#xff0…...

南宁宠物医院哪家好

在南宁这座充满活力的城市里,宠物已经成为许多家庭不可或缺的一员。当毛孩子出现健康问题时,选择一家值得信赖的宠物医院成为宠物主人的首要任务。今天,让我们一同走进广西阿荣宠物医院,了解这家陪伴宠物和主人走过13年时光的医疗…...

FireRed-OCR Studio效果展示:带页眉页脚文档区域智能过滤

FireRed-OCR Studio效果展示:带页眉页脚文档区域智能过滤 1. 工业级文档解析新标杆 FireRed-OCR Studio代表了当前文档解析技术的最高水平。这款基于Qwen3-VL模型深度优化的工具,不仅能准确识别文字内容,更能智能理解文档的完整结构布局。在…...

从汽车中控到工厂流水线:HMI触摸屏的7大核心功能,你真的都用上了吗?

从汽车中控到工厂流水线:HMI触摸屏的7大核心功能深度解析 在汽车制造车间里,工程师小王正盯着流水线上的HMI触摸屏,屏幕上跳动的参数曲线让他迅速定位了焊接机器人的异常状态。这个看似简单的交互界面,背后却整合了数据采集、逻辑…...

VCS仿真器下UVM调试实战:手把手解决uvm_hdl_force权限与$urandom_range范围溢出

VCS仿真器下UVM调试实战:手把手解决uvm_hdl_force权限与$urandom_range范围溢出 在芯片验证领域,UVM(Universal Verification Methodology)已成为事实上的标准。然而,当我们在Synopsys VCS这样的商业仿真器上实现UVM验…...

2026届必备的六大AI学术工具推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 于学术写作范畴内,挑出适配的AI网站可极高程度提升论文产出效率,当下…...