Привет! Меня зовут Денис. Уже более 5 лет работаю Senior Product Analyst в крупнейших IT-компаниях России, включая Тинькофф. Разрабатывал системы аналитики с полного нуля, провёл огромное количество A/B тестов и знаю всю внутреннюю кухню больших корпораций изнутри.
Я совершил множество ошибок на своём пути – и теперь здесь, чтобы помочь именно тебе их избежать и пройти этот путь быстрее!
A/B-тесты давно стали стандартным инструментом в продуктовой и маркетинговой аналитике. Но на практике большинство ошибок происходит не на этапе запуска эксперимента, а при анализе результатов. Чаще всего причина в том, что статистический метод выбирается «по привычке», без учёта типа метрики и свойств данных.
В этой статье я собрал практическую логику выбора методов анализа A/B-тестов. Без углубления в теорию, но с пониманием, почему в одном случае работает χ², а в другом t-test может привести к неверным выводам.
С чего начинается анализ A/B-теста
Предположим, у нас есть две рандомно сформированные выборки – контроль и тест. Первый и самый важный шаг – определить метрику, по которой мы будем принимать решение. Именно от типа метрики зависит выбор статистического метода.

На практике почти все продуктовые метрики можно разделить на три группы:
пропорции (качественные метрики),
количественные метрики,
метрики соотношений.
Разберём каждую из них.
Пропорции (качественные метрики)
К этому типу относятся конверсия, CTR, доля пользователей, совершивших целевое действие. Это самый частый кейс в A/B-тестах и одновременно самый простой с точки зрения анализа.
Для таких метрик оптимальным выбором является χ²-тест. Он хорошо подходит для бинарных исходов, устойчив на больших выборках и не требует сложных предположений о распределении данных.
Перед запуском теста важно оценить размер выборки. Для этого нужно задать базовую конверсию, минимальный эффект, уровень значимости и мощность эксперимента. Без этого легко попасть в ситуацию, когда разница не обнаруживается просто потому, что данных недостаточно.
Минимальный пример χ²-теста в Python выглядит так:
import numpy as np
from scipy.stats import chi2_contingency
# successes, failures
control = np.array([50, 950])
test = np.array([60, 940])
chi2, p_value, _, _ = chi2_contingency([control, test])
print(f'p-value: {p_value}')При анализе результатов полезно смотреть не только на p-value, но и на относительное изменение (lift) и доверительный интервал. Один только факт статистической значимости редко даёт понимание бизнес-эффекта.
Количественные метрики
Количественные метрики – это количество заказов, длина сессии, выручка, число действий пользователя и т.д. Основная проблема таких данных – высокая дисперсия, выбросы и асимметричные распределения.
Если у вас есть данные за предтестовый период, имеет смысл использовать CUPED. Этот подход снижает дисперсию метрики за счёт учёта предыдущего поведения пользователей и часто заметно повышает чувствительность эксперимента.
Ключевая идея CUPED сводится к корректировке тестовой метрики:
theta = cov_pre_test / var_pre_test
cuped_metric = test_metric - theta * (pre_test_metric - mean_pre_test)После применения CUPED стоит оценить распределение данных. Если выборка достаточно большая и распределение близко к нормальному, можно использовать t-test. На практике безопаснее сразу выбирать t-критерий Уэлча – он не требует равенства дисперсий между группами.
Пример:
from scipy.stats import ttest_ind
ttest_ind(control_cuped, test_cuped, equal_var=False)Если данных мало или распределение явно не нормальное, разумной альтернативой становится bootstrap. Этот метод не опирается на предположения о распределении и позволяет напрямую получить доверительный интервал для эффекта.
Упрощённый пример bootstrap-оценки разницы средних:
import numpy as np
boot_diffs = []
for _ in range(1000):
boot_control = np.random.choice(control, size=len(control), replace=True)
boot_test = np.random.choice(test, size=len(test), replace=True)
boot_diffs.append(boot_test.mean() - boot_control.mean())Дальше по распределению boot_diffs можно построить доверительный интервал и проверить, содержит ли он ноль.
Метрики соотношений
Метрики соотношений – один из самых частых источников ошибок в A/B-тестах. Примеры: ARPU, количество действий на пользователя, число открытий карточек на покупку.
Основная проблема здесь в том, что числитель и знаменатель зависимы. Стандартный t-test предполагает независимость наблюдений, из-за чего дисперсия оценивается неправильно, а выводы могут быть смещены.
При больших выборках для таких метрик хорошо подходит дельта-метод. Он позволяет аппроксимировать дисперсию сложной функции от случайных величин и получить корректное p-value.
Упрощённый пример проверки с помощью дельта-метода:
import numpy as np
from scipy.stats import norm
mean_diff = mean_test - mean_control
var = var_test / n_test + var_control / n_control
z = mean_diff / np.sqrt(var)
p_value = 2 * (1 - norm.cdf(abs(z)))Если выборка небольшая, лучше использовать блочный bootstrap. В отличие от обычного bootstrap, здесь данные пересобираются блоками, что позволяет сохранить структуру зависимости. После этого эффект можно оценивать через доверительный интервал или t-статистику, рассчитанную на основе bootstrap-оценки стандартной ошибки.
Как выбирать метод на практике
Если сильно упростить логику выбора, она будет такой:
для пропорций – χ²-тест;
для количественных метрик – CUPED + t-test (или bootstrap при малых выборках);
для метрик соотношений – дельта-метод при больших выборках и блочный bootstrap при малых.

Выводы
Корректный анализ A/B-теста – это не только проверка p-value. Это последовательность решений: выбор правильной метрики, понимание её статистической природы, оценка размера выборки и дисперсии данных, а затем – осознанный выбор метода анализа.
Использование «привычного» теста без учёта особенностей данных часто приводит к статистически значимым, но неверным бизнес-выводам. И именно на этом этапе A/B-тесты чаще всего дают ложное чувство уверенности.
Чтобы узнать больше о продуктовой аналитике — подписывайтесь на мой Telegram канал. Если статья была полезна — добавляйте в избранное. До скорого!
