Модуль 3. Распределения

1. Зачем распределения в A/B: что ломается, если их игнорировать

«Среднее» не всегда отражает продукт

Revenue per user: среднее = 120₽. Но 80% пользователей = 0₽, 15% = 50–200₽, 5% = 500–10 000₽. Среднее описывает «типичного пользователя», которого не существует. Решение на основе разницы средних — решение на основе абстракции.

Число сессий: среднее = 4.2. Но медиана = 2, мода = 1, а один пользователь с 500 сессиями сдвигает среднее всей группы. t-test сравнивает средние — но если среднее нестабильно, p-value тоже нестабилен.

Как распределение влияет на статтест и power

Каждый статтест делает допущения о данных. t-test предполагает, что среднее имеет нормальное распределение (CLT). Это работает при:

Если эти условия нарушены — CLT сходится медленно. p-value «плывёт»: один запуск даёт 0.03, повторный — 0.45. Power analysis обещает 80%, реальная power — 30%.

Вывод: прежде чем выбирать тест — посмотрите на данные. Не на среднее, а на форму.

2. Типовые формы продуктовых данных

Доля (Bernoulli / Binomial)

Каждая единица — 0 или 1. Агрегированная доля — биномиальная.

Примеры: CR (купил / не купил), CTR (кликнул / не кликнул), retention (вернулся / нет).

Свойства: дисперсия = p(1−p)/n. Максимальна при p = 0.5, минимальна при крайних значениях. CLT работает быстро — z-test надёжен уже при n > 1000 (если p не слишком близко к 0 или 1).

Когда ломается: при p < 0.01 или p > 0.99 нормальная аппроксимация плоха. Нужен точный тест Фишера или bootstrap.

Счётчики (Poisson / Negative Binomial)

Число дискретных событий за период. Целые неотрицательные значения.

Примеры: число заказов за неделю, число сессий за день, число кликов по рекомендациям.

Свойства: Poisson: среднее = дисперсия. В реальности дисперсия обычно больше (overdispersion) → Negative Binomial. Правый хвост, асимметрия. Zero inflation частая — большая масса в нуле.

Практическое следствие: t-test на счётчиках формально работает (CLT), но при большой overdispersion среднее нестабильно. При zero inflation стоит разделить метрику: конверсия (0/1) + среднее среди активных.

Время (Exponential / Weibull, heavy right tail)

Время до события: всегда положительное, часто с длинным правым хвостом.

Примеры: время до первой покупки, время загрузки страницы, время доставки, time-to-resolution в support.

Свойства: сильная правая асимметрия. Медиана << среднего. Несколько «застрявших» кейсов (доставка через 2 недели вместо 2 часов) драматически сдвигают среднее.

Практическое следствие: t-test на средних — рискованно. Winsorization (ограничить максимум) или log-трансформация. Bootstrap предпочтительнее.

Деньги (Log-normal / Pareto-like, смесь)

Revenue, GMV, LTV, средний чек. Положительные, с тяжёлым правым хвостом.

Примеры: revenue per user, GMV per user, LTV 90 дней.

Свойства: часто хорошо аппроксимируются log-normal (в логарифме — нормальные). Но хвост может быть ещё тяжелее (Pareto-like): 1% пользователей = 40% выручки. Это не outlier — это структура рынка.

Практическое следствие: среднее определяется хвостом. t-test зависит от нескольких наблюдений. Bootstrap, trimmed mean, winsorization — обязательны. Log-трансформация работает, но меняет интерпретацию (вы тестируете геометрическое среднее, а не арифметическое).

Нулевая инфляция (Zero-inflated)

Большая масса в нуле + непрерывное или дискретное распределение для ненулевых.

Примеры: purchases per user (80% = 0), revenue per user, число рефералов.

Свойства: двухкомпонентная смесь: (1) «нулевой процесс» (пользователь не конвертировался) + (2) «ненулевой процесс» (распределение среди конвертировавших). Среднее близко к нулю, медиана = 0, дисперсия завышена.

