Короткий ответ
Выбросы в revenue нужно либо обработать статистически устойчивым методом (например, сравнивать медианы, использовать винзоризацию верхнего процентиля, или применять bootstrap для доверительного интервала среднего), либо явно анализировать отдельно долю конвертировавшихся и величину чека среди купивших, не удаляя крупные заказы без оснований, так как они могут быть реальной частью бизнеса.
Как это работает подробнее
Как это работает: среднее чувствительно к экстремальным значениям: один заказ на несколько порядков больше типичного может определить весь результат сравнения групп, особенно при умеренной выборке, из-за чего обычный t-тест становится ненадёжным (нарушается предположение о скорее симметричном, нетяжёлохвостом распределении).
Ожидаемый результат: 95% bootstrap-ДИ для разницы средних чеков; sanity check — сравнить с результатом при удалении топ-1% значений, чтобы понять, насколько вывод зависит именно от выбросов.
Пример кода
import numpy as np
def bootstrap_diff_ci(a, b, n_boot=10000, seed=42):
rng = np.random.default_rng(seed)
diffs = []
for _ in range(n_boot):
sample_a = rng.choice(a, size=len(a), replace=True)
sample_b = rng.choice(b, size=len(b), replace=True)
diffs.append(sample_b.mean() - sample_a.mean())
return np.percentile(diffs, [2.5, 97.5])
ci = bootstrap_diff_ci(revenue_a, revenue_b)
print(ci)Что использовать на практике
- На практике: применяют bootstrap для построения доверительного интервала разницы средних (устойчив к форме распределения при достаточном числе ресэмплов), либо винзоризацию (ограничение значений метрики сверху определённым процентилем, например 99-м) с явным указанием этого в методологии, либо разбивают анализ на 'конверсия в покупку' и 'средний чек среди купивших' отдельно.
Подводные камни
- Частые ошибки: удаление выбросов без документирования и без проверки, не относятся ли они к одной группе чаще, чем к другой (что само может быть частью эффекта изменения, например, если новая версия привлекает крупных корпоративных клиентов) — бездумное удаление может скрыть реальный и важный эффект.