new-lvl.pro · Статьи · A/B тесты
Статья middle+ // 16 мин чтения

A/B тесты на
маркетплейсе:
когда всё идёт не так

Network effects, каннибализация, нарушение SUTVA — почему стандартный A/B тест врёт на двусторонних рынках и как это исправить.

Почему маркетплейс — это не обычный продукт

Когда вы тестируете кнопку на лендинге или цвет CTA — пользователи в контрольной и тестовой группах не влияют друг на друга. Видел синюю кнопку, не видел — независимые события. Классический A/B тест работает идеально.

Маркетплейс — другой зверь. Это двусторонний рынок: покупатели и продавцы существуют вместе, их поведение переплетено. Когда вы что-то меняете для одной группы пользователей, это рябью расходится на всех остальных — включая тех, кого вы не трогали.

// Структура двустороннего рынка
Спрос
Покупатели
Авито, Ozon, Яндекс Маркет:
пользователи, которые ищут товары
Платформа
←→
Предложение
Продавцы
Селлеры, которые размещают объявления и управляют ценами

Ключевое свойство двустороннего рынка — сетевые эффекты. Больше покупателей → продавцам выгоднее размещаться → больше предложений → покупателям лучше → ещё больше покупателей. Цикл замкнут.

Этот цикл делает A/B тест на маркетплейсе потенциально некорректным. Проверим через конкретный пример.

Пример: тест нового ранжирования Проблема
Эксперимент: 50% покупателей видят новый алгоритм ранжирования (тест), 50% — старый (контроль).

Что происходит: пользователи теста видят более релевантные результаты → чаще кликают и покупают → продавцы замечают рост продаж → увеличивают ставки в аукционе и пополняют запасы.

Проблема: продавцы не знают, что это эффект теста. Они реагируют на общий рост, который меняет инвентарь для всех — включая контрольную группу. Контрольная группа получает «заражённый» опыт, её метрики растут без какого-либо воздействия. Эффект алгоритма занижается.

SUTVA: что это и почему важно

SUTVA — Stable Unit Treatment Value Assumption. Это фундаментальное допущение классической экспериментальной статистики. Звучит страшно, но смысл простой:

// SUTVA формально
Эффект воздействия на юнит i зависит только от того, какое воздействие получил юнит i, и не зависит от того, какое воздействие получили другие юниты.

Переводя на русский: пользователь A не должен влиять на пользователя B только потому, что они оба участвуют в эксперименте. Если это условие нарушено — оценка эффекта смещена, p-value неверен, вывод может быть ложным в обе стороны.

SUTVA выполнено
Стандартный продукт
Пользователь А видит новую кнопку. Пользователь Б видит старую. Их поведение независимо — один не знает о другом и не влияет на его опыт.
SUTVA нарушено
Маркетплейс
Пользователь А (тест) покупает активнее → продавец повышает ставку → топ выдачи меняется для пользователя Б (контроль). Б «заражён» воздействием на А.

Почему нарушение SUTVA так опасно

Когда SUTVA нарушено, оценка treatment effect смещается. Причём направление смещения непредсказуемо:

Занижение эффекта
Spillover в контроль
Тест «заражает» контроль: контрольная группа тоже улучшается. Разница между группами меньше реальной. Хорошая фича выглядит слабой или нейтральной.
Завышение эффекта
Каннибализация контроля
Тест «забирает» у контроля: покупки перетекают из контроля в тест. Контроль ухудшается. Нейтральная или плохая фича выглядит сильной.

Три вида помех на маркетплейсе

1. Сетевые эффекты через инвентарь

Самый распространённый тип. Продавцы не разделены между группами теста — один продавец может показываться как тестовым, так и контрольным пользователям. Его поведение (цены, ставки, запасы) меняется в ответ на агрегированный спрос.

