更新于 

ABTest

ab测试流程图

一、AB测试的思维

假设检验的反证法思维:

假设检验(其中的参数检验)是先对总体的参数提出某种假设,然后利用样本数据判断假设是否成立的过程。逻辑上运用反证法,统计上依据小概率思想。反证法是指先提出假设,再用适当的统计方法确定假设成立的可能性大小;如果可能性小,则认为假设不成立。小概率思想是指小概率事件(p < 0.05)在一次试验中基本不会发生。

有时用逻辑说服别人非常困难,因为事实依据并不总是存在的。但是只需要提出一个目标或假设,不必考虑命题的真假,只要用实验去验证它就行了。严密的逻辑推理自然重要,只是在需要快速迭代、快速落地的业务场景下,很难有时间去使用理论模型和逻辑推理去建立整套体系,并且说服别人。尤其是当你的经验和你的合作方存在出入的时候,谁也说服不了谁,怎么办呢?不妨先假设其中一种更有效,然后试一试。

具体过程是:为了验证一件事情的真假,我们就先假设它为真(即认为它大概率发生),并约定它不发生的概率作为显著性水平,然后根据样本数据的验证结果,做出决策,即拒绝原假设或接受原假设。如图8-3-2所示为假设检验的基本步骤。

这种方法的本质思维是逆向的,是反证法的延展。它的起点不是确定的事实(我们总是喜欢确定的事实),而是一个“假设”。

试验的思维

数据分析可以带来有价值的试验假设,从而提升试验回报的可能性。不过值得一提的是,数据分析并不是试验项目唯一的驱动力,很多时候试验假设并不来自于数据分析。有些试验是为了应对竞争对手的策略(例如,竞品推出了新功能,我们也要试试看),有些试验是来自于头脑风暴的灵感(例如,给男性用户推荐女性用品会不会有奇效),有些试验是来自于外部咨询专家的建议(例如,某专家建议我们试试去掉官网的导航栏),甚至有些试验是纯粹的随机探索(例如,把某个按钮的颜色调亮一些看看)。做好分析,会提高我们的效率和能力;做不好试验,我们就无法确保完成业务增长。从这个意义上讲,试验是数据驱动业务增长的唯一力量。

二、AB测试介绍

A/B 测试的试验类型

1.正交试验,也叫分层试验

2.互斥试验

三、AB测试流程

采用的是双尾检验。因为指标高低并不直接代表好坏,并不是说越高就越好,也许我们改善的是退货率或者崩溃率,这种场景下是越低越好,所以我们使用双尾检验,能够更好的体现指标变化的方向。甚至有些时候,我们会额外关注那些变差的版本,总结经验教训,如果使用单尾检验,我们就无法知道哪些版本是明确变差的。

AB测试的核心都是单个用户,这个需要注意下(互联网场景下)

三个阶段

试验前:试验设计

  1. 提出假设
  2. 确立试验目标(选取指标)
  3. 选取试验单位及分流策略
  4. 计算样本量
  5. 计算试验周期

试验中:试验进行

  1. 分流和埋点上报

试验后:结果解读

  1. 数据检验
    1. 显著性检验
    2. 统计量检验(和显著性检验一样的作用,主要目的是为了判断是否推翻原假设
  2. 解读指标变化原因(从业务上进行解读)
  3. 给出试验结论

四、试验前

1.提出假设

2.确定实验指标及提升幅度

3.选取实验单位及分流策略

4.计算样本量

ab实验的核心指标主要分两类:均值类(例如:平均停留时长)和比率类(例如:点击率),

ab测试样本量计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
class ABTest():
def sampleSize(self, StatPower: float, confidence: float, goalRate: float, baseRate: float):
"""
AB测试中比例类指标的样本量计算,

Args:
StatPower: 统计功效power(1−β),默认80% Statistical power 1−β:
confidence: 置信水平,默认95%,Significance level, α为显著性水平,一般为5%,1-confidence
goalRate: 「goalRate」指的是「期望通过优化提升到的转化率水平」,
baseRate: 「baseRate」指的是「试验前的转化率」

Returns:
value: num, 每组所需样本量,向上取整
"""
# 入参校验,由接口实现

delta = goalRate - baseRate # 试验组和对照组在核心评价指标上的差值

a = 1 - confidence # 显著性水平a
Za = stats.norm.ppf(1 - a/2) # 1-α/2对应的z-score,α通常取5%

Zpower = stats.norm.ppf(StatPower) # power对应的z分数,power通常取80%

# 比率类样本的方差通过goalRate、baseRate计算
variance = goalRate*(1-goalRate) + baseRate * \
(1-baseRate) # 比率类场景,二项分布的方差计算

# 使用numpy.divide进行除法,防止0除报警。
sampleCnt = np.divide((Za + Zpower)**2 * variance, delta**2)

try:
result = math.ceil(sampleCnt)
except:
result = 0

# 比率型指标的样本量计算公式
# from statsmodels.stats.power import zt_ind_solve_power
# from statsmodels.stats.proportion import proportion_effectsize as es
# result = zt_ind_solve_power(effect_size=es(prop1=0.121, prop2=0.137),
# alpha=0.05, power=0.8, alternative="two-sided")

return result

def sampleSizeValue(self, StatPower: float, confidence: float, goalValue: float, baseValue: float, std: float):
"""
AB测试中绝对值类指标的样本量计算,

Args:
StatPower: 统计功效power(1−β),默认80% Statistical power 1−β:
confidence: 置信水平,默认95%,Significance level, α为显著性水平,一般为5%,1-confidence
goalValue: 「goalValue」指的是「期望通过优化提升到的绝对值水平」,
baseValue: 「baseValue」指的是「试验前的绝对值水平」
std: baseValue试验前的标准差

Returns:
value: num, 每组所需样本量,向上取整
"""
# 入参校验,由接口实现

delta = goalValue - baseValue # 试验组和对照组在核心评价指标上的差值

a = 1 - confidence # 显著性水平a
Za = stats.norm.ppf(1 - a/2) # 1-α/2对应的z-score,α通常取5%

Zpower = stats.norm.ppf(StatPower) # power对应的z分数,power通常取80%

# 绝对值类方差通过手动输入标准差计算
variance = std ** 2

# 使用numpy.divide进行除法,防止0除报警。
sampleCnt = np.divide((Za + Zpower)**2 * variance, delta**2)

try:
result = math.ceil(sampleCnt)
except:
result = 0

return result

5.计算实验周期

五、实验中

六、实验解读

1.显著性检验

2.置信区间计算

3.MDE计算

4.实验结果解读

七、统计学原理

更新日志

v2023-02-05

feat:

fix:

  • 浮点数精度问题
  • 添加分组流量选项
  • 分析结论优化

Roadmap