Новый баннер: не обманись шумом
// Условие
Маркетинг уверен, что новый баннер на главной поднял конверсию в регистрацию: «в тесте уже +0.35 п.п.!». Тест шёл неделю, 8 000 юзеров на группу.
result — dict с ключами conv_a, conv_b, p_value.// Данные
user_id, group (A/B), converted (0/1) — одна строка на юзера// Решение
Подсказка
Механика та же, что в задаче 1: конверсии через groupby, потом z-тест двух долей.
Посмотри на p-value, прежде чем радоваться разнице долей: разница +0.35 п.п. при 8 000 юзерах на группу — внутри обычного шума.
Сначала попробуй сам → Показать решение
df = load_data()
from scipy import stats
s = df.groupby('group')['converted'].agg(['sum', 'count'])
conv_a = s.loc['A', 'sum'] / s.loc['A', 'count']
conv_b = s.loc['B', 'sum'] / s.loc['B', 'count']
p_pool = df['converted'].mean()
se = (p_pool * (1 - p_pool) * (1 / s.loc['A', 'count'] + 1 / s.loc['B', 'count'])) ** 0.5
z = (conv_b - conv_a) / se
p_value = 2 * (1 - stats.norm.cdf(abs(z)))
result = {'conv_a': conv_a, 'conv_b': conv_b, 'p_value': p_value}
print(result)
Маркетинг ждёт твой вердикт. Что скажешь?
p ≈ 0.42 означает: если бы баннер вообще ничего не менял, разница такого размера возникала бы в ~42% тестов. Это не доказательство отсутствия эффекта — но и не повод раскатывать. Корректный ответ продакту: «различие в пределах шума; если эффект и есть, он меньше, чем мы можем надёжно поймать этой выборкой». Перебирать другие метрики в поисках «чего-то значимого» — прямой путь к ложным открытиям (множественные сравнения).