数据运营 36 计(5):马尔可夫链对营销渠道归因建模,R 语言实现

Tian
Tian
Tian
33
文章
7
评论
2021年2月15日14:57:27
评论
404 5067字阅读16分53秒
摘要

用户行为路径中的每个渠道可以看作这里的每个状态。在知道状态空间的情况下,所求的渠道贡献率就是每条路径的转移概率。所以马尔可夫链模型可以用来做归因分析。

​1. 马尔可夫链

马尔可夫链是一个过程,它映射运动并给出概率分布,从一个状态转移到另一个状态。马尔可夫链由三个属性定义:

  • 状态空间:处理可能存在的所有状态的集合
  • 转移概率:从一个状态转移到另一个状态的概率
  • 当前状态分布 - 在过程开始时处于任何一个状态的概率分布

那么用户行为路径中的每个渠道可以看作这里的每个状态。在知道状态空间的情况下,所求的渠道贡献率就是每条路径的转移概率。所以马尔可夫链模型可以用来做归因分析。

2. 基于马尔可夫链的归因分析原理

在任何完成转化的路径中,客户可能会进行多次搜索,与同一广告客户的多个广告渠道进行互动,那么每个广告渠道应该为每次点击或购买等行为归功获得多少利益,这里借助归因分析方法来求解,以便更好地了解广告渠道质量和优化投放渠道。在谷歌分析 GA 中对多渠道营销归因的分析中,理解用户行为的一种流行方法是使用简单的启发式方法(如用户第一次点击、最后一次点击和线性归因)。
数据运营 36 计(5):马尔可夫链对营销渠道归因建模,R 语言实现

图 1 启发式归因方法

“首次点击”、“最终点击”、“首次点击”这三种归因方法将所有的转化贡献归属到 N 个渠道中的某一个,忽略的其他渠道对转化的贡献。比如“首次点击”即最终转化的用户归功为用户第一次接触的渠道。“线性归因”认为所有的渠道贡献都一样,强调广告的提醒功能,不适合长转化路径,这明显会对低估和高估某些渠道的真实贡献。
上面提到的启发式归因则是主观方法。当广告商清楚你归因计算的方法,那么可以轻易流量作弊。而算法归因更客观的使用统计方法或者机器学习方法来确定转化贡献度。这里介绍 Markov 建模探究每个渠道的贡献程度。

马尔科夫模型确定用户从序列A转换到序列B的概率。这些序列的内容由马尔科夫阶数决定,马尔科夫阶数从 0 到 4。以下面的例子为例:

  • 0 阶:不知道用户来自哪里,也不知道用户的步骤,只知道访问任何页面的概率。
  • 1 阶:返回0步。用户现在在 A。去任何地方的概率基于在那个步骤。
  • 2 阶:向后一个阶段。用户来自 A,目前处于 B。去任何地方的概率取决于用户在哪个阶段。
  • 3 阶:向后两个阶段。用户来自 A > B,目前处于 C。去任何地方的概率取决于用户在哪个阶段。
  • 4 阶:返回三个阶段。用户来自于 A > B > C,现在是 D。

假设用户X的步骤如下:A > B > C > D > E > F > G. 4 阶马尔可夫模型会显示用户 X 来自 A(A> B > C > D),然后经过序列 B (B > C > D > E),再到序列 C (C > D > E > F),等等,直到用户 X 退出或转换。马尔可夫模型这里的阶数参数决定了用户现在的状态或所处阶段是由过去几个阶段决定的。但是这里决定阶数比较困难,一种方法是通过将设置多个阶数模型来绘制训练模型的误差,选取误差小的模型,从而确定模型的阶数。

数据运营 36 计(5):马尔可夫链对营销渠道归因建模,R 语言实现

图 2 用户路径

在上述情况下,客户可以通过渠道 'C1' 或渠道 'C2' 开始他们的路径。以 C1 或 C2 开始的概率为 50%(或0.5)。我们首先计算转换的总体概率,然后进一步查看每个渠道的影响。

P(转换)= P(C1→C2→C3→转换)+ P(C2→C3→转换)

= 0.5 * 0.5 * 1 * 0.6 + 0.5 * 1 * 0.6

= 0.15 + 0.3

= 0.45

如果要弄清楚渠道 C1 在用户转化路径中的贡献,使用移除效应原则。即如果想要在用户路径中找到某个渠道的贡献,可以通过删除该渠道并查看在没有该渠道的情况下发生了多少次转化。

P(去除C1后的转换)= P(C2→C3→转换)

= 0.5 * 1 * 0.6

= 0.3

30% 的用户互动可以在没有渠道 C1 的情况下进行转换; 而 C1 完好无损,45% 的互动可以转换。所以,C1的移除效应是0.3 /0.45= 0.67。C2 和 C3 的移除效应可以直接得出为 1。那么渠道 C1 贡献度为 0.67/(0.67+1+1)=25%, 同理 C2=C3=37.5%。

这是马尔可夫链的一个非常有用的应用。在上述情况下,所有渠道 C1,C2,C3(在不同阶段)被称为转换状态 ; 而从一个渠道转移到另一个渠道的概率称为转移概率。用户路径是由一系列渠道组成的,可以看作是一个有向马尔可夫图中的一个链,其中每个顶点都是一个状态(渠道),每条边表示从一个状态移动到另一个状态的转移概率(渠道转化率)。由于到达状态的概率仅取决于以前的k阶状态,因此可以将其视为无记忆马尔可夫链。

上面每条路径中的具体转化率怎么通过由用户路径和转化数据计算得到的呢?比如有以下的用户转化路径,那么在这个马尔可夫链中,START、A、B 和 CONVERSION 为状态空间。

