在Python中进行收入的AB测试

0 投票
1 回答
1815 浏览
提问于 2025-04-17 21:38

我正在进行一个AB测试,目的是比较不同网站版本的收入。

我们通常的方法是使用t检验,但我觉得这不太适用,因为收入不能用二项分布来建模。不过,我读到了关于自助法(bootstrapping)的内容,于是写了以下代码:

import numpy as np
import scipy.stats as stats
import random

def resampler(original_array, number_of_samples):
    sample_array = np.zeros(number_of_samples)
    choice = random.choice
    for i in range(number_of_samples):
        sample_array[i] = sum([choice(original_array) for _ in range(len(original_array))])

    y = stats.normaltest(sample_array)
    if y[1] > 0.001:
        print y
        new_y = resampler(original_array, number_of_samples * 2)
        y = new_y
    return sample_array

简单来说,就是从“收入向量”中随机抽样(这个向量里大部分是零,只有那些有转化的访客才有收入),然后把这些结果相加,直到得到一个正态分布。

我可以对两个测试组都进行这个操作,这样就得到了两个符合正态分布的数量,可以用来进行t检验。通过使用scipy.stats.ttest_ind,我得到了看起来还不错的结果。

不过,我想知道在cookie分配上运行这个程序会有什么效果(我预期每组能看到50%的cookie)。在这里,我得到了一个相当意外的结果——根据以下代码:

x = [272898,389076,61091,65251,10060,1468815,216014,25863,42421,476379,73761]
y = [274253,387941,61333,65020,10056,1466908,214679,25682,42873,474692,73837]
print stats.ttest_ind(x,y)

我得到的输出是:(0.0021911476165975929, 0.99827342714956546)

这个结果一点也不显著(我觉得我理解得没错吧?)

但是,当我运行这段代码:

for i in range(1000, 100000, 5000):
    one_array = resampler(x,i)
    two_array = resampler(y,i)
    t_value, p_value = stats.ttest_ind(one_array, two_array)
    t_value_array.append(t_value)
    p_value_array.append(p_value)

print np.mean(t_value_array)
print np.mean(p_value_array)

我得到的是:

0.642213492773 0.490587258892

我不太确定该如何解读这些数字——据我所知,我是从实际的cookie分配中反复生成正态分布(数组中的每个数字代表一个不同的网站)。在这些情况下,我对两个分布进行了t检验,并得到了t统计量和p值。

这样做算不算合理?我之所以多次运行这些测试,是因为在不这样做的情况下,p值和t统计量的变化太大了。

我是不是漏掉了什么明显的测试方法?

谢谢,

马特

附言:

我们拥有的数据:

网站1:测试组1:唯一cookie:收入

网站1:测试组2:唯一cookie:收入

网站2:测试组1:唯一cookie:收入

网站2:测试组2:唯一cookie:收入

等等。

我们想要的结果:

测试组x以z%的把握击败测试组y

(零假设是测试组1 = 测试组2)

附加要求:

以上结果在每个网站和整体的基础上都要有。

1 个回答

1

首先,用t检验来测试二项响应变量是不对的。你需要用逻辑回归模型。

接下来谈谈你的问题。看你的代码很难理解你想测试什么——你的零假设(H_0)是什么?老实说(希望你不要介意),你的思路看起来有点混乱。

我得猜一下你的数据长什么样——你有一堆样本像这样:

Website   Method     Revenue
-------   ------     -------
w1        A          12
w2        B          0
w3        A          6
w4        B          0

等等。这看起来对吗?你有重复测量吗(也就是说,你是否为每个网站的每种方法都有收入测量?还是说你是随机把网站分配给方法的)?我猜你传给方法的是某种方法的所有收入的数组,但这些数据在不同方法之间有配对吗?

我能想象用这些数据测试各种假设。例如,方法A产生非零收入的可能性是否比方法B更高(用逻辑回归,响应是二元的)?在所有产生收入的案例中,方法A的收入是否比方法B多(对非零收入进行t检验)?在所有情况下,方法A的收入是否总是比方法B多(可能需要用符号检验,因为在包含零的时候,正态性假设可能有问题)。我猜这就是你为什么要反复抽样,直到数据看起来是正态分布的,但你不能这样做并测试任何有意义的东西:仅仅因为你数据的某个子集是正态分布的,并不意味着你可以只看这一部分!实际上,我不会惊讶地发现,这样做基本上是排除了大部分的零条目或大部分的非零条目。

如果你能详细说明一些实际数据的样子,以及你想回答的问题,我很乐意提供更具体的建议。

撰写回答