抛弃P值,选择更直观的A/B测试!
时间:2022-10-28 08:30:00
↑↑↑关注后"星标"Datawhale
每日干货&每个月组队学习,不要错过
Datawhale干货
作者:Dr.Robert Kubler,译者:张峰
如何选择两个选项?一个简单而智能的方法是A/B。本文将简要解释A/B测试背后的动机,总结背后的逻辑和问题:它使用的P值很容易被误解。
因此,本文使用贝叶斯
魔法来完善这种方法,讲讲什么是贝叶斯A/B测试,不需要统计学A/B测试。
A/B测试的动机
想象一下,你经营着一家成功的网上商店,每天大约有1万名游客。在这1万人中,大约有100人真的从你的商店买了东西——你所谓的转化率大约是1万/1万=1%,相当小。(大多数网店的转化率约为1-3%,亚马逊甚至超过10%)
因为很多人都去过你的店,但只有少数人成为顾客,你的结论是改善商店转换率
,因为这是增加收入的最大杠杆。
到底是什么让人们不买我的好产品呢?
你想不出好的解释,所以你向一些朋友寻求灵感。他们告诉你,他们不喜欢你购买按钮的蓝色。也许红色会更吸引游客?你可以用数据说话!

开始战斗吧! 方法如下:
将新访客随机分配给蓝队或红队的概率为50%。蓝队的人会看到蓝色按钮,红队的人会看到红色按钮。在这个过程中运行一段时间后,您可以检查哪个团队的转换率更高。
注:蓝队是对照组,红队是测试组。对照组给你一个指示,如果你让一切保持原样,测试组告诉你如果你做了一些干预,比如改变按钮的颜色。
请注意,如果你想轻松评估实验,这种随机化非常重要。你不应该做的事情包括:
将所有男性分配给红色团队,所有女性分配给蓝色团队。无论团队的转换率有多高,你都不知道这是因为按钮的颜色还是性别。
本周将每个人分配给红色团队,下周分配给蓝色团队。即使一个团队的转换率要高得多,你也不知道这是因为按钮的颜色,还是人们只是在一周内买了更多的东西,不管是什么颜色。也许一周包括黑色星期五或圣诞节,或其他更微妙的季节性模式。
为了提取按钮的颜色效应,不应该有其他混淆效应,可以解释两队的不同转换率。
准备A/B测试
不妨假设A/B测试已经进行了一天的适当数据收集,最终得到了一些数据。你只有1万名访客,你随机分成蓝色组(对照组)和红色组(测试组)。你记录了访客是否买了东西(编码1)或没有(编码为0)。
我们可以使用以下代码来模拟结果:
importnumpyasnp np.random.seed(0) blue_conversions=np.random.binomial(1,0.01,size=4800) red_conversions=np.random.binomial(1,0.012,size=5200)
你可以看到,我把1%作为对照组的转换率,1.2%作为测试组的转换率。所以你已经知道,如果抽样不做太奇怪的事情,红色按钮应该表现得更好!这就是为什么我们必须把数据放在对照组中。但从现在开始,假设数据是未知的,因为这就是我们在现实中一直面临的情况。
请注意:这些小组规模不同,通常发生在随机分配中。它们大约是1000/200=5000人,但不太可能得到如此完美的50:50比例。
两个NumPy数组由1和0组成,大部分元素为0。
print(blue_conversions) #output:[000...000] print(red_conversions) #output:[000...000]
我们可以检查的下一件事是访问者(即购买某物的访问者)的份额。
print(f'Blue:{blue_conversions.mean():.3%}') print(f'Red:{red_conversions.mean():.3%}') #output:Blue:0.854%,Red:1.135%
这表明红色按钮的性能可能更好,但目前还不确定。即使不同组的转化率完全相同,一组的最终转化率也会高于另一组。
我们必须排除这只是偶然的,这正是事实 A/B 测试目的。
进行A/B测试
现在让我们看看如何更好地解释正在发生的事情。蓝色按钮还是红色按钮更好?首先,我们将以传统的方式再现,然后我们将以贝叶斯的方式再现。
传统方式
我不会在这里深入,因为有很多资源可以完美地解释如何正常工作 A/B 测试。您想知道以下两个假设中哪一个是正确的:
基本上,您计算测试统计数据,如Fisher's exact test或Welch's t-test 。然后计算一个 p 检查它是否在任何范围内,如5%。Welch-t检验。
fromscipy.statsimportttest_ind print(f'p-value:{ttest_ind(blue_conversions,red_conversions,equal_var=False,alternative="less").pvalue:.1%}') #output:p-value:7.8%
因为有些人对P值很纠结,这里解释一下:
鉴于H?是正确的,我们得到所观察到的或更极端的结果的机会最多是7.8%。
由于 7.8% > 5%,我们保留原来的假设。不清楚红色按钮是否明显好,所以我们只留下蓝色按钮。
我认为 p 值的定义相当不直观-每个误解 p 值得的人都证明了这一点。最常见的误解如下:
蓝色更好的概率是 7.8%。(错了!
虽然没有人说要这样理解,但这样清晰简洁的描述似乎没有错,不是吗?现在,贝叶斯来拯救它 A/B 测试。
贝叶斯A/B测试的优点
贝叶斯 A/B 测试有以下优点:
它使你能够以一定的概率对一个版本做出比另一个版本更好的声明。这就是我们想要的。
你不需要知道所有的统计测试。您只需要建立适当的生成模型并按下贝叶斯推断按钮。
假设你现在已经有一些关于使用PyMC3的知识,没有的话,请查看上面链接的文章。
为了更清楚地说明这些优点,让我们在PyMC3的帮助下用贝叶斯的方式分析我们的问题。首先,我们需要考虑需要推断哪些参数。这很容易,有两个未知参数:
蓝色按钮的转换率;
红色按钮的转换率。
我们现在需要决定两个参数的先验分布。由于转化率可能介于 0 和 1 之间,因此Beta分布是有意义的。Beta 分布有两个参数 a 和 b,可以通过改变它们来创建不同的分布。
因为我们知道转化率相当小,所以它们的良好先验是 Beta(1, 99)。
现在,我们必须考虑如何将观察到的结果(包含0和1的数组)与这些参数联系起来进行建模。直接的方法是使用伯努利变量(Bernoulli_distribution),因为它们可以只取0和1的值,并使用一个概率参数。
长话短说,我们可以编写以下程序:
import pymc3 as pm
with pm.Model():
blue_rate = pm.Beta('blue_rate', 1, 99)
red_rate = pm.Beta('red_rate', 1, 99)
blue_obs = pm.Bernoulli('blue_obs', blue_rate, observed=blue_conversions)
red_obs = pm.Bernoulli('red_obs', red_rate, observed=red_conversions)
trace = pm.sample(return_inferencedata=True)
加上这些解释,这个程序对你来说应该是有意义的。在模型的前两行,我们定义了先验参数。之后,我们设计了模型的输出(伯努利变量),并使用 "observed "参数给它提供了A/B测试准备中的观察结果。最后一行是著名的贝叶斯推理按钮的PyMC3版本。
在trace
对象的帮助下,你可以重建转换率的后验分布。
import arviz as az
az.plot_posterior(trace)
我们发现最大可能性估计转换率,蓝色约为0.854%,红色约为1.135%,甚至还有这些估计值的可信区间。例如,蓝色的比率在0.62%和1.1%之间,概率为94%。
很好,对吗?但这并没有回答我们的问题。红色按钮的转换率比蓝色按钮的转换率高的概率是多少?要回答这个问题,我们可以对两个后验分布进行抽样,看看红色比率比蓝色比率高的频率。幸运的是,这些样本已经存储在trace
对象中。我们只需要看看红色比率样本比蓝色比率样本大的频率。
blue_rate_samples = trace.posterior['blue_rate'].values
red_rate_samples = trace.posterior['red_rate'].values
print(f'Probability that red is better: {(red_rate_samples > blue_rate_samples).mean():.1%}.')
# output (for me): Probability that red is better: 91.7%.
这是我们可以使用的东西!这对我们来说很容易,但其他人——我特别希望业务部门——都能理解。红色按钮更好,概率在 92% 左右?
“完美!”,可以选择店里的红色版本能够提高你的转化率!
现在想象一下:这只是一个有可能增加销售额的微小变化。可能还有其他各种更小和更大的东西可以修补,让你的商店变得更好。比赛才刚刚开始!
结论
有很多情况下,我们必须在两个选项中做出选择。这可以是一个按钮的颜色,也可以是网站上一个物体的位置,一个按钮或图片上的文字,任何有可能被改变的东西。
在两个版本中进行选择的一种方法是进行A/B测试。这个想法很简单。你可以把客户分成两组,这两组只在你想要更改的方面有所不同,即一个按钮的颜色。这样你就可以确定只有你改变的东西导致了结果的改变,而不是其他任何东西。不是人们的年龄或性别,也不是你收集数据的工作日。
通常情况下,人们使用经典的 A/B 测试,往往会使用 p 值。虽然这是统计学家熟悉的概念,但普通人经常会得到涉及 p 值的混淆陈述。这就是我们转向贝叶斯 A/B 测试的原因,它允许每个人都能轻松掌握结果。最后,我们甚至可以用 PyMC3 制定这样的结果,而不需要太多的代码。
原文链接????:
https://towardsdatascience.com/bayesian-a-b-testing-in-pymc3-54dceb87af74
整理不易,点赞三连↓