数据运营 36 计(5):马尔可夫链对营销渠道归因建模,R 语言实现

图 3 每个状态之间的转移次数

通过统计每个状态之间的转移次数,即可画出上一个例子中的转化图(下图左图)。计算移除效应,当去除渠道 A 时,无法转化,因此渠道 A 的移除效应为 1,而 B 的移除效应为 0.5(由下图左图简化为右图得出),因此 3 次转化结果中,渠道 A 贡献为 2 次转化,渠道 B 贡献转化 1 次。

数据运营 36 计(5):马尔可夫链对营销渠道归因建模,R 语言实现

图 4 转化图

 

3. R 语言实现营销渠道归因分析

这里直接用R语言里面的 ChannelAttribution 库来进行例子解释,Demo 里面的数据包括4列,每行为每个用户的行为路径,“path”  列为用户转化路径,“total_conversions”  列为转化的次数,“total_conversions_value”  列为营销渠道的收益价值,“total_null”  列为用户没有转化的路径数量。数据展示如下:
数据运营 36 计(5):马尔可夫链对营销渠道归因建模,R 语言实现

图 5 转化行为路径

## markov_model attribution
library(ChannelAttribution)
library(reshape)
library(ggplot2)
​
# This loads the demo data.
data(PathData)
​
# 启发式模型
H <- heuristic_models(Data, 'path', 'total_conversions'
                      , var_value='total_conversion_value')
# 马尔可夫模型
M <- markov_model(Data, 'path', 'total_conversions'
                  , var_value='total_conversion_value', order = 1)
​
R <- merge(H, M, by='channel_name') 
# Selects only relevant columns
R1 <- R[, (colnames(R)%in%c('channel_name'
          , 'first_touch_conversions'
          , 'last_touch_conversions'
          , 'linear_touch_conversions'
          , 'total_conversion'))]
          
# Renames the columns
colnames(R1) <- c('channel_name', 'first_touch'
                , 'last_touch', 'linear_touch', 'markov_model') 
​
R1 <- melt(R1, id='channel_name')
​
ggplot(R1, aes(channel_name, value, fill = variable)) +
  geom_bar(stat='identity', position='dodge') +
  ggtitle('TOTAL CONVERSIONS') + 
  theme(axis.title.x = element_text(vjust = -2)) +
  theme(axis.title.y = element_text(vjust = +2)) +
  theme(title = element_text(size = 16)) +
  theme(plot.title=element_text(size = 20)) +
​  ylab("")
将启发式模型和马尔可夫模型进行建模并对比分析,“总转化次数”条形图展示了每个模型的每个渠道的转化次数,紫色条形图为 markov model,其他三个为启发式算法模型。分析图形可以发现 markov model 得到的结果中 alpha 渠道的转化次数贡献上并没有像启发式算法分析得那么重要。而 epsilon、lambda、theta和 zeta 比简单的启发式有更重要的转化贡献。

数据运营 36 计(5):马尔可夫链对营销渠道归因建模,R 语言实现

图 6 各模型总转化次数各渠道贡献情况

​R2 <- R[, (colnames(R)%in%c('channel_name'
                            , 'first_touch_value'
                            , 'last_touch_value'
                            , 'linear_touch_value'
                            , 'total_conversion_value'))]
colnames(R2) <- c('channel_name', 'first_touch'
                  , 'last_touch', 'linear_touch', 'markov_model')
R2 <- melt(R2, id='channel_name')
​
ggplot(R2, aes(channel_name, value, fill = variable)) +
  geom_bar(stat='identity', position='dodge') +
  ggtitle('TOTAL VALUE') + 
  theme(axis.title.x = element_text(vjust = -2)) +
  theme(axis.title.y = element_text(vjust = +2)) +
  theme(title = element_text(size = 16)) +
  theme(plot.title=element_text(size = 20)) +
  ylab("")

“转化价值”条形图展示了每个模型的每个渠道的转化价值收益(比如货币),紫色条形图为 markov model,其他三个为启发式算法模型。分析图形可以发现 markov model 得到的结果中 alpha 渠道的价值贡献上并没有像启发式算法分析得那么重要。而 epsilon、lambda、theta 和 zeta 比简单的启发式有更重要的价值贡献。

数据运营 36 计(5):马尔可夫链对营销渠道归因建模,R 语言实现

图 7 各模型转化价值各渠道贡献情况

最后得到转移矩阵,即第二点例子中的转化路径图,每个渠道的转化率即为转移概率,比如第一条路径从开始状态到渠道1(eta)的转化率为 0.157。将得到的转移矩阵再用来计算每个渠道的移除效应,也可得到每个渠道的贡献度。

# 转移概率矩阵
T <- transition_matrix(Data, 'path', 'total_conversions'
        , 'total_conversion_value', order=1, sep=">",flg_equal=TRUE)
数据运营 36 计(5):马尔可夫链对营销渠道归因建模,R 语言实现

图 8 各渠道转化贡献度

 

4. 学习资料

  • 论文推荐:《Mapping the Customer Journey: A Graph-Based Framework for Online Attribution Modeling》一文直接全面清晰地讲解了马尔可夫链对营销渠道归因建模的原理和求解的过程。
  • R语言ChannelAttribution库
  • 参考博客:https://blog.csdn.net/qq_19600291/java/article/details/79531623
  • https://www.slideshare.net/adavide1982/markov-model-for-the-multichannel-attribution-problem
weinxin
微信公众号
微信公众号搜索关注「DataGo 数据狗」 数据分析从 0 到 1 再到 2 。
Tian
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: