结构比率归因
·
Xiebro
在一些工作场景当中,比如渠道广告投放,假如这月与上月相比,总投放转化率出现了差异,那么,作为指导业务决策的数据分析师,我们需要讲清楚:两次投放转化率的差异,有多少是来自于渠道占比变化的结果,又有多少是来自渠道本身转化率波动的结果。
构造一份演示数据:
dat <- data.frame(
dim = c("A", "B", "C", "D", "E"), # 渠道名称
base_prop = c(0.2, 0.3, 0.1, 0.2, 0.2), # 上月(基期)各渠道用户数量占比
base_rate = c(0.1, 0.2, 0.15, 0.12, 0.05), # 上月(基期)各渠道用户转化率
curr_prop = c(0.25, 0.25, 0.15, 0.2, 0.15), # 本月(现期)各渠道用户数量占比
curr_rate = c(0.08, 0.15, 0.09, 0.1, 0.07) # 本月(现期)各渠道用户转化率
)
dat |> knitr::kable()
dim | base_prop | base_rate | curr_prop | curr_rate |
---|---|---|---|---|
A | 0.2 | 0.10 | 0.25 | 0.08 |
B | 0.3 | 0.20 | 0.25 | 0.15 |
C | 0.1 | 0.15 | 0.15 | 0.09 |
D | 0.2 | 0.12 | 0.20 | 0.10 |
E | 0.2 | 0.05 | 0.15 | 0.07 |
base_cvr <- sum(dat$base_prop * dat$curr_rate)
curr_cvr <- sum(dat$curr_prop * dat$curr_rate)
cat(paste0("基期总转化率:", base_cvr, "\n",
"现期总转化率:", curr_cvr, "\n",
"Diff(现期-基期):", curr_cvr - base_cvr, "\n"))
## 基期总转化率:0.104
## 现期总转化率:0.1015
## Diff(现期-基期):-0.0025
本月与上月相比,转化率下跌了0.25pp,量化其中有几个pp来自于渠道占比变化,又有几个pp来自于渠道率值波动。如此,我们可以对业务进行指导:调整渠道结构 or 优化渠道率值
Shapley-value:量化结构与率值的贡献度变化
library(dplyr)
# 量化公式
qt_r <- \(r0, r1, p0, p1) (r1 - r0) * (p1 + p0) / 2
qt_p <- \(r0, r1, p0, p1) (p1 - p0) * (r1 + r0) / 2
# 量化结果
result <-
dat |>
mutate(r.eff = qt_r(base_cvr, curr_cvr, base_prop, curr_prop),
p.eff = qt_p(base_cvr, curr_cvr, base_prop, curr_prop),
tot.eff = r.eff + p.eff)
result |> knitr::kable()
dim | base_prop | base_rate | curr_prop | curr_rate | r.eff | p.eff | tot.eff |
---|---|---|---|---|---|---|---|
A | 0.2 | 0.10 | 0.25 | 0.08 | -0.0005625 | 0.0051375 | 0.004575 |
B | 0.3 | 0.20 | 0.25 | 0.15 | -0.0006875 | -0.0051375 | -0.005825 |
C | 0.1 | 0.15 | 0.15 | 0.09 | -0.0003125 | 0.0051375 | 0.004825 |
D | 0.2 | 0.12 | 0.20 | 0.10 | -0.0005000 | 0.0000000 | -0.000500 |
E | 0.2 | 0.05 | 0.15 | 0.07 | -0.0004375 | -0.0051375 | -0.005575 |
# 校验:
tot_p.eff <- round(sum(result$p.eff), 4)
tot_r.eff <- round(sum(result$r.eff), 4)
cat(paste0("占比变化影响:", tot_p.eff, "\n",
"率值波动影响:", tot_r.eff, "\n",
"占比率值共同影响:", tot_p.eff + tot_r.eff, "\n"))
## 占比变化影响:0
## 率值波动影响:-0.0025
## 占比率值共同影响:-0.0025
双因素分析法:量化结构与率值对期望值的影响
# 量化公式
qt_r <- \(r0, r1, p1) (r1 - r0) * p1
qt_p <- \(p0, p1, r0, e) (p1 - p0) * (r0 - e)
# 期望值计算
exp <- sum(dat$base_prop * dat$base_rate)
# 量化结果
result <-
dat |>
mutate(r.eff = qt_r(base_cvr, curr_cvr, curr_prop),
p.eff = qt_p(base_prop, curr_prop, base_cvr, exp),
tot.eff = r.eff + p.eff)
result |> knitr::kable()
dim | base_prop | base_rate | curr_prop | curr_rate | r.eff | p.eff | tot.eff |
---|---|---|---|---|---|---|---|
A | 0.2 | 0.10 | 0.25 | 0.08 | -0.000625 | -0.00125 | -0.001875 |
B | 0.3 | 0.20 | 0.25 | 0.15 | -0.000625 | 0.00125 | 0.000625 |
C | 0.1 | 0.15 | 0.15 | 0.09 | -0.000375 | -0.00125 | -0.001625 |
D | 0.2 | 0.12 | 0.20 | 0.10 | -0.000500 | 0.00000 | -0.000500 |
E | 0.2 | 0.05 | 0.15 | 0.07 | -0.000375 | 0.00125 | 0.000875 |
# 校验:
tot_p.eff <- round(sum(result$p.eff), 4)
tot_r.eff <- round(sum(result$r.eff), 4)
cat(paste0("占比变化影响:", tot_p.eff, "\n",
"率值波动影响:", tot_r.eff, "\n",
"占比率值共同影响:", tot_p.eff + tot_r.eff, "\n"))
## 占比变化影响:0
## 率值波动影响:-0.0025
## 占比率值共同影响:-0.0025