在Python中进行收入的AB测试
我正在进行一个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 个回答
首先,用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多(可能需要用符号检验,因为在包含零的时候,正态性假设可能有问题)。我猜这就是你为什么要反复抽样,直到数据看起来是正态分布的,但你不能这样做并测试任何有意义的东西:仅仅因为你数据的某个子集是正态分布的,并不意味着你可以只看这一部分!实际上,我不会惊讶地发现,这样做基本上是排除了大部分的零条目或大部分的非零条目。
如果你能详细说明一些实际数据的样子,以及你想回答的问题,我很乐意提供更具体的建议。