1. 术语定义
在上一篇博客归因分析【一】:加法型、乘法型、除法型指标的贡献度计算中,我们为大家简单介绍了归因分析中常见的基于公式分解的因子贡献率的方法。在开始本篇之前,我们首先回顾一些术语定义:
指标:所谓指标,就是我们归因和分析的目标。如果大家看了上一篇博客,可以知道,就是指在归因分析中的 Y Y Y值。我们希望知道导致这个指标变化的主导因素。例如:总销售额,满意度,都可以是我们这里所说的“指标”。
维度:所谓维度,是指构成或者影响指标的一组值。例如,总销售额 = 平均价格 x 总销量,而“总销量”又可以按照城市来分解为:北京的销量、上海的销量等;这里的“总销量”就可以认为是一个维度。
维度值:维度值就是维度中的一个值,例如在“维度”定义中所提到的“北京的销量”就是“总销量”这个维度下的一个纬度值。后面我们也会纬度值称为因子,两者在下文中是等价的。
当前值: 就是我们当前要分析的指标值(参考前面关于“指标”的定义),一般使用 Y 1 Y_1 Y1来表示;
基准值:就是我们要对比的历史上的一个指标的值,一般使用 Y 0 Y_0 Y0来表示;
2. 基于因子的归因vs.基于维度的归因
我们一般说的“归因分析”,其实完整表达出来,应该是: 基于因子/维度对指标归因,也就是说我们可以对指标进行两个层次的归因:
- 一个层次是因子
- 另外一个层次是维度
还拿“总销售额 = 平均价格 x 总销量”这个场景来举例,其中“总销量”是一个维度,而“总销量”又是由不同城市的销量相加得到的,其中每一个城市的销量都是一个因子(例如北京的销量);针对“总销售额”的变化,我们可以分析“总销量”这个维度的贡献率,也可以分析“北京的销量”这个因子所带来的贡献率。
这里需要澄清的一点是,不是每一个场景下都可以既对因子归因,又对维度归因。如果一个维度下的因子之间有明显的关联关系,那么就不再适合基于单一的因子进行归因。而是要考虑基于整个维度进行归因。下面我们来看一个维度归因的具体的例子。
3. 基于维度归因的实例
假设我们运营一个在线购物的app,我们将用户划分为:新用户、活跃用户、沉默用户这三类;然后我们分别统计(基期和当期下)这三类用户对商品的访问和购买的次数。 有如下的表格:
新用户(基期) | 活跃用户(基期) | 沉默用户(基期) | 新用户(当期) | 活跃用户(当期) | 沉默用户(当期) | |
---|---|---|---|---|---|---|
商品浏览量(万次) | 200 | 30 | 20 | 180 | 35 | 15 |
商品购买量(万件) | 1 | 2 | 0.1 | 1.2 | 1.8 | 0.1 |
假如使用
P
i
P_i
Pi表示不同类型用户的对商品的购买量,使用
Q
i
Q_i
Qi表示不同类型用户对商品的浏览次数;使用
Y
Y
Y表示购买率,那么有
Y
=
∑
i
=
1
n
P
i
∑
i
=
1
n
Q
i
(
1
)
Y = \frac{\sum_{i=1}^n P_i}{ \sum_{i=1}^n Q_i} \qquad (1)
Y=∑i=1nQi∑i=1nPi(1)
在上一篇文章中,我们介绍了在这种场景下,无法使用求和分解的方法为每一个因子计算出贡献率。
现在我们换一个思路,假如我们把 ( P i , Q i ) (P_i, Q_i) (Pi,Qi)当做一个整体的维度 M i M_i Mi来看(一个维度下,包括了商品浏览量、商品购买量 这两个因子),那么很显然,我们会有:新用户、活跃用户、沉默用户共3个维度;那么我们如何计算每一个维度 M i M_i Mi对这里的购买率变化 Δ Y % = ( Y 1 − Y 0 ) / Y 0 \Delta Y\% = (Y_1 - Y_0)/Y_0 ΔY%=(Y1−Y0)/Y0的贡献度。
答案就是使用差分法,通过只修改一个维度值
(
P
0
,
k
,
Q
0
,
k
)
(P_{0,k}, Q_{0,k})
(P0,k,Q0,k) 到
(
P
1
,
k
,
Q
1
,
k
)
(P_{1,k}, Q_{1,k})
(P1,k,Q1,k),来观察其对
Y
Y
Y的影响程度
E
k
E_k
Ek,(
k
=
1
,
2...
n
k=1,2...n
k=1,2...n),大白话就是分子和分母同时从基期
P
0
,
k
,
Q
0
,
k
P_{0,k}, Q_{0,k}
P0,k,Q0,k替换为
P
1
,
k
P_{1,k}
P1,k以及
Q
1
,
k
Q_{1,k}
Q1,k,然后看这种调整对不调整的原指标的影响
E
k
E_k
Ek:
E
k
=
(
∑
i
=
1
,
i
≠
k
n
P
0
,
i
)
+
(
P
1
,
k
−
P
0
,
k
)
(
∑
i
=
1
,
i
≠
k
n
Q
0
,
i
)
+
(
Q
1
,
k
−
Q
0
,
k
)
−
∑
i
=
1
n
P
0
,
i
∑
i
=
1
n
Q
0
,
i
(
2
)
E_k = \frac{ (\sum_{i=1, i \ne k}^n P_{0,i}) + (P_{1,k} - P_{0,k}) }{(\sum_{i=1, i \ne k}^n Q_{0,i}) + (Q_{1,k} - Q_{0,k})} - \frac{\sum_{i=1}^n P_{0,i}}{\sum_{i=1}^n Q_{0,i}} \qquad (2)
Ek=(∑i=1,i=knQ0,i)+(Q1,k−Q0,k)(∑i=1,i=knP0,i)+(P1,k−P0,k)−∑i=1nQ0,i∑i=1nP0,i(2)
然后我们需要对
E
k
E_k
Ek的值进行正则化,记结果为
E
k
~
\tilde{E_k}
Ek~,那么:
E
k
~
=
E
k
∑
i
=
1
n
E
i
(
3
)
\tilde{E_k} = \frac{E_k}{\sum_{i=1}^n E_i} \qquad (3)
Ek~=∑i=1nEiEk(3)
使用这种方法,我们可以求出每一个维度对指标变化的贡献率。
需要注意一点的是,使用这种方法得到的
E
k
~
\tilde{E_k}
Ek~有可能为负值。如果我们希望得到一个全是非负值的贡献率
E
k
+
~
\tilde{E_k^+}
Ek+~,可以使用下面这个新的正则化方法:
E
k
+
~
=
∣
E
k
∣
∑
i
=
1
n
∣
E
i
∣
(
4
)
\tilde{E_k^+} = \frac{\mid E_k\mid}{\sum_{i=1}^n \mid E_i \mid} \qquad (4)
Ek+~=∑i=1n∣Ei∣∣Ek∣(4)
另外,因为本文是从基于因子的归因开始的,这里一定会有人想到,我们能不能使用这种方法来计算单一因子的贡献度,例如对
P
k
P_k
Pk计算其对
Y
Y
Y的影响程度
E
k
’
E_k’
Ek’:
E
k
′
=
(
∑
i
=
1
,
i
≠
k
n
P
0
,
i
)
+
(
P
1
,
k
−
P
0
,
k
)
∑
i
=
1
n
Q
0
,
i
−
∑
i
=
1
n
P
0
,
i
∑
i
=
1
n
Q
0
,
i
(
5
)
E_k' = \frac{ (\sum_{i=1, i \ne k}^n P_{0,i}) + (P_{1,k} - P_{0,k}) }{\sum_{i=1}^n Q_{0,i} } - \frac{\sum_{i=1}^n P_{0,i}}{\sum_{i=1}^n Q_{0,i}} \qquad (5)
Ek′=∑i=1nQ0,i(∑i=1,i=knP0,i)+(P1,k−P0,k)−∑i=1nQ0,i∑i=1nP0,i(5)
公式
(
5
)
(5)
(5)看似也能计算出结果,但是要注意到在当前场景下,
P
k
P_k
Pk是商品的购买量,
Q
k
Q_k
Qk是对商品的浏览次数:两者是强关联的(只有看过商品后才可能产生购买行为);只调整
P
k
P_k
Pk而不调整
Q
k
Q_k
Qk在业务上不合理;所以这里我们要同时调整分子和分母,也就是说测量的是不同人群这个维度,而无法测量维度下单一因子的贡献率。
4. 差分法的扩展
在上一节中,我们使用了差分法,并在一个除法的场景下应用了这种方法。实际上这是一种通用的方法,我们在这里给出一个一般性的定义。
假设有如下的指标计算公式:
Y
=
f
(
X
1
,
X
2
,
.
.
.
X
n
)
(
6
)
Y = f(X_1, X_2, ...X_n) \qquad (6)
Y=f(X1,X2,...Xn)(6)
其中
X
i
X_i
Xi可以是因子,也可以是维度。接着我们给出基准值
Y
0
Y_0
Y0以及当期值
Y
1
Y_1
Y1:
Y
0
=
f
(
X
0
,
1
,
X
0
,
2
,
.
.
.
X
0
,
n
)
Y
1
=
f
(
X
1
,
1
,
X
1
,
2
,
.
.
.
X
1
,
n
)
(
7
)
\begin{align*} Y_0 &= f(X_{0,1}, X_{0,2}, ...X_{0,n}) \\ Y_1 &= f(X_{1,1}, X_{1,2}, ...X_{1,n}) \end{align*} \qquad (7)
Y0Y1=f(X0,1,X0,2,...X0,n)=f(X1,1,X1,2,...X1,n)(7)
其中
X
t
,
i
X_{t,i}
Xt,i表示基准或者当期值,
t
=
0
t=0
t=0表示基准值;
t
=
1
t=1
t=1表示当期值;
接着我们给出
X
k
X_k
Xk从基准值调整为当期值后对
Y
Y
Y产生的影响
E
k
E_k
Ek:
E
k
=
f
(
X
0
,
1
,
.
.
.
X
0
,
k
−
1
,
X
1
,
k
,
X
0
,
k
+
1
,
.
.
.
X
0
,
n
)
−
Y
0
(
8
)
E_k = f(X_{0,1}, ... X_{0,k-1}, X_{1,k}, X_{0,k+1}, ...X_{0,n}) - Y_0 \qquad (8)
Ek=f(X0,1,...X0,k−1,X1,k,X0,k+1,...X0,n)−Y0(8)
公式
(
8
)
(8)
(8)看似复杂,实际上就是在
Y
0
Y_0
Y0的表达式中,将第
k
k
k个因子或者维度替换为当期值,然后计算
f
(
⋅
)
f(\cdot)
f(⋅)的值与
Y
0
Y_0
Y0之间的差值。
最后我们计算出归一化之后的贡献度
E
k
~
\tilde{E_k}
Ek~:
E
k
~
=
E
k
∑
i
=
1
n
E
i
(
9
)
\tilde{E_k} = \frac{E_k}{\sum_{i=1}^n E_i} \qquad (9)
Ek~=∑i=1nEiEk(9)
这个方法几乎可以用在所有的既有公式的归因场景中,但需要注意一点的是,当
X
k
X_k
Xk是维度的时候,可能会出现
∣
X
0
,
k
∣
>
∣
X
1
,
k
∣
\mid X_{0,k}\mid > \mid X_{1,k}\mid
∣X0,k∣>∣X1,k∣,即基准值中因子的个数大于当期值中的因子个数。这种情况下实际上只能将
X
0
,
k
X_{0,k}
X0,k中的部分因子替换为
X
1
,
k
X_{1,k}
X1,k。总而言之,大家需要依据业务的合理性,来做这种
X
k
X_k
Xk的替换。这样才能做到计算出合理的基于维度的归因贡献率。
参考文献:
- https://www.volcengine.com/docs/4726/1217644
- https://www.usenix.org/system/files/conference/nsdi14/nsdi14-paper-bhagwan.pdf