Как проводил A/B тесты на последнем проекте

«Как проводил A/B тесты на последнем проекте» — вопрос из категории Софт-скиллы, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый пример ответа, который можно адаптировать под свой опыт.

Ответ

На последнем проекте (маркетплейс) я отвечал за A/B-тестирование изменений в интерфейсе и алгоритмах рекомендаций. Мой типичный рабочий процесс выглядел так:

1. Формулировка гипотезы и метрик: Перед запуском четко определял, что мы меняем и какой эффект ожидаем. Например: «Добавление блока „Часто покупают вместе“ на страницу товара увеличит средний чек на 3%». Основной метрикой был средний чек, guard-метрикой — конверсия в покупку.

2. Дизайн и запуск эксперимента:

  • Использовал встроенный инструмент сплитования трафика (вроде Яндекс.Экспериментов или собственный сервис на основе user_id).
  • Делил трафик 50/50, проверял отсутствие SRM (Sample Ratio Mismatch) на первых днях теста.
  • Рассчитывал необходимый размер выборки с помощью power analysis (statsmodels.stats.power) до запуска, чтобы тест не был недоопределен.

3. Анализ результатов: После сбора данных проводил статистическую проверку. Для пропорциональных метрик (CTR) использовал z-тест для долей, для непрерывных (средний чек, время на сайте) — t-тест или U-тест.

# Пример анализа CTR двух версий кнопки
import statsmodels.stats.proportion as proportion
import numpy as np

# Данные: клики и показы
clicks_A, impressions_A = 150, 5000  # Контроль (версия A)
clicks_B, impressions_B = 200, 5000  # Тест (версия B)

# Z-тест для двух пропорций
z_score, p_value = proportion.proportions_ztest(
    count=[clicks_A, clicks_B],
    nobs=[impressions_A, impressions_B],
    alternative='smaller' # Проверяем, что B лучше A
)

ctr_A = clicks_A / impressions_A
ctr_B = clicks_B / impressions_B
print(f"CTR версии A: {ctr_A:.3%}")
print(f"CTR версии B: {ctr_B:.3%}")
print(f"p-value: {p_value:.4f}")

if p_value < 0.05:
    print("Улучшение статистически значимо. Версию B можно rollout'ить.")
else:
    print("Разница незначима. Гипотеза не подтвердилась.")

4. Выводы и rollout: Если тест показывал статистически и практически значимый положительный эффект без вреда для guard-метрик, мы принимали решение о полном внедрении изменения. Все результаты и выводы документировались в Confluence.