Ответ
На последнем проекте (маркетплейс) я отвечал за 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.