用Python中的马尔科夫链进行营销渠道归因 --第一部分:"更简单 "的方法
任何积极开展营销活动的企业都应该对确定哪些营销渠道推动了实际转化率感兴趣。投资回报率(ROI)是一个关键的KPI,这已经不是什么秘密。
在这篇文章中,我们将介绍。
为什么渠道归因很重要? 3种标准归因模型 一个先进的归因模型。马尔科夫链 如何在Python中建立这4种归因模型 本文中的马尔科夫链方法将通过利用R包ChannelAttribution采取一种 "简单 "的方法。关于这个解决方案的完整python实现,请参见本系列的第二部分。
为什么归因很重要? 由于企业可以向客户进行营销的平台越来越多,而且大多数客户都在多个渠道上与你的内容接触,现在决定如何将转换归因于渠道比以往任何时候都更重要。2017年的一项研究表明,92%的消费者第一次访问零售商的网站并不是为了购买(链接)。
为了说明归因的重要性,让我们考虑一个导致转换的用户旅程的简单例子。在这个例子中,我们的用户名叫约翰。
第一天。
约翰对你的产品的认识是由一个YouTube广告引发的,随后访问你的网站,浏览你的产品目录。
经过一段时间的浏览,约翰对你的产品的认识被激发出来,然而他并没有完成购买的打算。
第二天。
第二天,当约翰在他的Facebook上滚动浏览时,他收到了另一个关于你的产品的广告,这促使他回到你的网站,这次约翰完成了购买过程。
在这种情况下,当你想通过营销渠道来计算你的投资回报率时,你将如何把约翰产生的美元归于营销渠道?
传统上,渠道归因是由一些简单而强大的方法来解决的,比如First Touch、Last Touch和Linear。
标准归因模型
3种标准归因模型
最后接触归因
顾名思义,Last Touch是一种归因方法,任何产生的收入都归于用户最后参与的营销渠道。
虽然这种方法的优点是简单,但你也有过度简化归因的风险,因为最后接触不一定是产生购买的营销活动。
在上面John的例子中,最后接触的渠道(Facebook)可能没有创造100%的购买意向。意识来自于观看YouTube广告的最初火花。
第一次接触归因
购买所产生的收入归属于用户在购买过程中接触到的第一个营销渠道。
就像 "最后一次接触 "方法一样,"第一次接触 "归因有其简单的优势,但你也有可能将你的归因方法过度简化。
线性归因
在这种方法中,归因被平均分配给用户在导致购买的旅程中接触到的所有营销渠道。
这种方法更适合捕捉我们在消费者行为中看到的多渠道接触行为的趋势。然而,它没有区分不同的渠道,而且由于不是所有的消费者与营销工作的接触都是平等的,这是这个模型的一个明显的缺点。
其他值得一提的标准归因方法是时间衰减归因和基于位置的归因。
一个先进的归因模型-马尔科夫链
有了上述3种标准的归因方法,我们就有了容易实施的模型来确定我们的营销渠道的投资回报率。
然而,这3种方法的注意事项是,它们过于简化了。这可能会导致人们对营销渠道所推动的结果过于自信。这种疏忽可能是有害的--误导了未来的商业/营销决策。
为了克服这种疏忽,我们可以考虑采用一种更先进的方法-马尔科夫链。
如果你上过统计学课程,你可能会接触到这个理论。马尔科夫链是以俄罗斯数学家安德烈-马尔科夫的名字命名的,它描述了一个可能事件的序列,其中每个事件的概率只取决于前一个事件所达到的状态。
马尔科夫链,在渠道归因的背景下,给我们提供了一个框架来模拟用户旅程,以及每个渠道如何影响用户从一个渠道到另一个渠道最终购买(或不购买)的因素。
在这篇文章中,我们不会对马尔科夫链理论进行太深入的研究。(如果你有兴趣了解更多幕后的数学/统计学,Setosa.io有一篇很好的阅读。)
有2个事件A和E的简单马尔可夫链的例子 马尔可夫链的核心概念是,我们可以使用生成的数据来确定在我们的潜在营销渠道事件和转换事件网络中从一个事件到另一个事件的概率。
在下一节,我们将通过Python代码来实现这些归因框架中的任何一个。
如何在Python中构建4种归因模型 如果你想跟着学,我们在这个例子中使用的数据集可以在这里下载。
本文中的马尔科夫链模型是用R语言中的ChannelAttribution包建立的,完整的Python实现见第二部分。
我们的数据集的结构是以参与活动为列,行是参与的渠道,按时间顺序排列。在这种情况下,每个营销渠道都被分配了一个固定的编号,如果某个用户的第n次参与是在该营销渠道进行的,就会显示在第n列。渠道21是一个转换,我们的数据集只包含转换的用户旅程的记录。
我们的数据集的样本 我们要做的第一件事是导入必要的库
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import subprocess
接下来,让我们加载我们的数据集并清理数据点
装入我们的数据
df = pd.read_csv('Channel_attribution.csv')
抓取要迭代的列的列表
cols = df.columns