数据科学家必会AB Testing基础知识

Jun 05, 2021 by Zhang in  Blog

当遇到典型的产品或工程组织时,团队成员经常会怀疑他们所做的事情是否产生了影响,或者他们在许多不同的设计中所做的选择,是否是最好的。

当这些团队想要以数据为基础来影响决策方向时,AB测试是第一步。

什么是Ab Testing?

AB测试是一种方法,通过向客户或潜在客户展示不同版本的功能、页面、按钮等,并通过一些指标(点击、购买、响应行动等)来评估交互的质量。任何时候,如果你想测试某个东西的多个变体,AB测试都是一个很好的选择。

如何开始

将过程简化为不同的步骤是很重要的。

设计,计划和运行你的实验

第一部分是设置好你的假设,或者你认为会发生的事情。(更具体来说,你认为的是备择假设(Alternative Hypothesis),而零假设(Null Hypothesis)会假设变量之间没有差异变化。)

让我们先来浏览一下你需要了解或者准备的内容:

  • 备择假设(Alternative Hypothesis):这是你认为会发生的事情。例如:变量B比变量A的表现好20%。
  • 零假设(Null Hypothesis):假设变量之间没有差异。
  • 设定好因变量:你要决定你的功能要达到的目的是什么。比如,让用户点击下一页,让他们在购物车里加更多的东西,购买更多的商品,或者其他任何涉及多种产品的东西。无论行动要求或指标是什么,我们都将使用它来衡量变化的程度。
  • 当你设计任何给定的实验时,你可能会有各种各样的自变量,你想用它们来预测Y(你的因变量);在AB测试的情况下,因变量中,变体的解释变量(explanatory variable)只会显示哪个版本会导致什么结果。

在进行实验时的另一个想法,是在相同的时间段内向客户推出变体,而不是在不同的时间段内推出不同的变体。你的样本中中出现越多的非随机变化,你的实验就越不可靠。时间是一个标准化的好例子,不要让季节性(seasonality)变化在你的实验结果中发生影响。当你启动一个实验时,要启动它的所有变体。

到这一步,人们最常问的一个问题是,每种变体需要多少样本,才能得到有统计意义的结果?

为了确定这一点,我们进行了所谓的功效分析(power analysis)。功效分析的原理是根据一系列参数来确定所需的样本量;比如统计能力,p值,变量的数量,以及两组测量的差异大小等。这样做的原因是为了确保实验时间不会太长,以至于让很多客户看到了糟糕的版本,但仍然有足够的时间去证明我们的结果是正确的。

我会在接下来给你做详细说明。

  • K – 变体数(number of variants);至少两个,但可以更多。你需要记住的一点是,变体越多,需要的数据就越多。
  • n – 每组样本容量,我们把这个留作NULL,这就是我们要解决的部分。
  • f – 我们想要验证的组之间观察到的差异:差异越大,需要的样本就越小,差异越小,需要的样本就越大。从我生成的样本数据来看,最小的可测距离为18.7%
  • 显著性水平(significance level):这个数的意思是,如果结果成功验证了你的假设,我们可以接受的随机的可能性是多少;通常,我们用的数字是0.05。
  • 统计功效(statistical power):如果你的假设是真的,你最终接受它的概率是多少。标准通常是0.8。

让我们加载pwr包,然后用pwr.anova.test来确定所需的样本大小。

我创建了两个虚拟数据集,一个用于实验,一个用于预实验。

library(pwr)
pwr.anova.test(k = 2,
               n = NULL,
               f = .202,
               sig.level = 0.05,
               power = .8)

作为参考,我还将提供一段代码,你可能会用到这些操作来达到对基线的理解。基线在这里是变量A。

pre_experiment_data %>%  
summarize(conversion_rate = mean(call_to_action))

正如你在上面看到的,每个变量的n(样本数)是98。

click_data %>%      
summarize(conversion_rate = mean(clicked_adopt_today))

返回的结果是0.502,作为我们的基线,来与变体B的0.673进行比较。

另一种选择是在实验过程中绘制不同变体的性能图表。下面你可以看到,我们按日期和变体对实验数据进行分组,然后汇总并画出每组的平均转化率。由于这只是示例数据,为了可视化的展示,我对数据进行了调整。

experiment_data %>%
  group_by(date, variant)%>%
  summarize(conv_rate = mean(call_to_action))%>%
ggplot(aes(x = date,
           y = conv_rate,
           color = variant,
           group = variant)) +
  geom_point() +
  geom_line()+ 
 theme(axis.text.x = element_text(angle = 90, hjust = 1))

验证和分析你的结果

在每个变体中收集了114个样本之后,就可以验证结果了。

在通过GLM导入度量之前,你可以直接查看实验数据,并检查按变量分组的度量的转换率。

experiment_data %>%
  group_by(variant) %>%
  summarize(conv_rate = mean(call_to_action))

结果和我们之前看到的差不多,这是个好迹象。

另一个选择是去看实验过程中不同变体的表现。

现在,我们用GLM验证这个结果。

正如你在下面的语句中所看到的,我们试着通过它们的经验变体来解释call_to_action的结果。末尾的tidy()函数只是清理了输出,要用这个函数,需要先下载broom软件包。

glm(call_to_action ~ variant,
    family = "binomial",
    data = experiment_data)%>%
  tidy()

首先我们来看variantB的行,你可以看到p值低于我们的最小值.05.

现在,将intercept的估计值与variantB进行比较,可以看到,我们的测试组比对照组有更高的转化率。

结论

达到这个结果后,我们就可以接受我们的假设了!现在,你可以执行你的结果,并继续相应的迭代了!

我们在很短的时间内学习了很多内容,现在,我来把今天所学的内容分解一下:

  • 设计,计划和运行你的实验
  • 如何选择零假设和备择假设
  • ab测试相关参数的解释:k, n, f, sig.level和power
  • 如何进行实验并验证我们的结果

拥有强大的AB测试基础是数据科学家工作的关键,特别是那些产品组织内部,并希望利用他们的技能来推动有意义改进的人。

Data Science-ing快乐!

原文作者:Robert Wood
翻译作者:过儿
美工编辑:过儿
校对审稿:Jiawei Tong
原文链接:https://towardsdatascience.com/ab-testing-fundamentals-for-every-data-scientist-34afa436ce0e

为什么谷歌把SQL当代码对待?你也应该这样做!

Feb 18, 2022

过去 2 年,作为谷歌的供应商,我观察到谷歌的数据工程师(Data Engineers)对待 SQL 的方式与软件工程师(Software Engineers)对待代码的方式相同。

北美求职60秒:为何在低失业率的情况下仍然很难找到工作?(5月第1周)

May 09, 2024

本期话题,带你了解“为何在低失业率的情况下仍然很难找到工作?

应用机器学习技能的十大技术岗位

May 07, 2021

如果你刚开始接触机器学习,你可能想知道哪类技术工作需要用到这些技能。有些职位(尤其是数据科学家)越来越依赖于机器学习,这就意味着你必须至少了解一些基础概念。

Leave a Comment

Your email address will not be published. Required fields are marked *

Comment *