分割测试,也称为A/B测试,是一种比较两个版本的营销工具(如折扣优惠、电子邮件、网页等)并衡量它们性能差异的过程。这种测试的目的是为了改进现有设计并衡量其影响。A/B测试不是一次性的活动,而是一个“测试 >> 学习 >> 再次测试”的循环过程。
一个来自《Trustworthy Online Controlled Experiments: A Practical Guide to A/B Testing》书中的优秀案例是:一名在Bing工作的员工提出了对广告标题显示的一些改动。这个想法非常简单,他建议通过将标题行与标题下方第一行的文本结合起来,来延长广告的标题行。这个想法在真实用户中得到了实施,随机向其中一些人展示新的标题布局,而其他人则展示旧的布局。记录了用户与网站的互动,包括点击次数和由此产生的收入。这是一个A/B测试的例子,也就是比较两种变体(A和B,控制组或实验组)的最简单类型的控制实验。
在测试开始后的几个小时内,一个收入高警报被触发,表明实验可能出了问题。新的布局从广告中产生了太多的收入。对于这个实验来说,收入的增加是有效的。
但是,即使是小的变化也可能产生大的影响。如果实验成功,那么它无疑会在长期内产生重大影响。
那么,衡量成功的第一步是什么呢?第一部分:感兴趣的指标。设计或选择感兴趣的指标,它应该是与实验直接相关的任何指标。例如,一家快餐零售连锁店想要测试一个新的折扣优惠是否比现有的优惠更好。那么感兴趣的指标应该是:(1)每位顾客的销售量(2)频率。
关于数据,有两个关键的表格(假设数据):a) 实验表格 - 客户被标记为“测试”和“控制”组以及他们的广泛类别。b) 交易表格 - 客户购买数据,按不同日期细分。从这两个基础表格中,创建了一个派生表格,它为提供了客户在测试前后KPI的聚合数据,数据如下所示。
要创建上述表格,需要知道测试前日期范围(测试启动日期之前)和测试期间日期(测试期间的实时日期)。现在最重要的问题是什么是一个理想的衡量指标,所以用非常简单的方式,感兴趣的指标的关键特征应该是:可测量的、可计算的、敏感的。
这篇博客将集中讨论每位顾客的销售KPI。因为它继承了一个完美指标的所有品质。如果正在处理很多指标,理想情况下希望将它们合并成一个单一的指标,称之为聚合指标(称为北极星指标),然后衡量该特定指标的delta影响,以宣布实验的成功和失败。
第二部分:实验前分析。所以当得到了感兴趣的指标后,现在是时候进行一些探索,以了解一些问题,比如:每位顾客的基础销售量是多少?顾客在商店的平均频率是多少?平均订单价值是多少?探索性数据分析(EDA)将是答案,相信,它是存在的最强大的工具。它有助于推断。一个简单的基于时间的线图能够显示当前状态的度量,如平均值、中位数、所有主要KPI的标准差,这些基础值对于理解可以从实验中预期的最小可检测变化非常有帮助。
最小可检测效应(MDE):MDE代表在实验中预期的相对于基线的最小改进,具有一定的统计显著性。因此,打算比较控制组(无处理)和实验组的均值/中位数/标准差。为此,必须进行假设检验。
假设检验:在假设检验中,考虑两种情况:零假设 - 控制组和实验组之间没有统计显著性。备择假设 - 控制组和实验组之间存在显著差异。
功效和显著性:现在的问题是有足够的样本来运行实验吗?在计算样本量估计时,应避免这些错误:I型错误,计算样本量时应指定显著性水平。II型错误,样本量应该大,并且作为标准实践,将功效设置为0.8或0.9。
在上述图表中,可以看到对于不同的效应大小(可检测效应),所需的样本量是不同的。
第三部分:测量实验结果。现在是时候测量实验结果了。记住零假设认为控制组(保留)和测试组之间没有统计显著性。
因此,可以使用许多不同的方法来估计控制组和测试组之间的差异,但为了简单起见,将估计过程分为三大类别:
1) 后(控制)与后(测试):在后行为分析中,可以使用许多方法,但为了简单起见,将使用:T检验(参数) - 它是一种推断性统计方法,用于确定两组均值之间的显著差异,当分布遵循正态分布时,这是一种非常强大的方法。
# 假设使用Python进行T检验
from scipy import stats
t_stat, p_val = stats.ttest_ind(control_group, test_group)
在上述图表中,很明显测试组的表现优于控制组,但差异不显著。
2. Mann Whitney U-Test(非参数) - 非参数测试,用于比较控制组和测试组的结果,当分布不遵循正态分布时非常有用。但不能完全依赖这个结果,因为必须检查实验前偏见是否影响了测试期间的KPI。
2) 预(测试)与后(测试):另一种经典而直观的测量效果的方法是干预方法(中断时间序列方法)或准实验方法,它假设控制组不存在,试图使用反事实来测量测试的影响。这种分析是使用Google的因果推断库在Python中完成的。
# 假设使用Python进行因果推断分析
from causalimpact import CausalImpact
ci = CausalImpact(control_group, test_group)
ci.plot()
3) 调整测量(CUPED):使用预实验数据的控制实验(CUPED)。这种出色的方法是由微软的“实验平台团队”开发的。
很多时候,实验受到了影响,但delta非常小,可能因为高方差而被统计测试拒绝。这种技术非常有助于通过减少与预实验数据相关的方差来提高实验的灵敏度。
从上述视觉中可以看到R平方是0.64,这是相当高的。这表明指标中存在预实验偏见,因此应该将其移除。
所以在移除方差之后,然后进行T检验将给出确切的画面。
第四部分:分析和结论。所以从上述分析中,很明显实验对控制组有一些积极的影响。但非常重要的是要知道它是否总体上收敛,以及拐点在哪里。