Channel Attribution 简介
Channel Attribution 是一个用于解决市场营销渠道归因问题的 Python 包。它通过数据驱动的方法(如马尔可夫链模型)和启发式模型(如首次点击、末次点击)来量化不同营销渠道对转化的贡献,帮助优化广告预算分配。
主要功能
- 启发式模型(Heuristic Models):
- 首次点击(First-Touch):将转化功劳全部归于用户路径中的第一个渠道。
- 末次点击(Last-Touch):将转化功劳全部归于路径中的最后一个渠道。
- 线性归因(Linear):平均分配功劳给路径中的所有渠道。
- 时间衰减(Time Decay):根据渠道的时间远近按权重分配功劳。
- 马尔可夫链模型(Markov Model):
- 基于概率论,通过移除每个渠道并计算转化概率的变化来评估其贡献,更精准地反映渠道的真实影响。
应用场景
- 广告预算优化:根据渠道贡献分配预算。
- 用户行为分析:识别高影响力渠道,优化用户旅程。
- A/B 测试支持:评估渠道调整后的效果变化。
使用案例
电商行业:优化广告预算分配
- 场景:分析用户从广告点击到购买的路径(如 Google Ads > Email > Direct)。
- 步骤:
- 使用马尔可夫模型计算各渠道的边际贡献。
- 对比启发式模型结果,识别被低估的渠道(如中间触点的社交广告)。
- 输出:将预算倾斜至高贡献渠道(如首触渠道+中间交互渠道)。
SaaS 产品:免费试用转化归因
- 场景:用户通过内容营销→产品试用→客服沟通→付费订阅。
- 分析:
- 马尔可夫模型可能显示“客服沟通”对转化的关键作用。
- 线性归因可能低估客服的贡献。
- 行动:加强客服团队培训或优化用户教育流程。
游戏行业:用户留存渠道分析
- 场景:玩家通过社交广告→应用商店→游戏内活动持续活跃。
- 模型应用:
- 时间衰减模型可能高估末次触点(应用商店)。
- 马尔可夫模型揭示社交广告的长期留存价值。
Channel Attribution 实现原理
Channel Attribution 的实现原理主要基于两类模型:启发式模型(规则模型)和马尔可夫链模型。以下从数学基础、数据处理和算法逻辑三方面详细解释其工作原理。
启发式模型(Heuristic Models)
核心思想
通过预设规则分配转化功劳,简单直观但依赖人工经验。常见规则包括:
- 首次点击(First-Touch):将 100% 功劳归于路径的第一个渠道。
- 末次点击(Last-Touch):将 100% 功劳归于路径的最后一个渠道。
- 线性归因(Linear):平均分配功劳给路径中所有渠道。
- 时间衰减(Time Decay):按时间远近加权分配(越接近转化的渠道权重越高)。
实现步骤
- 路径拆分:将每条路径按分隔符(如 >)拆分为渠道序列。
- 权重分配:
- 首次/末次点击:取首尾渠道,直接累加总转化次数/收益。
- 线性归因:对每个渠道分配权重 1/N(N 为路径长度),例如路径 A > B > C 中每个渠道权重为 1/3。
- 时间衰减:权重按指数衰减,例如路径 A > B > C 的权重可能为 2, 0.3, 0.5(总和为 1)。
数学公式(以线性归因为例)
每条路径的总转化值 V 分配给 k 个渠道,每个渠道的贡献为:贡献 = V/k
所有路径的贡献按渠道累加,得到最终结果。
马尔可夫链模型(Markov Model)
核心思想
基于概率论,通过计算每个渠道对整体转化概率的边际贡献(移除效应),动态评估其价值。核心步骤如下:
- 构建状态转移矩阵:统计所有渠道之间的转移概率。
- 计算基准转化率:基于完整路径的转化概率。
- 模拟移除单个渠道:计算移除该渠道后的转化率变化。
- 归因分数:变化值即为该渠道的贡献。
关键概念
- 状态(States):每个渠道视为一个状态,加上起始状态(start)和转化状态(conversion)。
- 转移概率矩阵(Transition Matrix):记录从状态 i 到状态 j 的概率:$P(i \to j) = \frac{\text{从 i 转移到 j 的次数}}{\text{从 i 转移出去的总次数}}$
- 吸收状态(Absorbing State):conversion 是吸收状态,一旦进入则路径终止。
移除效应计算
- 原始转化率(R):从 start 到 conversion 的总概率。
- 模拟移除渠道C:在转移矩阵中删除所有与 C 相关的转移(进入、离开)。
- 新转化率($R_{-C}$):计算移除 C 后的转化概率。
- 渠道C的贡献:$\text{贡献}_C = R – R_{-C}$
数学推导(简化版)
假设用户路径为 A → B → C → conversion,完整转化概率为:
$$R = P(\text{start} \to A) \times P(A \to B) \times P(B \to C) \times P(C \to \text{conversion})$$
若移除渠道 B,路径可能变为 A → C → conversion,此时:
$$R_{-B} = P(\text{start} \to A) \times P(A \to C) \times P(C \to \text{conversion})$$
贡献值为 $R – R_{-B}$,但实际计算需遍历所有可能路径。
数据处理与算法优化
输入数据预处理
- 路径标准化:统一渠道命名(如大小写、空格处理)。
- 过滤无效路径:如空路径或单渠道路径(对马尔可夫模型无意义)。
马尔可夫链的阶数(Order)
- 一阶马尔可夫(order=1):仅考虑当前状态,忽略历史路径(默认)。
- 高阶马尔可夫:考虑多个历史状态(如二阶模型需记录 A → B 后转移到 C 的概率),计算复杂度指数级增长,实际中较少使用。
计算效率
- 路径概率计算:采用动态规划或矩阵乘法优化。
- 稀疏矩阵处理:对大规模渠道场景使用稀疏矩阵存储转移概率。
优缺点对比
模型类型 | 优点 | 缺点 |
启发式模型 | 计算快,易于解释 | 依赖人工规则,忽略渠道协同效应 |
马尔可夫模型 | 数据驱动,精准量化渠道贡献 | 计算复杂,需大量数据支持 |
示例说明
场景数据
- 路径1:A > B > C,转化次数=2
- 路径2:B > D,转化次数=3
马尔可夫模型计算步骤
- 统计转移概率:
- start → A: 1 次
- A → B: 1 次
- B → C: 1 次, B → D: 1 次
- C → conversion: 1 次
- D → conversion: 1 次
- 构建转移矩阵:
From \ To | A | B | C | D | conversion |
start | 1 | 0 | 0 | 0 | 0 |
A | 0 | 1 | 0 | 0 | 0 |
B | 0 | 0 | 0.5 | 0.5 | 0 |
C | 0 | 0 | 0 | 0 | 1 |
D | 0 | 0 | 0 | 0 | 1 |
- 计算原始转化率R:
- start → A → B → C → conversion 的概率 = 1 × 1 × 0.5 × 1 = 0.5
- start → B → D → conversion 的概率 = 0(因为 start 无法直接到 B)
- 总转化率 R = 0.5(仅路径1有效)。
- 移除渠道B
后的转化率$R_{-B}$:
- 路径1失效(A无法转移到C),路径2失效(start无法到D)。
- 新转化率$R_{-B}$=0。
- 贡献值B=0.5-0=0.5。
ChannelAttribution使用教程
安装ChannelAttribution
通过 pip 安装最新版本:pip install ChannelAttribution
数据准备
归因分析需要特定格式的数据,通常包含用户转化路径(path)和转化结果(conversion或conversion_value)。
示例数据结构
path | conversion | conversion_value |
channel1>channel2 | 1 | 100 |
channel2>channel3 | 0 | 0 |
channel1 | 1 | 50 |
- path:用户接触的渠道路径(按时间顺序排列,用>分隔)。
- conversion:是否发生转化(1/0)。
- conversion_value:转化带来的价值(可选)。
代码示例:生成模拟数据
import pandas as pd data = { "path": ["channel1>channel2", "channel2>channel3", "channel1", "channel3>channel2"], "conversion": [1, 0, 1, 1], "conversion_value": [100, 0, 50, 200] } df = pd.DataFrame(data) print(df)
应用归因模型
ChannelAttribution提供启发式模型和马尔可夫链模型。
启发式模型(HeuristicModels)
包含首次点击、末次点击、线性归因等。
from ChannelAttribution import heuristic_models # 应用启发式模型 heuristic_results = heuristic_models( df, var_path="path", var_conv="conversion", var_value="conversion_value", # 可选 sep=">" ) print(heuristic_results)
输出结果示例:
channel_name | first_touch | last_touch | linear_touch |
channel1 | 150 | 50 | 100 |
channel2 | 0 | 200 | 150 |
channel3 | 0 | 0 | 50 |
- first_touch: 首次点击归因的转化价值。
- last_touch: 末次点击归因的转化价值。
- linear_touch: 线性归因(各渠道平均分配价值)。
马尔可夫链模型(Markov Model)
基于渠道转移概率计算贡献度。
from ChannelAttribution import markov_model # 应用马尔可夫链模型 markov_results = markov_model( df, var_path="path", var_conv="conversion", var_value="conversion_value", # 可选 sep=">", order=1 # 马尔可夫链阶数(默认为1) ) print(markov_results)
输出结果示例:
channel_name | total_conversion | total_conversion_value |
channel1 | 1.2 | 160 |
channel2 | 1.5 | 220 |
channel3 | 0.3 | 60 |
- total_conversion: 渠道贡献的转化次数(加权)。
- total_conversion_value: 渠道贡献的转化价值(加权)。
结果分析与可视化
归因结果对比
合并启发式模型和马尔可夫链结果:
combined_results = pd.merge( heuristic_results, markov_results, on="channel_name", how="outer" ) print(combined_results)
可视化渠道贡献
使用 matplotlib 或 plotly 绘制柱状图:
import matplotlib.pyplot as plt # 马尔可夫模型结果可视化 markov_results.plot(kind="bar", x="channel_name", y="total_conversion_value") plt.title("Channel Contribution (Markov Model)") plt.xlabel("Channel") plt.ylabel("Conversion Value") plt.show()
关键参数说明
参数 | 说明 |
var_path | 数据中代表渠道路径的列名(默认”path”) |
var_conv | 转化标签列名(默认”conversion”) |
var_value | 转化价值列名(可选,如未提供则仅计算转化次数) |
sep | 路径分隔符(默认”>”,需与数据中的分隔符一致) |
order | 马尔可夫链阶数(默认为1,即仅考虑当前渠道与前一个渠道的关系) |
注意事项
- 数据预处理:
- 确保路径中的渠道名称统一(如大小写、空格)。
- 过滤无效路径(如空值或单渠道路径)。
- 模型选择:
- 马尔可夫模型更适合复杂路径分析,但计算量较大。
- 启发式模型简单直观,适用于快速分析。
- 结果解读:
- 马尔可夫模型的结果可能包含小数,表示概率贡献。
- 对比不同模型的结果,结合业务背景调整策略。
常见问题
Q1: 如何处理长路径或稀疏路径?
- 使用 max_steps 参数限制路径最大长度。
- 过滤低频路径(如出现次数<5的路径)。
Q2: 马尔可夫模型结果不稳定?
- 确保数据量足够大(建议至少10,000条转化路径)。
- 调整马尔可夫链阶数(order),尝试 order=2。
Q3: 如何自定义归因模型?
- ChannelAttribution 目前不支持自定义模型,但可通过结果加权组合实现。
参考链接: