1. 基础概念介绍
归因分析是数据分析以及BI(Business Intelligence)中一项常见功能,可以很简单,也可以很复杂,具体视不同问题而定。
最近因为偶然的机会,需要解决一些归因分析的问题。所以看了一些这方面的资料,作为初学者(或者说外行),发现外部的资料并不丰富(或者是叙述不够完整,让初学者看后丈二和尚摸不着头脑),这里从初学者的角度来总结一下所看所学,有不对的地方还请大家指正。
首先,我们来看,为什么需要归因分析?或者说归因分析可以用来解决什么问题?假设我是最近大火的《哪吒2》的导演,我想要知道和《哪吒1》相比,《哪吒2》在制作方面的哪些调整是对票房提升最为关键的因素。
假设我们有以下《哪吒1》和《哪吒2》的产品特性对比图(虚构的)
要素\电影名称 | 《哪吒2》 | 《哪吒1》 |
---|---|---|
片长( X 1 X_1 X1) | 200分钟 | 150分钟 |
分辨率( X 2 X_2 X2) | 8K | 6K |
涉及角色个数( X 3 X_3 X3) | 20 | 30 |
长镜头个数( X 4 X_4 X4) | 150 | 200 |
票房收入( Y Y Y) | 60亿人民币 | 50亿人民币 |
我们可以看到《哪吒2》比《哪吒1》票房收入高10亿人民币,那么是哪个制作要素的调整最为重要,每一种制作要素对于票房变化的贡献率又是多少?这些问题,看似不简单,实际上一点儿也不简单。归因分析就是用来帮助我们解决这类问题,帮助我们给出量化的结果,从而帮助优化后续的ROI(投入产出比)。
如果我们认为票房收入(使用
Y
Y
Y表示),是由“偏长”、“分辨率”、“涉及角色个数”、“长镜头个数”,共同决定的。我们不妨使用一个函数
f
(
⋅
)
f(\cdot)
f(⋅)来表示这种关系,即:
Y
=
f
(
X
1
,
X
2
,
X
3
,
X
4
)
Y = f(X_1, X_2, X_3, X_4)
Y=f(X1,X2,X3,X4)
显然在当前的场景下,我们不知道
f
(
⋅
)
f(\cdot)
f(⋅)具体是什么。但是我们认为
Y
Y
Y的前后变化,肯定是跟
X
i
X_i
Xi以及
f
(
⋅
)
f(\cdot)
f(⋅)紧密相关的。
归因分析可以解决很多种场景下的问题,而这些场景下,很多都有清晰的 f ( ⋅ ) f(\cdot) f(⋅)的定义。下面我们来具体看看。
2. 简单问题的归因分析
在正式介绍之前,我们首先定义一些符号,以便后续讲解方便。我们一般使用 Y Y Y来表示结果(例如UV、PV、GMV等数值),使用 Y 0 Y_0 Y0表示基期的结果(所谓“基期”一般是指之前的结果),使用 Y 1 Y_1 Y1表示“当期”的结果。例如我们要对比一款手机在今年二月相对今年一月的销售量变化。这时“基期”结果就是一月的销量;而“当期”结果就是二月的销量;
另外,我们使用 X i , i = 1 , 2... X_i, i=1,2... Xi,i=1,2...来表示影响 Y Y Y的因素。所谓归因分析,就是要找到每一个因素 X i X_i Xi对 Δ Y = Y 1 − Y 0 \Delta Y = Y_1 - Y_0 ΔY=Y1−Y0的影响程度 D X i D_{X_i} DXi。
可能还是看上去很抽象的样子,下面来通过一些具体的场景来看一下如何计算每一个因素 X i X_i Xi对 Δ Y \Delta Y ΔY的影响程度。
2.1 加法型指标的归因分析
所谓加法型指标,就是指这个指标的计算可以表示为相关因素的和。例如,一款手机的总销量 Y Y Y是汇总各个城市的销量。如:
城市 | 一月销量(基期) | 二月销量(当期) |
---|---|---|
北京( X 1 X_1 X1) | 20w | 25w |
上海( X 2 X_2 X2) | 25w | 18w |
深圳( X 3 X_3 X3) | 15w | 30w |
成都( X 4 X_4 X4) | 10w | 9w |
总销量 Y Y Y | 70w | 82w |
经过验证,可以看出来,在上面的表格中,一月总销量和二月总销量都满足公式:
Y
=
X
1
+
X
2
+
X
3
+
X
4
Y = X_1 + X_2 + X_3 + X_4
Y=X1+X2+X3+X4
我们现在希望知道,相对于基期,当期销量的变化,都是由哪些城市的销量主导的。或者说我们希望量化每一个城市的销量
X
i
X_i
Xi对销量变化率
Δ
Y
%
=
(
Y
1
−
Y
0
)
/
Y
0
\Delta Y \% = (Y_1 - Y_0)/Y_0
ΔY%=(Y1−Y0)/Y0的贡献程度
D
X
i
D_{X_i}
DXi,即我们希望计算出
D
X
i
D_{X_i}
DXi使得:
Δ
Y
%
=
∑
i
D
X
i
(
1
)
\Delta Y \% = \sum_i D_{X_i} \qquad (1)
ΔY%=i∑DXi(1)
那么我们可以如何计算出每一个
D
X
i
D_{X_i}
DXi呢?其实也很简单,就是我们把
Δ
Y
%
\Delta Y \%
ΔY%的计算公式展开,然后分摊到每一个
X
i
X_i
Xi上(即
D
X
i
D_{X_i}
DXi),使得
Δ
Y
%
\Delta Y \%
ΔY%看上去是由
D
X
i
D_{X_i}
DXi来组成的。
我们对公式
(
1
)
(1)
(1)进行展开,可以得到:
Δ
Y
%
=
Y
1
−
Y
0
Y
0
=
∑
i
X
1
,
i
−
∑
i
X
0
,
i
Y
0
#
X
1
,
i
表示当期因素;
X
0
,
i
表示基期因素;
=
∑
i
(
X
1
,
i
−
X
0
,
i
)
Y
0
(
2
)
\begin{align*} \Delta Y \% &= \frac{Y_1 - Y_0}{Y_0} \\ &= \frac{\sum_i X_{1,i} - \sum_i X_{0,i}}{ Y_0} \qquad \#X_{1,i}表示当期因素;X_{0,i}表示基期因素;\\ &=\sum_i \frac{ (X_{1,i} - X_{0,i})}{Y_0} \end{align*} \qquad (2)
ΔY%=Y0Y1−Y0=Y0∑iX1,i−∑iX0,i#X1,i表示当期因素;X0,i表示基期因素;=i∑Y0(X1,i−X0,i)(2)
如果,我们令
D
X
i
=
(
X
1
,
i
−
X
0
,
i
)
/
Y
0
D_{X_i} = (X_{1,i} - X_{0,i})/Y_0
DXi=(X1,i−X0,i)/Y0,则这时候,显然有
Δ
Y
%
=
∑
i
D
X
i
\Delta Y \% = \sum_i D_{X_i}
ΔY%=∑iDXi
所以在加法型指标的归因中,每一个因素 X i X_i Xi对 Δ Y % \Delta Y \% ΔY%的贡献程度就是 ( X 1 , i − X 0 , i ) / Y 0 (X_{1,i} - X_{0,i})/Y_0 (X1,i−X0,i)/Y0
使用我们这里定义的 D X i D_{X_i} DXi,我们可以对上面的例子计算出每一个 D X i D_{X_i} DXi,如下表所示:
城市 | 一月销量(基期) | 二月销量(当期) | 各因子贡献率 |
---|---|---|---|
北京( X 1 X_1 X1) | 20w | 25w | D X 1 = 7.14 % D_{X_1} = 7.14 \% DX1=7.14% |
上海( X 2 X_2 X2) | 25w | 18w | D X 2 = − 10 % D_{X_2} = - 10 \% DX2=−10% |
深圳( X 3 X_3 X3) | 15w | 30w | D X 3 = 21.43 % D_{X_3} = 21.43 \% DX3=21.43% |
成都( X 4 X_4 X4) | 10w | 9w | D X 4 = − 1.43 % D_{X_4} = -1.43 \% DX4=−1.43% |
总销量 Y Y Y | 70w | 82w | Δ Y % = 17.14 % \Delta Y \% = 17.14 \% ΔY%=17.14% |
总的销量变化率为17.14%,其中贡献最大的是深圳,其销量贡献了其中的21.43%,而贡献最小(其实是拉后腿的)的是上海,贡献了-10%;
这里需要注意的一点是,在这种实现的方法中,我们只保证了 Δ Y % = ∑ i D X i \Delta Y \% = \sum_i D_{X_i} ΔY%=∑iDXi,但 D X i D_{X_i} DXi可以为正也可以为负。从业务层面来解释,“正”代表了正向的贡献度,“负”表示了与总体结果变化( Δ Y % \Delta Y \% ΔY%)的相反的方向上的贡献度,即假如 Δ Y % > 0 \Delta Y \% \gt 0 ΔY%>0,而 D X i < 0 D_{X_i} \lt 0 DXi<0表示 X i X_i Xi在过程中业绩产生了下滑,给整体业绩拖了后腿。
加法型指标的归因分析是一种合理的拆分各因子贡献度的方法。大家如果还是不理解,不妨亲自使用例子中的数据手算一遍,就能很快掌握加法型指标的归因过程。
2.2 乘法型指标的归因分析
所谓乘法型指标,是指结果 Y Y Y的计算由于各个因子 X i X_i Xi的乘积组成。例如: 总利润 = 商品总销量 x 单价 x 平均利润率,在这个场景下,总利润 Y Y Y和各因子 X i X_i Xi之间构成了乘法型指标。
下面,我们来正式定义一下,乘法型指标的问题,假设我们的指标
Y
Y
Y可以拆分为如下的形式:
Y
=
X
1
×
X
2
.
.
.
=
∏
i
=
1
n
X
i
(
3
)
Y = X_1 \times X_2 ...= \prod_{i=1}^n X_i \qquad (3)
Y=X1×X2...=i=1∏nXi(3)
指标
Y
Y
Y的变化比
Δ
Y
%
\Delta Y \%
ΔY%依然是:
Δ
Y
%
=
Y
1
−
Y
0
Y
0
(
4
)
\Delta Y \% = \frac{Y_1 - Y_0}{Y_0} \qquad (4)
ΔY%=Y0Y1−Y0(4)
那么问题来了,怎么才能让
Δ
Y
%
\Delta Y \%
ΔY% 拆分成
∑
i
n
D
X
i
\sum_i^n D_{X_i}
∑inDXi的形式呢? 直观上来说,我们怎么把乘法变成加法?答案是取“对数”操作,对于式子
(
3
)
(3)
(3),我们有
log
Y
=
∑
i
=
1
n
log
X
i
\log Y = \sum_{i=1}^n \log X_i
logY=∑i=1nlogXi ,很好,我们可以利用这种方法把公式
(
3
)
(3)
(3)变成加法形式,下面,我们把这种操作具体应用到“基期”和“当期”的两个等式
(
5
)
(5)
(5)上:
Y
0
=
∏
i
=
1
n
X
0
,
i
Y
1
=
∏
i
=
1
n
X
1
,
i
(
5
)
\begin{align*} Y_0 = \prod_{i=1}^n X_{0,i} \\ Y_1 = \prod_{i=1}^n X_{1,i} \end{align*} \qquad (5)
Y0=i=1∏nX0,iY1=i=1∏nX1,i(5)
即,对
(
5
)
(5)
(5)中的两个等式左右两边同时取对数,然后再用第二个式子减去第一个式子,可以得到:
log
Y
1
−
log
Y
0
=
∑
i
=
1
n
log
(
X
1
,
i
X
0
,
i
)
(
6
)
\log Y_1 - \log Y_0 = \sum_{i=1}^n \log \left(\frac{X_{1,i}}{X_{0,i}} \right) \qquad (6)
logY1−logY0=i=1∑nlog(X0,iX1,i)(6)
对等式
(
6
)
(6)
(6)两边同时除以
log
Y
1
−
log
Y
0
\log Y_1 - \log Y_0
logY1−logY0,然后再乘以
Y
1
−
Y
0
Y
0
\frac{Y_1 - Y_0}{ Y_0}
Y0Y1−Y0 我们就可以得到:
Δ
Y
%
=
Y
1
−
Y
0
Y
0
(
log
Y
1
−
log
Y
0
)
∑
i
=
1
n
log
(
X
1
,
i
X
0
,
i
)
=
∑
i
=
1
n
Y
1
−
Y
0
Y
0
(
log
Y
1
−
log
Y
0
)
log
(
X
1
,
i
X
0
,
i
)
(
7
)
\begin{align*} \Delta Y \% &= \frac{Y_1 - Y_0}{Y_0 (\log Y_1 - \log Y_0)} \sum_{i=1}^n \log \left ( \frac{X_{1,i}}{X_{0,i}} \right) \\ &= \sum_{i=1}^n \frac{Y_1 - Y_0}{Y_0 (\log Y_1 - \log Y_0)} \log \left ( \frac{X_{1,i}}{X_{0,i}} \right) \end{align*} \qquad (7)
ΔY%=Y0(logY1−logY0)Y1−Y0i=1∑nlog(X0,iX1,i)=i=1∑nY0(logY1−logY0)Y1−Y0log(X0,iX1,i)(7)
通过公式 ( 7 ) (7) (7),我们可以看出来,实际上我们要找的 D X i = Y 1 − Y 0 Y 0 ( log Y 1 − log Y 0 ) log ( X 1 , i X 0 , i ) D_{X_i} = \frac{Y_1 - Y_0}{Y_0 (\log Y_1 - \log Y_0)} \log \left ( \frac{X_{1,i}}{X_{0,i}} \right) DXi=Y0(logY1−logY0)Y1−Y0log(X0,iX1,i)
看完了乘法型指标的归因计算,我们可以继续用这种方法看一下除法的情况。
2.3 除法型指标的归因分析
似乎越说越抽象,我们先稳一下,举个例子看看除法型指标的例子,假设我们运营一个在线购物的app,非常关注哪些关键因素在商品购买率的变化上起决定性作用。
在这个场景下,假设“基期”是上月,“当期”是本月。且我们将用户划分为:新用户、活跃用户、沉默用户这三类;然后我们从是否具有访问行为和是否具有购买行为这两个维度再进行统计。所以我们可以定义如下的购买率:
购买率
=
∑
i
n
用户类型i的购买量
∑
i
n
用户类型i的访问量
\text{购买率} = \frac{\sum_i^n \text{用户类型i的购买量}}{\sum_i^n \text{用户类型i的访问量} }
购买率=∑in用户类型i的访问量∑in用户类型i的购买量
如果我们使用
Y
Y
Y来表示购买率,使用
P
i
P_{i}
Pi表示用户类型
i
i
i的购买量(共有3中用户类型),使用
Q
i
Q_{i}
Qi表示用户类型
i
i
i对于app中商品的访问量(例如:浏览量)。所以购买率可以表示为:
Y
=
∑
i
=
1
n
P
i
∑
i
=
1
n
Q
i
(
8
)
Y = \frac{\sum_{i=1}^n P_{i}}{ \sum_{i=1}^n Q_{i}} \qquad (8)
Y=∑i=1nQi∑i=1nPi(8)
同样地我们来看如何分解
Δ
Y
%
=
(
Y
1
−
Y
0
)
/
Y
0
\Delta Y \% = (Y_1 - Y_0)/Y_0
ΔY%=(Y1−Y0)/Y0:
Δ
Y
%
=
Y
1
−
Y
0
Y
0
=
∑
i
=
1
n
P
1
,
i
∑
i
=
1
n
Q
1
,
i
−
∑
i
=
1
n
P
0
,
i
∑
i
=
1
n
Q
0
,
i
Y
0
#
代入Y的定义,即公式(8)
=
∑
i
=
1
n
P
1
,
i
Q
1
,
i
×
Q
1
,
i
∑
i
=
1
n
Q
1
,
i
−
∑
i
=
1
n
P
0
,
i
Q
0
,
i
×
Q
0
,
i
∑
i
=
1
n
Q
0
,
i
Y
0
#
恒等变换
p
→
p
a
⋅
a
=
∑
i
=
1
n
P
1
,
i
Q
1
,
i
×
Q
1
,
i
∑
i
=
1
n
Q
1
,
i
−
∑
i
=
1
n
P
0
,
i
Q
0
,
i
×
Q
0
,
i
∑
i
=
1
n
Q
0
,
i
Y
0
#
将常量
∑
i
=
1
n
Q
t
,
i
移动到求和符号内部
(
9
)
\begin{align*} \Delta Y \% &= \frac{Y_1 - Y_0}{Y_0} \\ &= \frac{ \frac{\sum_{i=1}^n P_{1,i}}{\sum_{i=1}^n Q_{1,i}} - \frac{\sum_{i=1}^n P_{0,i}}{\sum_{i=1}^n Q_{0,i}} }{ Y_0} \qquad \#\text{代入Y的定义,即公式(8)} \\ &= \frac{ \frac{ \sum_{i=1}^n \frac{P_{1,i}} {Q_{1,i}} \times Q_{1,i} }{\sum_{i=1}^n Q_{1,i}} - \frac{\sum_{i=1}^n \frac{P_{0,i}}{Q_{0,i}} \times Q_{0,i} } {\sum_{i=1}^n Q_{0,i} } }{ Y_0 } \qquad \#\text{恒等变换} p \rightarrow \frac{p}{a}\cdot a \\ &= \frac{ \sum_{i=1}^n \frac{P_{1,i}}{Q_{1,i}} \times \frac{Q_{1,i}}{\sum_{i=1}^n Q_{1,i}} - \sum_{i=1}^n \frac{P_{0,i}}{Q_{0,i}} \times \frac{Q_{0,i}}{ \sum_{i=1}^n Q_{0,i}} }{Y_0} \qquad \#\text{将常量} \sum_{i=1}^n Q_{t,i}\text{移动到求和符号内部} \\ \end{align*} \qquad (9)
ΔY%=Y0Y1−Y0=Y0∑i=1nQ1,i∑i=1nP1,i−∑i=1nQ0,i∑i=1nP0,i#代入Y的定义,即公式(8)=Y0∑i=1nQ1,i∑i=1nQ1,iP1,i×Q1,i−∑i=1nQ0,i∑i=1nQ0,iP0,i×Q0,i#恒等变换p→ap⋅a=Y0∑i=1nQ1,iP1,i×∑i=1nQ1,iQ1,i−∑i=1nQ0,iP0,i×∑i=1nQ0,iQ0,i#将常量i=1∑nQt,i移动到求和符号内部(9)
公式
(
9
)
(9)
(9)看上去太复杂了,我们做一些简单的表达式替换,我们令:
q
t
,
i
=
Q
t
,
i
∑
i
=
1
n
Q
t
,
i
c
t
,
i
=
P
t
,
i
Q
t
,
i
(
10
)
\begin{align*} q_{t,i} &= \frac{Q_{t,i}}{\sum_{i=1}^n Q_{t,i}} \\ c_{t,i} &= \frac{P_{t,i}}{Q_{t,i}} \end{align*} \qquad (10)
qt,ict,i=∑i=1nQt,iQt,i=Qt,iPt,i(10)
我们将公式
(
10
)
(10)
(10)代入到
(
9
)
(9)
(9)中可以得到公式
(
11
)
(11)
(11)如下:
Δ
Y
%
=
Y
1
−
Y
0
Y
0
=
∑
i
=
1
n
c
1
,
i
×
q
1
,
i
−
∑
i
=
1
n
c
0
,
i
×
q
0
,
i
Y
0
=
∑
i
=
1
n
c
1
,
i
×
q
1
,
i
−
∑
i
=
1
n
c
0
,
i
×
q
0
,
i
+
∑
i
=
1
n
Y
0
×
(
q
0
,
i
−
q
1
,
i
)
Y
0
#
(
∑
i
=
1
n
q
t
,
i
)
可以验证等于1,于是最后一个求和项,实际上是0
=
∑
i
=
1
n
c
1
,
i
×
q
0
,
i
−
∑
i
=
1
n
c
1
,
i
×
q
0
,
i
+
∑
i
=
1
n
c
1
,
i
×
q
1
,
i
−
∑
i
=
1
n
c
0
,
i
×
q
0
,
i
+
∑
i
=
1
n
Y
0
×
(
q
0
,
i
−
q
1
,
i
)
Y
0
#
开头增加了两个相同的求和项
∑
i
=
1
n
c
1
,
i
×
q
0
,
i
=
∑
i
=
1
n
(
c
1
,
i
−
c
0
,
i
)
×
q
0
,
i
+
∑
i
=
1
n
(
q
1
,
i
−
q
0
,
i
)
×
(
c
1
,
i
−
Y
0
)
Y
0
(
11
)
\begin{align*} \Delta Y \% &= \frac{Y_1 - Y_0}{Y_0} \\ &= \frac{\sum_{i=1}^n c_{1,i} \times q_{1,i} - \sum_{i=1}^n c_{0,i} \times q_{0,i}}{Y_0} \\ &= \frac{\sum_{i=1}^n c_{1,i} \times q_{1,i} - \sum_{i=1}^n c_{0,i} \times q_{0,i} + \sum_{i=1}^n Y_0 \times (q_{0,i} - q_{1,i})}{Y_0} \qquad \# (\sum_{i=1}^n q_{t,i}) \text{可以验证等于1,于是最后一个求和项,实际上是0} \\ &= \frac{\sum_{i=1}^n c_{1,i} \times q_{0,i} - \sum_{i=1}^n c_{1,i} \times q_{0,i} + \sum_{i=1}^n c_{1,i} \times q_{1,i} - \sum_{i=1}^n c_{0,i} \times q_{0,i} + \sum_{i=1}^n Y_0 \times (q_{0,i} - q_{1,i})}{Y_0} \qquad \#开头增加了两个相同的求和项\sum_{i=1}^n c_{1,i}\times q_{0,i} \\ &= \frac{ \sum_{i=1}^n(c_{1,i} - c_{0,i})\times q_{0,i} + \sum_{i=1}^n (q_{1,i} - q_{0,i})\times (c_{1,i} - Y_0)}{Y_0} \end{align*} \qquad (11)
ΔY%=Y0Y1−Y0=Y0∑i=1nc1,i×q1,i−∑i=1nc0,i×q0,i=Y0∑i=1nc1,i×q1,i−∑i=1nc0,i×q0,i+∑i=1nY0×(q0,i−q1,i)#(i=1∑nqt,i)可以验证等于1,于是最后一个求和项,实际上是0=Y0∑i=1nc1,i×q0,i−∑i=1nc1,i×q0,i+∑i=1nc1,i×q1,i−∑i=1nc0,i×q0,i+∑i=1nY0×(q0,i−q1,i)#开头增加了两个相同的求和项i=1∑nc1,i×q0,i=Y0∑i=1n(c1,i−c0,i)×q0,i+∑i=1n(q1,i−q0,i)×(c1,i−Y0)(11)
所以根据公式
(
11
)
(11)
(11)(标号需要滑动滚动条才能看到估计),我们知道,在这种情况下,我们所求的
D
X
i
D_{X_i}
DXi 实际上比乘法和加法的情况要复杂的多:
第一、我们在这里引入了两组变量 P i P_i Pi以及 Q i Q_i Qi,而不是之前的一组 X i X_i Xi;
第二、最终的结果中 c t , i c_{t,i} ct,i实际上是一个 P i P_i Pi和 Q i Q_i Qi的交叉变量(两个变量组合在一起的),而 q t , i q_{t,i} qt,i则是变量 Q i Q_i Qi之间的检查变量;
所以实际上这里并没有独立的 D P i D_{P_i} DPi或者 D Q i D_{Q_i} DQi,而是交叉变量(内交叉: q t , i q_{t,i} qt,i或者外交叉 c t , i c_{t,i} ct,i)所形成占比的分配。也就是说,当这种运算复杂了之后,实际上我们很难直接通过这种构建拆分表达式的形式来衡量各个独立变量对整体变化所带来的影响程度。
参考文献:
- https://mp.weixin.qq.com/s/dWVu8n4TTcp27-5o58e2xg