Механика: инвентарный spillover SUTVA нарушено
Тест: новый алгоритм цены доставки для 50% покупателей.
Эффект: тестовые пользователи покупают чаще → продавец X видит +30% заказов → повышает цену на товар (думает, что спрос вырос).
Проблема: контрольные пользователи тоже видят новую цену продавца X. Их покупательская активность меняется — без какого-либо воздействия с нашей стороны.

2. Каннибализация (marketplace cannibalization)

Маркетплейс — рынок с ограниченным инвентарём. Хороший товар по хорошей цене существует в одном экземпляре. Если тестовый пользователь купил его первым — контрольному пользователю он уже недоступен.

// Пример каннибализации
Тест: новая карточка товара с лучшим UX показывается 50% пользователей. Тестовые пользователи быстрее находят и покупают топовые позиции. Контрольные приходят позже — топ уже раскуплен. Их conversion rate падает не потому что им что-то ухудшили, а потому что тест «съел» лучший инвентарь. Эффект фичи будет сильно завышен.

3. Эффекты ценообразования и аукциона

На маркетплейсах с аукционным ценообразованием (рекламные позиции, buy box) воздействие на часть пользователей меняет аукционный баланс для всех. Продавцы оптимизируют ставки на основе общей статистики, не зная о тесте.

Механика: аукционный spillover SUTVA нарушено
Тест: новый формат рекламного блока для 30% покупателей.
CTR рекламы в тесте растёт → продавцы видят общий рост CTR → повышают ставки → стоимость клика растёт для всех рекламодателей → меняется состав рекламной выдачи для контрольных пользователей.

Все три механизма роднит одно: точка связи между группами — продавец или инвентарь. Именно поэтому рандомизация по пользователям-покупателям не изолирует группы в достаточной мере.

Методы решения: от простого к сложному

Хорошая новость: проблема известна, и у неё есть несколько рабочих решений. Выбор зависит от типа помехи, масштаба теста и возможностей инфраструктуры.

Switchback-тест (временнáя рандомизация)
Средняя сложность
// Когда: сетевые эффекты через платформу, одна «настройка» на всех
Вместо того чтобы делить пользователей на группы, делите время. Чётные часы — control, нечётные — treatment (или чередуете дни, недели). В каждый момент все пользователи находятся в одной группе, поэтому нет перекрёстного загрязнения.

Применяется, когда воздействие — это глобальная настройка (алгоритм ранжирования, аукционные параметры), которую нельзя применить только к части пользователей без последствий для остальных.
Плюсы
  • Нет spillover по определению
  • Не нужна сложная инфраструктура
  • Работает для любой глобальной фичи
Минусы
  • Сезонность и дни недели — конфаундеры
  • Нужно много периодов для мощности
  • Carry-over эффекты (привычки пользователей)
Geo-split (географическая рандомизация)
Средняя сложность
// Когда: локальные рынки, локальный инвентарь (доставка, объявления в городах)
Разделить рынок по географии: одни регионы получают treatment, другие — control. Продавцы и покупатели внутри региона взаимодействуют в основном друг с другом, поэтому spillover между регионами минимален.

Хорошо работает для маркетплейсов с локальным инвентарём (Авито с объявлениями «в Москве»). Плохо работает для e-commerce с централизованным складом (Ozon) — там инвентарь общий.
Плюсы
  • Естественная изоляция рынков
  • Легко интерпретировать
  • Подходит для крупных изменений
Минусы
  • Регионы неоднородны (Москва ≠ Тверь)
  • Нужна поправка на региональные эффекты
  • Мало «юнитов» — низкая статмощность
Кластерная рандомизация по продавцам
Сложно
// Когда: воздействие на продавцов, spillover идёт через продавцов
Если корень проблемы — продавцы, рандомизировать нужно по ним. Одни продавцы попадают в тест (например, видят новый кабинет аналитики), другие — в контроль. Покупатели не разделяются — они случайно видят тех и других продавцов.

Единица рандомизации — продавец (кластер), а не пользователь. Это меняет расчёт статистической мощности: нужно считать дисперсию между кластерами, а не между пользователями.
Плюсы
  • Устраняет spillover через продавцов
  • Корректная модель для seller-side фич