Практическое следствие: мощность t-test резко падает. Разделение на CR (proportion) + среднее среди конвертировавших — проще и мощнее. CUPED с pre-period помогает (снижает дисперсию на 30–50%).

Смешанные распределения (Mixtures)

Данные — смесь нескольких подпопуляций.

Примеры: время в приложении (active users vs passive), revenue (freemium vs premium), latency (cache hit vs miss).

Свойства: бимодальные или мультимодальные гистограммы. Среднее не описывает ни одну из подгрупп. Дисперсия завышена.

Практическое следствие: если treatment по-разному влияет на подгруппы — средний эффект маскирует гетерогенность. Стоит стратифицировать анализ или использовать quantile-методы.

3. Диагностика: как понять форму без формул

Симптомы heavy tail

Симптомы zero inflation

Skewness, outliers, long tail

Что смотреть: графическая диагностика

  1. Гистограмма — форма, модальность, масса в нуле
  2. Гистограмма в log-шкале — если после логарифма данные похожи на колокол → log-normal
  3. Q-Q plot — отклонение от прямой в хвостах → heavy tail
  4. Box plot — медиана, IQR, whiskers, outliers

Формулы не нужны. Достаточно посмотреть на гистограмму и ответить на 3 вопроса:

4. Практические последствия для A/B

Почему t-test часто «живёт», но иногда врёт

CLT гарантирует, что среднее стремится к нормальному распределению при N → ∞. На практике:

«t-test живёт» значит: при повторных запусках p-value стабилен. «Врёт» значит: один запуск — p = 0.02, другой — p = 0.6. Если ваша метрика в heavy tail зоне, увеличение выборки помогает, но медленно.

Когда bootstrap предпочтительнее

Bootstrap не «лучше» t-test — он робастнее. При лёгких хвостах t-test точнее и дешевле.

Когда log-трансформация уместна

Риск: log(0) не определён. При zero inflation нужен log(x + 1) (log1p) — но это искажает распределение и ослабляет эффект. Не рекомендуется при >30% нулей.

Когда winsorization / trimming — и какие риски

Winsorization — замена значений выше P99 (или P95) на пороговое. Сохраняет наблюдения, снижает влияние хвоста.

Trimming — удаление крайних значений. Теряем данные, но среднее стабильнее.

Риски: (1) Если treatment влияет на хвост (например, увеличивает число whale users) — winsorization скрывает реальный эффект. (2) Порог (P95 vs P99) — произвольный. Разные пороги дают разные p-value.

Рекомендация: зафиксировать порог до эксперимента. Показывать результат с winsorization и без — как sensitivity check.

Ratio-метрики: отдельная опасность

AOV = GMV / orders. И числитель, и знаменатель — случайные величины. Распределение отношения — не log-normal и не нормальное, даже если каждый компонент по отдельности «нормальный».

Следствие: ни t-test на средних AOV, ни log-трансформация не корректны. Нужен delta-method (линеаризация) или bootstrap отношения.

Подробнее — Модуль 02 (типы метрик) и Модуль 04 (выбор теста).

5. Мостик к выбору теста

Форма данных Риск Рекомендованный подход
Бинарная (0/1) Минимальный при p ∈ [0.01, 0.99] z-test для долей
Счётчики (Poisson-like) Overdispersion, zero inflation t-test (с осторожностью) / bootstrap
Время (right tail) Heavy tail, нестабильное среднее Bootstrap / winsorization
Деньги (log-normal) Heavy tail, extreme outliers Bootstrap / trimmed mean / log1p (если мало нулей)
Zero-inflated Потеря power Разделить на CR + среднее среди ненулевых
Ratio Ковариация числителя/знаменателя Delta-method / bootstrap отношения
Mixture Гетерогенность эффекта Стратификация / quantile-методы

Мостик к следующему модулю

Следующий шаг: используйте симулятор распределений, чтобы увидеть, как форма данных влияет на рекомендацию. Затем — Модуль 04 (Карта выбора статкритерия) для полного decision tree.

Практика

Открыть практику

Симуляторы

Открыть симуляторы