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

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, потребуется создать два отдельных холдаута, чтобы оценить совокупное влияние каждого типа эксперимента.