最近做了一个AB,有几点经验值得记录一下。
背景
用户每日都可以打卡到微信,引导关注公众号。近期关注率有下降,怀疑与微信屏蔽有关,(微信抵制诱导分享引流到公众号)。
因此申请一个新公众号做测试,新老两个公众号内容均一致,观测两个公众号的关注率是否有差异。
关注指标:关注用户数/打卡用户数
过程
AB实验 1号上线,上线时全量切origin,2号开始1:1切
分析
step1
观察当天新进入分组的用户,在当天打卡发出的场景二维码带来的订单。连续观测多天数据,对每日即多日汇总数据进行假设检验
原假设: origin >= v2, 备则假设: origin < v2
p值 ≈ 0.002 <0.01,可以拒绝原假设,接受备则假设,即 新公众号关注率高于老公众号
##### 假设检验
n1 = c(3935,2329); d1 = c(304, 209)
n2 = c(2431,2538); d2 = c(180, 203)
n3 = c(2016,2015); d3 = c(146, 167)
n4 = c(1524,1475); d4 = c(122, 152)
alt = "less"
num_tests = 4
nt = 0; dt = 0;
for (i in 1:num_tests) {
nx = eval(parse(text = paste0("n",i)))
dx = eval(parse(text = paste0("d",i)))
nt = nt + nx; dt = dt + dx;
p = prop.test(n = nx, x = dx, conf.level = .9, alternative = alt)
cat('test result', i, ':', p$p.value, '\n')
if (i == num_tests) {
pt = prop.test(n = nt, x = dt, conf.level = .9, alternative = alt)
cat('test result for all :', pt$p.value)
}
}
test result 1 : 0.04517291
test result 2 : 0.2321899
test result 3 : 0.1186704
test result 4 : 0.01692163
test result for all : 0.002388452
然而,发现ab结论是v2高于origin,但从大盘看自AB上线开始,整体大盘的关注率却在下降,需要进一步排查。
step2
首先,看AB分组是否平均,用户质量是否有差异
对进入分组的用户进行维度拆分,查看各维度AB两组分布是否均匀。
观察城市等级、平台、年龄、性别等维度后分布都均匀
其次,这部分是重点
思考AB是否无偏差,而是真的AB
以这个案例来说,用户每天都可以打卡,可能存在很多人关注过老的公众号, 所以开新号的效率高一些。
为验证该想法,查看数据,发现关注新号的用户中,12% 关注过老号 查询SQL。对于这部分已关注老号的用户,本身可能意愿较强,看到新号也愿意关注看看。
所以这个AB是有偏的,为矫正这部分偏差,排除v2关注用户中之前已关注过老号的用户。
再将结果进行假设检验,发现两组用户无显著差异.