A/B Test❣️
参考了很多大佬的文章,用与个人学习
本质就是一种对照,如何找到完美合适的对照组?就算找到了,样本量是否充足呢?
-
样本选择 - 正交分桶
-
确定样本量的分布
- 确定选择什么检验统计量
- 小样本 大样本 方差是否已知 u 还是t
- 计算样本均值和样本标准差
- 确定选择什么检验统计量
-
设计样本量
-
知道预期提升的比例 (比如转化率)
- 在假定的提升比例下,确实这个假设是否通过
-
通过转化率和p值共同确定
-
-
检验结果
一、A/B Test
1. 常见用途
新功能验证、计算算法、UI布局、运营策略、文案
计算收益:例如,最近新上线了一个直播功能,那么直播功能究竟给平台带了来多少额外的 DAU,多少额外的使用时长,多少直播以外的视频观看时长等
二、A/B Test实验设计
1. 流量分类
实验版本的设计要遵循变量的单一性,也不一定吧。可以是单一因素,也可以是多因素试验设计
因此经常需要在流量分配时有所权衡,一般有以下几个情况:
-
不影响用户体验:如 UI 实验、文案类实验等,一般可以均匀分配流量实验,可以快速得到实验结论
-
不确定性较强的实验:如产品新功能上线,一般需小流量实验,尽量减小用户体验影响,在允许的时间内得到结论
-
希望收益最大化的实验:如运营活动等,尽可能将效果最大化,一般需要大流量实验,留出小部分对照组用于评估 ROI
2. 实验时长
业界的实验时长一般是2-3周,最短时长建议不要少于7天。因为不同日期活跃的用户群体可能不一样,所以最好要覆盖一个周期,如7天、14天、21天。
实验时间不宜过程,应该快速验证快速迭代
3. 选择指标
- 直接指标
- 间接指标
- 正向指标:可能提升的指标
- 负向指标:可能导致下降的指标
基于什么指标进行比较?
指标基线:由历史的数据得出,如果没有额话可以参考其他类似功能的指标
4. 计算最小样本量
虽然参加实验的样本越多越好,但是资源有限。而且如果实验是负向,可以避免不必要的损失
第一类错误和第二类错误:
-
α
\alpha
α:表示出现第一类错误的概率,也称为显著性水平,常见的取值有1%、5%、10%、,一般取值5%,即犯第一类错误的概率不超过5%
- 1-α,称为统计显著性,表示有多大的把握不误诊。
-
β
\beta
β: 出现第二类错误的概率,一般取值20%
- 更常见的表示方式为统计功效power=1-β,即有多大把握能检查出版本差异
- A/B Test的重要理念:宁肯砍掉多个好的产品,也不要让一个不好的产品上线
1. 计算最小样本量的两种检验方法
对于留存率、渗透率等漏斗类指标,采用**卡方检验**
对于人均时长类等均值类指标,采用**t 检验**:
- Z检验
- 检验灵敏度Δ,新方案的直接效果指标与指标基线差值的绝对值,即新方案与旧方案的区别有多大
- 从表达式上看,差距越大所需样本量越小 (不理解)❓
- 从表达式上看,差距越大所需样本量越小 (不理解)❓
- 检验灵敏度Δ,新方案的直接效果指标与指标基线差值的绝对值,即新方案与旧方案的区别有多大
- 卡方检验
5. 圈选用户
如何从一个总体中按一定比例抽取随机样本;如果同时进行的实验中有互斥的怎么办。
正交实验和互斥实验
- 正交:test1和test2互不影响
- 互斥:实验之间存在相互影响。举例: AB Test1是测试温控限频策略对温度的影响,AB Test2是测试温控降亮度对温度的影响,Test1和Test2都会影响温度,所以Test1和2之间互斥。
分流(或者说抽样):应该保证同时性、同质性、唯一性、均匀性。
同时性:分流应该是同时的,测试的进行也应该是同时的。
同质性:也可以说是相似性,是要求分出的用户群,在各维度的特征都相似。
- 判断同质性的方法:AAB测试,对两组对照组的结果进行方差检验,判断结果是否存在差异
唯一性:即要求用户不被重复计入测试。
均匀性:要求各组流量是均匀的
-
单层方案
所有流量按某个参数(UserID,DeviceID、CookieID、手机号等)分成n个桶,假设选定UserID,有以下两种方法:
如果出现实验互斥的情况,只能靠人工给各个实验指定分组
单层方案适合简单的验证,不适合长期大规模做交叉实验,流量利用效率太低,且随机组不好把握,最终容易造成某一组用户指标明显优于其他组。
-
多层方案
人为定义一些分层,如:UI 层、推荐算法层,每一层中再对用户随机分组,即可实现同一个用户出现在不同层的不同组里面,做到流量的重复利用。
单独看每一层,其实就是一个单层方案,并没有从根本上解决问题,只不过是复制出来多几层而已,如果某一层实验非常多,还是会存在流量不够用的情况,
-
无层方案
就是每一层都单独一层。确保每一个实验都单独占据了所有流量。可以取任意组的流量进行实验,但是又引进了新的问题,多层方案将实验的互斥在层内进行了限制,无层会导致同一个用户命中多个实验,即使这些实验是互斥的。
显然这样子是绝对不允许的,解决方法是赋予每个实验优先级,例如按上线优先级排序,优先将流量赋予高优先级用户。也可以在创建实验的时候如果有互斥实验,新创建实验的分组算法复用已有实验的实验ID进行分组即可避免。
三、A/B Test实验结果评估
显著性检验同样有多种方法:T检验、Z检验、卡方检验。具体选择什么检验参考如下流程图,互联网行业日活较大数据量较多,常常选用Z检验。
Z检验使用的是总体方差,T检验使用的是样本方差,卡方检验是比较两组数值的分布,因此Z检验比T检验和卡方检验效果更明显,检验精确度是:Z检验>T检验>卡方检验,下面以Z检验为例进行介绍。
AB测试需要比较出哪个实验组表现更好,因此使用的是单尾检验。原假设为新方案不优于旧方案,然后计算出在原假设成立的条件下,计算所得实验样本数据特征的概率原假设发生的概率P值,和显著性水平α进行比较以判断是否拒绝原假设。具体步骤如下:
1. 计算Z值
根据实验数据得到对照组均值为p1、实验样本数n1,实验组均值为p2、实验样本数n2
这个公式可能不太对,常见的公式为$z=\frac{p_1 - p_2}{\sqrt{(\frac{1}{n_2}+\frac{1}{n_2})p_c(1-p_c)}} $
2. 得到结果
-
法一:比较置信区间
计算 Φ 1 − α ( z 0 ) \Phi_{1-\alpha}(z_0) Φ1−α(z0),也就是左分位数的值,与正态分布的进行比较
-
法二:比较p值
计算 P ( z < z 0 ) P(z<z_0) P(z<z0),与显著水平 α \alpha α 进行比较,如果两者相等则加大样本量
利用
statsmodels.stats.proportion.proportions_ztest([c1,c2],[n1,n2],alternative='smaller')
计算置信区间和p值,其中n1 n2为对应的样本量,alternative='smaller’代表左尾
实验结束后需要:
- 反馈实验结论,包括直接效果(渗透、留存、人均时长等)、ROI
- 充分利用实验数据,进一步探索分析不同用户群体,不同场景下的差异,提出探索性分析
- 对于发现的现象,进一步提出假设,进一步实验论证
3. 更加高级的实验
3.1 多个活动交集量化的实验
活动 A 和活动 B,有着相互放大的作用,这个时候就会 1+1 > 2;还有的时候,活动 A 和活动 B,本质上是在做相同的事情,这个时候就会 1+1 < 2。
这个时候就需要一个贯穿层(贯穿所有活动的对照组)
- 春节活动的整体贡献:实验填充层 vs 贯穿层
- 活动A的贡献:活动A实验层,实验组 vs 对照组
- 活动B的贡献:活动B实验层,实验组 vs 对照组
3.2 业务迭代的同时,如何与自身的过去对比
业务需要和去年或上个季度的自身对比,同时业务还不断在多个方面运用 AB Test 迭代
类似与上面这种层次设计,在推荐系统中较为常见,在某一些产品或系统中,贯穿层不能够完全没有策略,那么采用去年或上个季度的策略,代表着基准值,从而量化新一个周期的增量贡献
可以量化:
- 每个小迭代对整体体统的贡献:实验层中的实验组vs对照组
- 系统的整体迭代与上一个周期的比较:实验填充层 vs 贯穿层1(如果是年,那就2)
- 同时,可以量化去年策略的自然增长或下降,以衡量旧有系统是否具有长期的适用性(作为系统设计者,更应鼓励设计具有长期适应性的系统):贯穿层 1(上个季度的策略)VS 贯穿层 2(去年的策略)
3.3 更为复杂的实验设计
微视任务福利中心的实验设计为例,举例一个更复杂的实验系统设计,综合了上面提到的 2 个目的:
- 量化每一个实验迭代为系统带来的增量贡献
- 即每一次实验迭代都与上一次对比
- 量化每一类迭代(如 UI 迭代、策略迭代),在一个阶段的增量贡献
- 量化系统整体在上一个周期(季度、年)的增量贡献
- 量化任务福利中心的整体 ROI(本质上,是给用户一些激励,促进用户活跃,获得更多商业化收益,所以和推荐系统不同的是,需要有完全没有任务福利中心的对照组,用户量化 ROI)
={“sourceType”%3A"answer"%2C"sourceId"%3A1103961403})整体在上一个周期(季度、年)的增量贡献
- 量化任务福利中心的整体 ROI(本质上,是给用户一些激励,促进用户活跃,获得更多商业化收益,所以和推荐系统不同的是,需要有完全没有任务福利中心的对照组,用户量化 ROI)