数字小站
首发于数字小站
归因分析

归因分析

互联网渠道运营面临的一个重要问题就是如何分配各渠道的运营、推广费用。电商网站通常会同时发起多个活动,一件商品可能出现在多个活动中,各个活动对商品销售的影响力有多大?这两个问题是典型的归因问题。概况来说,归因分析是识别所有对最终转化有贡献的过程,并确定每个过程的贡献度。然而,根据我个人的经验,归因分析可能是互联网数据分析中最难解决的一个问题,没有之一。数据缺失、数据丢失、虚假流量都是归因分析的障碍,而且还不好解决。先不管这些,下面将介绍一下互联网数据分析中的常用的一些归因算法。

归因模型分类

根据模型采用的算法,可以将归因模型分为两类:

1. 启发式归因

顾名思义,启发式归因主要起启发作用,是一种快速分析方法。它使用简单的算法,计算各个触点、渠道对转化的贡献度。

2. 算法归因

利用统计或者机器学习方法分析各个触点对最终转化的影响程度。与启发式归因相比,它更加客观,不受到使用者偏好的影响。常见的算法有logistics回归、生存模型、probabilistic模型、markov模型等。

在实际中,不管使用哪种归因算法,我们都要注意不同品类的广告面对的消费者群体可能不一致,构建模型时有必要进行分层建模,例如针对高价值用户建模或者针对偏好聚类结果建模。

启发式归因 - heuristic attribution

常见的启发式归因方法有6种,如下图所示。启发式归因的理解比较简单,更多关于启发式归因的内容见google analytics文档(support.google.com/anal)。

启发式归因的缺点比较明显,它们都是主观的权重分配方法。然而,在实际运营中,不同品类、渠道,甚至不同时期的渠道归因的真实分配规则可能都不一样。下面说一下以上这些启发式归因各自的缺点:

  • “最终点击”、“最终非直接点击”、“首次点击”这三种归因方法将所有的转化贡献归属到N个渠道中的某一个,忽略的其他渠道对转化的贡献。
  • “线性归因”认为所有的渠道贡献都一样,强调广告的提醒功能,不适合长转化路径,这明显会对低估和高估某些渠道的真实贡献。
  • “线性衰减”不适合短转化路径,因为这时候衰减作用还未发生。

目前,广告行业内主流的CPA/CPS结算方式还是按照最终点击计算。为什么大多按照最终点击计算,我们来看一些数据(来自国内某大型广告分发平台的后台数据)。从用户接触的触点数量看,74.3%的所有用户和85.4%的转化用户只接触一个触点,或者说只接触过一次广告。从用户接触的渠道数量看,92.1%的用户只接触了一个渠道。从这些数据可以看出最终点击的归因方式有其合理性,这也是为什么流量作弊存在的重要原因。通过IDFA/Cookie撞库、预点击、替换APK、肉机等方式,我们就可以轻易薅到广告主的羊毛。特别是替换APK的作弊流量,实际上就是真实流量,有转化也有留存,非常难甄别。互联网领域内,买流量、流量作弊的现象非常严重,你花10000块钱推广App,如果不选好渠道,可能只能带来几个真实用户。

算法归因 - algorithm attribution

算法归因使用统计方法或者机器学习方法来确定转化贡献度,它是一种客观方法,而上面提到的启发式归因则是主观方法。算法归因本质上是一个分类问题,目标值通常是未来一段时间内用户是否转化(购买、下载等行为)。将渠道、渠道组合的变量二元化,构建分类模型,通过变量重要性计算渠道、渠道组合对转化的贡献度。我们还可以构建算法归因系统,将不同类别(如3C、服装、化妆品等)的数据清洗后输入系统,自动得到相应的渠道归因。下面主要以logistic为例,讲述如何应用算法归因。

1. logistic归因模型

logistic归因模型实际上是通过构建logistic分类模型,得到变量系数,然后计算出渠道对转化的贡献度。

数据准备

这里不考虑过滤虚假流量。构建模型需要2部分数据:自变量X和因变量Y。X来自各平台的广告曝光、点击数据,我们一般选择点击数据(不选择曝光数据的原因在文章最后会提到),Y来自用户在网站、APP内的转化行为数据。