Минусы
  • Нужен intraclass correlation (ICC)
  • Требует больших выборок
  • Покупатели всё равно «перетекают»
Holdout + долгосрочный замер
Проще
// Когда: нужно оценить долгосрочный рыночный эффект
Небольшой постоянный holdout (5–10% пользователей), которые никогда не получают новые фичи. Остальные 90–95% — treatment. Spillover в holdout минимален из-за малого размера и «разбавления» в общем рынке.

Позволяет оценить market-level equilibrium effect — что происходит с рынком, когда фича полностью раскатана. Именно это число нужно для бизнес-решений, а не краткосрочный A/B δ.
Плюсы
  • Отражает реальный эффект на рынке
  • Прост в реализации
  • Можно держать постоянно
Минусы
  • Holdout «обделён» фичами — этично?
  • Долго до результата
  • Не изолирует конкретную фичу

Как выбрать метод и что считать

Диагностика: есть ли у вас проблема?

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

Вопросы для диагностики spillover
1
Воздействие касается только UI покупателя? Цвет кнопки, порядок фото, текст описания — скорее всего, spillover минимален. Алгоритм ранжирования, ценообразование — spillover почти гарантирован.
2
Меняется ли поведение продавцов в ответ на эксперимент? Если да — инвентарный spillover присутствует. Проверьте: изменились ли ставки, цены или активность продавцов в период теста?
3
Есть ли дефицитный инвентарь? Если топ-товары продаются в ограниченном количестве — каннибализация возможна. Если запасы практически бесконечны — риск ниже.
4
Какова доля теста? При 1–5% пользователей в тесте spillover мал и им можно пренебречь. При 50/50 — обязателен учёт.

Как выбрать метод рандомизации

Тип фичи Основной риск Рекомендуемый метод
UI покупателя (кнопка, карточка) Минимальный Стандартный A/B по user_id
Алгоритм ранжирования Инвентарный spillover Switchback или geo-split
Ценообразование / аукцион Аукционный spillover Switchback (временной)
Фича для продавцов (кабинет, аналитика) Seller-side spillover Кластерная рандомизация по seller_id
Локальная доставка / логистика Локальный spillover Geo-split по регионам
Глобальное изменение политики Системный Holdout + долгосрочный замер

Расчёт мощности при кластерной рандомизации

Когда единица рандомизации — кластер (регион, продавец), стандартная формула размера выборки не работает. Нужно учесть intraclass correlation coefficient (ICC) — насколько сильно юниты внутри кластера похожи друг на друга.

Design Effect и ICC — расчёт в SQL PostgreSQL
-- ICC и Design Effect для кластерной рандомизации
-- Пример: кластеры = регионы, юниты = пользователи
WITH cluster_stats AS (
  SELECT
    city                         AS cluster_id,
    COUNT(*)                       AS n_users,
    AVG(conversion)               AS cluster_mean,
    VAR_POP(conversion)           AS within_var
  FROM user_experiment_data
  GROUP BY city
),
grand AS (
  SELECT
    AVG(cluster_mean)             AS grand_mean,
    VAR_POP(cluster_mean)         AS between_var,  -- дисперсия между кластерами
    AVG(within_var)               AS avg_within_var,
    AVG(n_users)                   AS avg_cluster_size
  FROM cluster_stats
)
SELECT
  grand_mean,
  between_var,
  avg_within_var,
  -- ICC = между_дисперсия / (между_дисперсия + внутри_дисперсия)
  ROUND(between_var / (between_var + avg_within_var), 4)
    AS icc,
  -- Design Effect = 1 + (m - 1) * ICC, где m = средний размер кластера
  ROUND(1 + (avg_cluster_size - 1)
    * (between_var / (between_var + avg_within_var)), 2)
    AS design_effect
