Значимо ≠ важно
// Условие
Огромный тест на главной странице маркетплейса — по 500 000 юзеров на группу. Данные уже агрегированы по группам. Новый блок рекомендаций дал «статистически значимый рост» — так написано в дашборде. Фича стоила два месяца работы команды, и её поддержка — ещё 0.5 инженера постоянно.
result — dict с ключами diff, p_value.// Данные
group, users, conversions — данные уже агрегированы, по строке на группу// Решение
Подсказка
Работать с агрегатами даже проще: conv = conversions / users. Достань строки через df.set_index('group').
z-тест тот же: пулированная доля — это суммарные конверсии, делённые на суммарных юзеров.
Прирост переведи в проценты от базы — сколько это денег при чеке из легенды?
Сначала попробуй сам → Показать решение
df = load_data()
from scipy import stats
t = df.set_index('group')
pa = t.loc['A', 'conversions'] / t.loc['A', 'users']
pb = t.loc['B', 'conversions'] / t.loc['B', 'users']
diff = pb - pa
p_pool = df['conversions'].sum() / df['users'].sum()
se = (p_pool * (1 - p_pool) * (1 / t.loc['A', 'users'] + 1 / t.loc['B', 'users'])) ** 0.5
z = diff / se
p_value = 2 * (1 - stats.norm.cdf(abs(z)))
result = {'diff': diff, 'p_value': p_value}
print(result)
Дашборд говорит «значимо». Что скажешь на демо фичи?
Обе крайности неверны. Эффект настоящий — большая выборка не «рисует» различия, а честно находит маленькие. Но статистическая значимость отвечает только на вопрос «есть ли эффект», а решение принимается по вопросу «окупается ли он»: +0.15 п.п. конверсии против стоимости разработки и вечной поддержки. Уменьшать выборку, чтобы «стало честнее», — это просто ослеплять микроскоп.