AB テストを実行しようとしています - Web サイトのバリアント間の収益を比較します。
私たちの標準的なアプローチ (t 検定を使用) は、収益を二項式でモデル化できないため、うまくいかないように思われました。ただし、ブートストラップについて読んで、次のコードを思いつきました。
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 検定用に 2 つの正規分布量が得られます。を使用scipy.stats.ttest_ind
すると、ある程度妥当に見える結果を得ることができました。
ただし、この手順を実行すると、Cookie の分割にどのような影響があるのだろうと思いました (各グループが Cookie の 50% を確認することを期待していました)。ここで、次のコードを考えると、かなり予想外のことがわかりました。
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 分割から正規分布を繰り返し生成しました (配列内の各数値は異なるサイトを表します)。これらのケースのそれぞれで、2 つの分布に対して t 検定を使用し、t 統計量と p 値を取得しました。
これは合法的な行為ですか?これらのテストを複数回実行しただけです。これを実行しないと、p 値と t 統計量に大きな変動が見られたからです。
この種のテストを実行する明らかな方法がありませんか?
乾杯、
マット
ps
私たちが持っているデータ: ウェブサイト 1: テスト グループ 1: 固有の Cookie: 収益 ウェブサイト 1: テスト グループ 2: 固有の Cookie: 収益 ウェブサイト 2: テスト グループ 1: 固有の Cookie: 収益 ウェブサイト 2: テスト グループ 2: 固有の Cookie: 収益 など
私たちが望むもの:
テスト グループ x はテスト グループ y を z% の確率で上回っています
(検定グループ 1 の帰無仮説 = 検定グループ 2)
ボーナス:
上記と同じですが、サイトごと、および全体的な基準で