数据分析误区:AB测试=简单对照?NO!正确打开方式应该是这样

后台收到一些旁友的留言 , 想学习AB测试相关知识 , 但市面上的教程要么太“正式” , 要么知识点比较零散 。 今天给大家分享的这篇文章 , 可谓既干货又生动活泼:
让我们想象一下 , 在公司的某产品研发讨论会上……
“这个功能要不要上?”
“我觉得没问题 , XX指标肯定能涨一大截 。 ”
“我不这么想 , XX指标说不定也会受到影响 , 你不能只想着可能的收益呀 。 ”
blahblah无限循环争吵中……
“好啦 , 别吵了 , 让我们开个AB看一下效果吧 。 ”
当现在越来越多的app都已经日活百万千万 , 新功能是绝对不敢、也绝无必要轻易上线的 。 (因为一旦全量上线引起用户反感 , 损失不可估计 。 )这个时候 , AB实验就成为了大型功能上线前的必备利器——进行小流量的测试 , 利用测试的效果来预估上线后的效果 。
OK , 那一个AB实验开启了之后 , 我们(常常是数据分析师)该怎么评估这个AB实验的效果 , 给出这个需求到底要不要上线的分析结论呢?这就是本文的重点所在了 。
一个合格的分析师 , 可以问自己以下几个问题:
我怎么衡量一个指标是否有显著变化?
当你看到指标显著时:是真的显著吗?
当你看到指标不显著时 , 是真的不显著吗?
一个合适的AB实验指标判断结论怎么给出?
我会遇到哪些问题、分别应该怎么处理?
接下来 , 让我们一起看看这些问题该怎么解答吧~
我怎么衡量一个指标是否有显著变化?
结论:利用p值进行判断 , 一般来说p值<0.05 , 认为指标有显著变化 。
原因:假设检验的相关知识 。
嗯……AB实验就是一种假设检验吗?那假设检验是怎么一回事呢?
这里我举一个公开课里看到的例子 。 非常生动形象 。 看看我们在一个实际的Case中 , 怎么拒绝/接受一个假设的 。
背景:神经学家测试一种药物对小老鼠反应时间的影响 , 给实验组100只小老鼠注释某种药物 。 神经学家知道 , 没有注射药物的老鼠平均反应时间是1.2s , 注射了药物的老鼠平均反应时间1.05s , 样本标准差0.5s 。 你认为这个药物对于老鼠的反应时间有影响吗?
依照我们上面说的步骤逐步拆解:
我们先假设药物是没有影响的 。 (H0:药物无影响 。 ps.此处还有一个备择假设H1:药物有影响)
如果药物没有影响 , 换句话说 , 实验组的小鼠在注射药物之后 , 他们的反应时间均值应该是1.2s 。
假设总体小鼠的反应均值就应该是1.2s , 那么我们得到的这个样本——平均反应时间1.05s的概率是多大?
求解:
(1)已知总体均值为1.2s;
(2)已知样本均值为1.05s , 样本标准差0.5s
(3)由于样本量尚可 , 利用样本标准差估计总体标准差(这部分如果不懂的可以去补一下抽样分布 , 不详细展开说):0.5/10=0.05
(4)计算1.05距离1.2有几个标准差那么远?——1.05-1.2/0.05=3个
(5)当我们抽出一个样本 , 它落在距离总体均值1.2三个标准差的地方、甚至更远 , 概率是多少?——概率是正态分布钟形曲线下 , 3sigma之外的面积(包括正、负3sigma) 。 可以通过查正态分布得知 , 概率是0.3%
(6)事已至此 , 我们可以得到的结论是:如果接受原假设 , 药物没作用 , 出现我们这种抽样结果的概率是——0.003...我们居然就抽到了??所以 , 这个时候 , 虽然不是100%确定 , 但我们倾向于拒绝原假设(药物无影响) , 接受备择假设(药物有影响) 。
数据分析误区:AB测试=简单对照?NO!正确打开方式应该是这样
文章图片
那么 , 当我们做一个实验时 , 判断feature是否有用 , 我们的思路是这样的:
当我有足够大的样本量 , 把用户分成两组 。 A组(对照组)和B组(实验组) 。 由于样本量充足 , 理论上来说 , A组和B组的各项原始指标表现应当是差不多的 。
AB实验是在对照组的基础上 , 做一个feature改动 。
假设这个feature改动是不影响指标的 。 是没有作用的 。
观察B组的指标 , 经过统计学方法计算 , 在H0成立的情况下 , B组这种指标表现出现的概率 。 根据这个概率去判断我们是该接受3的假设、还是拒绝3的假设 。
在统计学上 , 我们称 , 依照原假设 , 得到实际这种或更加极端情况的概率值为P-value , 也就是p值 。 在这个背景问题中 , P值为0.003 。 一般来说 , 我们规定0.05是判断显著与否的阈值(当然 , 这个阈值可以调整) , 也就是这一part的结论:我怎么衡量一个指标是否有显著变化?——利用p值进行判断 。 一般来说p值<0.05 , 认为指标有显著变化 。
当你看到指标显著时:是真的显著吗?
结论:不一定是真的显著 。
原因:犯了第一类错误!(常说的alpha错误)
看到这 , 有的小伙伴可能有点迷茫 。 什么意思??不是刚刚说p值远小于0.05 , 拒绝原假设了吗?怎么又不一定真的显著呢??
这里解释一下 。 我们刚刚说了 , 我们拒绝了H0 , 不是因为100%确定H0是错的 , 而是因为H0为真的概率太低了 , 所以我们选择拒绝了它 。 但是不代表它一定就是错的 , 有可能药是确实没有作用 , 只是我们选的小鼠刚好反应巨快!!鼠中佼佼者!!! 。。
数据分析误区:AB测试=简单对照?NO!正确打开方式应该是这样
文章图片
也就是说 , AB实验告诉我 , 显著了!指标显著发生了变化!!!喜大普奔!!!这个时候 , 我们仍然是有可能犯错的 。 可能我们的样本指标就是落在了那个5%的区间里 。
你可能会想 , 完犊子了 。 那我们这还咋评估啊 。
数据分析误区:AB测试=简单对照?NO!正确打开方式应该是这样
文章图片
但是!!!!虽然我们不敢说100%数据就一定会像表现的那样涨 , 我们可以给出 , “实际没涨 , AB实验看起来涨了”的犯错概率 。 这个过程 , 就是将“不确定性”进行“量化”的过程 。 一般如果给定P值0.05 , AB实验看起来显著的涨了 , 但实际没涨 , 犯这种错误的概率是5% 。
总而言之 , 我们不可能“准确”的预估产品feature上线后的表现 , 但是它能将“不可预知”的风险 , 转换为“可以量化”其“不确定性”的问题 。
当你看到指标不显著时 , 是真的不显著吗?
结论:不一定真的不显著 。
原因:犯了第二类错误!(常说的beta错误)
嗯嗯嗯又来了 , 看到不显著 , 也不一定是真的不显著……
那这又是为什么呢?我们会可能犯第二类错误:其实策略有效 , 只是没有被检测出来 。
这种错误的概率被记为β 。 而统计功效(power , 也被称为检验效力) , 被定义为1-β , 表示的是“假设我的新策略是有效的 , 我有多大概率在实验中检测出来” 。
什么意思呢?让我们画图来看 , 右边这个红色曲线是实验组 , 左边这个蓝色曲线是对照组 。 大家可以知道的是 , 如果我实验组取的样本落在了图中蓝色涂满的这部分 , 其实是应该拒绝原假设的!!但是由于它不在蓝色曲线的拒绝域里 , 所以我们接受了它 。 这就是第二类错误了 。 第二类错误的概率取决于两个曲线的分布情况 。
数据分析误区:AB测试=简单对照?NO!正确打开方式应该是这样
文章图片
一个合适的AB实验指标判断怎么给出?
数据分析误区:AB测试=简单对照?NO!正确打开方式应该是这样
文章图片
这里有个简单的流程 。
当我们判断一个指标是否显著时 , 先看P值 。 能得到显著与否的结论 , 但是要注意仍然有概率犯错 。
当我们判断一个指标不显著、实验没效果时 , 要注意是否会存在流量不够的问题 , 造成了实际有效果 , 但没被检验出来的可能性 。 (不过一般来说 , 开始实验前最好就评估好样本量的问题)
AB实验相关的面试常见问题
1.怎么降低犯第一类错误的概率?
把p值限定得越小 , 犯第一类错误的概率就越低 。 因为P值本来就是犯第一类错误的概率……
2.怎么降低犯第二类错误的概率?
数据分析误区:AB测试=简单对照?NO!正确打开方式应该是这样
文章图片
降低犯第二类错误的概率 , 换言之就是提升统计功效 。
这个部分和我们置信度(1-p值)、样本量都有关系 。
首先 , 如果我们降低置信度 , 可以提升统计功效 。 比如说不需要p值<0.05就认为显著了 , 我们认为p值<0.1就显著 。 那么红色的部分会往更中间集中 , 相对应 , 蓝色的部分会变小 。
不过这种方式的缺点在于 , 我们犯第一类错误的概率就会变大 。
数据分析误区:AB测试=简单对照?NO!正确打开方式应该是这样
文章图片
其次 , 可以提升样本量 , 使我们的正态分布钟型变更尖 , 让犯第二类错误的概率变小 。
数据分析误区:AB测试=简单对照?NO!正确打开方式应该是这样
文章图片
3.怎么确定样本量?
样本量和我们的统计功效息息相关 。 怎么根据我们希望的统计功效 , 来反过来推算实验所需的样本量呢?
输入:
1、指标的base值和两组指标的差异(比如说 , 现在对照组留存是60% , 认为提升到61%才是有意义的 , 差异就是0.01)
2、指标方差 。 如一个实验组的指标如阅读数的方差 , 可用历史数据估算 。
3、t检验的显著性水平 , 默认0.05
4、统计功效 , 一般取80% , 可以调整 。
输出:
单个实验组的样本量 。
这个部分的公式推导就不展开了(公式推导是我的弱项…) , python中提供了相应的计算包 , 可以去实验一下 , 感兴趣的也可以自己研究背后的计算函数、原理 。
pythonstatsmodels里计算样本量的包
4.产品要求开AABB实验 , 我听不听?
数据分析误区:AB测试=简单对照?NO!正确打开方式应该是这样
文章图片
听你个大头鬼哦 。
首先 , 不科学 。 抽样产生的误差本身就已经在我们的计算概率里了!为啥还要专门开4组实验对比?
其次 , 不聪明 。 多样本进行对比更可能犯错 。 比如说 , 一次抽样有5%的可能犯错 , 四次抽样 , 产生6组对比(A1A2,A1B1,A1B2,A2B1,A2B2,B1B2) , 一组对比时不犯错的概率95% , ?假设各组对比结果相互独立 , 至少一组犯错的概率[1-(1-0.05)^6]=0.265 , 远大于0.05 。 多来几次抽样 , 犯错的概率增加 。 更别提评估成本了——本来只用评估两组 , 现在需要看6组 。
最后 , 不好使 。 AABB实验可能会影响实验的灵敏度 。 流量不变则意味着各组样本流量减少一半 , 灵敏度下降;加大流量则更多用户进组 , 有可能引入风险 。 因此不管怎么说都是加大成本的 。
5.实验做了有效果 , 上线没有效果是怎么回事?
有可能犯第一类错误 。 你看到的显著可能不是真的 , 只是抽样的随机误差带来的~~~
【数据分析误区:AB测试=简单对照?NO!正确打开方式应该是这样】文源:知乎作者无眠


    推荐阅读