Skip to content
PПромтбук
RUEN
05Эксперименты

Дизайн holdout-группы для long-term эффектов

10-20% юзеров без новых фич минимум 4 недели — измеряй накопленный эффект, а не недельный bump.

Спроектируй holdout для измерения накопленного эффекта {{feature_set}}.

Primary metric: {{main_metric}}

Зачем holdout, если есть A/B

A/B-тест отвечает «работает ли фича X?». Holdout отвечает «работает ли всё что мы делаем в сумме?». Накопленный эффект 20 мелких изменений за квартал не виден в A/B по каждой — половина показывает p > 0.05.

Holdout — это зеркало для всего продукта.

1. Размер

Размер holdoutКогда
5%Очень крупный продукт (>1M активных), нужна минимальная потеря $
10-20%Стандарт — баланс мощности и стоимости
50%На раннем этапе или когда новинки рискованные

Меньше 5% — недостаточно мощности на retention-метриках. Больше 20% — теряешь слишком много пользовательского опыта.

Формула проверки мощности:

n_per_group ≥ 16 × σ² / (μ × MDE)²

Для retention 40% и MDE 5% относительных (= 2pp абс):
n ≈ 16 × 0.24 / (0.4 × 0.05)² ≈ 9,600 per group

При 200k активных в месяц — 10% holdout = 20k. Достаточно.

2. Длительность

МетрикаМинимум
Engagement (DAU, session length)2-4 недели
Retention (W4, M1)8-12 недель
Revenue / LTV1-2 квартала
Churn (annual subs)минимум 1 цикл подписки

Правило: держи holdout минимум 2× цикла твоей метрики. Если меряешь monthly retention — минимум 8 недель.

3. Что МОЖНО на holdout не давать

  • Новые второстепенные фичи
  • Изменения UI / редизайн копий
  • Новые алгоритмы рекомендаций
  • A/B-тесты в активной разработке
  • Notification кампании / lifecycle email обновления

4. Что НЕЛЬЗЯ держать на холде

КатегорияПочему
Критические security / privacy фиксыЭтический и юридический вопрос
Bug fixes ломающие функциональностьНе «эксперимент» — это сломанный продукт
Compliance (GDPR, accessibility)Юридические требования
Изменения ценНесправедливо, скорее юр риск
Сервис-уровневые улучшения (uptime, latency)Holdout — про продукт, не про инфру

Перепроверь свой список: если в holdout попадает > 30% всех релизов — твой holdout слишком жёсткий, размой границы.

5. Дизайн рандомизации

  • Уровень: user_id (не session) — иначе один и тот же юзер попадёт в обе ветки
  • Hashing: hash(user_id + holdout_salt) mod 100 < 10 — детерминистично
  • Стабильность: юзер остаётся в группе на весь срок holdout — не пересоберай каждую неделю
  • Сегменты: проверь, что holdout сбалансирован по плану / стране / device

6. Анализ — что считать

Primary

Разница в {{main_metric}} между treatment (получили всё) и holdout (не получили нового).

Effect = (treatment_metric - holdout_metric) / holdout_metric

Пример: M1 retention treatment = 42%, holdout = 38%
Effect = +10.5% relative, +4pp absolute

Secondary (для разбора)

  • Per-feature attribution — сравни «holdout vs treatment без фичи X» (требует sub-holdouts)
  • Time decay — эффект растёт или плато?
  • Сегментный effect — где работает больше

7. Каденс

  • Запуск — раз в квартал / полугодие
  • Промежуточный read — на 4 неделе, только мониторинг (не решения)
  • Финальный read — в конце окна
  • После — выпустить holdout, измерить «catch-up effect»

Что НЕ делать

❌ Менять размер holdout посреди эксперимента — нарушает рандомизацию ❌ Решать по 1-недельному окну — недостаточно для retention ❌ Использовать holdout как контроль для отдельного A/B — двойной учёт ❌ Держать одного юзера в нескольких holdout одновременно — caovariance не контролируется ❌ Игнорировать guard rails — holdout может «случайно» снизить metric (degradation) ❌ Peeking каждый день — multiple comparison inflation ❌ Делать holdout только для растущих фич — выберешь bias positive

На выходе

  • Размер и длительность с обоснованием мощности
  • Список «в holdout» и «не в holdout» (с обоснованием)
  • Метод рандомизации (hash + salt)
  • Primary / secondary metrics
  • Каденс read'ов с заранее определёнными правилами
  • Шаблон финального отчёта (включая cumulative + per-feature attribution)
К подразделу «Эксперименты»
Похожие промты