Перейти к основному содержимому

Holdouts (Холдауты)

О возможностях​

Определение​

Holdout (холдаут) – это псевдо-эксперимент, раскатанный на небольшом траффике, на который не действуют никакие эксперименты, кроме него самого. В холдауте не подразумевается делать какие-либо изменения. Можно воспринимать холдаут как одну большую контрольную группу для всех привязанных экспериментов.

Механизм работы схож с концепцией слоёв (layers), но имеет следующую иерархию: Холдаут → Слой → Эксперимент.

Основное преимущество холдаутов перед слоями заключается в возможности оценки чистого эффекта от всех A/B-тестов на метрике. Это достигается за счёт того, что часть пользователей попадает в холдаут-группу (контрольную), а часть — в экспериментальные группы. Таким образом, пользователи из холдаут группы и экспериментальных групп никак не пересекаются.

Мотивация и use-cases​

В качестве примера применения холдаутов можно привести следующие кейсы:

  1. Квартальное/годовое оценивание вклада A/B-тестов в общую экономику
  2. Возможность оценивания аддитивного и мультипликативного эффекта (т.е. индивидуальных и “грязных” эффектов от множества экспериментов) по какой-либо фиче на сайте или в приложении

Иерархия распределения траффика​

Схема​

На схеме показано как определяется пользователь в эксперимент и холдаут. На ней можно заметить, что холдаут имеет приоритет выше над слоями и настройками эксперимента.

К примеру, если пользователь был записан в “Принудительный список холдаута”, то дальнейшие правила в цепочке игнорируются.

Как использовать Holdout'ы​

Создание Holdout'а в интерфейсе Sigma​

  1. Перейдите в раздел Холдауты и нажать Создать
  2. Определить необходимые настройки (Тип идентификатора, Платформа и т.п.)
  3. Выбрать эксперименты, которые будут взаимодействовать с холдаутом во вкладке “Включенные эксперименты”
  4. Запустить холдаут

Технические детали и ограничения​

  • Группы: нельзя создавать. Всегда только одна группа
  • Аллокация: Можно выбрать любое значение от 0% до 100%
  • Тип единицы рандомизации (тип идентификатора): аналогичный другим экспериментам (profileid, userid, deviceid). Нельзя использовать разные типы идентификаторов у экспериментов и холдаута. Типы идентификаторов всегда должны быть одинаковыми.
  • Платформа: Нельзя определять эксперименты в холдаут, если у них выбраны разные платформы. Исключением является тип ALL (Все платформы).
  • Подключение к слоям: Слои не поддерживаются в холдауте
  • Фича-флаги: Фича-флаги пока не поддерживаются. Только в эксперименте.
  • Целевые аудитории: Поддерживаются аналогично другим экспериментам
  • Запуск и остановка: Аналогично другим экспериментам. При остановке холдаута с активными экспериментами показывается предупреждение, действие не блокируется.
  • Принудительные списки: Если пользователь включен в эксперименты и в холдаут, приоритет будет у холдаута.

Совмещение экспериментов и холдаутов: анализ на примере данных из Sigma​

Запуская эксперименты и холдауты в Sigma, вы получаете удобную отправную точку для анализа данных и оценки влияния изменений. Рассмотрим типичный пример:

Допустим, у вас запущено:

  • 2 эксперимента, привязанных к одному холдауту (например, exp_1 и exp_2);
  • 1 эксперимент, который не привязан к холдауту (exp_3).

Итого: 3 эксперимента и 1 холдаут.

Исходные данные: структура таблицы​

В Sigma таблица с пользователями может выглядеть так (если вы использовали метода sigma.getAllUserExperiments()):

userIdexperiments
1exp_1.0|exp_2.0|exp_3.1
2exp_1.1|exp_2.0|exp_3.0
3holdout_1|exp_3.1
4exp_1.1|exp_2.1
5holdout_1

Каждое значение exp_X.Y означает, что пользователь участвует в эксперименте X и находится в группе Y, где 0 — контрольная группа, 1 — тестовая.

Преобразование таблицы для анализа​

Для удобства анализа данные можно распарсить в табличный вид:

userIdexp_1exp_2exp_3holdout_1
1001FALSE
2100FALSE
3nullnull1TRUE
411nullFALSE
5nullnullnullTRUE

