LionKing数据科学专栏

购买普通会员高级会员可以解锁网站精华内容且享受VIP服务的优惠

想要查看更多数据科学相关的内容请关注我们的微信公众号知乎专栏

t检验和A/B试验(t test)

A/B试验

假设我们想要考察新上线的产品是否比旧版产品更加能吸引用户使用,可以进行如下实验。

对被试用户进行为期两周的实验,其中第一周给他们使用旧版产品,并在第二周更新为新版。比较这些用户在这两周的总共使用时间,检验新版的平均使用时间是否显著高于旧版即可。

在上面的例子中,一个比较大的问题是该用户第一周的体验可能会影响用户第二周的使用时间。

相对更加准确的检验方式是随机地抽取一部分用户作为对照组(control)使用旧版产品;再随机地抽取一部分用户作为实验组(experiment)使用新版产品。检验新版的平均使用时间是否显著高于旧版即可。

这一做法需要更多的样本以得到较准确的结果。好处是可以用一部分对照组对照很多不同的实验组,从而可以同时检验不同的新版设计。

在业界中,这个方法被称作A/B实验,被各大科技公司和药厂广泛使用。

对于连续型的指标(metric),可以假设该指标服从正态分布,并且使用双样本t检验或成对样本t检验。

对于二进制的指标,例如是否点击(Click Through Rate),可以使用Fisher精确检验

对于分类型指标,例如5个按钮中哪一个被点击,可以使用卡方检验

如果该指标不适合正态分布,也可以使用非参数的检验,例如Mann-Whitney U检验

本文介绍t检验。

t分布

考虑随机变量

$$T = \frac{Z}{\sqrt{V / k}}$$

其中$Z$是标准正态分布,$V$是自由度为$k$的卡方分布,且$Z$和$V$独立。

称$T$服从自由度(degrees of freedom)为$k$的$t$分布,记为$T \sim t(k)$。

假设$X_1, \ldots, X_n$为独立的正态分布样本,来自$N(\mu, \sigma^2)$,则

$$\frac{\overline{X} - \mu}{S / \sqrt{n}} \sim t(n - 1)$$

其中$$\overline{X} = \frac{1}{n}\sum_{i=1}^{n}X_i, S^2 = \frac{1}{n - 1}\sum_{i=1}^{n}(X_i - \overline{X})^2$$

单样本t检验

假设有样本$x_1, \ldots, x_n \sim N(\mu, \sigma^2)$,其中$\sigma$未知。

现在想要进行双边(two-sided)检验$$H_0: \mu = \mu_0 \leftrightarrow H_{\alpha}: \mu \neq \mu_0$$或单边(one-sided)检验$$H_0: \mu \leqslant \mu_0 \leftrightarrow H_{\alpha}: \mu \gt \mu_0$$$$H_0: \mu \geqslant \mu_0 \leftrightarrow H_{\alpha}: \mu \lt \mu_0$$

我们考虑统计量$$t = \frac{\overline{x} - \mu_0}{\frac{s}{\sqrt{n}}}$$

其中$s$为样本标准差:

$$s = \sqrt{\frac{\sum_{i=1}^{n}(x_i - \overline{x})^2}{n - 1}}$$

在零假设$x_1, \ldots, x_n \sim N(\mu_0, \sigma^2)$下,$t$服从自由度为$n - 1$的$t$分布。

即使样本不服从正态分布,根据中心极限定理,$t$在分布的期望为$\mu_0$的假设下,在$n$足够大时近似地服从$t$分布。

对于双边检验,我们在$t \gt t_{1 - \frac{\alpha}{2}}$或$t \lt -t_{1 - \frac{\alpha}{2}}$时拒绝$H_0: \mu = \mu_0$。

对于单边检验$H_0: \mu \leqslant \mu_0 \leftrightarrow H_{\alpha}: \mu \gt \mu_0$,我们在$t \gt t_{1 - \alpha}$时拒绝$H_0$。

对于单边检验$H_0: \mu \geqslant \mu_0 \leftrightarrow H_{\alpha}: \mu \lt \mu_0$,我们在$t \lt -t_{1 - \alpha}$时拒绝$H_0$。

其中$t_{p}$满足$\Pr[Y \leqslant t_p] = p$对于$Y \sim t(n - 1)$成立。

