在Python的Revenue上运行AB测试

时间:2014-03-10 14:53:28

标签: python statistics scipy ab-testing abtest

我正在尝试进行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统计量的这么大变化。

我错过了一种明显的方法来进行这种测试吗?

干杯,

马特

P.S

我们拥有的数据: 网站1:测试组1:独特的cookie:收入 网站1:测试组2:独特的cookie:收入 网站2:测试组1:独特的cookie:收入 网站2:测试组2:独特的cookie:收入 e.t.c。

我们想要什么:

测试组x以z%确定性击败测试组y

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

加成:

与上述相同,但在每个站点以及整体基础

1 个答案:

答案 0 :(得分: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更多的收入(可能是符号测试,因为当您包含零时假设正常性存在问题)。我假设这个令人不安的假设是为什么你运行重复子采样的过程,直到你的数据看起来正常,但你不能这样做并测试任何有意义的东西:只是因为你的数据的某些子集是正态分布并不意味着你可以看看只有这一部分!实际上,我不会惊讶地发现,这基本上做的是排除大多数零条目或大多数非零条目。

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