
4 ошибки в A/B‑тестах, из‑за которых случайный шум выглядит как эффект
badcasedaily1 10 минут назад 4 ошибки в A/B‑тестах, из‑за которых случайный шум выглядит как эффект Средний 8 мин 288 Блог компании OTUS Анализ и проектирование систем * Программирование * Python * Управление продуктом...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Значимый прорыв формирует отрасль ИИ: badcasedaily1 10 минут назад 4 ошибки в A/B‑тестах, из‑за которых случайный шум выглядит как эффект Средний 8 мин 288 Блог компании OTUS Анализ и проектирование систем * Программирование * Python * Управление продуктом * Туториал Привет, Хабр! Про A/B‑тесты написано столько, что кажется, будто там нечего обсуждать. Разбили пользователей на две группы, посчитали метрику, прогнали t‑тест, посмотрели на p‑value.
На практике эта схема ломается регулярно, причём данные при этом абсолютно честные: сплиттер не врёт, метрика посчитана правильно, формула теста взята из учебника. Ломается статистика, а конкретно — оценка дисперсии, из которой растёт и доверительный интервал, и p‑value. Ошибиться в ней можно четырьмя очень популярными способами, и каждый даёт один и тот же результат: вы уверенно катите то, что на самом деле ничего не улучшило.
Технические детали
Метрика — отношение, а вы считаете её по строкамСамая частая история. Метрика — CTR: клики, делённые на показы. Данные лежат в таблице показов, по строке на показ, в каждой флаг клика и id пользователя.
Аналитик берёт колонку кликов и гонит t‑тест. from scipy import stats a = impressions. clicked b = impressions.
ttest_ind(a, b) # p = 0. 011, ура, катимПользователей вы рандомизировали, а тест считаете по показам. У одного пользователя показов может быть три, а может быть триста, и его показы — не независимые наблюдения: человек, который кликает на всё подряд, накликает вам сотню единиц подряд.
Отраслевые последствия
t‑тест же верит, что перед ним n независимых наблюдений. Он берёт огромное n (число показов), делит на корень из него дисперсию — и получает микроскопическую стандартную ошибку. Интервал схлопывается, p‑value падает, и вы видите значимость там, где её нет.
Проверить это можно за минуту симуляцией, где никакого эффекта нет вовсе:import numpy as np from scipy import stats rng = np. default_rng(0) def simulate_aa(n_users=2000): # у каждого пользователя своя склонность кликать — вот она и создаёт зависимость p_user = rng. beta(2, 20, size=n_users) n_imp = rng.
integers(1, 300, size=n_users) group = rng. integers(0, 2, size=n_users) rows = for u in range(n_users): clicks = rng. binomial(1, p_user, size=n_imp) rows.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