转化数据Y很好理解,Y值就是用户是否转化(转化=1,未转化=0)。X的数据处理就没这么简单了,我们需要考虑以下几个问题:

  • 单个转化路径的拆分。转化路径的终点是用户发生了转化,但是如果用户没有发生转化,转化路径应该多长呢?我个人认为如果2条广告访问记录的时间间隔小于3天,那么这两条访问记录在同一个转化路径内。如下图所示,C和D之间的时间间隔大于3天,所以A-B-C-D-C-E可以拆分为两个转化路径,一是A-B-C-0(未转化),二是D-C-E-1(转化)。理论上,如果用户接触外部推广的时间间隔小于3天,并且没有转化,用户的转化路径长度可以无限延长。
  • 未结束的转化路径。在处理数据时,我们还会面对一些没有结束的转化路径。例如下图的示例,数据截止日期是2018-01-31,用户1在2018-01-31点击了F渠道的广告,但是当天没有转化行为,我们当时不知道他以后会不会转化(虽然在后面几天转化了),所以我们需要丢弃用户1的转化路径(C=>F=>D)。
  • 合并重复行为。理论上,每次加载页面的时候,广告都会算一次曝光,而有时候会出现广告加载正常、页面加载失败或者用户多次刷新页面的情况。用户有时候会短时间内多次浏览、点击广告,我们无法判断用户的行为是有意还是无意。我认为用户短时间内的相同行为并不会对用户的认知造成太大影响。另外,用户重复点击同一个广告的概率非常低,根据我接触到的数据,一般不会超过3%。所以我认为需要合并这些重复行为。我们可以将5分钟内(时间阈值可自定义)的重复行为合并为一条记录。如下图所示,将10:01-10:04的记录合并,虽然10:07也是同样的记录,但是距离10:01已经超过5分钟,可以有充足的理由认为广告至少曝光了2次。
  • 渠道协同效应。渠道协同指的是在多个渠道同时投放广告,并取得1+1>2的效果。在实际中,我们可以这样来生成渠道协同变量:如果用户在制定时间窗口内同时访问了渠道A和渠道B,那么就用A*B来表示,记A*B=1。如下图所示,可以设时间阈值N=2,渠道C的访问时间-渠道A的访问时间小于2天,渠道D的访问时间-渠道A的访问时间大于2天,那么我们生成A*B、A*C、B*C三个变量,并记为1,然后移动时间窗口。在建模时,我们可以生成两份数据,一份是不带协同效应的数据,一份是带有协同效应的数据。
  • 其他关键变量。在构建面向老用户的模型时,要考虑到每个用户的转化倾向是不同的,有些人天生转化率低一些,有些人高一些。我们要将老用户的转化倾向加入模型,如平均转化率、最大转化率、最小转化率、转化率方差、转化率中位数。

模型构建

因为用户转化是小概率事件,有转化的用户路径一般不超过5%,我们在建模时要面对数据严重不平衡问题。对于这类问题,我们可以使用欠采样的easyensemble或者balancecascade算法,算法的细节就不解释了,网上到处都有。过采样容易造成过拟合,训练集效果好,但是测试集效果就差不少了。而SMOTE方法在大数据量和高维度情况下速度太慢。我们建模的主要目的是评估各个渠道的相对贡献度,把固定的预算分配到各个渠道,就算渠道不是转化的重要变量也得分出个三六九等,所以不用太在意AUC、LogLoss等指标,不是太差就行了。

计算渠道贡献度

要注意的是,logistic模型计算的系数并不能直接用于评估渠道重要性,需要经过一系列转换:

  • 我们首先利用模型的系数β计算Odds Ratio,OR=exp(βi),由于最终转化率通常比较低(一般不高于3%),所以用OR值近似RR值
  • 再利用RR值计算人群归因危险度PAR(Population Attributable Risk)或PAF( Population Attributable Fraction),PAR的计算公式: PAR = Pe (RRe-1) / [1 +
    Pe (RRe-1)],参考
The Population Attributable Fractionsphweb.bumc.bu.edu图标

。其中,pe是二元变量值为1的记录的转化率,RRe是上面计算的变量的OR值。

  • 计算出的PAR值才是实际的渠道转化归因权重,以下是曾经做过的一个电商渠道转化归因分析,将logistic归因和last click归因(带来的销售额)的比较,可以看到SEM、邮件和社交渠道的归因贡献差不多,但是展示广告和信息流广告渠道的效果起伏就比较大了。

2. 基于生存分析的归因模型

与logistic回归一样,cox模型也能计算出变量的RR值,但是cox模型和logistic模型有显著的区别。首先,cox模型无法预测最终的转化可能性,因为我们使用cox模型的时候不会去计算h(t)函数。其次,cox模型还需要最后一次接触广告与转化行为之间的时间间隔,而logistic模型只关注是否转化,没有利用到时间信息。最后,cox模型可以直接计算出RR值,而logistic模型计算出的是OR值,需要经过换算才能得到RR值。

在应用cox回归模型时,我们可以在logistic模型数据的基础上增加时间列,表示最后一次接触广告和转化之间的小时或者分钟间隔T1,这个T1要小于等于我们设定的间隔阈值T。利用python的包Lifelines或者R的survival包可以很方便的计算出RR值,再计算出人群归因危险度PAR值。

3. 其他归因模型

