我将如何对 A/B 实验的这些简单结果进行卡方检验?

数据挖掘 scikit-学习 测试
2022-02-04 17:06:12

我有一个 A/B 实验的结果,用户可以做以下三件事之一:观看、互动或什么都不做

我的数据是这样的:

   Watch  | Nothing | Interact
A: 327445 | 271602  | 744702
B: 376455 | 140737  | 818204  

我尝试使用与 scipy 捆绑的卡方测试。我对数据科学完全陌生,但我相信这是我想要的评估指标。

scipy.stats.chisquare([ [327445, 271602, 744702], [376455, 140737, 818204] ])
Power_divergenceResult(statistic=array([  3412.38826538,  41532.93339946,   3456.72996585]), pvalue=array([ 0.,  0.,  0.]))

这看起来不像是一个有效的结果......

我什至尝试添加一个expected frequencies选项,但没有成功。也许我错过了一些东西,无论是关于评估这种类型的数据还是只是没有正确使用 scipy。谁能帮我?

1个回答

如果您要回答的是用户采取的行动(观看、互动、什么都没有)是否受到他们所在的组(A 或 B)的影响,您可以使用 chi2 独立性测试。

为此,您可以使用 scipy.stats.chi2_contingency 函数:

a = [327445, 271602, 744702]
b = [376455, 140737, 818204]

chi2, pvalue, _, _ = scipy.stats.chi2_contingency([a, b])

在这种情况下,它返回 48376.48 的 chi2 检验统计量和 0.0 的 p 值,因此拒绝原假设(“动作独立于组”)。

您还可以使用 scipy.stats.chisquare 函数来获得相同的结果,但除了使用 chi2_contingency 函数之外,您还必须自己计算“预期频率”。您记录的数据是您观察到的频率:

obs = np.array([a, b]).astype(float)

(请注意,我将数字转换为浮点数,因为卡方函数会遇到一些奇怪的整数溢出,否则......!?)

预期频率计算如下:

exp = np.outer(obs.sum(axis=1), obs.sum(axis=0)) / obs.sum()

最后,调用

chi2, pvalue = scipy.stats.chisquare(obs.ravel(), exp.ravel(), ddof=sum(obs.shape)-2)

返回与以前相同的 chi2 检验统计量和 p 值。