为 Python 中的 A/B 测试随机生成多个测试控制变体
Generating multiple test-control variants randomly for A/B testing in Python
我想用 3 个桶进行 A/B 实验。如果我有 2 个桶,我可以使用 random.sample
方法从所有用户中获取 2 组用户
from random import sample
test = sample(all_users, k=100)
control = set(all_users) - set(test)
由于我需要 3 组用户,下面的代码是否可以确保每个用户都有平等的机会处于任一变体中?
NUM_USERS = int(len(all_users) * 0.33)
variant1 = sample(all_users, NUM_USERS)
variant2 = sample(set(all_users) - set(variant1), NUM_USERS)
variant3 = set(all_users) - variant1 - variant2
我认为会,但因为它是代码,您可以很容易地根据经验对其进行测试。例如,您可以将代码包装到一个函数中并调用它几千次,并确保每个条目以任一变体结束的概率相同。
另一种表达方式是打乱元素然后选择子集。例如,类似于:
from random import shuffle
# shuffle works in-place, making a copy means we don't change the callers version
elems = list(all_users)
shuffle(elems)
# round up to nearest group size
n = (len(elems) + 2) // 3
# assign users to groups
g1, g2, g3 = (
elems[i:i+n]
for i in range(0, len(elems), n)
)
我想用 3 个桶进行 A/B 实验。如果我有 2 个桶,我可以使用 random.sample
from random import sample
test = sample(all_users, k=100)
control = set(all_users) - set(test)
由于我需要 3 组用户,下面的代码是否可以确保每个用户都有平等的机会处于任一变体中?
NUM_USERS = int(len(all_users) * 0.33)
variant1 = sample(all_users, NUM_USERS)
variant2 = sample(set(all_users) - set(variant1), NUM_USERS)
variant3 = set(all_users) - variant1 - variant2
我认为会,但因为它是代码,您可以很容易地根据经验对其进行测试。例如,您可以将代码包装到一个函数中并调用它几千次,并确保每个条目以任一变体结束的概率相同。
另一种表达方式是打乱元素然后选择子集。例如,类似于:
from random import shuffle
# shuffle works in-place, making a copy means we don't change the callers version
elems = list(all_users)
shuffle(elems)
# round up to nearest group size
n = (len(elems) + 2) // 3
# assign users to groups
g1, g2, g3 = (
elems[i:i+n]
for i in range(0, len(elems), n)
)