算法归因除了上面介绍的两个模型外,常见的模型还有probabilistic模型(《A Probabilistic Multi-Touch
Attribution Model for Online Advertising》)和基于markov过程的模型(《Mapping the Customer Journey: A Graph-Based Framework for Online
Attribution Modeling》)。我们可以直接调用R包ChannelAttribution(cran.r-project.org/web/)基于markov过程计算各渠道贡献度。

归因分析的应用:要不要在这个渠道投放广告

理论上,一个新渠道的运营要经过3个过程:渠道属性分析、投放测试和投放优化。但是有些合作渠道、涉及金额较小的渠道可能很少会去针对性的优化投放。

在实际运营中,第一步的分析工作通常需要借助第三方工具。比如我们可以利用微博指数、百度指数分析渠道相关关键字的人群属性和流量趋势;利用talking data的移动观象台或者quest mobile的数据去了解某个app的运营概况。第二和第三个问题的分析需要从渠道的作用入手。在互联网业务中,渠道有两个主要作用:获取流量和促进转化。不是说一个渠道的转化归因很低就可以不投这个渠道。比如说,我们有一个移动站,100%的流量来自于uc广告,那么从转化贡献度角度来看,uc渠道的算法归因贡献度是0。因为对于logistic归因模型来说,uc渠道是一个冗余变量。但是你能不投uc吗?所以,我们要综合两方面去考虑,用3或7日留存用户数量(使用留存用户是为了排除垃圾流量、低质量流量)与渠道转化贡献度这两个指标来构建象限图,直观的分析渠道质量。

如下图所示(tableau制作),x轴是转化贡献率,y轴是7日回访用户数,圆圈大小表示渠道总用户数。渠道B和F的回访人数差不多,渠道B的转化贡献度高于渠道F,但是渠道B的留存率低于渠道F。接下来我们就要仔细分析渠道用户的商品、购买行为偏好,也许渠道B都是价格敏感用户或者是羊毛党导致其留存率低于渠道F。

总结

理论上来说,归因分析应当是一个非常有用的分析方法。但在实际应用时存在一些难以克服的问题,最大的问题是数据质量的问题,一个模型再好,如果数据质量不行,那也是GIGO(garbage in garbage out)。

1. 数据质量——数据割裂。在移动互联网时代,数据阵营化现象非常明显,腾讯系、阿里系、百度系、各种DSP平台的数据完全不互通,导致无法准确生成用户接触广告的路径。举个常见的例子,一个化妆品行业的广告主通过2个DSP平台投放广告,由于这两个DSP平台数据不互通,造成同一个用户可能会有两个不同的唯一编号(生成用户ID的规则不一致),我们就不能生成这个用户的广告曝光路径,只能获取广告点击数据。

2. 数据质量——数据丢失。在web时代,我们追踪流量来源的时候,就有来源丢失的问题(js跳转、跨域等原因)。在app时代,来源丢失问题更加严重,点击链接跳转到app总是很容易失败,特别是在机型复杂的安卓系统上。

3. 数据质量——虚假流量。根据admaster发布的数据,广告行业有3%-37%的虚假流量。根据我的实际经验,虚假流量比例远高于这个数字。广告的业务模式(CPC、CPM、CPA、CPD等)就决定了虚假流量无法避免,虚假流量的识别越来越困难。所以,基于这些数据做出来的渠道归因分析有多少可信度呢?只有天知道。

4. 线下广告。渠道归因模型只针对互联网广告,而线下广告仍然占比较大(来自尼尔森的数据显示,2017年电视广告份额稳定,电台广告份额快速增长),我们很难同时计算线上、线下渠道贡献度。

5. 人为因素。有一些广告订单是关系单、人情单或者是回扣单,效果差没关系,可以和平台方一起针对KPI用一些作弊手段改进数据质量嘛。

6. 难以测试。我们投放dsp广告时,可以基于地区、人口属性进行A/B测试。但是,我们的广告不可能只投dsp渠道,也要在相关app、网页上投放,这时候就无法分人群进行A/B测试。我们还可以用策略A投放一个月,再用策略B投放一个月,比较两者的效果,但是这样比较也没用意义啊。一个月中,app都不知道升级多少次,页面不知道优化几回了,市场环境、热点不知道轮换几次了。所以我一直不知道许多学术论文是怎么测试归因算法A比归因算法B更好,我看过的所有论文都没说具体的测试过程。

综上所述,我认为不同的归因算法在实际应用中的差异不大。想到上面这些问题,是不是觉得渠道归因分析就是个没什么卵用的东西?其实也不是,我们可以找出特别高效或者特别低效的渠道,找出渠道的一些共性,可以是基于访问数据的,也可以是基于分析师对渠道的认知,让运营少踩坑,毕竟投放广告也是要钱的。

编辑于 2018-06-11

文章被以下专栏收录