Интерпретация и подход к анализу​

  • Пользователи с userId = 3 и 5 находятся в холдауте, не участвуя в экспериментах exp_1 и exp_2. Это значит, что они не подвергались влиянию новых фичей, и их можно использовать как базовую (контрольную) группу.
  • Таким образом, exp_1 и exp_2 можно анализировать не только по внутреннему контролю (группы 0 и 1), но и по сравнению с холдаут-группой holdout_1 — для оценки совокупного эффекта.
  • Эксперимент exp_3 не привязан к холдауту, поэтому его анализ следует проводить отдельно, сравнивая только группы 0 и 1 внутри этого эксперимента.

  • При сравнении с холдаутом проверяйте, действительно ли пользователи не попадали под влияние других экспериментов (например, по таймингам или сегментации).
  • Помните, что холдаут-группа — это не просто контроль, а срез пользователей, полностью исключённых из любой экспериментальной активности, что делает её особенно ценной для оценки совокупных изменений.
  • Всегда приводите данные к подобному табличному виду, чтобы упростить фильтрацию, агрегации и визуализацию. Ниже представлены примеры SQL запросов для двух популярных БД

BigQuery​

WITH exploded AS (
SELECT
userId,
SPLIT(experiments, '|') AS experiment_list
FROM experiment_users
),
flattened AS (
SELECT
userId,
exp_item,
REGEXP_EXTRACT(exp_item, r'^(.*?)\.([01])$') AS exp_name,
SAFE_CAST(REGEXP_EXTRACT(exp_item, r'^(?:.*)\.([01])$') AS INT64) AS exp_group,
-- Условие для холдаута
IF(CONTAINS_SUBSTR(exp_item, 'holdout'), exp_item, NULL) AS holdout_flag
FROM exploded, UNNEST(experiment_list) AS exp_item
)
SELECT * FROM flattened

ClickHouse​

WITH parsed AS (
SELECT
userId,
arrayJoin(splitByChar('|', experiments)) AS exp_item
FROM experiment_users
),
flattened AS (
SELECT
userId,
exp_item,
extract(exp_item, '^([a-zA-Z0-9_]+)\\.([01])$') AS exp_name,
toIntOrNull(extract(exp_item, '^[a-zA-Z0-9_]+\\.([01])$')) AS exp_group,
position(exp_item, 'holdout') > 0 AS is_holdout
FROM parsed
)
SELECT *
FROM flattened

Лучшие практики​

Траффик (Allocation)​

Мы рекомендуем использовать небольшой процент выборки для холдаута. Например, 1–5% будет достаточно для продукта с MAU 1-3 млн.

Длительность​

В случае с длительностью, то лучше удерживать пользователей в холдаут-группе в течение трёх-шести месяцев (1-2 квартала), после чего выпускать для них новые фичи. Продление этого периода может “утяжелить” разработку, поскольку вам придётся дольше поддерживать несколько версий фичи/продукта.

Анализ и оценка метрик с использованием холдаутов​

Холдауты можно использовать не только для оценки отдельных фичей, но и для измерения совокупного эффекта от деятельности продуктовой команды или нескольких команд одновременно.

Пример: оценка вклада нескольких команд​

Представим, что у вас есть четыре команды, работающие над разными этапами пользовательского пути:

  • Acquisition — привлечение пользователей
  • Onboarding — первые шаги в продукте
  • Sales — монетизация и покупки
  • Retention — удержание пользователей

Каждая команда запускает свои эксперименты, которые минимально пересекаются по аудитории и затрагивают разные аспекты пользовательского опыта. Чтобы понять общий эффект от всех улучшений, вы можете использовать структурированные холдауты.

Как это работает:​

  1. Выделите холдаут-группу — скажем, 2% пользователей, которые не получают никаких изменений (никаких фичей, протестированных в рамках экспериментов этих 4 команд).
  2. Разрешите остальной аудитории участвовать в экспериментах, разделив их по командам, либо запуская эксперименты параллельно, если они не конфликтуют.
  3. По завершении отчетного периода (например, квартала), сравните ключевые метрики между:
    • пользователями из основной группы (которые видели все фичи и улучшения),
    • пользователями из холдаут-группы.

Такой подход позволяет:

  • Измерить кумулятивный эффект от всех продуктовых изменений вместе;
  • Изолировать фоновые эффекты — например, сезонность или внешние события, так как и холдаут, и основная группа подвергаются им одинаково;
  • Учесть конфликты между фичами (когда одна фича пессимизирует, а другая, наоборот, улучшает опыт пользователя). Вы сможете объективно оценивать вклад продуктовых инициатив без необходимости отдельно моделировать сложные взаимодействия между фичами

Типы Unit ID (Тип идентификатора)​

По умолчанию, холдауты основаны на userId. Чтобы использовать другой тип идентификатора (profileId или deviceId), выберите его из выпадающего списка при создании холдаута. Обратите внимание, что холдауты могут применяться только к экспериментам, использующим один и тот же тип идентификатора.
Если команда планирует запускать эксперименты как по userId, так и по profileId, потребуется создать два отдельных холдаута, чтобы оценить совокупное влияние каждого типа эксперимента.