单样本t检验的应用

如果现在有一个一维的线性回归模型$$y = a + bx + \varepsilon$$

已知数据$(x^{(1)}, y^{(1)}), \ldots, (x^{(n)}, y^{(n)})$。

现在想要检验假设$H_0: b = b_0$(一般$b_0 = 0$)

$\hat{b}$的方差为$$SE_{\hat{b}} = \frac{\sqrt{\frac{1}{n - 2}\sum_{i=1}^{n}(y^{(i)} - \hat{y}^{(i)})^2}}{\sqrt{\sum_{i=1}^{n}(x^{(i)} - \overline{x})^2}}$$

零假设下,$$t = \frac{\hat{b} - b_0}{SE_{\hat{b}}} \sim t(n - 2)$$

成对样本t检验

假设有成对样本$(X_1, Y_1), \ldots, (X_n, Y_n)$。需要验证两组样本的平均值是否有显著差异。

我们把该问题化为检验$Z_1 = X_1 - Y_1, \ldots, Z_n = X_n - Y_n$是否均值为0,即化为了单样本t检验:

$$t = \frac{\overline{Z}}{\frac{s_Z}{\sqrt{n}}}$$在零假设下服从$t(n - 1)$。

成对样本t检验适合之前A/B测试的第一个例子,我们把每个用户在第一周的使用时间记作$X_i$,把第二周的使用时间记作$Y_i$,检验$Z_1, \ldots, Z_n$的平均值是否小于0即可。

双样本t检验

假设有两组样本$X_1, \ldots, X_{n_1}; Y_1, \ldots, Y_{n_2}$。需要验证两组样本的平均值是否有显著差异。

若方差相等,使用$$t = \frac{\overline{X} - \overline{Y}}{s\sqrt{\frac{1}{n_1} + \frac{1}{n_2}}}$$其中$$s = \sqrt{\frac{(n_1 - 1)s_X^2 + (n_2 - 1)s_Y^2}{n_1 + n_2 - 2}}$$零假设下,$t \sim t(n_1 + n_2 - 2)$

更一般的t检验,也是最常用的t检验,并不假设两组样本的方差相等。该检验被称为Welch t检验。检验量为

$$t = \frac{\overline{X} - \overline{Y}}{s}$$

其中$$s = \sqrt{\frac{s_X^2}{n_1} + \frac{s_Y^2}{n_2}}$$

零假设下,$t$近似地服从$t$分布,其自由度为$$df = \frac{\left(\frac{s_X^2}{n_1} + \frac{s_Y^2}{n_2}\right)^2}{\frac{(s_X^2/n_1)^2}{n_1-1} + \frac{(s_Y^2/n_2)^2}{n_2-1}}$$

t检验的形式虽然复杂,核心在于理解其用途而不是记忆这些具体的检验方法。

双样本t检验对应之前A/B测试的第二个例子,我们把旧版用户的使用时间记作$X_1, \ldots, X_{n_1}$,把新版用户的使用时间记作$Y_1, \ldots, Y_{n_2}$,检验$X$的平均小于$Y$的平均即可。

Python实现

在Python中,我们通过scipy包很容易可以进行两组数据的t检验。

from scipy import stats
import numpy as np

np.random.seed(10)
X = stats.norm.rvs(loc=5, scale=1, size=500)
Y = stats.norm.rvs(loc=5, scale=2, size=600)

for delta in range(-2, 2):
  t_stats, p_val = stats.ttest_ind(X, Y + delta, equal_var=False)
  print('真实的均值差为%s,p值为%.5f' % (delta, p_val, ))
        
输出:

真实的均值差为-2,p值为0.00000
真实的均值差为-1,p值为0.00000
真实的均值差为0,p值为0.15922
真实的均值差为1,p值为0.00000
	

可以看到,当两组样本分别来自$N(5, 1)$和$N(5, 2)$时,p值大于0.1;若第二组样本的均值与5的差距至少为1,则p值非常小。

   

更多练习题请见假设检验练习题

更多关于假设检验的讨论见本网站论坛的假设检验版面

更多面试问题见面试真题汇总

想要查看更多数据科学相关的内容请关注我们的微信公众号知乎专栏