1. AB测试简介
1.1 什么是AB测试
A/B测试为一种随机测试,将两个不同的东西(即A和B)进行假设比较。该测试运用统计学上的假设检定和双母体假设检定。 A/B测试可以用来测试某一个变量两个不同版本的差异,一般是让A和B只有该变量不同,再测试其他人对于A和B的反应差异,再判断A和B的方式何者较佳。在这里先推荐一下udacity的学习课程 Udacity A/B testing by Google
简单来讲,和控制变量法基本一致,起源于医学中的双盲试验
1.2 AB测试的应用
一般在数据分析工作中,对一个产品不同阶段的转化程度,会使用漏斗模型来分析。例如以下为一个酒店预订网站的漏斗模型:
我们的目标是尽可能多的让用户转化到下一个阶段。而AB测试则可以测试不同的功能/配置/界面等对一个用户转化程度的提升,从而改进我们的产品。
在设计AB测试的初期,我们需要寻找某个指标,作为测量值。例如进行一个网页点击情况的测试,可用以下指标:
- CTR(click-through rate),点击数/浏览数,一般用来测量可用性(usability)
- CTP(click-through probability),点击人数/浏览人数,一般用来测量影响(impact)
rate和probability对应的中文一般均为率,实际则不同。rate更倾向于概率,例如我们丢一个无偏的硬币,正面向上的可能性是50%;probability更倾向于可能性,例如我们丢10000次无偏的硬币,正面向上的次数服从伯努利分布。
1.3 测试结果
- 统计上显著(statistical significant)vs.现实中显著(pratical significant)
统计上显著代表着可重复性(repeatability),而现实中显著则根据不同业务来界定。 - 代表正确,但是拒绝掉的概率,一般取值为。也就是本来有用,但是有5%的可能测试结果是没用。
- 代表错误,但是接受的概率,一般取值为。也就是本来没用,但是有20%的可能测试结果是有用。
- 小样本量,低,高;大样本量,低,低
2. 测试准则以及道德问题
2.1 风险(Risk)
受试者是否需要承担任何风险?例如金钱、情感、身体等等。阈值根据具体业务场景定义,如果超过某个阈值,则需要告知受试者。
医学上的部分临床试验会分测试组与对照组,广义上也是A/B测试,均会告知受试者并签署协议。
2.2 收益(Benefit)
测试是否带来任何收益?
2.3 替代(Alternatives)
除了测试外,受试者是否有其他选择?如果有其他选择,例如对一个App进行测试,受试者是否会被影响从而流失转往竞品?有多少会流失?成本是多少?
2.4 数据敏感性(Data Sensitvity)
- 收集的数据是否具有敏感性?是否有保险措施?
- 这部分数据将用于什么用途?如何保护数据不会用于其他用途?
- 如果需要公开部分数据,是否会带来额外的风险?
3. 定义与选择指标
指标(Metrics)是用来衡量业务的一个参数,例如上文所说的点击率,或者用户量,GMV均为指标。在A/B测试中,我们需要考虑如何可以科学有效的定义或选择一个指标。
3.1 定义指标
3.1.1 指标检测
合理性:指标符合业务上的理解,例如漏斗中的转化率不高于100%。
稳定性:两个分组如果没有区别,指标的表现应该是相同的。
有时会使用A/A test,来检测两个分组内各特征是否分布均匀。两个分组如果没有区别,指标应该在统计上是没有显著差别的,如果有则说明两个分组内的分布不均匀,例如新老客比例、男女分布等。
3.1.2 定义指标
通常会自上而下的来定义指标
- 第一步:高层次、低抽象、更广义且贴近商业、业务的指标。例如日活(日活跃用户量)、CTR。
- 第二步:更细节的指标。例如日活用户是由哪些组成?不同城市?不同版本APP?老用户回归?
3.1.3 指标统计量
- 聚合指标,例如日活、点击量。
- 分布指标,例如平均数、分位数。
- 概率、可能性、和比值
3.1.4 多指标
根据不同的公司/团队文化(对于数据的接受程度),我们可以考虑是否需要使用多个指标。
如果要使用多个指标,可以考虑制定一个综合评价标准(OEC Overall Evaluation Criterion) - 对所有指标的一个加权平均值。
通常情况不建议这么做,因为加权系数难以定义;个别指标增长导致整体增长,所以业务方可能仅持续优化某个指标等等
3.1.5 筛选数据
我们需要根据不同的原因,来筛选掉不需要的数据。
- 外部原因:导致数据被污染的原因。例如用户的恶意操作,其他实验导致的流量异常等。
- 内部原因:导致数据仅能反映部分实验的原因。例如实验仅可以影响分组中的新用户。
如何确定数据是否有偏差的呢?
- 拆分各种维度,观测流量是否受某个维度所影响。
- 增加时间维度。对比天vs天/周vs周之间的数据差异。
3.2 敏感性(Sensitivity)与鲁棒性(Robustness)
最理想的指标,应该反映我们想关注的数据变化(高敏感性),不反映我们不想关注的部分(高鲁棒性)。
鲁棒性,来源于音译Robust,意译为稳健性,可能更容易让人理解。
例如:均值对于离群值较为敏感,而中位数则不易收到离群值的影响,所以拥有更强的鲁棒性;但是如果数据集中的仅部分用户的数据发生变化,中位数可能不会有任何变化,所以敏感性较低。
那么,该如何验证指标的敏感性和鲁棒性呢?
a) 测试
- 使用历史测试进行验证
- A/A测试
b) 回顾分析(Retrospective Analysis)
- 观测指标在历史数据上的变化,分析造成变化的原因
3.3 变异性(Variability)
不同的指标拥有不同的可变性,有些指标尽管在业务上十分合理,但是可变性过强,会使该指标没有应用意义。
指标类型 | 分布 | 方差 |
---|---|---|
可能性(Probability) | Binomial/Normal | |
平均数(Mean) | Normal | |
分位数/中位数 | - | - |
量/差值 | Normal | |
率(rate) | Poisson | |
比值(ratios) | - | - |
计算指标的可变性,可以使用分析法和经验法:
-
分析法(Analytical)
例如中位数和比值的分布,是数据的分布类型,所以我们需要分析数据的分布类型是什么,来确定指标的分布,以确定该指标可变性。 -
经验法(Emprical)
重复进行A/A测试,记录每次测试指标差值的变化,以确定指标的可变性。
在重复进行A/A测试时,可以使用抽样法(Bootstrapping)。只进行一次A/A测试,但是每次只观测随机部分样本的结果,然后下次进行有放回的再次抽样。
4. 设计实验
实验设计通常需要确定以下几个部分:
- 分流对象(Subject):哪些是你的实验对象?例如,需要分流为两个组。
- 选择群体(Population):实验对象是哪些群体?例如,中国用户。
- 样本量(Size)
- 周期(Duration)
4.1 分流对象
为了测试,通过某种方式将流量(Traffic)分为A\B两组,称之为分流(Diversion),而分流所使用的单位,则称之为分流单位(Unit of Diversion)。
常用的分流单位:
- 用户ID:通常是用户名、手机号、邮箱地址等。用户ID通常是稳定,不会变化的,这样可以避免一个用户在不同时间点分到不同组内。
- 匿名ID:通常是浏览器cookie等。匿名ID会随着更换浏览器或者设备而跟着变化,另外移动App的cookie相对PC端会更加稳定一些。
- 事件:事件可以理解为一个界面或按钮等,通过是否到达这个界面而进行分流。这种分流方式通常用于用户不可感知的测试。
非常用的分流方法:
- 设备ID
- IP地址
在选择分流方式时,通常需要考虑以下三点:
4.1.1 一致性(Consistency)
对于用户可感知的测试,用户ID可以保证一个用户即使在多次访问一个界面,任然会被分在同一个组内;而对于用户不可感知测试,例如不同搜索排序算法的测试,则可以使用事件分流。
例:各种实验为了确定一致性,可以选择哪种分流方式?
实验 | 测试者是否会知晓 | 用户ID | cookie | 事件 |
---|---|---|---|---|
减小视频加载时间 | 应该不会 | |||
更改按钮的颜色或大小 | 如果刷新界面就会变化,用户就会注意到 | |||
更改搜索结果的排序 | 应该不会 | |||
考试前增加一份复习资料 | 应该会 |
4.1.2 伦理性(Ethical)
如果使用用户id进行分流,可能会有信息告知、披露的问题需要考虑,而使用cookie分流则不需要。
4.1.3 变异性(Variability)
分流单位需要和测试单位(指标的分母,也就是多少单位进入了测试)一致,否则计算出的变异性要远远小于实际的变异性。这是因为我们在计算变异性时,其实在假设数据的分布是独立的。
例如使用用户ID分流,一个用户会有多个事件,然后指标是根据事件维度的,则两个分组内的数据,则不是独立的。因为用户和事件是相关的。
4.2 选择群体
- 用户间测试(inter-user experiments):用户组A和用户组B对比
- 用户内测试(intra-user experiments):用户组在时间A与时间B对比
使用用户内测试需要注意两个问题:
a. 时间周期需要是可比的
b. 学习效应(learning effect)
b1. 变化厌恶(change aversion),用户对于变化是厌恶的,从而会对”变化“本身而产生反应。
b2. 知识效应(knowledge effect),用户对于变化的学习,可能开始时有效的,慢慢适应后变得无效。
避免学习效应可以使用留存用户(cohort)进行测试,或者在测试前与测试后均进行A/A测试。
附:插入式实验(Interleaved Experiments)
例如要对两种搜索排序算法进行对比测试,A算法的搜索结果排序为A1, A2, ..., AN,B算法的搜索结果排序为B1, B2, ..., BN。使用插入式实验,则可以将所有用户的搜索结果去重排序为A1, B1, A2, B2, ..., AN, BN,观测结果A和结果B的CTR,来验证测试结果。详见Interleaved in online Experiments at Netflix。
4.3 样本量与周期
样本量基于、、和(最小业务显著值)
如果想减少样本量,可以:
- 提升、,或下降
- 使分流单位需要和测试单位一致
- 缩小实验范围到有效的实验样本上
对样本曝光的风险控制:
- 对于未知结果的新功能上线,先小流量测试
- 长周期小流量的安全性 > 短周期大流量
5. 验证结果
5.1 合理性检验(Sanity Test)
收集到数据后的首当其冲我们要做的就是,检测数据的合理性,对照组和测试组的样本量需要是可对比的。
例如,
如果大于则说明统计上是不显著的。
5.2 单一指标
使用单一指标验证测试结果,我们可以使用简单的T检验或者Z检验,亦或是ANOVA和卡方检验均可。值得注意的是,在验证结果时,可能需要进行维度拆分,因为实验结果可能仅作用于某个子集。
注意辛普森悖论(Simpson's Paradox):两个组见每个子集均表现出差异,但是整体无差异,说明两个组中每个子集的占比不同
5.3 多个指标
使用多个指标验证测试结果,可能碰到的问题是,我们更有可能让测试的差异显著。也就是说,每一次进行测试结果的验证,都有一个几率,让我们的结果显著,而多次验证则会放大这个机率,也就是所谓的Type II Error。
解决方法是使用Bonferroni correction:缩小单个测试的置信区间,以获得合理的整体置信区间。例如进行三个指标的验证,而整体我们想要的置信水平,则单个指标的置信水平
很明显,Bonferroni correction会使整个测试过于保守,其他有效的方法为 closed testing procedure, Boole-Bonferroni bound和Holm-Bonferroni method,抑或是上文提到的综合评价标准(OEC)
5.4 Ramp-Up
通常AB测试的上线,我们会从1%等比较低的流量开始,然后慢慢上升到全部流量,达到功能的正式上线。在整个Ramp-Up过程中,可能会有一些原因导致测试之前是显著的,但是之后是不显著的:
- 季节效应:节假日等带来的数据波动。解决方法是保留一个组,持续的作为对照组。
- 新奇效应以及变化厌恶:变化所带来的对用户行为本身的影响,例如新功能的上线导致客人更喜欢使用或厌恶使用产品。解决方案是以使用留存用户(cohort)进行测试,或者在测试前与测试后均进行A/A测试。
Reference:
Tang, Diane, et al. "Overlapping experiment infrastructure: More, better, faster experimentation." Proceedings of the 16th ACM SIGKDD international conference on Knowledge discovery and data mining. 2010.
Udacity A/B testing by Google
Bootstrapping by wikipedia
Interleaved in online Experiments at Netflix
Bonferroni correction
网友评论