美文网首页
从零开始AB测试

从零开始AB测试

作者: 屹然1ran | 来源:发表于2021-12-13 17:57 被阅读0次

    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),而现实中显著则根据不同业务来界定。
    • \alpha代表H_0正确,但是拒绝掉H_0的概率,一般取值为0.05。也就是本来有用,但是有5%的可能测试结果是没用。
    • \beta代表H_0错误,但是接受H_0的概率,一般取值为0.20。也就是本来没用,但是有20%的可能测试结果是有用。
    • 小样本量,低\alpha,高\beta;大样本量,低\alpha,低\beta

    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 \frac{\hat{p}(1-\hat{p})}{N}
    平均数(Mean) Normal \sigma^2
    分位数/中位数 - -
    量/差值 Normal var(x)+var(y)
    率(rate) Poisson \overline{X}
    比值(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 事件
    减小视频加载时间 应该不会 \checkmark
    更改按钮的颜色或大小 如果刷新界面就会变化,用户就会注意到 \checkmark
    更改搜索结果的排序 应该不会 \checkmark
    考试前增加一份复习资料 应该会 \checkmark
    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 样本量与周期

    样本量基于\alpha\beta、和d_{min}(最小业务显著值)
    如果想减少样本量,可以:

    • 提升\alpha\beta,或下降d_{min}
    • 使分流单位需要和测试单位一致
    • 缩小实验范围到有效的实验样本上

    对样本曝光的风险控制:

    • 对于未知结果的新功能上线,先小流量测试
    • 长周期小流量的安全性 > 短周期大流量

    5. 验证结果

    5.1 合理性检验(Sanity Test)

    收集到数据后的首当其冲我们要做的就是,检测数据的合理性,对照组和测试组的样本量需要是可对比的。
    例如se = \sqrt{\frac{0.5*0.5}{x*y}}margin = \frac{x}{x+y} - \frac{y}{x+y}
    如果se大于margin则说明统计上是不显著的。

    5.2 单一指标

    使用单一指标验证测试结果,我们可以使用简单的T检验或者Z检验,亦或是ANOVA和卡方检验均可。值得注意的是,在验证结果时,可能需要进行维度拆分,因为实验结果可能仅作用于某个子集。

    注意辛普森悖论(Simpson's Paradox):两个组见每个子集均表现出差异,但是整体无差异,说明两个组中每个子集的占比不同

    5.3 多个指标

    使用多个指标验证测试结果,可能碰到的问题是,我们更有可能让测试的差异显著。也就是说,每一次进行测试结果的验证,都有一个几率,让我们的结果显著,而多次验证则会放大这个机率,也就是所谓的Type II Error
    解决方法是使用Bonferroni correction:缩小单个测试的置信区间,以获得合理的整体置信区间。例如进行三个指标的验证,而整体我们想要的置信水平p_{overall}=0.05,则单个指标的置信水平p_{individual}=0.05/3=0.016

    很明显,Bonferroni correction会使整个测试过于保守,其他有效的方法为 closed testing procedure, Boole-Bonferroni boundHolm-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

    相关文章

      网友评论

          本文标题:从零开始AB测试

          本文链接:https://www.haomeiwen.com/subject/howjfrtx.html