Почему маркетплейс — это не обычный продукт
Когда вы тестируете кнопку на лендинге или цвет CTA — пользователи в контрольной и тестовой группах не влияют друг на друга. Видел синюю кнопку, не видел — независимые события. Классический A/B тест работает идеально.
Маркетплейс — другой зверь. Это двусторонний рынок: покупатели и продавцы существуют вместе, их поведение переплетено. Когда вы что-то меняете для одной группы пользователей, это рябью расходится на всех остальных — включая тех, кого вы не трогали.
пользователи, которые ищут товары
Ключевое свойство двустороннего рынка — сетевые эффекты. Больше покупателей → продавцам выгоднее размещаться → больше предложений → покупателям лучше → ещё больше покупателей. Цикл замкнут.
Этот цикл делает A/B тест на маркетплейсе потенциально некорректным. Проверим через конкретный пример.
Что происходит: пользователи теста видят более релевантные результаты → чаще кликают и покупают → продавцы замечают рост продаж → увеличивают ставки в аукционе и пополняют запасы.
Проблема: продавцы не знают, что это эффект теста. Они реагируют на общий рост, который меняет инвентарь для всех — включая контрольную группу. Контрольная группа получает «заражённый» опыт, её метрики растут без какого-либо воздействия. Эффект алгоритма занижается.
SUTVA: что это и почему важно
SUTVA — Stable Unit Treatment Value Assumption. Это фундаментальное допущение классической экспериментальной статистики. Звучит страшно, но смысл простой:
Переводя на русский: пользователь A не должен влиять на пользователя B только потому, что они оба участвуют в эксперименте. Если это условие нарушено — оценка эффекта смещена, p-value неверен, вывод может быть ложным в обе стороны.
Почему нарушение SUTVA так опасно
Когда SUTVA нарушено, оценка treatment effect смещается. Причём направление смещения непредсказуемо:
Три вида помех на маркетплейсе
1. Сетевые эффекты через инвентарь
Самый распространённый тип. Продавцы не разделены между группами теста — один продавец может показываться как тестовым, так и контрольным пользователям. Его поведение (цены, ставки, запасы) меняется в ответ на агрегированный спрос.
Эффект: тестовые пользователи покупают чаще → продавец X видит +30% заказов → повышает цену на товар (думает, что спрос вырос).
Проблема: контрольные пользователи тоже видят новую цену продавца X. Их покупательская активность меняется — без какого-либо воздействия с нашей стороны.
2. Каннибализация (marketplace cannibalization)
Маркетплейс — рынок с ограниченным инвентарём. Хороший товар по хорошей цене существует в одном экземпляре. Если тестовый пользователь купил его первым — контрольному пользователю он уже недоступен.
3. Эффекты ценообразования и аукциона
На маркетплейсах с аукционным ценообразованием (рекламные позиции, buy box) воздействие на часть пользователей меняет аукционный баланс для всех. Продавцы оптимизируют ставки на основе общей статистики, не зная о тесте.
CTR рекламы в тесте растёт → продавцы видят общий рост CTR → повышают ставки → стоимость клика растёт для всех рекламодателей → меняется состав рекламной выдачи для контрольных пользователей.
Все три механизма роднит одно: точка связи между группами — продавец или инвентарь. Именно поэтому рандомизация по пользователям-покупателям не изолирует группы в достаточной мере.
Методы решения: от простого к сложному
Хорошая новость: проблема известна, и у неё есть несколько рабочих решений. Выбор зависит от типа помехи, масштаба теста и возможностей инфраструктуры.
Применяется, когда воздействие — это глобальная настройка (алгоритм ранжирования, аукционные параметры), которую нельзя применить только к части пользователей без последствий для остальных.
- Нет spillover по определению
- Не нужна сложная инфраструктура
- Работает для любой глобальной фичи
- Сезонность и дни недели — конфаундеры
- Нужно много периодов для мощности
- Carry-over эффекты (привычки пользователей)
Хорошо работает для маркетплейсов с локальным инвентарём (Авито с объявлениями «в Москве»). Плохо работает для e-commerce с централизованным складом (Ozon) — там инвентарь общий.
- Естественная изоляция рынков
- Легко интерпретировать
- Подходит для крупных изменений
- Регионы неоднородны (Москва ≠ Тверь)
- Нужна поправка на региональные эффекты
- Мало «юнитов» — низкая статмощность
Единица рандомизации — продавец (кластер), а не пользователь. Это меняет расчёт статистической мощности: нужно считать дисперсию между кластерами, а не между пользователями.
- Устраняет spillover через продавцов
- Корректная модель для seller-side фич
- Нужен intraclass correlation (ICC)
- Требует больших выборок
- Покупатели всё равно «перетекают»
Позволяет оценить market-level equilibrium effect — что происходит с рынком, когда фича полностью раскатана. Именно это число нужно для бизнес-решений, а не краткосрочный A/B δ.
- Отражает реальный эффект на рынке
- Прост в реализации
- Можно держать постоянно
- Holdout «обделён» фичами — этично?
- Долго до результата
- Не изолирует конкретную фичу
Как выбрать метод и что считать
Диагностика: есть ли у вас проблема?
Не каждый тест на маркетплейсе нарушает SUTVA. Прежде чем усложнять дизайн, проверьте: есть ли реальный механизм spillover в вашем конкретном случае?
Как выбрать метод рандомизации
| Тип фичи | Основной риск | Рекомендуемый метод |
|---|---|---|
| UI покупателя (кнопка, карточка) | Минимальный | Стандартный A/B по user_id |
| Алгоритм ранжирования | Инвентарный spillover | Switchback или geo-split |
| Ценообразование / аукцион | Аукционный spillover | Switchback (временной) |
| Фича для продавцов (кабинет, аналитика) | Seller-side spillover | Кластерная рандомизация по seller_id |
| Локальная доставка / логистика | Локальный spillover | Geo-split по регионам |
| Глобальное изменение политики | Системный | Holdout + долгосрочный замер |
Расчёт мощности при кластерной рандомизации
Когда единица рандомизации — кластер (регион, продавец), стандартная формула размера выборки не работает. Нужно учесть intraclass correlation coefficient (ICC) — насколько сильно юниты внутри кластера похожи друг на друга.
-- 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;
SQL: обнаружение spillover через метрики продавцов
Полезная диагностика — проверить, изменилось ли поведение продавцов в период теста. Если продавцы в «тестовых регионах» ведут себя иначе, чем в «контрольных» — spillover присутствует.
-- Сравниваем поведение продавцов в тестовых и контрольных регионах -- Если продавец работает в обоих — он «заражает» контроль 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;
Вопросы на собеседовании в Авито / Ozon / Яндекс
Тема сложная, и именно поэтому она любима интервьюерами в компаниях с маркетплейсами. Вопросы звучат невинно, но ждут глубины.
- Мы хотим протестировать новый алгоритм ранжирования на маркетплейсе. Как вы предложите дизайн эксперимента? — Ждут: осознание проблемы spillover, предложение switchback или geo-split, обоснование выбора.
- Что такое SUTVA и почему оно важно при A/B тестировании? — Ждут: формулировку допущения и конкретный пример его нарушения на маркетплейсе.
- Результаты A/B теста показали +5% к GMV. Но после раскатки на 100% эффект исчез. Что могло произойти? — Ждут: версию о spillover в тесте (занижен контроль) или market equilibrium (рынок адаптировался).
- Как вы определите размер выборки, если рандомизируете по городам, а не по пользователям? — Ждут: упоминание ICC и Design Effect, понимание, что кластерный дизайн требует больше данных.
- Продавец участвует как в тестовой, так и в контрольной группе. Это проблема? — Ждут: да, это источник spillover. Решение — рандомизировать по продавцам или исключить таких продавцов из анализа.
Как отвечать: структура мысли
2. Объясните механизм — через что именно идёт spillover: продавцы, инвентарь, аукцион
3. Предложите метод — switchback / geo-split / кластерная рандомизация, с обоснованием
4. Скажите о трейдоффах — каждый метод платит чем-то: скорость, мощность, сложность
Связанные материалы
Главное про A/B на маркетплейсе
Маркетплейс — двусторонний рынок, где действия одних пользователей влияют на опыт других через продавцов, инвентарь и аукцион. Классический A/B тест с рандомизацией по пользователям нарушает SUTVA и даёт смещённую оценку эффекта.
Решения существуют: switchback для глобальных настроек, geo-split для локальных рынков, кластерная рандомизация для seller-side фич, holdout для долгосрочных замеров. Каждый метод требует пересчёта размера выборки с поправкой на дизайн.
Практика: возьмите любую фичу маркетплейса, который вы знаете (Авито, Ozon, Яндекс Маркет). Опишите: что тестируется, какой механизм spillover возможен и какой метод вы бы выбрали. Это упражнение — лучшая подготовка к соответствующим вопросам на собесе.