Случайная генерация нескольких вариантов тестового контроля для A / B тестирования в Python

#python #python-3.x #random #sample

#python #python-3.x #Случайный #пример

Вопрос:

Я хочу выполнить эксперимент A / B с 3 сегментами. Если бы у меня было 2 сегмента, я мог бы получить 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
  

Ответ №1:

Я думаю, что это так, но поскольку это код, вы можете довольно легко проверить его эмпирически. Например, вы могли бы обернуть код в функцию и вызвать ее несколько тысяч раз и убедиться, что каждая запись имеет одинаковую вероятность попадания в любой вариант.

Другим способом выражения этого было бы просто перетасовать элементы, а затем выбрать подмножества. Например, что-то вроде:

 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)
)