Jupyter + TensorFlow 搭配谷歌云…90 秒!
数据科学初学者有可能在 2 分钟内启动并运行吗?
数据科学爱好者们,从零到谷歌云 Jupyter 笔记本能有多快?让我们来了解一下!
图片:来源。
定制还是不定制?
如果你想对你的设置进行超级定制,谷歌云会给你令人眼花缭乱的粒度。对于开始企业级项目的团队来说,这是一件令人难以置信的事情,它会扩大你削减的每个角落的后果。
初学者必须在众多选项中跋涉才能入门吗?
但是,如果你是一个只想玩玩数据科学笔记本的初学者,该怎么办呢?你必须在选择的森林中跋涉才能开始吗?好消息:你没有。您可以在 90 秒内启动并运行!(请随意跳到下面的演练。)
您可以在 2 分钟内启动并运行!(下面走一遍。)
如果这是你第一次,我打赌你可能特别渴望尽快到达hello world
。你会想跳过控制面板,使用别人的安装解决方案。如果是这样,你会爱上谷歌云市场!
什么是市场?
欢迎来到预先烘焙的机器图像合集,你可以用它作为自己工作的跳板。是的,如果需要的话,您可以在以后定制这些第三方模板(点击了解更多)。
预烘焙模板的集合。
90 秒挑战
序言够了!让我们看看是否有可能在 2 分钟内从零到英雄。我将在下面分解这些步骤——这只是证明它是可行的。我们开始吧:
我屏幕上的这段记录向你展示了在 90 秒内开始是可能的,但是你酸痛的眼睛可能更喜欢下面的一步一步截图指南。
我们刚刚看了什么?
第一,我们有哪些没看的?步骤 0.1–0.3。
步骤 0.1:创建谷歌账户
你需要一个谷歌账户才能使用谷歌云。我已经有一段时间了,所以没有显示出来。
步骤 0.2:打开谷歌云控制台
我的视频从谷歌云仪表盘屏幕开始,你可以点击console.cloud.google.com进入。第一次使用的用户会被提示一些日常用品。
步骤 0.3:创建新项目
我用的是我做的一个项目,名为 ItsTimeForDemos 。为了创建一个新项目,我点击了仪表板的这一部分:
现在我们准备好了,让我们检查一下我们在屏幕上看到的内容。
第一步:去市场!
为了跳过重新发明自己的轮子,你将前往谷歌云市场。
第二步:寻找你需要的解决方案
在搜索栏里,我会输入关键词“ ai cpu。”
为什么 AI ?我想用一台支持人工智能的笔记本来做这个演示。如果你在找别的东西,只需问搜索栏。这里几乎有 2000 个解决方案。
为什么是 CPU?这是最普通的选择。更强大的硬件——比如 GPU——更强大……这通常也意味着它更贵,并且会更快地消耗掉你的 300 美元免费积分。除非您已经知道为什么需要 beast 选项,否则从它的轻量级同类开始可能是个好主意。
第三步:选择你的赢家
在解决方案中,我选择了 TensorFlow Jupyter 笔记本。你喜欢什么就挑什么。
为什么是笔记本? 数据科学家喜欢笔记本,因为它们结合了最好的交互式数据分析和漂亮的报告制作。
为什么Jupyter*?*这是你最有可能听说过的笔记本电脑解决方案。
为什么tensor flow*?*这是一个强大的深度学习框架;在这里获得更多信息。
步骤 4:启动和部署
点击蓝色的大按钮。重复一遍。
第五步:复制提供的密码并打开笔记本
将为您创建一个随机生成的密码。耐心等待几秒钟,复制它的文本,然后在该选项可用时打开 Jupyter 笔记本。
第六步:你好世界!
粘贴您复制的密码来打开 Jupyter,然后创建一个新的笔记本。
一旦你进入,你会看到 TensorFlow 已经安装好,你可以开始探索了。
起床跑步用了不到 90 秒!
游戏开始。
这是你能拥有的最好的数据科学环境吗?不,因为为你创造完美的解决方案意味着根据你的个人需求定制一切。有一天,你可能会选择这么做。但与此同时,这是我发现的起床跑步的最短路径。我写这篇博文的目的只是想告诉你,有很多超快速的选择。
你能做得比我快吗?
你能做得比我快吗?也许吧!把它当成一个挑战,然后让我知道你花了多少秒。
别忘了
为了避免充电,当你用完的时候不要忘记关灯;使用搜索栏找到部署管理器页面,在这里您可以删除/停止任何您不再需要的内容。
放弃
这篇博文写于 2020 年 4 月,所以如果你来自未来,你的世界可能会有所不同。
感谢阅读!人工智能课程怎么样?
如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:
在这里欣赏整个课程播放列表:bit.ly/machinefriend
与凯西·科兹尔科夫联系
让我们做朋友吧!你可以在 Twitter 、 YouTube 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用这种形式取得联系。
93 个进球:打破韦恩·格雷兹基单赛季 92 个进球的记录,蒙特卡洛分析
韦恩·格雷兹基的记录保持了将近 40 年。它会被打破吗?
作者图片
在 1981-82 年的国家曲棍球联盟(NHL)赛季中,韦恩·格雷兹基为埃德蒙顿油工队在仅仅 80 场比赛中打入 92 球,创下了单赛季进球最多的纪录。唯一接近格雷茨基进球记录的球员是 1990-91 赛季的布雷特·赫尔,当时他在圣路易斯布鲁斯队的 78 场比赛中打进 86 球。此后再无球员破 80 球,最近 20 年也只有两位球员一个赛季进球超过 60(亚历山大·奥韦奇金’ 08 和史蒂文·斯塔姆科斯’ 12)。92 球的记录只是韦恩·格雷茨保持的 NHL 记录之一,许多人认为这一记录永远不会被打破。在这篇文章中,我将使用蒙特卡洛分析来估算打破格雷茨基 92 球记录的可能性。我分析了现代最伟大的进球赛季,以测试一名球员打破 92 个进球是多么幸运。
NHL 进球历史
首先,介绍一下格雷茨基 92 球记录的背景,以及为什么这个记录从未被打破。如上所述,在 1981-82 赛季,格雷茨基创造了 NHL 单赛季得分记录,该记录已经保持了 38 年。这不仅仅是因为“伟大的一位”的技术,也是因为当时曲棍球的不同风格。请看下面 NHL 平均每场进球的图表,数据来自Hockey-Reference.com。
作者图片
20 世纪 70-90 年代,每场比赛的进球数大幅增加。NHL 的快速扩张与更高技能的球员相结合,导致了单场比赛中更多的进球。80 年代末和 90 年代带来了更好的守门员,更好的教练,来自世界各地的更好的球员,以及一系列其他因素,这些因素都减少了每场比赛的进球数。一个经常被问到的问题是,“在格雷茨基的职业生涯中,他对场均进球有多大的影响?”。下图显示了除格雷茨基职业生涯进球和助攻之外的平均每场进球。
作者图片
自 20 世纪 80 年代以来,曲棍球运动发生了翻天覆地的变化。场均进球数从 8 个左右下降到 6 个,50 球赛季数也有所下降。在 1979-80 赛季和 1989-90 赛季之间,NHL 球员总共取得了 84 个 50 球的赛季。现在,在 2009-10 和 2019-20 赛季之间,只有 11 个赛季。由于球员技术的提高、教练水平的提高和设备技术的进步,现代的进球率在联盟范围内和个人球员中都有所下降。现代的任何球员都能打破格雷茨基赛季 92 球的记录吗?让我们找出答案。
蒙特卡罗法分析
使用一些现代最伟大的 NHL 进球赛季的球员得分统计数据,我模拟了一名球员在一场 NHL 比赛中的进球数量。然后,我模拟了 82 场比赛来估计整个 NHL 赛季。我重复这个过程数千次,以估计一名选手打破格雷茨基记录的真实概率。这种方法被称为蒙特卡洛分析,我们可以用它来模拟特定球员的 NHL 赛季,并获得可能结果的分布。
我使用来自 NHL.com 的进球数据来为一名球员在一场比赛中的进球数做一个概率分布。然后我随机抽取与概率分布相对应的值,以确定一名球员在一场比赛中的进球数量。例如,在奥韦奇金的 2007-08 赛季,他在 34 场比赛中打入一球,在 10 场比赛中打入两球,在一场比赛中上演帽子戏法,在两场比赛中打入四球,总共 65 球。由此,我们可以估计奥韦奇金 2008 在任何给定的比赛中有(34/82)* 100 = 42.5%的机会打进一球,有(10/82)* 100 = 12.2%的机会奥韦奇金打进两球,有(1/82)* 100 = 1.2%的机会上演帽子戏法,有(2/82)* 100 = 2.4%的机会打进 4 个 goals⁴.下面,我模拟了奥韦奇金的 2008 赛季 10,000 次,看看有多少次奥韦奇金打破了格雷茨基的 92 球纪录。
作者图片
在 10,000 个模拟的 2008 赛季中,奥韦奇金 7 次打破格雷茨基的 92 球记录,在他最好的赛季中打进了 105 球,所有 10,000 个赛季的平均进球数为 65.0851(与实际的 2008 赛季相比,他打进了 65 球,这是我们使用蒙特卡洛分析所预期的)。下面是奥韦奇金最佳模拟赛季和格雷茨基 1992 赛季的对比图。
作者图片
所以在 2008 年,奥韦奇金有大约(7/10000)* 100 = 0.07%的机会打破格雷茨基的单赛季进球纪录。但是,同样,这个估计是缺乏的,因为它是基于一个已经异常的季节。为了获得更准确的百分比,让我们使用奥韦奇金 2008、2009 和 2010 赛季的平均值。我还使用了其他两个现代时期的出色进球表演:2000 年至 2001 年佛罗里达州黑豹队的帕维尔·布尔和 2010 年至 2012 年坦帕湾闪电队的史蒂文·斯塔姆科斯。然后作为一个更近的例子,典型的火箭理查德过去十年的赢家,奥韦奇金 2018-2020。对于每个球员,我模拟了 10 万个赛季,以获得更准确的结果分布。
结果
作者图片
在 10 万个模拟赛季中,布雷 1999 年 48 次打破格雷茨基的进球纪录,奥韦奇金 2008 年 74 次打破纪录,斯塔姆科斯 2012 年仅两次打破纪录,奥韦奇金 2019 年零次打破纪录。在他们各自的最佳模拟赛季中,Bure 1999 年进了 101 个球,Ovechkin 2008 年进了 103 个球,Stamkos 2012 年进了 96 个球,Ovechkin 2019 年进了 84 个球。以下是与格雷茨基 1982 赛季相对照的几个赛季。
作者图片
这些蒙特卡洛分析的结果进一步表明,奥韦奇金的 2008 赛季是现代球员中最接近打破格雷茨基进球纪录的一个赛季。1999 年,帕维尔·布尔打破格雷茨基进球纪录的几率约为(48/100000)* 100 = 0.048%,或者说,2083 年的几率约为 1%。在 2008 年,奥韦奇金有(74/100000)* 100 = 0.074%的机会打破格雷茨基的进球纪录,大约是 1351 分之一。2012 年,斯塔姆科斯有(2/100000)* 100 = 0.002%的机会打破格雷茨基的进球纪录,也就是五万分之一的机会。
那么,怎样才能打破格雷茨基的现代 92 球记录呢?在 2007 年至 2009 年期间,像亚历山大·奥韦奇金这样优秀的球员,在任何一个赛季中,都有 1/1351 的机会打破格雷茨基的单赛季进球纪录。这意味着,如果他们连续打了 1351 个赛季,他们平均只会打破一次记录。自 2009 年以来,没有一个球员的表现像奥韦奇金在 2007 年至 2009 年期间那样好。在我们有生之年,要打破格雷茨基 92 球的赛季记录,需要一个全新的一代人/有天赋的人才和/或曲棍球风格的巨大转变。最后,格雷茨基在仅仅 80 场比赛中打进 92 球。即使一名球员打破了格雷茨基的单赛季纪录,他们也不可能打破格雷茨基 80 场比赛 92 球的纪录。“伟大的一个”是不可改变的。
[1]: 这篇来自 HockeyAnalytics.com 的文章很好地总结了 NHL 这些年来风格的变化。
[2]:https://en . Wikipedia . org/wiki/List _ of _ NHL _ players _ with _ 50-goal _ seasons
[3]:请记住缩短的 2012–13 和 2019–20 赛季。如果打满赛季,那 11 个可能更接近 15 个。
深度学习超参数的 a、B、Cs……
超参数:是福是祸,由你决定。好吧,我们都知道“人工智能是新的电力”,我们不可避免地需要力量和知识来综合和控制它。
Diomari Madulara 在 Unsplash 上拍摄的照片
D eep learning 目前成为新闻,因为它的准确性和对我们现有模型的控制。有了大量的编程软件,如 TensorFlow 、 Keras 、 Caffe ,以及一个巨大的列表,简化了深度学习编程的工作。现在,我们不必担心反向传播步骤、权重更新等,而只需调整超参数。
然而,深度学习的人知道这不是一件简单的事情。由于预测精度高,深度学习有利于拥有大量超参数,这些超参数由从业者根据他们的任务或他们实施深度学习模型的问题类型来使用。
人工智能对世界来说是一种恩惠,但如果你不明智地使用它,它可能会成为你的诅咒,而要明智地使用它,你需要准确地理解它。
因此,为了准确地理解它们,我们需要回答三个问题,即何时、何地以及在何种背景下。在此之前,让我们列出它们,以便顺利开始。
我们将讨论以下超参数的三个 w:
- 学习率
- 隐藏单元数和隐藏层数
- β(带动量的梯度下降)
- β1、β2 和ϵ (Adam 优化器)
- 学习率衰减
- 小批量(小批量梯度下降)
1.学习率
当你写出梯度下降的最基本形式并更新参数时,这里就是学习率出现的地方
梯度下降的步骤(由作者出版)
学习率决定了你在梯度下降的每次迭代中要跳多远。一般来说,学习率在 0.001 和 1 之间,这可以随着你向函数的最小值前进而变化。
2.隐藏层和隐藏单元的数量
另一个重要的超参数是隐藏层中隐藏单元的数量和隐藏层本身。它决定了模型在给定数据点中描述的函数有多复杂。隐藏单元和隐藏层的数量越多,模型概述的函数就越复杂,因此过度拟合的机会就越多。
通常,人们采用许多隐藏层和隐藏单元来构建深度神经网络,并使用一些技术,如 L2 或辍学正则化,以防止数据过拟合的规定。
没有规定的方法来确定正确的或最佳的层数,您必须从某个最小的层数开始并增加它,直到您达到期望的预测精度。这就是为什么应用机器学习是一个高度迭代的过程。
另一个参数是你的系统, CPU ,或者 GPU 决定了隐藏层和单元的数量。因为这是一个高度迭代的过程,你需要迅速得到每次迭代的结果,为此你应该有很高的计算能力。
3.带动量的梯度下降
什么是加权平均?
假设我们记录了夏季 200 天的温度(黄色散点分布)。附加曲线代表不同权重(β)的加权平均温度。
##CODE FOR WEIGHTED AVERAGE
temp ## list of temperatures of 200 days
v[0] = temp[0] ## random initialization (for scalability)
for i in range(len(temp)) :
v[i+1] = (beta)*v[i] + (1-beta)*temp[i+1]
印度德里 200 天的温度分布((作者发表))
注意:我们已经初始化了 v[0] = temp[0],以确保加权平均温度保持在实际分布的范围内。
我们如何利用这一点?
假设我们有以下类型的成本函数,我们的梯度下降与它很好地合作。
成本函数上的批量梯度下降(由作者发表)
但是,当我们有足够的数据来训练时,梯度下降在振荡中花费了大量的时间来达到成本函数的最小值。当我们将加权平均应用于梯度下降时,它将两个方向的值平均化。因此,垂直值相互抵消,我们在水平方向获得更多的动量。
成本函数上带有动量的梯度下降(由作者发表)
这叫做动量梯度下降。通常,β的范围从 0.9 到 0.99,我们使用对数标度来寻找该超参数的最佳值。
## UPDATION STEP OF GRADIENT DESCENT
W = W - learning_rate * dW
b = b - learning_rate * db## CHANGE IN UPDATION STEP OF GRDIENT DESCENT
## WEIGHTED AVERAGE form of GRADIENT DESCENT
VdW = beta * VdW + (1-beta)*dW ## Taking weighted avg of weights Vdb = beta * Vdb + (1-beta)*db ## Taking weighted avg of biases## Updating weights and biases
W = W - learning_rate*VdW
b = b - learning_rate*Vdb
4.Adam 优化器
批量标准化
据观察,当我们标准化输入数据时,训练变得更快。那么,为什么我们不对每个隐藏层的输入进行标准化呢?这种技术被称为批处理规范化。通常,在将它们放入激活函数之前,我们会对值进行归一化。
但是,如果我们对如下所示的给定的猫图片进行训练,我们的模型就有可能预测不正确。
(1)Kazuky aka yashi 在 Unsplash 上的照片,(2)Lamna The Shark 在 Unsplash 上的照片,(3)Daria Shatova 在 Unsplash 上的照片,(4)Tran Mau Tri Tam在 Unsplash 上的照片
这是因为训练数据集中的所有猫都是黑色的,而测试数据集中的图片是白色的猫。从数学上讲,测试数据集和训练数据集的数据分布是不同的。
标准化是一种技术,通过这种技术,我们每次必须提供输入时都可以获得相同的数据分布。标准化的一般步骤是:
规范化输入数据的步骤(由作者发布)
这些步骤使平均值为零和单位标准偏差。这种特殊的分布可能并不总是有效。可能存在这样的情况,我们需要具有不同集中趋势的分布。因此,我们需要调整分布参数,即平均值和偏差。
调整标准化数据集中趋势的附加步骤(由作者发布)
步骤 4 允许我们调整分布参数。此外,在步骤 3 中,我们添加了一个ε项,以确保分母永远不等于零。
5.小批量
梯度下降的一次迭代过程:
分批梯度下降法(作者发表)
当训练集非常大时,比如说大约 500 万个样本,那么升级一次参数所需的时间将会很长。因此,作为一种补救措施,我们将大型数据集划分为较小的数据集,对于这些较小数据集的每次迭代,我们都要更新参数。
小批量梯度下降法(作者发表)
这里,我们将训练集分成三个更小的集合,但是有一些规范可以做到这一点。人们建议我们应该在小批量中生产相当于 2 的某个幂的批量,即 64、128、1024 个样品。这在某种程度上优化了内存分配,实际上优化了模型的性能。
整个数据集的一个循环的完成被称为一个时期。当我们使用批量梯度下降(简单梯度下降)时,我们在一个时期内更新一次参数,但是在小批量梯度下降中,在一个时期内更新多次参数。
6.学习率衰减
取学习率的大值可以优化时间,但是我们可能永远达不到最小值。相反,如果我们取一个小的学习率,学习速度就低。那么,为什么我们不能在训练模型时改变学习率呢?
当学习速率接近收敛(成本函数的最小值)时,可以减慢学习速率以获得更好的结果。在这种情况下,学习率的一个非常一般的形式可以表示为
实现学习率衰减(由作者出版)
在这个例子中,我们可以观察到学习率是如何变化的。现在明智地选择“衰变率变得很重要,因此可以称为另一个超参数。
猜测…
当你训练一个模型时,感知每个参数和超参数的细节是非常重要的,因为你梦想它会给世界和社会带来一些变化。即使是一件小事也能引发一项大的创新。
至此,我希望这篇文章能为你增添一些东西。请分享你的想法,因为
"批评是自我吹嘘的一种间接形式。"埃米特·福克斯
A/B 测试统计变得简单
第 1 部分:连续度量
我们的 A/B 测试刚刚结束,看起来测试的表现比控制组好。但是这个结果仅仅是因为随机噪声吗?还是结果大到有统计学意义?本指南将告诉你如何使用推断统计学来回答这些问题。
统计学常常是一门令人生畏的学科。许多教科书,甚至是那些针对初学者的教科书,都太快地陷入像这样看似复杂的公式:σd = sqrt( σ1^2 / n1 + σ2^2 / n2)。或者他们太快进入抽象概念,如“测试统计”。公式和抽象有一个重要的位置:它们允许你快速有效地执行统计分析。但它们不是吸引观众或教授统计概念的最佳工具。
在本文中,我们将使用模拟将关键的统计概念带入生活,而不是依赖于公式。我们将解构抽象来阐明所有隐藏的组件。总之,我们将揭开这个迷人的主题领域的神秘面纱,让读者更容易理解和享受。
唯一的先决知识是熟悉均值、标准差和密度图。这篇文章(第 1 部分)关注于连续指标的分析(考虑年龄、身高、收入等。).在以后的文章中(第二部分),我们将检查比例指标(想想转化率,吸烟者的百分比,满意的顾客比例,等等)。).
1.通过模拟创建采样分布
想象一个有 100 万居民的城镇。一半居民是男性,另一半是女性。每个组的平均年龄是 35 岁。女性年龄的标准差略高于男性年龄。以下是总体参数的汇总:
如果我们要绘制每个群体的年龄密度图,它可能是这样的:
现在想象一下,我们想要探究两个群体之间平均年龄的差异。我们知道它应该是 0,因为两个人口有相同的平均年龄。让我们运行以下过程:
- 我们随机抽取 200 名男性样本,计算他们的平均年龄
- 我们随机抽取了 200 名女性,并计算了她们的平均年龄
- 我们计算平均年龄的差异
在运行完这个过程一次后,我们得到以下结果:
现在,让我们运行一个模拟,将上述过程重复 10,000 次:
尽管我们知道两个群体的平均年龄都是 35 岁,但我们对平均值的估计因样本而异。有些估计值高于 35,有些则低于 35。样本之间的这种自然变化被称为随机 采样误差 。
抽样误差也会导致样本之间的估计年龄差异(最后一列)不同。有些估计值高于 0,有些则低于 0。让我们来看看这些值的分布情况:
这个图叫做 抽样分布 。具体来说,就是均值之差的抽样分布。大多数差值接近于零,这是意料之中的,因为两个群体的平均值相同。也有一些样本产生很大的差异,也是由于随机采样误差。这些值出现在分布的尾部,这告诉我们它们出现的频率较低。
总结:使用模拟,我们创建了一个抽样分布。这种抽样分布说明了由于随机抽样误差引起的样本之间的自然变化。
2.生成采样分布的一种更快速的方法
模拟有助于我们理解什么是抽样分布以及它是如何创建的。一旦我们理解了这些概念,我们就可以完全不用模拟,直接计算抽样分布。这种方法更快、更准确。
为了计算抽样分布,我们只需要知道三个属性:
- 形状。一个抽样分布是总是对称的(给定足够的数据点),不管潜在人口分布的形状如何。具体来说,形状被称为 正常 (对于足够大的样本)。
- 的意思是。抽样分布的平均值是两个基础分布的平均值之差。在我们的例子中,这将是零,因为两个潜在的人口有相同的平均年龄。
- 标准偏差。当涉及抽样分布时,这也被称为 标准误差 ,因为抽样分布表征了抽样误差。原来我们可以这样计算:
现在我们知道了这三个属性,我们可以使用大多数编程语言快速计算采样分布。例如,在 R 中,我们可以简单地写:
rnorm(n = 10000, mean = 0, sd = 1.27)
这一行代码将生成 10,000 个值的正态分布,平均值为 0,标准偏差为 1.27。让我们绘制这些计算值(红色)相对于我们通过模拟创建的先前分布(黑色)的分布图:
注意这两个发行版是多么的相似。计算出的分布是精确的。模拟分布是一个不完美的估计。因此,两者之间略有差异。
重述:我们不再需要运行许多模拟来估计抽样分布。原来有一个简单的公式来计算我们的抽样分布的标准偏差。有了这个,我们现在可以快速计算精确的采样分布。
3.对一些 A/B 测试结果的初步看法
现在想象你必须解释 A/B 测试的结果。例如,你为你的网站设计了一个全新的主页,你认为这将会给每个访问者带来更高的收入。你设置了一个持续几周的 A/B 测试,其中一半的访问者看到了新的主页(测试组),另一半看到了现有的主页(控制组)。测试结束时,我们会看到以下结果:
乍看起来,测试实际上比控制组的表现要好,每个访问者多花了 7.7 美元。但是我们能相信这个结果代表了总体均值之间的真实差异吗?毕竟,在前面的章节中,我们已经观察到,即使两个总体具有相同的均值,由于抽样误差,我们仍然会产生一系列的差异估计值。
因此,假设测试和控制人口有相同的手段,有多大的可能性,我们会看到高达 7.7 美元的结果,仅由于抽样误差?这种假设——即测试和控制群体均值之间没有实际差异——被称为*(H0)。按照惯例,我们总是从 H0 开始,然后着手检查支持或反对它的证据的力度。*
总结:尽管第一次看起来测试比控制组表现得更好,但我们需要了解在假设无效的情况下,我们看到 7.7 美元结果的可能性有多大。
4.计算零假设的抽样分布
为了理解在给定零假设的情况下看到结果$7.7 的概率,我们首先需要理解假设测试和控制人群具有相同均值时可能出现的值的分布。
换句话说,我们需要在假设零假设为真的情况下生成结果的抽样分布。我们可以使用与之前相同的步骤进行计算,我们只需要知道三个属性:
- 形状=正常(如所示)
- 均值=零(如零假设所述)
- 标准误差(计算)
请注意,我们使用样本标准差作为总体标准差的最佳猜测。下面是我们的抽样分布图:
回顾:假设假设无效,我们看到 7.7 美元结果的可能性有多大?要回答这个问题,我们首先需要了解零假设下的抽样分布。我们可以这样计算,假设 a)分布的形状是正态的,b)测试和控制群体具有相同的平均值,c)我们的样本标准偏差代表总体标准偏差。
5.解释 A/B 测试结果
给定零假设下的抽样分布,我们有多大可能看到测试和控制均值之间的差异为 7.7 美元?请记住,如果零假设是真的,那么分布是对称的平均值为零。这意味着我们获得 7.7 美元的结果的机会与获得-7.7 美元的机会相等。因此,问题变成了:在给定零假设的情况下,获得极端结果或更极端结果7.7 美元的概率是多少?
让我们重新检查我们的抽样分布:
这里,我们用蓝色阴影标出了曲线上由和7.7 美元一样极端或更极端的值所限定的区域。两个面积之和为 2%,该值称为 p 值 。它告诉我们,如果零假设是真的,那么在 100 个 A/B 测试中,只有 2 个测试的结果会达到 7.7 美元或更高。
相比之下,橙色阴影区域(你必须想象橙色区域一直在蓝色区域之后)占曲线下总面积的 5%。5%的值是任意选择的,它被称为 显著性水平 或𝛂.当 p < 𝛂时,我们拒绝零假设。
换句话说,我们是说,如果我们看到一个 A/B 测试结果只可能在 100 个 A/B 测试中出现不到 5 个(假设是零假设),那么我们将拒绝零假设(即使它是真的)。这意味着我们有 5%的几率会冒错误地拒绝零假设的风险。因此,𝛂也被称为第一类错误率。
总结:在零假设下,看到极端或超过 7.7 美元的结果的可能性不大。具体来说,我们的 p 值为 0.02 意味着我们只可能在 100 个实验中的 2 个实验中看到极端或超过 7.7 美元的结果。这个比率小于我们的显著性水平(𝛂)0.05,因此,我们拒绝零假设。这可能是也可能不是正确的结论,从长远来看,我们的 1 型错误率= 0.05 (= 𝛂).
6.计算 p 值的更快方法
在实践中,统计学家不会根据每组 A/B 测试结果创建定制的抽样分布。对于足够大的样本量,他们采用单一的、 标准正态分布 。这个分布的平均值为 0,标准偏差为 1。任何平均值为 0 的正态分布都可以通过除以标准误差转换为标准正态分布。
因此,如果我们将之前分布中的所有值除以标准误差($3.31),我们会得到以下结果:
转换后的值被称为 z 值,它们是无单位的。
对于标准正态分布,5% 的显著性水平始终对应于等于或大于 1.96(大约)的 z 值。我们将 1.96 称为具有 5%显著性的 临界 z 值 。我们的 p 值不变,还是 0.02。在这里,曲线下的面积对应于 z 值达到或超过 2.32(7.7 美元/3.31 美元)。这个值称为 z 得分 或 检验统计量 。
按照惯例,统计学家使用标准的正态分布,其平均值为 0,标准差为 1。这消除了为每个 A/B 测试计算定制取样分布的需要。我们只需要计算 z 得分(观察到的差异/标准误差)。p 值就是由 z 得分限定的曲线下的面积。
7.置信区间
概括地说,我们的 A/B 测试结果是每个访问者 7.7 美元,我们认为,如果实际上测试人群和控制人群具有相同的平均值,这个值不太可能出现。更正式地说,我们的 p 值 0.02 小于我们的显著性水平 0.05,因此我们拒绝零假设。
我们拒绝了总体均值之差= 0 的(无效)假设。因此,我们自动接受了 的替代假设(HA) 其中,在这里,状态之间的差异意味着≠ 0。
所以如果均值之差不等于等于 0,那么等于什么?一个答案是 7.7 美元。假定我们现在认识到了采样误差的影响,一个更好的答案将确定一个可能值的范围*。***
那么,给定另一个假设,可能值的范围是什么呢?同样,我们只需要参考抽样分布。替代假设的抽样分布与零假设的抽样分布相同,只有一个例外:它的平均值等于观察结果($7.7):
灰色阴影区域代表图表的中间 95%,对应于(1.21,14.19)或 7.7±6.49 的*。每个置信区间都有一个相关的 置信水平 ,该置信水平由显著性水平(𝛂)预先确定,等于 1—𝛂= 1–0.05 = 95%。*
置信区间和置信水平的另一种解释是这样的:如果我们要重复整个 A/B 测试,那么我们可能会得到测试和控制样本,由于采样误差,它们的样本标准偏差略有不同。所以我们会产生一个稍微不同的抽样分布,从而产生一个稍微不同的置信区间。现在,如果我们多次重复整个 A/B 测试,那么从长远来看,95%的置信区间将包括总体均值之间的真差。请注意,这与说有 95%的概率我们的单一置信区间包含总体间的真实差异是不同的。
概述:置信区间(在相关置信水平上)显示了我们的 A/B 测试结果的可能值范围。在这里,我们报告的置信区间为 7.7±6.49,置信水平为 95%。
8.力量
关于假设检验,需要理解的另一个关键概念是统计功效。权力类似于意义:
- 显著性(𝛂) =当 H0 为真时拒绝 H0 的概率。
- 功率(1-𝛃) =当 HA 为真时接受 HA 的概率。
既然我们已经接受了 HA,那么在这里权力的概念基本上是多余的。我们将在以后关于样本大小计算的文章中讨论它。
重述:测试的功效是当 HA 为真时接受 HA 的概率。在测试运行之前,当您计算测试所需的样本量时,这是最重要的。
9.R 中的统计分析
至此,您应该对统计分析的总体框架感到相当满意了。现在,让我们看看如何将上述所有步骤简化为几行代码。在 R 中我们会写:
这会产生:
*[1] "standard error"
3.30989123688377[1] "p-value"
0.0199993307409128[1] "critical value at alpha = 95%"
6.48726761703693[1] "confidence interval, lower bound"
1.21273238296307[1] "confidence interval, upper bound"
14.1872676170369*
回顾:一旦你熟悉了统计分析中的所有步骤,你就可以使用计算机程序,如 R 快速进行计算。
10.摘要
在本文中,我们探讨了统计分析中涉及的许多关键概念和层次。我们回顾了一些捷径,一旦理解了这些概念,就可以更快地找到答案。希望这已经让你对 A/B 测试统计有了更好的理解。在下一篇文章的中,我们将使用我们在这里学到的知识来分析一个不同的 A/B 测试,其中成功度量是一个比例。
A/B 测试统计变得简单
第 2 部分:比例度量
这篇文章将展示当输出指标是一个比例,比如客户转换率时,如何评估 A/B 测试的结果。这里我们利用了我们在第 1 部分:持续度量中建立的统计基础,所以如果你需要复习,就从这里开始吧。
统计学可能是一门令人望而生畏的学科,但也不尽然。这些指南的目的是让人们更容易使用统计工具。本指南使用模拟数据来揭开主题的神秘面纱,并使关键的统计概念变得生动。尽情享受吧!
1.模拟两个相同网站的转化率
想象一下,我们拥有 2 个网站。每个网站以 30%的比率将访问者转化为客户。让我们看看 1000 个访问者访问每个网站后会发生什么:
现在我们运行一个模拟,可以对总共 100,000 个样本重复上述过程。以下是结果的一瞥:
因此,尽管我们知道真实转换率是 30%,但由于随机 采样误差 ,我们看到这个数字周围有一些变化。现在让我们把上面所有的数字转换成比例:
最后,让我们绘制转换率差异的分布图(最后一列):
总结:我们有两个转化率相同的网站。所以转换率的差异应该等于零。但是由于抽样误差,我们看到结果的抽样分布在零附近。
2.将模拟应用于 A/B 测试
现在假设 A/B 测试产生以下结果:
测试处理真的提高了 45 个客户的转化吗?或者测试组和对照组有相同的转化率吗?在这种情况下,我们观察到的任何差异都只是随机抽样误差的结果?
让我们更正式地捕捉这些假设:
- (零假设 ):人口转换率之差= 0。任何观察到的差异都是由于采样误差造成的。
- 哈 ( 替代假设 ):人口转化率之差≠ 0。观察到的差异不太可能仅仅是由于采样误差。
因此,让我们从确定假设为零时的抽样分布开始。我们需要知道的只是真实的(人口)转换率可能是多少。我们最好的猜测是样本转换率的平均值:(0.335 + 0.290) / 2 = 0.3125。现在,让我们模拟一下测试组和对照组的转换率均为 0.3125 时的分布情况:
回顾:我们再次使用模拟来生成抽样分布。这里我们假设测试人群和控制人群具有相同的转化率——这是我们的零假设。
3.生成采样分布的一种更快速的方法
模拟是生成抽样分布以展示抽样误差影响的一个很好的工具。如果我们想移动得更快,我们可以,事实上,计算采样分布如下:
第一步:计算汇集样本比例( p )。
我们已经计算出这是 0.3125。
下面是实际的公式,当测试组和对照组的样本量不同时,这个公式特别有用:
第二步:用 p 计算标准误差( se )。
步骤 3:计算一个均值= 0,标准差= 0.0207 的正态分布。
在 R 中,我们可以简单地写:
*rnorm(n = 10000, mean = 0, sd = 0.0207)*
让我们来看看这个计算值的分布(红色)与之前我们通过模拟创建的分布(黑色)相比是什么样的:
如你所见,我们有一个几乎完美的匹配!事实上,模拟导致对采样分布的估计*。然而,如果我们无限次运行模拟,我们将获得计算出的采样分布。因此,它是精确的抽样分布。*
概述:我们不再需要运行许多模拟来估计抽样分布。我们现在可以计算精确的采样分布。
4.解释 A/B 测试结果
那么,给定上面的抽样分布,在零假设下,获得 0.045 或更大的结果的概率是多少?让我们重新检查我们的抽样分布:
*这里我们的 p 值 (蓝色阴影)是 3%,它告诉我们,如果零假设为真,那么我们预计在 100 次 A/B 测试中只有 3 次会看到极端或大于 0.045 的结果。由于我们的 p 值小于我们的 显著性水平(【𝛂】**)*0.05,我们拒绝零假设。
总结:在零假设下,转换率提高到 0.045 或更高的可能性不大。具体来说,我们的 p 值为 0.03 意味着我们只可能在 100 个实验中的 3 个实验中看到极端或大于 0.045 的结果。这个比率小于我们的显著性水平(𝛂)0.05,因此,我们拒绝零假设。
5.计算 p 值的更快方法
我们可以通过使用 标准正态分布 来加速这个过程。我们可以通过除以标准误差将我们的分布转换成标准正态分布。同样,我们也可以通过除以标准误差将我们的测试结果转换成一个 z 分数 。所以这里我们得到 0.045 / 0.0207 = 2.17。
使用这个 z 值,我们现在可以通过查找表快速确定 p 值,或者使用编程语言如 R 计算 p 值:
*pnorm(q = -2.17, mean = 0, sd = 1) * 2*
在这两种情况下,我们得到了与之前相同的 p 值:0.03。
概述:通过将我们观察到的转换率差异(0.045)转换为 z 值(2.17),我们能够利用标准正态分布的查找表来快速得出 p 值。
6.置信区间
概括一下:
- 我们已经否定了原假设***【H0】*认为人口转换率之差= 0。
- 因此,我们必须 接受 的替代假设 (哈) 即人口转换率之差≠ 0。
如果我们接受人口转换率的差异不等于零,那么等于多少?给定替代假设,可能值的范围是什么?让我们参考给定替代假设的抽样分布:
灰色阴影区域代表图表的中间 95%,对应于置信区间(0.004,0.086)或 0.045±0.041。每个置信区间都有一个相关的置信水平,该置信水平由显著性水平(𝛂)预先确定,等于 1-𝛂= 1–0.05 = 95%。置信区间告诉我们,如果我们多次重复整个 A/B 测试,那么从长远来看,95%的置信区间将捕捉到人口转换率之间的真实差异。
概述:置信区间(在相关的置信水平上)显示了我们的 A/B 测试结果的可能值的范围。在这里,我们报告的置信区间为 0.045±0.041,置信水平为 95%。
7.R 中的统计分析
至此,您应该对统计分析的总体框架感到相当满意了。现在,让我们看看如何将上述所有步骤简化为几行代码。在 R 中我们会写:
这会产生:
8.摘要
在这里,我们探索了分析 A/B 测试所涉及的步骤,以及将所有步骤联系在一起的框架。希望这已经让你对 A/B 测试统计有了更好的理解。在这种情况下,我们有足够的证据(根据 p 值)来拒绝零假设。但是,如果我们没有收集到足够大的样本来产生 p 值怎么办?下一篇文章中,我们将演示如何提前推断出所需的样本量。
A/B 测试-第 1 部分
A/B 测试是一个很难理解和解释的概念。在这篇文章中,我将带你了解 A/B 测试背后的理论。
我们将关注以下主题:
- 什么是假设检验?
- 选择正确的指标
- 设计测试
- 分析测试的结果
什么是 A/B 测试
A/B 测试是一种用于测试在线平台上新功能推出或现有功能变化的性能的方法。这种方法通常被称为假设检验,并被用于许多不同的领域。例如,在医学领域,研究人员进行临床试验,并使用假设检验来衡量新药的有效性。假设检验基本上是用来检验研究人员在他们的新发明背后的假设。
然而在科技领域,假设检验的用例是不同的。比方说,一家科技公司的设计团队对网站上的注册按钮进行了新的设计。我们应该继续改变设计吗,因为我们认为它会对我们的用户更有吸引力?
不要!我们需要测试这个新设计,看看用户对这一变化的反应。为了测试这一点,我们得到了我们人群的一个子集(我所说的人群是指我们平台的所有用户),并将他们分成两个不同的组,名为控制组和测试组。控制组中的用户将看到注册按钮的当前设计,测试组中的用户将看到新的设计。
每当我们对一个特性进行修改时,我们应该运行一个测试吗?
不要!而一个数据科学家可能会说:请不要!
但是,为什么呢?
根据测试背后的假设,在某些情况下,A/B 测试可能不会告诉您需要什么。
衡量长期效果:假设一家房屋租赁公司想要对其推荐计划进行一些更改。事实是,用户不会经常寻找公寓,所以需要几个月甚至几年的时间用户才会回到网站,因此,在这种情况下运行 A/B 测试对你没有帮助。
衡量新体验:想象你正在完全改变你的网站首页的用户界面。测试组中的老用户可能会喜欢新的 UI,并想尝试所有的东西。这被称为新奇效应。我们可能会错误地认为测试组表现得更好。在推出新的用户体验时,我们应该始终考虑新鲜感的影响,并记住,在用户适应这种新体验以及你看到他们的真实行为之前,需要一些时间(几天、几周,取决于业务)。
或者,您可以使用其他技术,如焦点小组或调查来获得一些定性数据,并在此基础上做出一些假设。
测试前分析
陈述你的假设:在运行测试甚至设计测试之前,你需要陈述你的假设。你有一个想法,你认为为用户提供了更好的体验,并为你的公司创造了更多的收入。识别测试中的无效假设和替代假设。在注册按钮的设计变更的例子中,你假设设计的变更会鼓励更多的用户注册。
为你的测试选择和描述度量标准:一般来说,我们需要两种不同类型的度量标准。
A.不变度量
在我们进行更改时,这些指标应该保持不变。这些度量标准的完美用途是进行健全性检查和识别实验设置中的问题。在我们的示例中,两组中查看注册按钮的用户数量应该保持不变,因为我们没有做出任何影响用户查看注册按钮的更改。
B.评估指标
这些是我们用来衡量我们所做的改变的影响的指标。评估指标分为不同的类别:
- 总和与计数
- 平均值和中位数
- 概率和比率
在工业中,概率和比率经常被用来检查测试的性能。这两者是有区别的!再次考虑我们的注册按钮:
- 点击率(CTP)= #点击注册按钮的用户数/#查看注册按钮的用户数
- 点击率(CTR)= #点击事件/#查看事件
基于上面的定义,CTP 告诉我们有百分之多少的用户会点击这个按钮。它告诉我们有多少百分比的用户进入了我们的用户漏斗的下一步。在计算 CTP 时,你不关心用户点击或查看按钮的次数。只要他们至少有一次浏览/点击,他们就会被考虑计算这个指标。恰恰相反,CTR 经常被用来发现用户点击一个按钮的频率,这使得它们非常适合用来比较两个按钮。通常,点击率的变化会告诉我们一个技术问题,比如当用户使用特定设备时无法点击按钮。
在指标选择的过程中,考虑以下三个重要的事情:
- 考虑您的指标的敏感性和健壮性。您需要选择一个对您的变化足够敏感的度量标准,但不要太敏感。基本上,如果没有什么有趣的事情发生,度量标准不应该改变。测量您的度量标准的敏感度或健壮性的一种方法是使用运行 A/B 测试,并查看度量标准在两组之间如何变化。考虑用户在你网站的某一部分花费时间的平均值和中间值。用户在平台上花费的时间通常遵循具有长尾的对数正态分布(显示在平台上花费大量时间的用户)。根据您在产品中所做的更改,您会影响在平台上花费大量时间或中等时间的用户。这个变量(花费的时间)的平均值对在平台上花费大量时间的用户非常敏感,但它的中值实际上更稳健。
- 为你的指标设定一个实际的重要水平。从接受测试的商业角度来看,这是您期望看到的变化量。
- 检查您的指标的可变性。换句话说,你应该检查多久和一次你的指标变化多少。鉴于其可变性,您应该检查实际显著性水平是否可行。
设计测试
在选择了正确的评估和不变的度量标准之后,我们需要设计我们的测试。这是游戏最关键的部分。糟糕的实验设置会导致误导性分析和错误决策!
C 选择分流单位:分流单位是我们根据其组成对照组和测试组的标识符。转移的单元可以是用户 id、cookies 或事件。这里需要注意用户体验!如果您将事件随机分配给控制组和测试组,那么用户在您的网站上停留期间会多次看到控制和测试版本。你不希望你的用户有这种体验吧?您可以使用 user-id,它通常与用户的登录事件相关。但是请记住,一个用户可以拥有与多个帐户相关的多个登录。这意味着如果我改变我的帐户,我可能会在不同的组中结束,并经历不同的体验。
使用用户 id 作为转移单位的另一个缺点是,当变化从测试组泄漏到控制组时,会影响控制组的行为。想象一下,一个约会应用程序允许测试组的用户在他们的个人资料中写一篇关于自己的短文,假设他们的体验会更好(他们会收到更多的消息等等)。同时,我们令人惊奇的控制用户会看到测试用户的个人资料,这也会影响他们的行为。因为他们突然发现了更多有趣的用户!这就是所谓的网络效应。
为了防止网络效应,我们可以按社区运行测试(一个社区中的用户)。但是困难的部分是在你的产品中定义一个社区。社区可以是彼此交互最多的用户,也可以是处于相同地理位置的用户。
使用 cookies 是另一种选择。Cookies 将被分配给特定的浏览器或设备!因此,如果用户更换他们的设备,他们可能会经历不同的体验。
明智地选择你的测试分流单位!检查您的用户在使用您的产品时拥有多个帐户或更换设备的可能性。
C 选择合适的人群:选择你想要锁定的用户子集。这可能基于他们的平台、国家或语言。当脸书推出反应表情符号时,他们必须包括表达情感在文化上并非罕见的国家。想想看,如果测试组中看到新反应特性的用户普遍缺乏表达能力,会发生什么!
S 确定实验的规模:你需要找出测试组和对照组中需要多少用户,才能得到有统计意义的结果。确定测试规模时要考虑的事情有:
- 评估指标及其可变性
- 实际意义水平
- 分流单位
实验的时机:你需要知道什么时候是进行实验的最佳时机。这取决于您的业务、您的实验所需的样本量以及评估指标。
测试的置信水平和功效:95%的置信水平和 80%的功效是工业上最常用的。
分析测试的结果
现在我们已经进行了实验,我们有两个组(测试组和对照组)。请记住,我们没有将测试暴露给整个人群,我们从人群中抽取样本。
我们需要回答的问题是,我们观察到的这两组之间的差异是偶然发生的可能性有多大?
检查不变指标:如前所述,这些指标用于健全性检查。如果测试组和对照组之间的这些指标值存在显著差异,则不要继续分析。试着找出测试的问题。问题出在实验装置上吗?也许一个事件没有被正确捕获,也许你为某种语言传递的过滤器没有工作!在这些情况下,工程师和分析师是最好的帮手。如果您的不变度量的值是预期的,那么进入下一步。
分析结果:终于,我们到了激动人心的部分!还记得我们之前描述的注册按钮测试吗?假设我们决定将点击率作为我们的评估指标。
我们所拥有的数据通常是查看过该按钮的用户数量和点击过该按钮的用户数量。因此,我们可以计算出测试组和对照组中有人点击的估计概率。
然后我们计算这两个概率的差(称之为 d)。基于零假设,这两个概率应该没有区别(d 为零),但是替代假设说有区别(d 不为零)。
计算差额还不够!你需要围绕它建立一个置信区间。你需要做的是检查观察到的 d 在置信区间中的位置。置信区间告诉你有 95%可能性的 d 的真值位于置信区间内的某处。如果你的置信区间不包含零,那么你就有充分的证据证明测试组和对照组的 CTP 之间存在有意义的差异。
在对结果过于兴奋之前,请记住您为测试设置的实际显著性水平,并查看它相对于您的置信区间和 d 的观察值的位置。如果结果是显著的,并且我们观察到与对照组相比,测试中增加了 1%,但实际显著性水平是 2%,那么您需要非常小心地接受测试!在接受一个没有给出最低实际意义水平的测试之前,需要考虑工程师构建一个特性并在全球公开它背后的努力。
这是对 A/B 测试背后理论的快速总结和演练。下一个帖子会有更详细的计算, A/B 测试部分 2。
资源
简而言之,A/B 测试
A/B 测试是如何进行的?
由凯西·科济尔科夫 — 8 分钟阅读
简而言之:A/B 测试就是通过创建可信的克隆来研究因果关系——两个相同的项目(或者,更典型的是,两个统计上相同的组)——然后观察不同对待它们的效果。
照片由 Unsplash 上的 Morning Brew 拍摄,由作者编辑
我如何构建一个深度学习的表情符号 Slackbot
由吴 — 12 分钟读完
当我在加州大学伯克利分校完成我的计算机系统博士论文时,我经常想知道人工智能世界的生活是什么样的。我的人工智能朋友们不断吹嘘深度学习将如何彻底改变从医学到网上购物的一切——他们的论文一经发布就获得了 100 次引用(见鬼!).
弗兰基·查马基在 Unsplash 上的照片
生产中的深度强化学习
设计用户体验是一门困难的艺术。与其他应用程序相比,视频游戏为设计师提供了一个巨大的工作空间。在 Zynga,我们一直在想创新的方法来最大化用户在玩游戏时的体验。
编写一个 Web 应用程序来模拟赌徒的破产问题
由 Claudia Ng — 4 分钟阅读
我发现模拟是理解数学概念的一种有用的方式,所以我最近编写了一个程序来说明赌徒的破产问题。我做了一个 web app,用 Python 模拟了一系列游戏及其结局。
我们的每日精选将于周一回归!如果你想在周五收到我们的 每周文摘 ,很简单!跟随 我们的出版物 ,然后进入你的设置,打开“接收信件”您可以在此 了解有关如何充分利用数据科学 的更多信息。
R 中的 A/B 测试
测量用户体验的分析
什么是 A/B 测试?
A/B 测试是一种用于测试同一特性的两个变体的响应率是否不同的方法。例如,您可能想要测试对网站的特定更改(如将购物车按钮移动到网页的右上角而不是右侧面板)是否会改变点击购物车并购买产品的人数。
A/B 测试也称为分割测试,在这种测试中,同一网页的两个变体同时显示给网站访问者群体中的不同样本。然后,比较两种变体的转换次数。通常,给出更高比例变体的变体是获胜变体。
然而,由于这是一个数据科学博客,我们希望确保两种变体的转换比例差异具有统计学意义。我们可能还想了解访问者的哪些属性在推动这些转化。那么,让我们继续你的数据问题。
数据问题
- 最近进行了一次 A/B 测试,贵公司的产品经理想知道新版本的网页是否会带来更多的转化率。根据你的分析向你的产品经理提出建议
- CRM 经理很想知道,根据我们收集的用户首次访问网站时的属性,我们可以多准确地预测用户是否有可能使用我们的电子邮件。向客户关系经理汇报你的发现。
数据集
提供了四个数据集。
- 访问包含来自 10,000 个不同用户的数据,并包含以下各列:
- user_id:用户的唯一标识符
- visit_time:时间戳,表示访问网站的日期和时间
- 渠道:提示用户访问网站的营销渠道
- 年龄:用户访问网站时的年龄
- 性别:用户的性别
- 电子邮件参与度包含那些参与最近电子邮件活动的用户的数据。该文件包含以下列:
- user_id:用户的唯一标识符
- clicked_on_email:表示用户参与电子邮件的标志,其中 1 表示用户点击了电子邮件
- 变化包含指示每个用户看到 A/B 测试的哪些变化的数据。该文件包含以下列:
- user_id:用户的唯一标识符
- 变化:用户看到的变化(控制或处理)
- 测试转换包含由于 A/B 测试而转换的用户的数据。该文件包含以下列:
- user_id:用户的唯一标识符
- converted:表示用户已转换的标志(1 表示已转换
导入数据集并清理
我总是首先使用主键或唯一标识符来组合文件。然后我决定如何处理这些数据。我发现这种方法很有用,因为我可以扔掉以后不需要的东西。它还帮助我从整体上查看数据集。
在这个实例中,我们的惟一标识符是 user_id。使用以下代码合并文件后,
merge_1<-merge(variations_df,visits_df,by.x="user_id",by.y="user_id")
merge_2<-merge(merge_1,test_conv_df,by.x="user_id",by.y="user_id",all.x=TRUE)
merge_3<-merge(merge_2,eng_df,by.x="user_id",by.y="user_id",all.x=TRUE)
我发现我必须创建自己的二进制变量,来判断用户是否转换了邮件,以及他们是否点击了邮件。这是基于在 test_conversions.csv 和 email_engagement.csv 文件中找不到他们的用户 ID。我用 0 代替了所有的 NA。
merge_3$converted<-if_else(is.na(merge_3$converted),0,1)
merge_3$clicked_on_email<-if_else(is.na(merge_3$clicked_on_email),0,1)
merge_3$converted<-as.factor(merge_3$converted)
merge_3$clicked_on_email<-as.factor(merge_3$clicked_on_email)
下一个任务是将访问时间之类的变量转换成能够为用户提供有意义信息的信息。
merge_3$timeofday<- mapvalues(hour(merge_3$visit_time),from=c(0:23),
to=c(rep("night",times=5), rep("morning",times=6),rep("afternoon",times=5),rep("night", times=8)))
merge_3$timeofday<-as.factor(merge_3$timeofday)
现在,数据已经被清理了,是时候探索数据,以了解用户转换和他们在网站上访问的变化之间是否有关联。
数据探索和可视化
要检查的数据的最简单的方面是确定根据用户查看的变化类型转换的用户比例是否确实存在差异。运行博文末尾提供的代码,会给出下面的图形和比例:
对照:0.20 处理:0.24
A/B 检验显著性的统计检验
为了测试比例差异是否具有统计学意义,我们可以进行比例差异测试或独立性卡方测试,其中零假设是用户是否转换与他们访问的变异类型之间没有关联。
对于这两个测试,p 值< 0.05 was observed indicating a statistically significant difference in proportions.
I went a step further and ran logistic regression to understand how the other attributes of the users contributed to the difference in proportions. Only the type of variation and income (p-values less than 0.05) appeared to contribute to the difference in conversion proportions. A calculation of McFadden’s R-squared tells us that only 12.94% of the variation in proportions can be explained by the variation type and user attributes provided within our dataset.
因此,我对产品经理的回答如下:
与对照组相比,治疗组的转换率存在统计学显著差异。然而,很难理解为什么会这样。最好重复这个测试 2-3 次,以交叉验证结果。
探索性数据分析,了解用户参与电子邮件的驱动因素
柱状图的产生是为了检查用户属性和他们是否点击了电子邮件之间的视觉关系。
在运行探索性数据分析时,我注意到 1,243 个用户的年龄缺失。这些用户在分析中被忽略了,因为我无法在没有任何知识的情况下估算他们的年龄。为了了解点击电子邮件的用户平均年龄的差异,制作了箱线图和数字摘要。
结果发现,点击电子邮件(“1”)的人平均收入比不点击的人高。然而,两组都有很高的标准差,因此收入似乎不是一个有用的指标。
使用统计模型进行显著性检验
数据集被随机分为训练集(70%)和测试集(30%)用于建模。运行逻辑回归来确定哪些属性在解释用户是否点击电子邮件方面具有统计上的显著贡献。
该模型在训练集上进行训练,并在测试集上进行准确性预测。通过在不同阈值设置下绘制真阳性率(TPR)对假阳性率(FPR)的曲线来生成 ROC 曲线。AUC 是 ROC 曲线下的面积。根据经验,具有良好预测能力的模型的 AUC 应该更接近 1 (1 是理想的)而不是 0.5。在我们的例子中,我们的 AUC 为 0.84,显示了相当好的准确性。
虽然分数不错,但最好进行某种形式的交叉验证,以进一步验证结果并确保可重复性。
逻辑回归模型的总结证实了我们直观看到的情况,即用户点击电子邮件的可能性的最佳预测因素是:
频道
表示“作用”
-性别
我对 CRM 经理的回答是,电子邮件转化率的主要预测因素是年龄(年长用户更有可能点击)、渠道(点击付费在点击用户中很受欢迎)和性别(男性比女性更有可能点击)。然而,我想通过更大的样本来验证这些结果,以允许交叉验证。
最后的想法
希望这篇博文在某种程度上揭开了 A/B 测试的神秘面纱,为您提供了一些测试统计显著性的方法,并向您展示了探索性数据分析和统计测试如何一起工作来验证结果。
请注意,本例中使用了非常小的样本量(大约 4000 名用户),因此运行和训练复杂的机器学习算法没有意义。
我很喜欢你的反馈和建议,所有有用的代码都在下面提供,也可以在 github 上下载。😃
https://gist . github . com/shedoedasdatascience/de 3c 5d 3c 88132339347 c7da 838 a 126
A/B 测试——有更好的方法吗?多兵种土匪初探
使用ε-贪婪算法、Softmax 算法、UCB 算法、Exp3 算法和 Thompson 采样算法
Benoit Dare 在 Unsplash 上的照片
被困在付费墙后面?点击这里阅读完整的故事和朋友链接!
我是 Greg Rafferty,湾区的数据科学家。这个项目的代码可以在我的 GitHub 上找到。
在这篇文章中,我将模拟一个传统的 A/B 测试并讨论其缺点,然后我将使用蒙特卡罗模拟来检查一些不同的多臂 bandit 算法,这些算法可以缓解传统 A/B 测试的许多问题。最后,我将讨论 Thompson 抽样特定情况下的终止标准。
第 1 部分:传统的 A/B 测试
今天的网站精心设计,以最大化一个甚至几个目标。应该“现在就买!”按钮是红色还是蓝色?哪条新闻标题吸引了最多的点击量?哪个版本的广告点击率最高?为了确定这些问题的最佳答案,软件开发人员采用了 A/B 测试——一种统计上合理的技术来比较两种不同的变体,版本 A 和版本 B。本质上,他们试图确定下面蓝色分布的平均值是否实际上不同于红色分布的平均值,或者这种明显的差异实际上只是随机的?
还有一个中心极限定理的例子
在传统的 A/B 测试中,您首先要定义版本之间有意义的最小差异。在上述分布中,版本 A(通常是当前版本)的平均值为 0.01。假设这是 1%的点击率,或者说 CTR。为了将我们的网站改为 B 版,我们希望看到至少 5%的改进,或至少 1.05%的点击率。接下来,我们设置我们的置信水平,即统计置信水平,即我们观察到的结果是由于真实的差异而不是随机的机会。通常,这被称为 alpha ,并被设置为 95%。为了确定要收集多少观察值,我们使用功效分析来确定所需的样本量。如果α可以被认为是产生 I 型错误(假阳性)的可接受的比率,那么幂可以被认为是产生 II 型错误(假阴性)的可接受的比率。
许多统计学家认为,第一类错误的代价是第二类错误的 4 倍。换句话说:你的电子商务网站目前运行良好。你相信你已经发现了一个可以增加销售额的改变,所以你实施了这个改变,却发现这个改变实际上伤害了网站。这是一个I 型错误,已经让你失去了销售。现在想象一下,你考虑做出改变,但决定它不会改善事情,即使事实上它会改善,所以你没有做出改变。这是一个第二类错误,除了潜在的机会,你什么也没损失。因此,如果我们将我们的置信水平设为 95%,这意味着我们只愿意接受 5%的实验中的 I 型错误。如果第一类错误的代价是第二类错误的 4 倍,这意味着我们将功率设置为 80%;我们愿意保守一点,在 20%的时间里忽略潜在的积极变化。
版本 A 是当前运行的版本。因此,我们有历史数据,可以计算平均 CTR 和相应的标准差。不过,我们需要 B 版本的这些值,而 B 版本还不存在。对于平均值,我们将使用 5%的改进值,因此mean_b = 1.05 * mean_a
。尽管标准偏差需要估计。当这种估计很困难时,这对于传统的 A/B 测试来说是一个严重的缺点。在我们的例子中,我们假设版本 B 与版本 a 具有相同的标准偏差。用 sigma 代表标准偏差,用 d 代表我们两个平均值之间的差值,我们需要查找 alpha 和 beta 的 z 值,并用以下等式计算我们的样本量:
这样,我们只需运行我们的 A/B 测试,直到获得所需的样本大小。我们随机向我们网站的访问者展示版本 A 或版本 B,并记录每个版本的点击率。然后,您可以使用统计软件包或t-检验计算和 t-检验表来得出一个 p 值;如果 p 值小于您的 alpha 值,在本例中为 0.05,那么您可以 95%的信心声明您观察到了版本 A 和版本 B 之间的真正差异,而不是偶然的差异。
传统 A/B 测试的缺点
传统的 A/B 测试的最大缺点是一个版本可能比另一个版本差很多,但是你必须继续向访问者提供那个版本,直到测试完成,因此失去了销售。如前所述,您还必须对版本 B 的标准偏差进行估计;如果你的猜测不正确,你可能收集不到足够的样本,无法达到统计功效;也就是说,即使版本 B 确实比版本 A 更好,即使你的实验证明了这一事实,你也没有足够的样本来宣布这种差异具有统计学意义。你会被迫接受假阴性。
如果有一种方法可以运行 A/B 测试,但又不浪费时间在劣质版本 B(或者 C、D、E……)上,那就太好了。
第 2 部分:多股武装匪徒
那些边上只有一个杠杆的老式吃角子老虎机总是拿走你的钱——那些被称为独臂强盗。想象一下,一整排机器并排排列,以不同的利率和价值支付。这是多臂大盗的想法。如果你是一个想要最大化你的赢款的赌徒,你显然想要玩最高支付的机器。但是你不知道这是哪台机器。你需要随着时间的推移探索不同的机器,以了解它们的收益是多少,但你同时也想利用收益最高的机器。类似的场景还有理查德·费曼的餐厅问题。每当他去餐馆,他都想点菜单上最美味的菜,但他必须点所有可用的菜才能找到最好的菜。这种开发的平衡,选择一个在过去有良好回报的行动的愿望,和探索,尝试可能产生更好结果的选择的愿望,就是多臂强盗算法被开发的目的。
他们是怎么做到的?我们来看几个算法。我不会花太多时间讨论这些算法的数学,但是我会在我的 Github 上链接到每个算法的 Python 实现,您可以参考这些实现了解更多细节。我对每个算法都使用了相同的符号,所以select_arm()
和update()
函数应该能够完整地描述数学。
ε-贪婪的
ε贪婪的 T4 算法基本上平衡了开发和探索。它采用一个介于 0 和 1 之间的参数epsilon
,作为探索选项(在多臂土匪讨论中称为 arms)的概率,而不是在测试中利用当前的最佳变体。例如,假设ε被设置为 0.1。每次访问者来到被测试的网站,都会随机抽取一个 0 到 1 之间的数字。如果该数字大于 0.1,那么将向该访问者显示表现最好的变体(最初是版本 A)。如果该随机数小于 0.1,则将从所有可用选项中选择一个随机臂并提供给访问者。访问者的反应将被记录下来(点击或不点击,销售或不销售,等等。)并且那只手臂的成功率也会相应更新。
评估多臂 bandit 算法时,需要考虑几个因素。首先,您可以查看选择当前最佳手臂的概率。每个算法都需要一点时间来稳定和找到最佳臂,但是一旦达到稳定,ε-Greedy 应该以(1-ε)+ε/(臂数)的速率选择最佳臂。这是因为(1-ε)%的时间,它将自动选择最佳臂,然后剩余时间,它将以相等的速率选择所有臂。对于不同的ε值,精度如下:
在所有这些试验中,我模拟了 5 个失败/成功比率为[0.1, 0.25, 0.5, 0.75, 0.9]
的手臂。这些值跨越的范围比通常在这样的测试中看到的要宽得多,但它们允许手臂在模拟比其他情况下所需的迭代次数少得多的迭代后显示它们的行为。每张图都是对 5000 次实验进行平均的结果,其中 250 次实验的范围为**。**
epsilon
的低值对应于更少的探索和更多的利用,因此该算法需要更长的时间来发现哪个是最好的 arm,但是一旦发现,它就以更高的速率利用它。这一点可以从蓝线开始时的缓慢速度看得最清楚,但随后蓝线穿过其他手臂,并以较高的速度稳定下来。
当有许多武器在使用时,所有武器的预期报酬大致相似,观察算法的平均报酬可能是有价值的。下图再次显示了一些 epsilon 的比较值:
然而,这两种方法都关注于需要多少次试验才能找到最佳的手臂。一种着眼于累积回报的评估方法将更加公平地对待那些预先关注学习的算法。
显然,选择epsilon
的值非常重要,而且不是微不足道的。理想情况下,当试验次数很少时,您会想要一个高值(高探索),但是一旦学习完成并且知道了最佳手臂,您会转换到一个低值(高开发)。有一种技术叫做退火,我不会在这里做太多的详细介绍,但它非常简单。再次,查看我的 Github 代码了解详情,但它基本上完全按照我描述的那样做:随着试验次数的增加调整epsilon
。使用退火的ε-贪婪算法并绘制选择每个臂的比率看起来像这样:
有了每个臂的这些(公认的极端)值,算法很快就选定了最佳的arm_0
,并在很短的时间内选择其余的臂。
多臂 bandit 方法的最大优势之一是,如果一个臂明显是赢家,您可以提前取消测试。在这些实验中,每一次尝试都是伯努利试验——结果要么是成功(一次广告点击、一次销售、一封电子邮件注册),要么是失败(用户不采取任何行动就关闭网页)。这些试验总体上可以用贝塔分布来表示。请看下图。首先,每一组都有相同的概率出现任何结果。但随着越来越多的试验积累,每只手臂的成功概率变得越来越专注于其实际的、长期的成功概率。注意,y 轴是概率密度,并且在每一帧中增加;为了清楚起见,我省略了它,所以只要记住每条曲线下的面积总是正好为 1。随着曲线变得越来越窄,它们相应地变得更高,以保持这个恒定的面积。
注意每只手臂的峰值是如何开始围绕其实际支付概率[0.1, 0.25, 0.5, 0.75, 0.9]
的。您可以使用这些分布进行统计分析,如果达到统计显著性,可以提前停止您的实验。另一种静态看待这些变化的方式是:
这显示了一个跨度为 1,000,000 次试验的单个实验(与跨度为 250 的 5000 次实验的平均结果相反),以及更真实的[0.01, 0.009, 0.0105, 0.011, 0.015]
值(在这种情况下,我模拟了点击率,CTR)。但我想指出的是,arm_1
,最好的手臂,被使用得更频繁,因为ε-Greedy 喜欢它。它周围的 5%置信区间(阴影区域)比其他臂要紧密得多。正如在上面的 gif 中,最佳臂具有更紧密和更高的钟形曲线,代表更精确的价值估计,此图表显示使用多臂 bandit 方法允许您利用最佳臂,同时仍然了解其他臂,并且比传统 A/B 测试更早达到统计显著性。
Softmax
epsilon-Greedy 的一个明显缺陷是它完全随机地进行探索。如果我们有两个回报非常相似的手臂,我们需要探索很多来了解哪个更好,所以选择一个高ε。然而,如果我们的两臂有非常不同的奖励(当然,当我们开始实验时,我们不知道这一点),我们仍然会设置一个高的ε,并在较低的支付奖励上浪费大量时间。 Softmax 算法(和它的退火对应物)试图通过在探索阶段选择每个手臂来解决这个问题,大致与当前预期的回报成比例。
temperature
参数的目的与ε贪婪算法中的epsilon
相似:它平衡了探索利用的倾向。在极端情况下,0.0 的温度将始终选择性能最佳的手臂。无穷大的温度会随机选择任何一个臂。
在比较这些算法时,我希望您观察它们在探索/利用平衡方面的不同行为。这就是多兵种土匪问题的症结所在。
UCB1
尽管 Softmax 算法考虑了每个 arm 的期望值,但这确实是合理的,因为一个表现不佳的 arm 最初会连续成功几次,从而在利用阶段受到算法的青睐。即使他们没有足够的数据来确定,他们也会对可能有高回报的武器挖掘不足。因此,考虑我们对每个手臂的了解程度,并鼓励算法稍微倾向于那些我们对其行为没有高度信心的手臂,以便我们可以了解更多,这似乎是合理的。算法的置信上限类就是为此而开发的;在这里,我将演示两个版本,UCB1 和 UCB2。它们的操作方式相似。
UCB1 根本不显示任何随机性(你可以在我在 Github 上的代码里看到,我根本不导入random
包!).与ε-贪婪和 Softmax 相反,它是完全确定的。此外,UCB1 算法没有任何需要调整的参数,这就是为什么下面的图表只显示了一个变体。UCB1 算法的关键是它的“好奇心红利”。当选择一个手臂时,它会获得每个手臂的预期奖励,然后加上一个奖金,该奖金的计算与奖励的置信度成反比。它对不确定性持乐观态度。因此,相对于可信度较高的手臂,可信度较低的手臂会得到一点提升。这导致算法的结果在不同的试验之间摇摆不定,尤其是在早期阶段,因为每个新的试验都为所选的分支提供了更多的信息,所以在接下来的几轮中,其他分支基本上会更受青睐。
UCB2
UCB2 算法是 UCB1 的进一步发展。UCB2 的创新在于确保我们在尝试新的手臂之前,对同一只手臂进行一段时间的试验。这也确保了从长远来看,我们定期从开发中休息一下,以重新探索其他武器。当预期回报会随着时间变化时,UCB2 是一个很好的算法;在其他算法中,一旦发现最佳臂,它将被优先考虑,直到实验结束。UCB2 挑战了这一假设。
UCB2 有一个参数,alpha
,它可以有效地调整 UCB2 支持某些分支的周期长度。
Exp3
最后,我们有 Exp3 算法。UCB 类算法被认为是在随机环境中表现最好的算法;也就是说,每次试验的结果都是完全随机的。相比之下, Exp3 算法被开发用来处理审判对抗的情况;也就是说,我们要考虑未来试验的预期结果可能会被先前试验的结果所改变的可能性。股票市场就是一个很好的例子,可以说明 Exp3 算法什么时候是好的。一些投资者看到一只股票以较低的每股价格上市,即使它目前的回报并不是很大,也买了它,但大量购买股票的行为导致其价格飙升,其表现也是如此。由于我们的算法预测了这样或那样的事情,该股票的预期收益正在发生变化。因此,在这些实验中,Exp3 的表现似乎比其他算法差得多。我完全随机地运行每个试验,这是一个随机设置,Exp3 在其中从未被开发为强大。
比较算法
现在,让我们一起来看看所有这些算法。正如你所看到的,在这一组简短的试验中,UCB2 和 epsilon-Greedy 看起来像是在一起运行,UCB2 有更多的机会进行探索。然而,UCB2 的改进速度稍快,事实上在更长的时间内,它超过了 epsilon-Greedy。Softmax 往往很早就达到峰值,这表明它继续探索,以利用其最佳臂的知识为代价。作为 UCB2 的早期版本,UCB1 落后于其更具创新性的兄弟。Exp3 是一个有趣的例子;这似乎是迄今为止表现最差的,但这是意料之中的,因为这些试验不是 Exp3 所擅长的。相反,如果试验环境是对抗性的,我们预计 Exp3 会更有竞争力。
那些图表中有一个算法我们还没有讨论过, 汤普森采样 。这个算法是完全贝叶斯的。它从后验分布中为每只手臂生成一个期望回报向量,然后更新该分布。
该算法从变化的概率分布中抽取一个随机数,并选择最大值。它只是在每次试验中拉动预期回报最高的杠杆。汤普森取样学非常快哪一个是最好的臂并且非常赞成它向前,以探索为代价。只要看看所有其他手臂中的不确定性(阴影区域的宽度)就知道了!那是近乎纯粹的剥削和极少探索的结果。
你的多臂强盗实验什么时候结束?
因为 Thompson 抽样是以贝塔分布给定的频率抽取臂,我们可以使用许多不确定的统计技术来知道一个臂何时由于优势而领先于机会。Google Analytics 开发了一个合理的解决方案,使用他们所谓的 潜在价值剩余 。他们首先检查是否满足三个标准,然后检查是否出现了“冠军”手臂,并宣布实验完成。这三个标准是:
- 该网站每天都有活跃的流量
- 该实验至少运行了两周,以消除任何每周的周期性。
- 剩余的潜在价值不到 1%
在这一点上,一旦任何一只手臂在至少 95%的情况下被选中,实验就结束了。
潜在价值剩余在文献中也被称为“遗憾”。它描述了 CTR 等指标在领先的基础上还能提高多少。当另一只手只比领先者多 1%的机会时,这种微弱的进步不值得继续测试。
测试中剩余的潜在值计算为(*θ*ₘₐₓ *— θ*) / θ**
分布的第 95 个百分位数,其中*θ*ₘₐₓ
是一行中*θ*
的最大值,*θ**
是最有可能达到最优的变异的*θ*
值,*θ*
是从每个臂的 beta 分布中提取的值。和以前一样,关于数学的细节请参考我的 Github repo ,或者阅读一位谷歌工程师发表的原始论文。
在我在本文开头描述的传统 A/B 测试中,置信区间为 95%,功效为 80%,版本 A 的 CTR 为 1%,假设版本 B 的 CTR 为 1.05%,所需的样本量至少是从每个版本中抽取的 635,829 个样本。在我的实验中,我为每只手臂取了 70 万张画。
当使用带有谷歌终止标准的汤普森抽样时,我模拟了 100 次实验,并对结果进行了平均。该算法确定版本 B 好 5%,平均5357拉动劣质版本 A 臂,6353 拉动优质版本 B
在传统的 A/B 测试中,我会为我的客户提供 60 多万次我的网站的劣质版本,而 Thompson Sampling 只需要 5000 次就能学会同样的事情。错误减少了 120 倍!
那么哪个土匪最好呢?这真的取决于你的应用和需求。它们都有各自的优点和缺点以及对特定情况的适用性。Epsilon-Greedy 和 Softmax 是该领域的早期发展,其性能往往不如置信上限算法。在 web 测试领域,UCB 算法似乎使用得最频繁,尽管 Thompson Sampling 提供了终止标准的好处,并且是 Google Analytics 的优化工具使用的算法。如果你的环境不是随机的,你可以尝试 Exp3 算法,它在敌对环境中表现更好。
A/B 使用 Amazon SageMaker 在生产中测试机器学习模型(讨论)
用潜在的实时推理 ML 工作流来考虑 A/B 测试生产中的 ML 模型
基兰·卡瓦诺、大卫·尼根达和我,最近为 AWS 机器学习博客写了一篇关于使用亚马逊 SageMaker 在生产中 A/B 测试 ML 模型的文章。我推荐阅读这篇文章,并查看我们附带的 Jupyter 笔记本(亚马逊 SageMaker 的 A/B 测试)。
在这篇文章中,我想通过分享一个潜在的实时推理生产机器学习工作流的高级设计图,为我们的 AWS 博客文章添加背景。
一个潜在的实时推理 ML 工作流
请注意,ML 推理服务有多个模型,可用于向其端点提供推理请求。接下来的问题是,服务使用什么逻辑将推理请求路由到特定的 ML 模型。
在 Amazon SageMaker 上下文中,一个production variant" I标识了您想要托管的模型以及为托管它而部署的资源(直接来自文档!).在本帖中,我们将讨论 SageMaker 端点如何托管多个 ProductionVariant,用户可以(1)使用加权随机方法指定如何在production variant和它们相应的模型之间分配流量,或者覆盖这个默认的流量分配行为,以及(2)明确指定哪个 ProductionVariant 和相应的模型应该服务于一个推理请求。
这种灵活性为以各种方式使用生产流量对新的 ML 模型进行 A/B 测试提供了可能性,从而在新模型的验证过程中增加了一个有效的最终步骤。
A/B 测试-第 2 部分
这是我的 A/B 测试系列的第二篇文章。在第一部分中,我们学习了 A/B 测试背后的想法。在这篇文章中,我将带你浏览 A/B 测试背后的统计数据,并重点分析测试的结果。我将使用 Udacity 的 A/B 测试课程的最终项目作为案例研究。
我们将回顾:
- 测试概述
- 测试前分析
- 分析测试结果
- 建议
测试概述
在线学习平台 Udacity 在其课程概览页面有两个选项 开始免费试用 和 获取课程资料 。
如果学生单击“开始免费试用”按钮,他们将被要求输入信用卡信息,并注册参加付费课程的免费试用。14 天后,除非先取消,否则会自动收费。
如果学生单击“访问课程材料”按钮,他们将能够观看视频并免费参加测验,但他们不会获得辅导支持或认证证书,也不会提交他们的最终项目以获得反馈。
Udacity 看到许多学生注册了免费试用,过了一段时间就放弃了这门课程,因为他们根本没有足够的时间来专注于这门课程。因此,Udacity 决定进行一项测试,如果学生点击开始免费试用按钮,他们将被询问他们有多少时间可以投入到课程中。如果学生选择每周 5 小时或更多,他们将像往常一样通过结账流程。但是,如果他们选择每周少于 5 小时,将会出现一条消息,表明 Udacity 课程通常需要更多的时间才能成功完成。此时,学生可以选择继续注册免费试用,或者免费获取课程材料。这张截图展示了实验的样子。
测试背后的假设
假设是,这可能会预先为学生设定更明确的期望,从而减少因为没有足够的时间而离开免费试用的沮丧学生的数量,而不会显著减少继续通过免费试用并最终完成课程的学生的数量。这将改善学生的整体体验,并提高教练支持可能完成课程的学生的能力。
为了更好地理解用户流程,您可以查看以下图形:
新设计中的用户流
提示:在不知道用户流量的情况下,分析一个测试是没有意义的!此外,不可能对不变量和评估度量做出正确的决定。
测试前分析
在运行测试之前,我们需要执行测试前分析,包括:
- 选择分流单位
- 选择不变/评估指标
- 计算所需的样本量
分流单位
在这个测试中,Udacity 选择 cookie 作为导流单元。如果学生注册了免费试用,从那时起,他们将被一个用户 id 跟踪。同一个用户名不能注册两次免费试用。对于未注册的用户,即使他们在访问课程概述页面时已登录,也不会在实验中跟踪他们的用户 id。
不变/评估指标
不变指标用于健全性检查。换句话说,这些指标的值不应该受到变更的影响。查看用户流程图,我选择以下指标作为不变指标:
不变度量
Udacity 添加到用户漏斗的新层位于用户点击开始免费试用按钮之后。因此,与到达该按钮之前的用户旅程相关的指标应该保持不变。接下来,我们需要确定评估指标:
评估指标
基于我们期望看到的测试假设:
- 保留率的增加,这意味着更多的学生在免费试用后留在了测试组。
- 总转化率下降,这意味着测试组中沮丧的学生较少。
- 对净转换率没有太大影响,这意味着我们在测试组没有失去大量付费用户。
Udacity 给出了变更前每天的指标值。这些是我们的基线值。请注意,这些值与我们的用户数量相关。
人口数据
假设我们取了一个大小为 5000 的样本,这意味着 5k 的 cookies 查看了课程概述页面。基线值需要调整,因为现在我们有 5k cookies,而不是 40k:
抽样资料
设置测试的显著性水平和功效
为了理解测试的显著性水平和功效,让我们看看在无效假设和替代假设下的 d (测试和控制中的度量 X 的值之间的差异)的分布:
零假设和替代假设下 d 的分布
再次记住什么是无效假设和替代假设。零假设表明测试组和对照组之间没有真正的差异( d = 0),替代假设表明有差异( d !=0).你可能会问自己,在零假设下, d 的分布意味着什么?为什么无效假设和替代假设有分布?答案在于我们是从我们的人口中抽样的(还记得 5k 饼干吗?)!也就是说,每次采样,我们都会得到一个新的值。在零假设下,这些值的分布将是平均值为 0 的正态分布。
显著性水平和置信度水平:显著性水平通常被称为 1 类误差,用希腊字母 Alpha 表示。这是错误拒绝零假设的概率,在上图中用绿色标出。该区域位于零假设曲线之下,并且在其置信区间之外。在工业中这个值如果经常设置为 5%。黑色方块(1-alpha)显示的区域称为置信水平。当零假设为真时,置信水平基本上是拒绝替代假设的概率。如果 alpha 设置为 5%,则置信度为 95%。
**置信区间:**我们不确定 d 的 真值 ,所以我们使用 95%的置信水平在观察到的 d (我们测量的 d 是我们实验的结果)周围建立一个置信区间,我们这样解释: 在 95%的样本中,d 的真值落在置信区间内。
β和功效:类型 2 误差或β是错误拒绝零假设的概率,这是设置为 20%。在上图中,贝塔以紫色突出显示。所以 1-斗鱼 a.k.a 测试的功率是设置为 80%。图表中的红点表示功率。换句话说,能力是在你应该拒绝零假设的时候拒绝零假设的概率!(这是*真正,*给熟悉混淆矩阵的人看。)
我的朋友就是你所需要的去理解测试背后的数据!
计算所需的样本量
现在我们应该计算我们需要的最小 cookies 数(最小样本大小),以达到期望的统计功效。
总转化、留存、净转化都是概率,也就是说是二项式分布。基于中心极限定理,这些度量的标准偏差由以下公式给出:
为了计算所需的样本大小,假设我们有两个样本,一个是基线(网站的当前版本),另一个是测试版本(我们还没有推出,想找到它的大小)。实验功效与样本量有如下关系:
双尾检验中检验能力与样本量的关系
如您所见,样本大小包含在标准误差中。如果您将比例放入公式中,并假设我们希望在对照组和测试组之间有一个很好的 50/50 分割,那么样本大小将是:
酷!我们有一个样本量的公式!假设功效设置为 80%,显著性水平设置为 5%,则更一般的公式是:
如果我们想要测试组和对照组各占一半,那么 r=1。为了能够计算每个指标所需的样本量,我们需要基线转换和最小期望变化(也称为实际显著性水平)。
每个指标的预期实际显著性水平由 Udacity 给出。假设测试组和对照组的比例为 50/50,我们得到每个指标的样本大小的以下值:
每个评估指标所需的样本量
关于工作台的重要注意事项:
- 您需要选择您在最后一列中为测试计算的最大天数。这属于保留指标,表明需要 100 多天才能获得保留指标所需的 cookies 数量。这将是一个非常长的时间来运行一个测试,这是不值得的努力。我们放弃这一指标,转而使用第二大数字,它属于净转换率。
- 请注意,最后一列是基于我们每天可以处理 40k cookies 的假设计算的。这不实际!我们绝不会让所有人都参与实验,而是应该选择一定比例的人。假设我选择让 80%的人参与这个实验,那么我大概需要 22 天。
分析测试结果
恭喜你!您设计了您的测试,并运行了大约 3 周,现在您有了结果!
健全性检查
我们需要做的第一件事是健全性检查,我在这篇文章中强调了很多。我们为健全性检查选择了三个不变指标,让我们逐一检查:
- 查看课程概述页面的 cookies 数量:
我们决定测试组和对照组各占一半。这意味着浏览课程概览页面的 cookies 数量在两组之间应该不会有太大的差异。我们查看两组中的 cookies 总数,并检查它们是否有显著差异。如果答案是肯定的,我们查看每天的 cookies 数量,并检查差异来自哪里。
这些数字看起来非常相似。但是我们需要确定它们之间的差异是随机还是显著。我们可以通过二项式分布来模拟将 cookies 分配给控制组和测试组,成功概率为 50%(假设成功意味着被分配给控制组)。我们想要回答的问题是,如果我们有一个测试+控制组大小的样本,并且有 50%的概率被分配到控制组,那么在控制组中看到观察到的 cookies 分数有多奇怪?
为了回答这个问题,我们需要建立一个大约 50%概率的置信区间,并检查在控制组中观察到的饼干部分是否在该区间内。
如前所述,二项式分布的标准误差通过以下公式计算:
为了建立置信区间,我们首先需要计算误差幅度:
误差幅度和置信区间关系
为了让事情更容易理解,我做了这张表:
查看课程概述页面的 cookies 数量的健全性检查
请注意,我假设本次计算的置信度为 95%。
由于对照组中观察到的饼干比率在置信区间内,我们认为差异不显著。
2.点击开始免费试用按钮的 cookies 数量
按照与上面相同的公式和推理,我们得到这个表:
对点击免费试用按钮的 cookies 数量进行健全性检查
观察到的比例在 CI 范围内,因此我们可以检查第三个指标。
3.点击通过概率(CTP)
我们有两个概率,我们想知道它们之间的差异是否显著。
从总体中抽取两个样本,每个样本都有自己的大小和比例
我们需要利用前面提到的 *SE(差异)*公式:
两个样本比例的标准误差
我们期望两组的 CTP 之间的差异为零。因此,我们在 d = 0 附近设定一个置信区间,并检查 d 的观测值是否落在该区间内。
CTP 的健全性检查
根据上表,观察到的两组 CTP 之间的差异并不显著。我们的理智检查都完成了!
检查效果大小
现在我们进入有趣的部分!检查测试结果是否具有统计和实际意义。
- 总转换
为了计算这个指标,我们需要注册免费试用的用户数和点击免费试用按钮的 cookies 数。注册数据是不完整的,有些日子我们有点击数据,但没有注册数据。因此,在计算总转化率时,我们需要将这些日子过滤掉。
类似于点击率,我们使用 SE(差异)在两组总转化率之间的观察差异周围做出置信区间。与对照组相比,试验组的总转化率降低了 2.06%。
两组总转换值差异的置信区间
回头看看测试的假设,我们预计总转换值会下降。我们预期的最低降幅为 1%,置信区间的下限大于 1%。换句话说,我们可以确定下降幅度将大于 1%,并且由于置信区间不包含 0,因此该结果在统计上和实践上都是有意义的。
2.净转换
与总转化率非常相似,我们围绕两组间观察到的差异建立了 95%置信水平的置信区间。
两组净转换率值差异的置信区间
在这种情况下,结果没有统计学意义,因为我们的置信区间包括 0。
建议
我们唯一有把握谈论的指标是总转化率。我们看到,在测试组中,这个指标的值下降了(正如我们所预料的)。然而,净转换指标的结果并不显著!这意味着我们没有信心说出这个指标会如何变化,或者基本上付费用户数量会如何变化!**
我建议不要启动这项测试。虽然总转化率的下降使得沮丧的学生数量也减少了,但是不清楚通过免费试用期并付款的学生数量如何变化。
资源
A/B 测试统计:转化率的真实值和估计值
如何确保你的分割测试结果在统计上是显著的(简单的说)
相信分割测试还是检查其统计显著性?(感谢❤巴鲁·金的插图)
轶事:
——我如何检查我的测试的统计显著性?
——我可以告诉你。我也能看出来。我如何检查?
A/B 测试是最受欢迎的用户体验研究方法之一,用于评估网站或移动应用的 UX 或 UI 更改的有效性。假设你改变了一些东西,开始了测试——似乎修改后的版本赢了。但是我们能确定吗?我们有百分之几的把握?
为了回答这个问题,让我们把这种方法 A/B 测试不作为一种测量用户参与度和变化满意度的方法,而是作为一种统计实验。那么,你需要知道什么才能确定我们可以接受所获得的结果呢?
A/B 测试结果不显示转化率
我的意思是它没有显示 CR 的实际值,而是估计值。无论你在实验中有多少用户,样本量仍然小于用户总数。因此,当您确定测试所需的样本量时,下一个逻辑问题是“我们需要多少用户来确保测试结果(估计的 CR 值)真正描述了事物的实际状态(真实的 CR 值)?
换句话说,估计 CR (T) 与真实值(Q) 有多接近。为了回答这个问题,我们需要置信区间。
什么是置信区间?
因此,我们运行了 A/B 测试,现在有了一些估计的转化率(让我们用 T 来表示)。但实际上实际转化率可能略少,也可能略多,我们不知道一个确切的数值,但可以从[a;b]包含它。这被称为置信区间。
样本越大,区间越小。这就是为什么在开始测试之前,确定每个实验组的最小用户数量是如此重要。
置信区间是以一定的置信度计算的。例如,如果置信度为 95% (通常如此),是什么意思?
下面是:如果我们对 100 个不同的样本进行 100 次测试,得到 100 个估计的 CR,并计算每个 CR 的置信区间,那么 100 个区间中有 95 个包含真实的 CR 值。
重要的是要理解置信水平是置信区间计算过程的特征,而不是区间本身。我们可以选择哪个置信度足以让我们相信测试结果。
因此,置信区间是 CR 估计的一种方式,它不仅产生单个值,而且产生包含实际 CR 值的值区间。置信水平显示了它被控制在那里的可能性。
那 95%从何而来?
我希望我已经成功地传达了信心水平概念的含义,所以现在我们来看看为什么通常是 95%,而不是 75%或 80%?
而且这里我还要介绍两个来自数理统计的术语(今天最后一个,我保证!)—显著性水平和统计功效。
但首先,让我们看看下面的图片。这是一个统计测试矩阵(a/b 测试是一个统计测试),它显示了 4 个场景:
统计检验矩阵:4 例
让我们仔细看看。
比方说,我们在网站上有一个红色的按钮,我们决定把它重新漆成蓝色。我们希望蓝色按钮会被更频繁地点击,所以我们运行 a/b 测试来检查这个假设。我们能得到什么结果?
- **正误:**测试显示两个按钮有相同的 CR,这是真的——对我们的用户来说没有区别。
- **假阴性:**测试显示两个按钮具有相同的 CR,但事实并非如此:事实上,用户更频繁地点击蓝色(或红色,无所谓)按钮。测试是错误的。
- true-positive: 测试显示一个按钮比另一个好,确实如此。
- **误报:**测试显示用户喜欢一个,讨厌另一个按钮,但实际上两个按钮的 CR 是一样的。误导性的发现,测试是错误的。
因此,在两种情况下,结果是真实的,而在另外两种情况下,测试扭曲了真实的情况。
置信度
得到假阳性结果的概率通常被称为 I 型错误,通常用α表示。如果α=5%,这意味着 100 次中有 5 次我们记录到差异,而变量是相同的。
这种误导性的发现对我们意味着什么?很明显,我们很高兴,我们相信测试,我们花费时间和金钱来推出更改并将其介绍给所有用户,并且——没有影响,CR 是相同的,这是唯一可以预期的,因为从一开始就没有什么不同。无论你是在 5%的情况下还是在 1%的情况下做好了准备——这取决于你:)通常,人们同意α=5%,因此置信度(计算为 1-α)为 95%。
因此,置信水平(1-α)是不出现 I 类错误的概率(α)。如果测试显示变量 A 和变量 B 没有差异,则为结果的置信百分比。
如果我想要 99%而不是 95%呢?
请随意。但是你需要更多的人参与实验,或者在冠军和亚军的转化率之间有更大的差异。这会影响实验的时间,所以从你对结果有这么高的信心有多重要开始。
统计功效
然而,另一个错误的场景是可能的——当变体 A 和 B 在其转换率上有真正的差异,但是测试没有检测到它。这被称为假阴性结果或 II 型错误(用β表示)。
我们这是在冒险吗?错过了一个好主意,却没有实施。这是很痛苦的,但比第一类错误要稍微少一些,所以这里我们可以设置错误概率β=20%或更少。那么以 1-β计算的统计功效为 80%或更高。
统计功效是未出现 II 型错误的概率(β),即如果测试显示变量 A 和 b 之间的存在差异,则结果的置信百分比
回到置信区间
好了,现在我们准备计算置信区间,下面是如何做:
1.收集数据:
实验结果:样本量和转化率
2.计算变量 B 和 A 转换率之间的差异(如果变量 A 是赢家,则该差异可以是负数):
CR 差异
3.计算差值的置信区间:
CR 差异的置信区间。如果它不包含零,那就没问题。如果包含-您需要更多的流量或更大的差异之间的转换率您的变种。
可以得出什么结论?
- 作为 A/B 测试的结果,我们得到的不是真实值,而是每个变量的 CR 估计值
- 知道了估计的 CR 值,我们就可以计算包含真实 CR 值的置信区间
- 在计算选项 A 和 B 之间的转化率差异的置信区间后,我们可以得出是否存在真正差异的结论
- 我们不能 100%肯定这个结论,因为有两种类型的错误:第一类(误导性发现)和第二类(未能发现 CR 的真正差异)
- 然而,虽然没有 100%的置信度,但如果我们在选择置信度时决定这样做,它可以是 95%甚至 99%(通常仍然是 95%,但可以更大,例如对于 A/B/C 测试)
- 如果你想要更多的信心,你需要更多的流量或更大的冠军和亚军之间的转换率差异
在关闭时
- 只有当我们认为我们的样本分布是正态分布(可以是高斯分布、伯努利分布、皮尔逊分布等)时,上述所有方法才有效。),这意味着我们有均匀分布的概率,即有一个主质量(通过一些参数),在两个方向上都有微小的偏差。
- 如果您运行多变量测试或 A/B/n 测试(比较 n 个不同的变量),您应该使用校正值(例如 Bonferroni 校正值 )将置信水平保持在 95%。然而,它可能要求您运行测试一段不合理的长时间。
- A/B 测试可能显示错误的结果,这不仅是因为统计错误,也是因为技术错误。因此,在运行 A/B 测试之前,不要忘记通过运行 A/A 测试来检查测试设置:让两个流量组 A 和 B 被分配到相同的体验。如果你在工具的设置上犯了一个错误,你会看到转换率的不同(实际上不可能)。
A/B 测试:基础!
什么、为什么、何时和如何
粉色和蓝色哪个颜色会让更多人点击网站的登录按钮?他们应该在主页上显示 Gif 而不是图片吗?有多少菜单选项,五个还是七个,会吸引顾客?哪个版本能更好地引导客户到达漏斗的末端?
您可以大胆猜测,继续进行更改或 A/B 测试!
作者图片
A/B 测试用于确定某个产品的哪个版本在市场上表现更好。
从初创公司到大型科技公司,各种规模和行业的公司都依赖 A/B 测试来做出更明智的选择。即使是最简单的测试也能帮助做出重大决定。
什么是 A/B 测试?
A/B 测试是同时向网站访问者的不同部分显示同一网页的两个版本,以确定哪一个表现良好的过程。
基本就是确认哪个做的更好——这个版本(A)还是那个版本(B) ?
A/B 测试,也称为分割测试或桶测试,本质上是一个实验,其中一个广告的两个或更多变体、营销电子邮件或网页被随机显示给用户,然后使用不同的统计分析方法来确定哪个变体推动更多的转化。
通常在 A/B 测试中,给出更高转化率的变体是胜出的变体,并且该变体可以帮助你优化你的站点以获得更好的结果。
为什么要进行 A/B 测试?
在电子邮件活动中,一个活动的两个变体被发送给用户。通过这样做,营销团队将知道哪封邮件在鼓励打开或点击方面最有效。
但他们不会知道到底是什么导致用户打开邮件。是标题、主题、视觉效果还是邮件内容?这可以通过 A/B 测试来确定,这是邮件中最有说服力的元素?
它可以帮助你在做出改变的重大决定之前检查你的站点上的访问者和客户的行为,并帮助你增加成功的机会。简而言之,A/B 测试通过允许你将资源用于最大效果和效率来帮助你避免不必要的风险。
什么时候使用 A/B 测试?
一个在线学习平台想要改变他们的主页,新的、更吸引人的设计将增加浏览他们课程的用户数量。或者,他们可能希望在他们的课程概述页面上有更多关注职业的描述,这可能会鼓励更多的用户注册并完成他们的课程——A/B 测试可以为他们确认这一点。
可以使用 A/B 测试来测试网页上可能影响访问者在网站上浏览行为的任何内容。
以下是可通过 A/B 测试评估的变化列表— 标题、内容、页面设计、图片、促销和优惠、社交媒体提及、网站导航和用户界面、行动号召(CTA)文本和按钮、支付选项、交付选项等。
在 A/B 测试中,比较应该尽可能简单。例如,不要比较两个完全不同版本的网站,因为你不知道是什么因素造成了不同。同样,如果一个新的模块或菜单被添加到网站,它不能通过 A/B 测试进行测试,因为没有比较点。
如何进行 A/B 测试?
电子商务商店的理想客户漏斗如下:
首页 - > 分类列表/搜索商品 - > 查看商品页面 - > 购物车 - > 结账
随着用户在这个漏斗的各个阶段的下降,商店会失去用户。然后进行 A/B 测试,尝试有希望提高从一个阶段到下一个阶段的转化率的变化。
A/B 测试大致分为四个步骤:
确定变更和度量
首先,决定你能够收集和分析什么类型的信息。我们不只是猜测,而是使用适当的分析工具来确保您首先遇到了问题,并找到问题的确切位置。
这些分析通常会让你深入了解可以从哪里开始提高。例如,我们决定将产品页面上的行动号召(CTA) 按钮从“立即购买”更改为“立即购买”,以增加向购物车添加商品的用户数量。
然后选择一个指标来衡量用户的参与度。在我们的示例中,指标将是“立即购买”按钮的点击率。点击率(CTR) 是独立用户的点击数除以独立用户的浏览量。您可以选择任意多的指标,但是您评估的指标越多,您就越有可能观察到显著的差异。
定义你的假设
统计学中的假设检验是你对一个实验的结果进行检验,看你是否有有意义的结果。假设检验最重要和最令人困惑的方面是确定无效假设和替代假设。
简单来说,在我们收集任何数据之前为真的陈述就是 零假设 。因此,在 A/B 测试中,基本的零假设是新版本并不比旧版本更好,甚至更差。对于我们的例子,新的点击率(CTR)小于或等于旧的点击率。
候补 是相互竞争、互不重叠的无效假设。我们试图证明的陈述总是交替出现。所以,在 A/B 测试中,另一个假设是新版本比旧版本好。对于我们的例子,新的 CTR 大于旧的 CTR。
设计实验(样本量、影响因素、运行时间、参与者 )
通常,用户被随机选择并分配到对照组或治疗组。然后我们进行实验,对照组看旧版本,治疗组看新版本。
每个用户只能看到一个设计(A 或 B),即使他们更新了界面。这样,相同数量的人将查看每个版本,你可以衡量哪个版本实现了你认为有意义的提升。
您决定的样本大小将决定您可能需要等待多长时间,直到您收集到足够的数据。
分析 A/B 测试数据
在 Unsplash 上由 Carlos Muza 拍摄的照片
一旦你的实验完成,是时候分析结果了。这是分析师应该更加关注的地方。我们计算对照组和治疗组的度量值。
然后应用不同的统计技术,如使用自举、回归和各种其他机器学习算法的采样分布,来评估指标,并向您显示两个版本的页面表现之间的差异,以及是否存在统计上的显著差异。
A/B 测试困难
当设计 A/B 测试并根据其结果得出结论时,有许多因素需要考虑。一些常见的有:
- 现有用户第一次经历变化时的新奇效应和变化厌恶。
- 足够的流量和转化,以取得重大和可重复的结果。
- 对照组和治疗组受试者之间的一致性。
- 做出最终决策的最佳指标选择,例如衡量收入与点击量。
- 转换率的实际意义,推出新功能的成本与转换率增加的收益。
- 足够长的实验运行时间,以考虑基于一天/一周的时间或季节性事件的行为变化。
尼克·莫里森在 Unsplash 上拍摄的照片
我写这篇博客尽可能简单,这样没有 A/B 测试知识的人也可以对它有一个基本的了解。业界有各种各样的分析工具用于 A/B 测试比如 Google Analytics 和 Google Optimize,Vwo,Optimizely,HubSpot 的 A/B 测试套件,Crazy Egg 等。
对于有空闲时间的营销人员来说,A/B 不是奢侈品;他们是增长黑客的命脉。
A/B 测试最受欢迎的例子之一是41 种蓝色 ,当谷歌无法决定某个设计元素更喜欢两种蓝色中的哪一种时,据报道,他们使用 A/B 测试来评估 41 种不同蓝色的性能。此外,查看真实企业的 7 个令人难以置信的 A/B 测试示例行业级 A/B 测试示例。
精确的 A/B 测试方法可以带来巨大的好处——提高用户参与度、增加转化率、简化分析和增加销售——这是一个双赢的局面!!
A/B 测试:案例研究!
作者图片
使用 Python 分析测试结果。
在理论中,理论和实践是没有区别的,但是
实践中,却有。
我之前的博客给出了什么是 A/B 测试的基本概念。从图像在页面上的定位,到结账流程,我们都是 A/B 测试的坚定拥护者。一个概念的知识是不够的,这种知识的实现提供了最好的学习机会。
这篇博客是我作为 Udacity 的数据分析师 NanoDegree 项目的一部分参与的 A/B 测试案例研究的演练。本案例研究由 Udacity 开发并用于其许多项目中。
“ Audacity ”是一个在线学习平台,为学生提供各种课程、学位和认证。因此,Audacity 网站上典型新用户的客户漏斗如下:
主页- >探索课程- >查看课程概述页面- >注册课程- >完成课程
就像任何其他网站一样,漏斗顶部的用户数量会比底部多。Audacity 在这个漏斗的各个阶段都会失去用户。因此,它决定测试可以提高学生参与度的功能。Audacity 正在执行 A/B 测试,尝试有望提高从一个阶段到下一个阶段的转化率的变化。
他们决定引入的第一个变化是网页设计。Audacity 决定优化其主页,这样新的、更吸引人的设计将会增加探索他们课程的用户数量。
这基本上涵盖了漏斗的两个阶段,主页- >探索课程
设置了一个实验,以查看在控制组和治疗组中有多少用户参加了漏斗中的探索课程的下一阶段。然后选择主页上“探索课程”按钮的指标点击率(CTR) 来衡量各组用户的参与度。
这里的零假设是新的 CTR 小于或等于旧的 CTR。
H0:CTR _ new—CTR _ old<= 0
另一个假设是我们试图证明的,新的 CTR 大于旧的 CTR。
H1:CTR _ new—CTR _ old>0
数据收集了近 4 个月的时间,对照组人数为 3332 人,治疗组人数为 2996 人。主页动作,即浏览或点击按钮的访问者,被记录下来。
抽样资料
根据这些数据,我们计算了对照组和治疗组的 CTR。
对照组 CTR 为 0.2797 ,治疗组 CTR 为 0.3097 。然后计算两组的 CTR 之间的观察差异,发现为 0.030 。
然后,我们使用 bootstrapping 对经过 10,000 次迭代的两个页面之间的 CTR 差异模拟采样分布。
在统计学中, Bootstrap 抽样 是一种从数据源中反复抽取样本数据并替换以估计总体参数的方法。
一个 抽样分布 显示了一个统计可以从一个总体的每个可能的样本中得到的每个可能的结果,以及每个结果出现的频率。
我们使用这个抽样分布来模拟零假设下的分布,方法是创建一个以 0 为中心的随机正态分布,具有相同的分布和大小。
零假设下采样分布上的红线是我们之前得到的观察到的差异,在零假设下它看起来很小。
Bootstrapping 下的抽样分布|零假设下的抽样分布
然后,我们通过找出大于我们观察到的差异的零分布值的平均值来计算 p 值。
当你的 p 值很小时,你会随着另一个假设移动。但是有多小呢?因此,这将基于类型 1 误差的阈值来决定。商业与研究的类型 1 错误率 alpha 为 0.05 。
我们得到的 p 值是 0.0061 ,小于错误率α。所以现在我们有证据拒绝零假设。因此,A/B 测试导致实施新的主页设计。
接下来是 Audacity 决定尝试的第二个变化。他们在课程概述页面上对课程描述进行了更多的职业关注。他们希望这一改变可以鼓励更多的用户注册该课程并最终完成该课程。
这基本上涵盖了漏斗的三个阶段,查看课程概述页面- >报名课程- >完成课程。
对于这个实验,选择了四个指标。它们的定义如下:
- 注册率:“注册”按钮的点击率被考虑在内。
- **平均阅读时长:**用户在课程概览页面上花费的平均秒数。
- **平均课堂时间:**注册该课程的学生在课堂上度过的平均天数。
- **完成率:**注册该课程的学生的完成率。
按照第一次更改中提到的相同步骤,对每个指标进行了单独评估。为度量计算观察到的差异,然后通过 10,000 次迭代为两个页面之间的差异模拟使用自举的采样分布。在零假设下进行同样的操作,然后将观察到的差异绘制在获得的正态分布上。
计算了 p 值,我们发现所有的指标都具有统计学意义。您评估的指标越多,您就越有可能偶然观察到显著的差异。因此,我们需要确定每个指标中观察到的差异总体上是否具有统计学意义。
Bonferroni 校正是用来抵消多重比较问题的几种方法之一。
Bonferroni 校正 是一种多重比较校正,用于同时进行多个相关或独立统计测试的情况。
虽然给定的类型 1 误差α值可能适用于每个单独的比较,但它不适用于所有比较的集合。为了避免大量的假阳性,alpha 值需要降低,以考虑正在执行的比较的数量。
使用 Bonferroni 校正,我们将原始的 alpha 值除以度量(测试)的数量,得到错误率 alpha 的新值(0.05/4 = 0.0125)。
我们计算的四个指标的 p 值如下:
入学率- 0.0188
平均阅读时长- 0
平均课堂时间- 0.0384
完成率- 0.0846
新的 alpha 值为 0.0125 ,唯一要考虑的重要度量是平均读取持续时间。下图显示了平均读取持续时间自举下的采样分布和零假设下的采样分布。
Bootstrapping 下的抽样分布|零假设下的抽样分布
p 值应小于或等于拒绝零假设的α值。因为我们有同样的证据,我们将继续改变。因此,A/B 测试的结果是在概览页面上实施了更注重职业发展的课程描述。
上面的 A/B 测试案例研究给出了如何使用统计方法分析测试数据以得到结果的想法。你可以在 my GitHub 上找到从这些实验中收集的数据以及完整的 python 代码。
如果你想提高用户参与度,提高转化率,增加销售额,你需要做出数据驱动的决策。通过 A/B 测试,你可以看到黑色的结果&白色的,这样你就知道什么对你有效了。
A/B 测试:生存还是毁灭
来源:沉积照片
了解如何改善用户体验,改变用户行为,并通过谷歌优化中的 A/B 测试提高你的转化率
没有痛苦,就没有收获,也就没有领导。为了将你的广告带来的流量转化为销售额,你需要通过改善用户体验、改变用户行为和提高转化率来不断优化你的网站。但是你如何确保你实施的改变会带来预期的结果呢?这就是 A/B 测试的目的。在这篇文章中,我们告诉你什么是 A/B 测试,如何进行,有哪些细微之处值得注意。
什么是 A/B 测试?
营销中的 A/B 测试与分割测试是一样的——比较网站页面的两种变体,它们只有一个参数不同。A/B 测试的目标是确定这两个选项哪个更有效,带来更多的转化。
假设你卖软件。您有一个带有产品描述的登录页面,页面底部有一个按钮可以订阅试用版。为了增加订阅者的数量,您决定在登录页面上为那些已经了解您的产品或喜欢不阅读详细信息就立即试用的人多添加一个按钮。
为了检查您的假设是否正确——通过添加另一个按钮可以获得更多订户——您创建了一个原始登录页面的副本,并在其中添加了一个按钮。然后将页面访问者分成两组:一组显示原始页面(变体 A),另一组显示更新后的页面(变体 B)。在测试的最后,您比较性能指标(在我们的例子中是订阅的数量)并确定获胜者。
图片由作者提供
为什么要进行 A/B 测试?
让我们看看 A/B 测试(或分割测试)帮助我们实现的一些主要事情。
1。更好地理解你的用户,给他们想要的。无论你从事电子商务和在线营销有多长时间,仅仅依靠你的个人经验都是错误的。
即使你似乎可以预测网站用户的行为,并确切地了解如何组织内容,使他们尽快通过销售渠道,进行 A/B 测试。结果可能会让你吃惊。
实践表明,我们的假设并不总是与现实相符。因此,我们不能仅仅根据自己的信念来决定什么对客户最好。
**2。依靠数据而不是专家意见。**第二个挑战源于第一个挑战,即在现场进行变更并最大限度降低相关风险的可行性。
通常,假设是基于个人观点,可能与观众观点不一致。因此,没有经过 A/B 测试就引入的变更不会达到预期的效果——或者更糟,它们会降低转化率。
因此,当你面临用什么做决策的问题时——数据还是专家意见——总是选择数据。
**3。个性化与客户的沟通。**客户使用不同的设备,来自不同的来源,以不同的方式与您的网站互动,浏览和购买不同的商品…
网络分析服务,如谷歌分析和 Yandex。度量帮助你组合这些数据,并系统化关于用户的知识。营销人员收集用户访问了哪些页面以及在这些页面上做了什么的信息。这使得将受众分成几十个或几百个部分成为可能,并且可以学习,例如,来自有机或付费流量的用户如何行为。
但是我们并不总是正确地使用这些信息,也不总是从中获取最大的利益。一个简单的例子:大多数在线项目仍然向所有用户显示相同的内容,而不管他们的行为和流量来源:
图片由作者提供
如果你正在这样做,一个分割测试可以帮助你解决这个问题,并使你的网站内容个性化。
A/B 测试的主要阶段
现在让我们来看看分割测试的主要阶段(和细微差别):
图片由作者提供
第一阶段。找出问题所在
你需要做的第一件事是找出你网站的弱点。为此,您可以:
- 探索谷歌分析和其他网络分析系统中的数据,看看哪些页面失败率高,滚动深度低,转化率差。
- 使用 Webvisor 并单击热图来了解用户如何与您站点的元素进行交互。
- 分析支持案例或采访活跃客户,看看他们在网站上错过了什么。
例如,假设您在 Google Analytics 中查看增强的电子商务漏斗,发现很少有人在购物车中添加某样商品。同时,你有一个线下销售点,你知道这个产品很受欢迎。在这种情况下,很可能是你的网上商店出了问题。
第二阶段。提出假设
一旦你决定了要修复什么,你需要考虑你将如何修复它。没有 A/B 假设,测试就没有意义——你的发现的价值就很小。你要清楚的了解实验的目的,你要测试网页的什么元素,你要达到什么量化的结果。
当制定假设时,推回你的转换漏斗。问问你自己:*为了让用户更快地通过漏斗,我应该在页面的某个部分改变什么?"*每次测试检查一个假设;否则,很难确定什么样的变化对最终结果产生了什么程度的影响。
可以测试的内容:
- 转换按钮的颜色、大小、文本和位置
- 标题—更改文本;让它更短、更有趣、更相关
- 表单—减少字段数量或添加工具提示和填充示例
- 登录—更改页面结构、字体或调色板
- 内容——添加高质量的照片和视频、行动呼吁、促销优惠、“免费”一词等。
你对绩效指标的选择取决于你的假设和你想要达到的目标。这些可以是收入、购买数量、转换率、平均支票大小、应用和订阅、失败率等。
第三阶段。检查指标
下一步是确保您实现并记录了所有必要的指标,在此基础上,您将在测试结束时得出结论。在我们的工作中,我们遇到过这样的情况,客户已经确定了弱点并形成了假设,但没有正确地规定一个指标体系,因此他们可以理解转换率的变化恰恰是因为一个按钮的变化,而不是因为其他因素。
第四阶段。运行 A/B 测试
在运行实验之前,请考虑以下因素:
- **最小样本量。**为了确保您的测试结果在统计上具有显著性并且可信,请确定所需的参与者人数。你可以使用免费的在线计算器,如 Abtasty 和 Optimizely 来计算。假设你的原登陆页面转化率为 5%,你期望页面的测试版达到 7%。在这种情况下,最小可见效果为 40%。将这些数字输入计算器,你会发现每个变量至少需要 1964 人:
图片由作者提供
- **外部因素:**季节性、节假日、股票、天气、货币汇率等。因此,外部因素不会扭曲实验结果,在同一时期并行显示页面的两个版本非常重要。
- 首先测试宏转换。如果你设定了访问某个页面的目标,很可能用户会实现这个目标,但不会进行交易或采取其他目标行动。总有必要将你的漏斗作为一个整体来考虑,以了解网站上哪些用户行为是最高优先级的。
- **考虑设备的类型。**如果你开始对你网站的所有流量进行测试,并且你有移动和桌面版本,检查测试选项在移动设备上看起来如何。
- 排除内部流量这样你的员工在网站上的行为就不会扭曲统计数据。这可以在 Google Analytics 中通过 IP 地址过滤来实现。
在考虑了这些因素之后,您可以运行测试。稍后,我们将告诉您可以用来做这件事的工具。
第五阶段。分析结果
实验结束时,对结果进行分析。例如,假设您的登录页面上的原始转化率为 3%,您假设您可以将其提高到 5%,测试变量显示为 3.5%。转化率有所提高,但只是略微提高。现在你需要决定是在网站上引入改变还是尝试另一种假设。
您可以使用在线计算器或统计方法检查分割测试的结果是否具有统计学意义。
在我们关于网络分析中的统计或如何成为真正的数据科学家的文章中,阅读更多关于统计能力、样本长度、置信区间、统计显著性以及如何测量它们的内容。
如果这个过程是成功的,并且你已经收到了可靠的数据,把登陆页面的获胜者带到网站,继续下一个实验。
分析结果时可能出现的错误:
- 过早地评估结果。我们建议进行至少 14 天的分割测试。如果任务已经开始,你正在测试不影响网站全局功能的小变化(例如,你已经改变了一个按钮的颜色),并且你正在使用 Google Optimize,你可以对这个规则做一个例外。如果您在优化报告中看到新选项以 80–90%的概率胜出,您可以停止实验。这些指标不太可能发生巨大变化。
- 评估有效性阈值低于 95%的结果是优化报告的另一个指标。当你进行实验时,Google Optimize 会考虑最终结果的有效性。如果低于 95%,Optimize 会建议继续实验。您可以在选项卡中的活动实验中看到该阈值。
- **忽略测试结果为次要。**谁不想一次翻倍转换?!然而,即使是这样一个温和的(乍一看)2-3%的转化率增长也不是一个坏结果。尤其是如果登录页面上的变化很小的话。
- **不检查您站点的全局指标。**毕竟,你需要检查你的全球站点指标,而不仅仅是那些你在实验中选择的指标。单个参数可能不足以评估变化的影响。例如,通过提高转换率,平均支票大小可以减小,总收入可以增加。因此,监控所有相互关联的 KPI。
A/B 测试工具
要运行 A/B 测试,您必须创建页面的测试版本,对受众进行细分,并分别计算每个细分的目标指标。如果您有编程技能和足够的资源,您可以手动运行 A/B 测试。但是在特殊工具的帮助下做起来更容易更方便。
我们准备了一个比较流行的分割测试工具的小表格:
图片由作者提供
在 OWOX BI ,我们使用 Google Optimize 进行测试,所以我们将更多地关注这个工具的特性。
谷歌优化的 A/B 测试
优化是一项连接到你网站的在线服务,允许你尝试不同的内容显示方式。
Optimize 允许您使用您在 Google Analytics 中积累的数据,为用户提供对他们最方便、对您的企业最有利的页面版本。
谷歌优化的优势
- 数据的完整性。要建立和分析一个实验,可以使用谷歌分析的目的和细分。你可以使用谷歌分析中你熟悉和喜爱的常用指标。
- **个性化的大量机会。**成功完成测试后,您可以使用 Google Analytics 受众和变量配置不同内容的演示,例如,在 Google Tag Manager 的 dataLayer 中实现的变量。如果实验让你为普通用户提高网站的生产力,那么基于用户信息的个性化将让你在每个细分市场中获得更高的回报。
- 与其他谷歌产品集成,实现更深入的定位和分析(谷歌广告、数据工作室、标签管理器等)。)
- 易于理解的便捷界面。可视化编辑器允许您在没有开发人员参与的情况下配置和启动新的实验。它大大减少了进行实验的时间。
- 最低限度影响 页面加载速度。
- 无需手动汇总数据、编制报表、应用统计公式检查结果。谷歌优化自己做一切。
优化缺点
- 到目前为止,Google Optimize 还不能用来测试移动应用。
- 你不能安排测试。也就是说,如果您想要准备几十个测试,但由于某种原因无法同时开始,或者如果免费版本对同时测试的数量有限制,或者您不想在同一受众身上尝试几十个选项,这可能会成为一个问题。您需要在界面中手动启动每个测试。这不是一个严重的缺点,但是你仍然可以在其他服务中这样做。
谷歌优化如何工作
Google Optimize 的工作方式类似于其他进行实验和个性化的工具:
图片由作者提供
- 首先,您需要创建各种页面、弹出窗口和其他要向用户显示的对象。
- 然后,您需要确定目标(衡量标准),通过这些目标来确定获胜的选项。这些可以是优化中内置的指标——页面浏览量、会话持续时间、交易、收入和失败率——或谷歌分析的任何自定义目标。
- 之后,你需要确定将参与实验的受众,并启动实验。在这一阶段,您必须通过向用户显示测试选项来决定您可以承担多大的风险。您可以在两个选项之间平均分配流量,或者,例如,进行 20/80 分割。另外,在这个阶段,你必须选择向哪部分观众展示这个实验。给大家看,还是拿 20%把你的两个选项分给他们?你为什么想这么做?如果你有一个大商店,你不确定你的假设,你不想冒险一半的流量。
除了经典的 A/B 测试之外,在 Optimize 中,您还可以运行多元测试(在多种组合中有多个变化的元素)和重定向测试(针对具有不同 URL 和设计的页面)。
在我们关于如何使用 Google Optimize 进行首次 A/B 测试的文章中,你可以了解更多关于 Google Optimize 的界面和设置。
分析结果
使用 Google Optimize 中的报告,您可以在实验过程中监控结果,并在实验结束后立即分析收集的数据。
图片由作者提供
优化报告中的术语:
- 改进——转换率的可能范围
- 最佳概率-此选项优于所有其他选项的概率
- 超出基线的概率——该选项将带来比原来更好的转换率的概率
- 转换率—预测的平均转换率
- 转换—具有转换的会话数
获胜者是如何确定的
谷歌优化使用贝叶斯推理生成统计数据。无需深入细节,这意味着在实验过程中,您可以在优化报告中看到变体 B 在实验结束前胜出的概率。如果概率达到一定水平,就有可能提前完成实验,节省时间和金钱。
此外,谷歌团队计划在实验结束前实施一种有利于最佳选项的流量重新分配机制。这将为您节省资金,因为在测试过程中很少用户会看到无效的选项。
如果您将 Optimize 与您的 Google Analytics 帐户集成,您将能够在 Google Analytics 界面的行为/实验部分浏览和分析测试结果:
图片由作者提供
如果您的实验成功,您可以在您的网站上部署获胜选项。
A/B 测试:业务案例的 4 大错误及解决方法
不犯错误的人永远一事无成
你可能有的是 en 忽略直到你发现这篇文章
约翰·施诺布里奇在 Unsplash 上拍摄的照片
介绍
史蒂夫·乔布斯在 1997 年回答一个棘手的问题时说:
“你必须从客户体验开始,然后回溯到技术。你不能从技术入手,试图找出在哪里销售。”
我相信 A/B 测试正是基于这种想法。大多数创新型公司已经从 HiPPO (薪酬最高的人的观点)转向数据驱动的决策。他们在数字实验上投入大量资金,以确保最佳的客户体验和组织决策。
谈及脸书对庞大测试框架的投资,在一次采访中,马克·扎克伯格说,
“在任何给定的时间点,世界上都不会只有一个版本的脸书。大概有一万个版本在运行。”
杰夫·贝索斯也曾经说过:
“我们在亚马逊的成功取决于我们每年、每月、每周、每天做多少实验。”
但是,尽管有适当的预算和努力,一些可以避免的错误还是在实施过程中悄悄出现了。这篇文章指出了在 A/B 测试中经常发生而又被忽视的 4 大错误。
我将把以下内容作为本文框架的一部分:
- 我用真实的商业案例/假设的案例来阐述错误,帮助你清楚的理解思路。
- 我还会为它们建议合适的修复方法。
我保证会让你觉得非常有趣和容易理解。所以,泡一杯热咖啡,拿起你最喜欢的扶手椅。
让我们开始吧。
1。 测试变量太多
当您测试一个假设来比较两个变量时,您在某个置信区间执行统计测试。假设您的组织为某个实验决定了 5%的置信区间。这是什么意思?
这意味着有 5%的几率你的测试结果是随机的,你会发现一个错误的赢家。
e.g. Your test will say that Option B is better than Option A, 5 times out of 100 when that is not the case.In statistical terms, there’s a 5% probability of getting a false positive (Type 1 Error).
很简单,对吧?现在让我们更进一步。让我们将这个概念扩展到不止一个测试变量。
得到假阳性的概率的一般公式如下:
False Positive Rate = 1-(1-α)ⁿ
α → significance level
n → total number of test variants (excluding the control)
这个等式目前看起来像这样:
1-(1–0.05)¹=0.05
现在,随着测试变量数量的增加,第一类错误也会增加。下图清楚地描述了这种变化:
图 1 假阳性率随测试变异数的变化(图片由作者提供)
这就是所谓的 【多重比较问题】 。
让我以谷歌的一个著名实验为基础,叫做【41 种蓝色测试】 。
图 2 谷歌的“41 种蓝色测试”(图片由作者提供)
2009 年,谷歌想要决定在他们的搜索结果页面上产生最大点击量的蓝色色调。因此,他们进行了“1%实验”来测试 41 种不同深浅的蓝色,给 1%的用户展示一种蓝色,给 1%的用户展示另一种蓝色,以此类推。
这就是你在 Gmail 和谷歌搜索中看到的广告链接中的蓝色是如何选择的。有趣的是,它为该公司带来了每年 2 亿美元的额外收入。
很吸引人,对吧?现在,让我们回到‘多重比较问题’。我们该如何应对?谷歌会怎么做?
修复:
应该测试的变体数量取决于您组织的业务需求、组织效率以及一系列因素,如转化率、收入、流量等。尽管如此,通常还是应该避免测试太多的变化。
据统计,有多种技术可以解决这个问题。我来解释一种叫做 【邦费罗尼校正】 的技术。
到目前为止,您已经知道,随着测试假设数量的增加,第一类错误也会增加。“Bonferroni 校正”对此有何帮助?
“Bonferroni 校正”通过在α/n 的显著性水平上测试每个假设来补偿误差的增加
例如,如果一个实验测试 40 个假设,期望的显著性水平为 0.05,那么“Bonferroni 校正”将在α=0.05/40=0.00125 测试每个假设。
所以,现在你知道了,为了维持“41 度蓝色测试”实验 95%的置信区间,谷歌会以 99.875%的置信区间测试每个假设。
2。 忽略交互影响
当多个实验以相同的观众为目标时,注意交互效应是很重要的。但是互动效应是什么呢?
这是一种在实验过程中两个变量对测量的成功度量的同时影响不是相加的情况。我们通过一个例子来理解这一点。
假设亚马逊正在改善其对外客户沟通,以提高转化率。电子商务分析团队正在对“废弃购物车”推送通知进行 A/B 测试。与此同时,营销分析团队也在对发送给客户的“推荐电子邮件”进行 A/B 测试。
下图显示了测试期间获得的转换率:
图 3 单个 A/B 测试中获得的转化率(图片由作者提供)
图 4 在综合 A/B 测试中获得的转换率(图片由作者提供)
这很奇怪,对吧?这两个新功能在各自的实验中都表现良好,但为什么联合测试槽会如此呢?
这是由于**相互作用的结果。亚马逊在对外客户沟通项目上走得太远了。这两个各自表现出色的功能结合在一起的效果是,它惹恼了客户。因此,转换率下降了。**
修复:
有一个双重方法可以消除交互效应对实验成功指标的负面影响:
- 首先,留意同时推出的两个新功能之间可能存在的交互效应。如果有两个团队参与,组织中的某个人作为两个团队之间的纽带,对两个团队的工作有很好的了解,可以成为有用的资源。
- 第二,当这种交互作用被识别时,不要同时进行 A/B 测试。相反,按顺序测试它们。
3。 忽略客户价值
有时,组织只关注主要 KPI 的表现,如转换率或每次访问的收入,而忽略了基于客户价值的细分。这可能导致有缺陷的实验结果。让我们看一个例子。
假设沃尔玛超市重新设计了它的主页,改变了“搜索栏”的位置。该团队进行了一项为期两周的实验,但发现转换率和每次访问的收入都下降了。因此,结论是旧的设计更好。
一切看起来都很好,对吗?但是是吗?号码
团队忽略了一个重要的事实,即忠实客户的反应往往比新客户更不利。忠诚的顾客需要更长的时间来适应新的设计。让我们用一个更贴切的例子来理解这一点。
假设你去离你最近的沃尔玛实体店购物,发现他们已经完全重新布置了整个商店。你会在杂货店的通常位置找到电子产品区,在家庭必需品的通常位置找到服装区,等等。如果这是你第一次来,你不会知道有什么不同,你会买你想要的东西。但如果你是那里的常客,你会感到困惑,如果你很着急,你甚至可能会走出去。
我想你明白了。只是类似的网上行为可能性更大。
修复:
我想你现在会同意我的观点,顾客价值和对网页设计修改的积极反应之间存在反比关系,考虑到顾客价值不仅仅是一生收入的函数,也是近期和频率的函数。
换句话说,在一个的 RFM 模型中,上四分之一(在最近、频率和货币价值方面得分最高的客户)不会对新设计做出有利的反应。
让我通过 4 个客户的小样本数据来快速演示 RFM 四分位数的客户细分。
****R (Recency) → Days since last conversion
F (Frequency) → Number of days with conversions
M (Monetary) → Total money spent****
图 5 使用 RFM 模型的客户细分(图片由作者提供)
因此,了解基于客户价值的客户组合和细分非常重要。将它们分为新的和常规的。如果你根据 RFM 四分位数()RFM 细分 ) 来形成细分就更好了。****
图 6 基于 RFM 四分位数的样本客户群(图片由作者提供)
4。 不正确的测试后分割
实验完成后,您开始将数据分成几个部分,如流量大小、新客户与忠实客户、设备类型等。您希望根据您的成功指标对它们进行比较,以挖掘出有用的业务洞察力。这叫做测后分割。
但是,在这里你需要小心。请注意以下两个问题:
- ****细分的小样本量:测试后你形成的细分可能会以非常小的规模结束。因此,你通过比较你测试的变量的不同部分得出的商业见解可能不具有统计学意义。
- ****多重比较问题:还记得这个吗?是的,你是对的。我们在文章的第一点就谈到了它。如果比较太多段,类型 1 错误的概率会增加。
修复:
那么,你是怎么处理的呢?
最好的处理方法是选择分层抽样,设计有针对性的测试。将样本分成同质的组,这样组内的差异就很小。这些类别或客户群可以基于设备类别、流量来源、人口统计等属性。根据业务需要和预算。然后,进行实验以比较待测试变量的相应括号。
给你举一个行业的例子, 网飞 使用分层抽样来保持一组关键指标的同质性,这些指标包括国家和设备类型(如智能电视、游戏机等。)才是最关键的。
结论
虽然有许多 A/B 测试错误,我的努力是指出更复杂的错误,这些错误在行业中很有可能被忽略。
我希望我能够兑现我的承诺,让这篇文章变得有趣和容易理解。我希望你觉得有用。
以托马斯·阿尔瓦·爱迪生颂扬错误并从中吸取教训的精神作为结束,
“我没有失败过一万次。我已经成功地找到了一万种行不通的方法。”
请随意看看我写的关于数据分析的其他文章:
电子商务零售中的分析概念和应用,带有简单的演示和有趣的业务示例
towardsdatascience.com](/data-analytics-in-e-commerce-retail-7ea42b561c2f) [## SQL 查询优化的索引
是时候开始你的查询游戏了!
towardsdatascience.com](/indexing-for-sql-query-optimization-139b57db9fc6) [## 7 必须知道 SQL 查询错误和修复
避免这些错误,提高你的查询技巧!
towardsdatascience.com](/7-must-know-sql-querying-mistakes-fixes-321ee292a251)
请随时提供反馈,并关注我以获取更多关于数据分析的有趣文章。在 LinkedIn 上与我联系。****
使用卡方检验进行 A/B 测试,以最大化转化率和 CTR
面向有抱负的实验者的数据科学项目演练
作者创建的图像
目录
前四节解释了用于此 A/B 测试的概念,后两节介绍了对转换率执行 A/B 测试的分步示例。
- 介绍
- 什么是 A/B 测试?
- 卡方检验
- 计算卡方检验统计量
- 资料组
- A/B 测试项目演练
介绍
可以说,工作场所中最实用的数据科学概念之一是 A/B 测试。然而,这是一个很容易被误解的概念,因为它非常复杂。
举个例子,许多实验主义者使用 t 检验来确定两个选项之间是否有显著差异。但是如果不假设分布是高斯的呢?如果两组的标准差不一样呢?如果分发未知地完成了呢?
在这篇文章中,我将谈论一种特别的 A/B 测试方法,这种方法可以很好地比较点击率和转化率。
什么是 A/B 测试?
从最简单的意义上来说,A/B 测试是对两个变量进行的实验,根据给定的度量标准来看哪一个表现更好。通常,两个消费者群体接触同一事物的两个不同版本,以查看会话、点击率和/或转化率等指标是否有显著差异。
以上面的图片为例,我们可以将我们的客户群随机分成两组,一个对照组和一个变异(或治疗)组。然后,我们可以用一个红色的网站横幅来展示我们的变体组,看看我们是否会获得显著的转化率增加。需要注意的是,在执行 A/B 测试时,所有其他变量都需要保持不变。
更专业地说,A/B 测试是一种统计和双样本假设测试。统计假设检验是一种将样本数据集与总体数据进行比较的方法。两样本假设检验是确定两个样本之间的差异是否具有统计显著性的方法。
卡方检验
点击率和转化率有什么共同点?他们有一个伯努利分布,一个概率为 1,一个概率为 0 的离散概率分布。对于点击率,用户要么点击(1),要么不点击(0)。同样,对于转换,用户要么转换(1),要么不转换(0)。
因为我们正在对遵循伯努利分布的分类变量转换执行 A/B 测试,所以我们将使用卡方测试。
进行卡方检验的步骤如下:
- 计算卡方检验统计量
- 计算 p 值
- 将 p 值与显著性水平进行比较
当您跟随项目演练时,这将更有意义。
计算卡方检验统计量
确定卡方检验统计量的公式如下:
让我们通过一个例子来更好地理解这一点。
假设我们展示了两个不同的广告,A 和 B,来测试用户是否点击了广告。测试结束时,收集了以下信息:
在这种情况下,我们必须进行四次计算,然后将它们相加:
- 广告 A,点击
- 广告 A,无点击
- 广告 B,点击
- 广告 B,无点击
我们以广告 A 为例。我们需要计算观察值和期望值。
观察值等于 360,如上表所示。
期望值等于广告显示的次数乘以点击的概率。因此,期望值= 500 * (660/1050) = 31.429。这些数字也取自上表。
对所有四种情况进行计算后,可以将这些数字输入到 x 方程中,以确定卡方检验统计量。
资料组
我用来执行这个 A/B 测试的数据集来自 Kaggle ( 这里是数据集的链接)。
该数据集包含 A/B 测试的结果,其中两组(对照组和处理组)分别暴露于旧网页和新网页。该测试的目的是确定与旧网页相比,新网页是否会显著提高转化率。每一行代表一个独特的用户,并显示他们是否在对照组或治疗组,以及他们是否转换。
A/B 测试项目演练
*# Import libraries and data*
import numpy as np
import pandas as pd
import scipy
import matplotlib.pyplot as plt
df = pd.read_csv('../input/ab-testing/ab_data.csv')
和往常一样,我从导入相关的库和数据开始。
数据争论
在进行卡方检验之前,我想检查一些东西,因为我不知道数据有多干净。我检查的第一件事是查看控制组中是否有任何用户看到了新的网页,反之亦然。
# Checking to see if there are any users in control that saw new page and users in treatment that saw old page
df.groupby(['group','landing_page']).count()
上面,你可以看到似乎有一个错误,对照组的一些用户看到了新页面,而治疗组的一些用户看到了旧页面。因为我不确定用哪种方法来恢复错误分类的用户,所以我决定用下面的代码删除它。
*# Removing control/new_page and treatment/old_page*
df_cleaned = df.loc[(df['group'] == 'control') & (df['landing_page'] == 'old_page') | (df['group'] == 'treatment') & (df['landing_page'] == 'new_page')df_cleaned.groupby(['group','landing_page']).count()
现在,对照组被限制在旧页面,而治疗组被限制在新页面。我想检查的下一件事是基于 user_id 的重复值。
*# Checking for duplicate values*
df_cleaned['user_id'].duplicated().sum()
因为有一个副本,我想深入研究一下。
*# Finding user_id for duplicate value*
df_cleaned[df_cleaned.duplicated(['user_id'],keep=False)]['user_id']
df[df['user_id'] == 773192]
看起来这位用户看了两次新的登录页面,但两次都没有转换。为了实验的简单,我想把它限制在每个用户的第一个决定上。因此,我删除了这个用户的第二个实例。
df_cleaned = df.drop_duplicates(subset='user_id', keep="first")
探索性数据分析
一旦我的数据被清理,我想更好地了解我的数据。我将数据绘制成柱状图,看看两组的转化率是多少。它们似乎具有相似的转换率(大约。1/7),但是我们将通过卡方检验来看是否有显著差异。
groups = df_cleaned.groupby(['group','landing_page','converted']).size()
groups.plot.bar()
同样,我想用饼状图看看每个组中用户数量之间的比例大小是否相似。
df_cleaned['landing_page'].value_counts().plot.pie()
数据准备
此时,我已经准备好为卡方数据准备数据了。下面的代码相当于上一节中我解释了如何计算卡方检验统计量的示例。
### Re-arrrange data into 2x2 for Chi-Squared# 1) Split groups into two separate DataFrames
a = df_cleaned[df_cleaned['group'] == 'control']
b = df_cleaned[df_cleaned['group'] == 'treatment']# 2) A-click, A-noclick, B-click, B-noclick
a_click = a.converted.sum()
a_noclick = a.converted.size - a.converted.sum()
b_click = b.converted.sum()
b_noclick = b.converted.size - b.converted.sum()# 3) Create np array
T = np.array([[a_click, a_noclick], [b_click, b_noclick]])
卡方检验
一旦我的数据格式正确,我就准备好进行测试了。这可以简单地通过从 Scipy 库中导入统计数据来完成。这一步计算卡方统计量和 p 值。
import scipy
from scipy import statsprint(scipy.stats.chi2_contingency(T,correction=False)[1])
p 值计算为 19%。假设显著性水平为 5%,我们可以推断 p 值大于α值,并且我们不拒绝零假设。简单来说,新旧网页之间的转换没有任何意义。
# Sanity Check
a_CTR = a_click / (a_click + a_noclick)
b_CTR = b_click / (b_click + b_noclick)
print(a_CTR, b_CTR)
作为健全性检查,我计算了两组之间的转换率,它们之间的差异是最小的,这再次保证了这是正确进行的。
本教程到此结束!我希望你觉得这很有用。😃
感谢阅读!
特伦斯·申
创始人ShinTwin|我们来连线一下LinkedIn|项目组合这里是。
用概率编程和 PyMC3 进行 A/B 测试(上)
离散变量的 A/B 测试
声明:这篇文章深受《黑客的概率编程和贝叶斯方法》一书的影响。我们的主要贡献可能是说明性的风格——我们希望这将对概率编程或 A/B 测试或者两者都有好处。我们也将思考我们在 Kibo Commerce 实习时处理这些话题的一些经验。
这是关于概率编程应用的系列文章中的第二篇,特别是 PyMC3。在本文中,我将描述如何使用 PyMC3 对离散变量进行 A/B 测试。由于篇幅已经很长,我将在后续文章中讨论使用连续变量的 A/B 测试。目前的文章结构如下。
1.什么是 A/B 测试,为什么它对商业成功很重要?
2.经典 A/B 测试的一些缺点,对更多信息的 A/B 测试的需求,以及 PyMC3 如何帮助。
3.用离散变量进行 A/B 测试的一个例子。
让我们深入细节。
第一部分:什么是 A/B 测试,为什么它对商业成功很重要?
首先,让我们通过一个具体的例子来简单解释一下什么是 A/B 测试。我们注意到,在实现和部署 A/B 测试时会有各种变化,所以尽管我们的例子相当典型,但它并不具有唯一的代表性。
假设,一个活动组织怀疑,如果主题行更长,会吸引更多人阅读电子邮件,然后捐款。当然,竞选组织者没有办法事先核实这一点。换句话说,它们只是形成了一个需要用数据来检验的假设;否则,如果他们的假设被证明是错误的,这场运动可能会失去捐助者。简单地说,活动组织者计划向 50,000 名潜在捐赠者发送活动电子邮件。一个简单过程如下。
1.将潜在的捐助者随机分成两组:测试组和维持组。
2.顾名思义,我们将使用测试集来测试我们的假设。这一部分可以这样做:我们将测试集随机分为两组:控制组和实验组。然后,我们将把旧的运动策略应用于控制组,把新的策略应用于实验组。我们将等到从这两组中收集到足够的数据来比较这两种策略。
3.然后,我们可以将第二步验证的更好的策略应用于维持集。
这个简单的过程很容易实现,事实上,它被证明是成功的:请看这里的一些真实世界的例子。
第 2 部分:经典 A/B 测试的一些缺点,对更多信息的 A/B 测试的需求,以及 PyMC3 如何能有所帮助。
本文中我们主要关注的是第二步。通常,为了比较这两种策略,我们经常使用 t 检验。虽然这种测试相对容易实现,但也有一些缺点。其中一些是:
㈠它没有提供关于这两种方法之间差异的全部信息。特别是,它并没有真正为我们的最终决定提供一定程度的信心。
(二)它要求我们事先确定一个样本量。
(iii)传统的 t 检验使用 p 值来接受/拒绝零假设。从我和我在 Kibo Commerce 的导师的谈话中, Austin Rochford,我了解到,营销人员经常将 p 值误解为实验组比对照组表现更好的概率。这种误解可能会导致糟糕的商业决策。
(iv)不容易使用 t 检验来回答更复杂的问题,例如差异的量化。例如,有时我们不仅对实验组是否比控制组表现更好感兴趣,而且对好多少感兴趣。这一点很重要,因为实施一项新战略通常需要花费时间和金钱等资源;因此,我们必须从战略上决定这样做是否值得。
这些原因和其他原因是发现更多信息测试的动机。我们在本文中采用的方法是贝叶斯 A/B 测试。粗略地说,在贝叶斯/概率编程框架中进行 A/B 测试的过程如下。
*第一步:*我们形成了对数据真实性的先验信念。
第二步:从证据/观察到的数据中,我们更新信念;换句话说,我们(数值地)计算后验分布。
步骤 3 :我们从后验分布中抽取样本,并使用这些样本进行统计推断。
正如我们在第一篇文章中解释的,计算后验分布的精确形式通常具有挑战性,尤其是在共轭先验不可用的情况下。幸运的是,我们有 PyMC3 来神奇地帮助我们。
3。使用离散变量进行 A/B 测试的示例
第一部分中讨论的 A/B 测试问题的一个重要指标是转换率:即潜在捐赠者向活动捐赠的概率。
我们将使用模拟数据,如第一部分中的图片所示。更准确地说,假设我们进行实验,结果由下式给出:
donors_A=1300
donors_B=1500
conversions_from_A=273
conversions_from_B=570
请注意,与图片不同,A 组和 B 组的样本量不同。这种情况在实践中并不少见:严格遵循上述 A/B 测试程序通常具有挑战性(例如,我观察到 Kibo 的数据经常出现这种情况。)然而,正如我们所看到的,样本大小几乎相等。此外,在贝叶斯框架中,不相等的样本大小不是一个大问题。
我们可以通过下面几行代码在数字上近似这两组转换率的后验分布。
#group A
with pm.Model() as model_A:
#set the prior distribution of $p_A$.
p_A=pm.Uniform('p_A', lower=0, upper=1)
#fit the observed data to our model
obs=pm.Binomial("obs", n=donors_A,
p=p_A, observed=conversions_from_A) #MCMC algorithm
step=pm.Metropolis() #sampling from the posterior distriubtion.
trace_A=pm.sample(30000, step=step)
burned_trace_A=trace_A[1000:]#group B
with pm.Model() as model_B:
#set the prior distribution of $p_B$. p_B=pm.Uniform('p_B', lower=0, upper=1)
#fit the observed data to our model
obs=pm.Binomial("obs", n=donors_B,
p=p_B, observed=conversions_from_B)
#MCMC algorithm
step=pm.Metropolis() #sampling from the posterior distriubtion.
trace_B=pm.sample(30000, step=step)
burned_trace_B=trace_B[1000:]
关于代码的一些话。由于我们观察到的数据是转换的数量,我们使用二项分布来描述我们的观察。如果我们有逐点数据(即每个潜在捐献者的转化率),我们可以使用伯努利分布,就像我们在的上一篇文章中描述的那样。当然,不管我们使用什么分布,后验分布都是相同的。从数学上来说,总转化率是对我们问题的充分统计。
我们还注意到这不是计算后验分布的唯一方法。在这种特殊情况下,我们可以显式地计算它们,详见我们的上一篇文章。更准确地说,我们可以证明 p_A 的后验分布是β(274,1028),p_B 的后验分布是β(571,931)。
我们绘制了 A 组样本的直方图及其精确后验分布β(274,1028)。我们看到 PyMC3 在近似 pA 的后验分布方面表现得相当好。
#histogram for samples from the posterior distribution of $p_A$figsize(12.5, 4)
alpha_prior=beta_prior=1
a=alpha_prior+conversions_from_A
b=beta_prior+donors_A-conversions_from_A
coef=beta(a,b)
plt.title(r"Posterior distribution of $p_A$")
plt.hist(burned_trace_A["p_A"], bins=50, histtype='stepfilled', density=True, color='#348ABD')
x=np.arange(0,1.04,0.001)
y= beta.pdf(x, a, b)
plt.plot(x, y, color='black', label='True posterior distribution of $p_A$')
plt.xlim(0.15, 0.3)
plt.legend()
plt.show()
我们可以通过取样本平均值来估计 A 组的转化率。
#the sample mean-an estimate for conversion rate of group A.
samples_posterior_A=burned_trace_A['p_A']
samples_posterior_A.mean()0.21050251102125828
我们看到这个估计非常接近频率主义者的估计。
同样,我们可以对 p_B 做同样的事情。
#histogram for samples from the posterior distribution of $p_A$figsize(12.5, 4)
alpha_prior=beta_prior=1
a=alpha_prior+conversions_from_B
b=beta_prior+donors_B-conversions_from_B
plt.title(r"Posterior distribution of $p_B$")
plt.hist(burned_trace_B["p_B"], bins=50, histtype='stepfilled', density=True, color='#348ABD')
x=np.arange(0,1.04,0.001)
y= beta.pdf(x, a, b)
plt.plot(x, y, color='black', label='True posterior distribution of $p_A$')
plt.xlim(0.3, 0.45)
plt.show()
现在,由于我们从 pA 和 pB 的后验分布中获得了足够的样本,我们可以开始进行统计推断。
我们可以一起绘制两个直方图。
figsize(12.5, 4)
plt.hist(samples_posterior_A, bins=40, label='posterior of p_A', density=True)
plt.hist(samples_posterior_B, bins=40, label='posterior of p_B', density=True)
plt.xlabel('Value')
plt.ylabel('Density')
plt.title("Posterior distributions of the conversion rates of group $A$ and group $B$")
plt.legend()
plt.show()
我们清楚地看到,B 组的表现优于 a 组。
但是好多少呢?我们可以用两个指标来回答这个问题:
(一)两种手段的绝对区别。
(二)两种手段的相对区别。
这些是我们之前讨论过的量化问题的例子。这两个问题都可以在贝叶斯框架下解决。首先,我们来回答第一个问题。为此,我们可以绘制 A 组和 b 组样本之间的差异。
difference=samples_posterior_B-samples_posterior_A
figsize(12.5, 4)
plt.hist(difference, bins=40, density=True)
plt.vlines(0.14, 0, 25, linestyle='--', color='red')
plt.title('Posterior distribution of the difference of the two means')
plt.show()
我们可以清楚地看到,这个分布远远不是 0。多远?比如我们有信心说 B 组的转化率比来自 A 组的转化率高 14%吗?我们可以用下面几行代码来近似这个概率。
#probability of 14% increase by group B100*len(difference[difference>0.14])*1.0/len(difference)96.23620689655172
这非常接近 100;所以我们真的对上面的说法很有信心。B 组的转化率比 A 组的转化率高 16%呢?
#probability of 16% increase by group B
100*len(difference[difference>0.16])*1.0/len(difference)71.44913793103449
现在,我们对第二种说法不太有信心。
接下来,我们回答第二个问题。如上所述,我们可以绘制两组转化率之间的相对差异。
rel_difference=100*(samples_posterior_B-samples_posterior_A)/samples_posterior_A
figsize(12.5, 4)
plt.hist(rel_difference, bins=40, density=True)
plt.vlines(60, 0, 0.04, linestyle='--', color='red')
plt.title('Posterior distribution of the relative difference of the two means')
plt.xlabel("percentage")
plt.show()
让我们计算一下 B 组提高转化率至少 60%的概率。
100*len(rel_difference[rel_difference>60])*1.0/len(rel_difference)97.6301724137931
嗯,我们有信心 B 组确实提高了 60%的转化率。80%呢?
100*len(rel_difference[rel_difference>80])*1.0/len(rel_difference)52.0051724137931
正如我们所看到的,这个概率与通过投掷公平硬币获得正面的概率没有太大区别,换句话说,它大多是随机的,我们不应该相信 80%的增长。
结论
如上所述,贝叶斯框架能够克服经典 t 检验的许多缺点。此外,PyMC3 使得在离散变量的情况下实现贝叶斯 A/B 测试变得非常简单。
参考文献
[1] Cameron Davidson-Pilon,黑客的概率编程和贝叶斯方法
[2]安德鲁·盖尔曼、约翰·卡林、哈尔·斯特恩、大卫·邓森、阿基·维赫塔里和唐纳德·鲁宾,贝叶斯数据分析。