FROM grand;
// Как использовать Design Effect
Умножьте стандартный размер выборки на Design Effect. Если стандартный тест требует 10 000 пользователей, а DEFF = 3.5 — нужно 35 000. Чем выше ICC (пользователи внутри кластера похожи), тем выше DEFF и тем больше нужна выборка.

SQL: обнаружение spillover через метрики продавцов

Полезная диагностика — проверить, изменилось ли поведение продавцов в период теста. Если продавцы в «тестовых регионах» ведут себя иначе, чем в «контрольных» — spillover присутствует.

Диагностика seller-side spillover PostgreSQL
-- Сравниваем поведение продавцов в тестовых и контрольных регионах
-- Если продавец работает в обоих — он «заражает» контроль
WITH seller_exposure AS (
  SELECT
    p.seller_id,
    COUNT(DISTINCT CASE WHEN u.city IN ('Москва', 'Санкт-Петербург')
          THEN o.order_id END)  AS orders_treatment,
    COUNT(DISTINCT CASE WHEN u.city NOT IN ('Москва', 'Санкт-Петербург')
          THEN o.order_id END)  AS orders_control
  FROM orders o
  JOIN order_items oi ON o.order_id = oi.order_id
  JOIN products p     ON oi.product_id = p.product_id
  JOIN users u        ON o.user_id = u.user_id
  WHERE o.order_date BETWEEN '2024-06-01' AND '2024-06-30'
  GROUP BY p.seller_id
)
SELECT
  CASE
    WHEN orders_treatment > 0 AND orders_control > 0
      THEN 'contaminated'   -- продавец в обоих группах
    WHEN orders_treatment > 0
      THEN 'treatment_only'
    ELSE 'control_only'
  END AS seller_type,
  COUNT(*) AS n_sellers,
  ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 1) AS pct
FROM seller_exposure
GROUP BY 1
ORDER BY n_sellers DESC;
// Красный флаг
Если доля «contaminated» продавцов высокая (>30%) — geo-split по пользователям не работает. Нужно либо рандомизировать по продавцам, либо переходить к switchback-дизайну.

Вопросы на собеседовании в Авито / Ozon / Яндекс

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

💬 Типичные вопросы на собесе

Как отвечать: структура мысли

// Фреймворк ответа
1. Назовите проблему — «стандартный A/B нарушает SUTVA из-за [конкретного механизма]»
2. Объясните механизм — через что именно идёт spillover: продавцы, инвентарь, аукцион
3. Предложите метод — switchback / geo-split / кластерная рандомизация, с обоснованием
4. Скажите о трейдоффах — каждый метод платит чем-то: скорость, мощность, сложность
// Бонус-очко на собесе
Упомяните разницу между краткосрочным эффектом теста (δ из A/B) и долгосрочным рыночным эффектом (после полной раскатки и адаптации рынка). Это показывает понимание того, что рынок — живая система, а не статичный снапшот.

Связанные материалы

Главное про A/B на маркетплейсе

Маркетплейс — двусторонний рынок, где действия одних пользователей влияют на опыт других через продавцов, инвентарь и аукцион. Классический A/B тест с рандомизацией по пользователям нарушает SUTVA и даёт смещённую оценку эффекта.

Решения существуют: switchback для глобальных настроек, geo-split для локальных рынков, кластерная рандомизация для seller-side фич, holdout для долгосрочных замеров. Каждый метод требует пересчёта размера выборки с поправкой на дизайн.

Практика: возьмите любую фичу маркетплейса, который вы знаете (Авито, Ozon, Яндекс Маркет). Опишите: что тестируется, какой механизм spillover возможен и какой метод вы бы выбрали. Это упражнение — лучшая подготовка к соответствующим вопросам на собесе.

АТ
Андрей Тарасенко
// Продуктовый аналитик · Авито · Ментор

Тема SUTVA и network effects — то, с чем сталкиваешься в Авито на каждом втором тесте, связанном с ранжированием или монетизацией. Статья написана из опыта реальных экспериментов.

Написать в Telegram