Home

漏斗指标归因

· Xiebro

我们有一个结果指标新用户购买率Y,它由4个漏斗指标构成,分别为:新用户注册率A注册用户激活率B激活用户留存率C留存用户购买率D

即:Y = A x B x C x D

我们希望通过计算因子波动对结果指标Y的影响,来衡量这4个指标的重要性如何。

或是另外一个非常常见的工作场景,当Y发生了较大的波动,我们希望通过指标拆解,来清楚地说明各个因素的变动对整体的波动产生了什么样的影响。


# 创建一个包含基期和现期漏斗指标的示例数据框
set.seed(42)
funnel_data <- 
  data.frame(Indicator = c("新用户注册率A", "注册用户激活率B", "激活用户留存率C", "留存用户购买率D"),
             Base_Rate = runif(4, min = 0.1, max = 0.5), 
             Current_Rate = runif(4, min = 0.1, max = 0.5)
)

print(funnel_data)
##         Indicator Base_Rate Current_Rate
## 1   新用户注册率A 0.4659224    0.3566982
## 2 注册用户激活率B 0.4748302    0.3076384
## 3 激活用户留存率C 0.2144558    0.3946353
## 4 留存用户购买率D 0.4321791    0.1538666

LMDI(Logarithmic Mean Index Method)乘积因子拆解

library(dplyr)
# 计算现期与基期结果指标Y的差异
Y0 <- prod(funnel_data$Base_Rate)
Y1 <- prod(funnel_data$Current_Rate)
Y_delta <- Y1 - Y0
# 计算平均对数权重
L <- Y_delta / (log(Y1) - log(Y0))
# 计算各指标在Y_delta中的贡献
C <- \(r0, r1)  L * log(r1 / r0)
# 计算各指标对整体变化率的贡献,即重要性
I <- \(C) C / Y_delta

result <- 
  funnel_data |>
  mutate(C = C(Base_Rate, Current_Rate),
         I = I(C))

result |> knitr::kable()
Indicator Base_Rate Current_Rate C I
新用户注册率A 0.4659224 0.3566982 -0.0032894 0.2376473
注册用户激活率B 0.4748302 0.3076384 -0.0053446 0.3861302
激活用户留存率C 0.2144558 0.3946353 0.0075097 -0.5425513
留存用户购买率D 0.4321791 0.1538666 -0.0127172 0.9187738
# 校验
cat(paste0("Y0: ",      round(Y0, 4),       "\n",
           "Y1: ",      round(Y1, 4),       "\n",
           "Y_delta: ", round(Y_delta, 4)), "\n",
           "SUM(C): ",  sum(result$C),      "\n",
           "SUM(I): ",  sum(result$I),      "\n")
## Y0: 0.0205
## Y1: 0.0067
## Y_delta: -0.0138 
##  SUM(C):  -0.01384152 
##  SUM(I):  1

从上表可以很直观的看到,造成新用户购买率Y下降的主因是留存用户购买率D