Тестирование фотографий на маркетплейсах: полное руководство
Полное руководство по A/B-тестированию фото на маркетплейсах: статистический фундамент, расчёт размера выборки, байесовский подход, встроенные инструменты WB и Ozon, ротаторы, панельные сервисы.
Тестирование фотографий на маркетплейсах: полное руководство
Доверительные интервалы, частотный подход, байесовская статистика, Monte Carlo, бандиты — и то, чем реальная жизнь на WB и Ozon отличается от учебника
TL;DR для тех, кто не будет читать 60 000 знаков
- Фото — самый дешёвый рычаг с самым большим плечом. Изменение главного фото меняет CTR на входе воронки, а CTR умножается на всё остальное. Но именно поэтому ошибка здесь стоит дороже всего: вы масштабируете неверное решение.
- Почти никто не тестирует фото корректно. Типовой «тест» на маркетплейсе — это «поменял фото в понедельник, посмотрел продажи в пятницу». Это не тест. Это наблюдение за шумом.
- Доверительный интервал важнее точечной оценки. «CTR вырос с 2,8% до 3,1%» — бессмысленная фраза без интервала. При 2 000 показов на вариант этот прирост неотличим от нуля; при 60 000 — это уже почти наверняка реальный эффект.
- Не используйте формулу Вальда. Стандартный
p ± 1.96·√(p(1−p)/n)разваливается на малых выборках и на малых CTR — то есть ровно там, где живут продавцы. Используйте интервал Уилсона или Клоппера — Пирсона. - Подглядывание убивает статистику. Если вы смотрите на p-value каждый день и останавливаете тест, как только увидели «значимо», ваша реальная вероятность ошибки не 5%, а 20–30% и выше. Это самая массовая и самая незаметная ошибка.
- Байес не спасает от подглядывания сам по себе, но даёт правильную единицу измерения решения — ожидаемые потери (expected loss), а не p-value. «Вероятность, что B лучше A» = 71% звучит убедительно и при этом означает «не внедрять».
- Monte Carlo — не экзотика, а рабочий инструмент, потому что реальная целевая метрика (выручка на показ = CTR × CR × средний чек × процент выкупа) не имеет замкнутой формулы для доверительного интервала.
- CTR — не цель. Инфографика с обещанием, которого нет в товаре, поднимает CTR и убивает выкуп. Всегда держите guardrail-метрики.
- Встроенные инструменты площадок (WB «А/Б-тесты», Ozon A/B, Amazon Manage Your Experiments) — единственная настоящая рандомизация, доступная продавцу. Всё остальное — ротация во времени, то есть квазиэксперимент, который надо чинить дизайном.
- Тест без предварительно зафиксированной гипотезы, метрики, размера выборки и порога решения — это не тест, а способ рационализировать то, что вы уже решили.
Оглавление
Часть I. Что мы вообще меряем
- Почему фото — это про деньги, а не про красоту
- Дерево метрик: что именно двигает фотография
- Почему глаз врёт: шум, регрессия к среднему и базовые ставки
Часть II. Статистический фундамент 4. Биномиальная модель и почему CTR — это подбрасывание монеты 5. Доверительные интервалы: Вальд, Уилсон, Агрести — Коулл, Клоппер — Пирсон, Джеффрис 6. Интервал на разницу двух конверсий
Часть III. Частотный подход 7. Гипотезы, ошибки I и II рода, мощность 8. MDE и расчёт размера выборки: сколько показов вам реально нужно 9. Критерии: z-тест, χ², точный тест Фишера 10. Проблема подглядывания (peeking) и как её решают взрослые 11. Множественные сравнения: Бонферрони, Холм, Бенджамини — Хохберг
Часть IV. Байесовский подход 12. Бета-биномиальная модель и сопряжённые априоры 13. Выбор априора: Beta(1,1), Джеффрис, эмпирический байес 14. P(B > A), expected loss, HDI и ROPE 15. Почему байесовский интервал отвечает на тот вопрос, который вы задавали
Часть V. Monte Carlo 16. Зачем нужна симуляция, если есть формулы 17. Симуляция апостериорного распределения выручки на показ 18. Симуляция дизайна: считаем мощность и цену подглядывания 19. Бутстрап для тяжёлых хвостов
Часть VI. Маркетплейсная реальность 20. Почему «чистый A/B» на WB и Ozon почти невозможен 21. Конфаундеры: позиция, ранжирование, реклама, сезонность, эффект новизны 22. Квазиэксперименты: switchback, ABAB, difference-in-differences, синтетический контроль 23. SRM, A/A-тесты и парадокс Симпсона
Часть VII. Методики тестирования фото — от дешёвых к дорогим 24. Семь уровней валидности 25. Как правильно проводить опросные (предиктивные) тесты 26. Многорукие бандиты: Thompson sampling, UCB, ε-greedy
Часть VIII. Практика 27. Что именно тестировать в фото: карта гипотез 28. Полный разбор кейса с цифрами 29. Как делают лузеры и как делают профессионалы: 20 антипаттернов 30. Guardrail-метрики и OEC
Часть IX. Инструменты 31. Встроенные инструменты маркетплейсов (RU и международные) 32. Топ-10 сервисов для тестирования фото: WB и Ozon 33. Панельные и опросные сервисы 34. Статистические движки и open source 35. Код: калькулятор на Python
Часть X. Операционка 36. Реестр экспериментов и метаанализ 37. Чек-лист профессионала 38. Шаблон отчёта об эксперименте 39. FAQ 40. Глоссарий
Часть I. Что мы вообще меряем
1. Почему фото — это про деньги, а не про красоту
Начнём с арифметики, потому что без неё весь дальнейший разговор про байесовские апостериорные распределения превращается в интеллектуальную гимнастику.
Продавец на маркетплейсе получает выручку по цепочке:
Выручка = Показы × CTR × CR(карточка→заказ) × Средний чек × Процент выкупа
Каждый множитель — рычаг. Но рычаги неравноценны по трём параметрам: стоимость изменения, скорость изменения и обратимость.
| Рычаг | Стоимость изменения | Скорость | Обратимость | Кто контролирует |
|---|---|---|---|---|
| Показы | Очень высокая (реклама, ранг) | Дни–месяцы | Да | Алгоритм площадки |
| CTR (главное фото) | Низкая (дизайнер, 2–20 тыс. ₽) | Часы | Полностью | Продавец |
| CR (галерея, инфографика, цена, отзывы) | Средняя | Дни | Частично | Продавец |
| Средний чек | Средняя | Дни | Да | Продавец |
| Процент выкупа | Высокая (товар, логистика) | Недели | Плохо | Продавец + логистика |
Главное фото — единственная позиция в этой таблице, где дёшево, быстро, обратимо и полностью под вашим контролем. Отсюда парадокс: рычаг с лучшим соотношением «эффект/усилие» одновременно является самым запущенным с методической точки зрения. Продавец, который считает юнит-экономику до копейки и спорит о трёх рублях логистики, принимает решение о главном фото фразой «мне вот это больше нравится».
Эффект мультипликации
Есть второй, менее очевидный эффект. На WB и Ozon поведенческие метрики карточки участвуют в ранжировании. Точные веса площадки не раскрывают и меняют, но направление известно и не оспаривается: карточка, которую чаще кликают и чаще покупают из выдачи, получает больше показов.
Значит, зависимость нелинейна:
ΔCTR → Δранг → ΔПоказы → ΔВыручка
Прирост CTR на 10% даёт не 10% выручки, а больше — потому что за ним подтягивается объём показов. Это же работает и в обратную сторону: неудачное фото не просто снижает клики, оно снижает клики и отбирает трафик, и вы можете этого никогда не заметить, потому что вы не видите контрфактуальный мир, где стояло другое фото.
Именно этот механизм с обратной связью — причина, по которой наивные «до/после» замеры на маркетплейсе врут систематически, а не случайно. Мы вернёмся к этому в части VI.
Сколько стоит одна десятая процентного пункта
Возьмём средний по рынку сценарий: карточка получает 300 000 показов в месяц, CTR 3,0%, конверсия из карточки в заказ 6%, средний чек 1 800 ₽, маржинальность 25%.
Заказы = 300 000 × 0,030 × 0,06 = 540
Выручка = 540 × 1 800 = 972 000 ₽
Прибыль = 972 000 × 0,25 = 243 000 ₽
Теперь CTR 3,1% (+0,1 п.п., +3,3% относительно):
Заказы = 300 000 × 0,031 × 0,06 = 558
Выручка = 1 004 400 ₽
Прибыль = 251 100 ₽ (+8 100 ₽/мес)
Восемь тысяч в месяц с одной карточки за одну десятую процентного пункта. Если у вас 200 карточек — это 1,6 млн ₽ в месяц. И это без учёта эффекта ранжирования, который в реальности удваивает или утраивает цифру.
Ровно поэтому вопрос «а достоверно ли, что 3,1% лучше 3,0%?» — не академический. Это вопрос о том, стоит ли вам платить дизайнеру и разворачивать новый визуал на весь ассортимент.
2. Дерево метрик: что именно двигает фотография
Одна из системных ошибок — считать, что «фото влияет на CTR». Фото влияет на всю воронку, но на разные её участки — разные фото.
2.1. Структура воронки на маркетплейсе
Показ в выдаче / рекомендациях
│ ← ГЛАВНОЕ ФОТО (превью 1:1, ~160–220 px по ширине на мобильном)
▼
Клик (переход в карточку) → метрика: CTR
│ ← ГАЛЕРЕЯ: 2-й, 3-й слайд, инфографика, видео, 360°, rich-контент
▼
Добавление в корзину → метрика: CR1 (показ→корзина) или CR(клик→корзина)
│ ← цена, отзывы, срок доставки, характеристики
▼
Оформление заказа → метрика: CR2
│ ← склад, логистика, реальный товар vs ожидание
▼
Выкуп (получение) → метрика: % выкупа
│
▼
Отзыв / возврат / повторная покупка → метрики: рейтинг, % возвратов, retention
Что двигает главное фото: почти исключительно CTR. Плюс — косвенно — ожидания покупателя, а значит выкуп и возвраты.
Что двигает галерея: CR1 и CR2. Главное фото она почти не двигает (кроме случая, когда первый слайд заменяется видеообложкой).
Что двигает рич-контент/A+: CR2 и возвраты.
Из этого следует железное правило: метрика теста должна соответствовать тестируемому элементу. Тестировать главное фото и мерить «продажи за неделю» — значит намеренно добавить в измерение шум от четырёх других этапов воронки, каждый из которых живёт своей жизнью.
2.2. Иерархия метрик
Заведите три уровня.
Уровень 1. Целевая метрика (OEC — Overall Evaluation Criterion). Одна. Не две, не пять. Это то, ради чего вы вообще что-то меняете.
Для теста главного фото хорошая OEC:
RPM = Выручка на 1000 показов = 1000 × CTR × CR × AOV × BuyoutRate
Или, если вы оптимизируете прибыль:
PPM = 1000 × CTR × CR × AOV × BuyoutRate × Margin − 1000 × CTR × CPC
(второй член — если тест идёт на платном трафике).
Уровень 2. Драйверные метрики. CTR, CR1, CR2, AOV. Они объясняют, почему сдвинулась OEC. Они не принимают решение, они его интерпретируют.
Уровень 3. Guardrail-метрики (метрики-предохранители). Не должны ухудшиться. Если ухудшились — тест проигран, даже если OEC выросла.
- Процент выкупа
- Процент возвратов
- Средний рейтинг новых отзывов
- Доля отзывов с ключевыми словами «не соответствует», «другой цвет», «меньше, чем на фото»
- Доля отмен
Почему guardrail обязательны. Классическая ловушка маркетплейса: вы добавляете на превью крупную плашку «−70%» и стрелку. CTR растёт на 25%. Все счастливы. Через три недели процент выкупа падает с 78% до 71%, потому что кликают люди, которым товар не подходит; растёт доля возвратов; логистика съедает маржу; рейтинг проседает; карточка теряет ранг.
Считаем: CTR +25%, выкуп −9% относительно. Итог по прибыли:
1,25 × 0,91 = 1,1375 → +13,75% ... но:
+ логистика возвратов (в среднем 50–100 ₽ на возврат)
+ падение рейтинга → долгосрочная потеря CTR
И это ещё «в плюс». Часто получается «в минус», а продавец рапортует о победе, потому что смотрел только на CTR.
2.3. Ratio-метрики и единица рандомизации
Тонкий момент, который ломает половину самодельных калькуляторов.
CTR = клики / показы. Единица рандомизации — показ (или сессия). Клик — событие внутри единицы. Здесь биномиальная модель работает почти честно.
CR = заказы / посетителей карточки. Единица — посетитель. Тоже почти честно.
А вот «выручка на посетителя» — это уже не биномиальная величина. Один покупатель может купить на 500 ₽, другой на 40 000 ₽. Распределение с тяжёлым правым хвостом. Обычный t-тест на таких данных занижает дисперсию и завышает значимость. Здесь нужен бутстрап, винзоризация или лог-преобразование. Об этом — в части V.
И третий уровень сложности: если один пользователь видит карточку 5 раз, его показы не независимы. Формально это нарушает предпосылки биномиальной модели и слегка занижает истинную дисперсию. На практике при больших n эффект невелик, но он есть, и это одна из причин, почему интервалы, посчитанные вручную, всегда чуть у́же реальных.
3. Почему глаз врёт: шум, регрессия к среднему и базовые ставки
3.1. Эксперимент, который вы можете провести за минуту
Возьмите монету. Она честная: p = 0,5. Подбросьте 20 раз. Вы получите не 10 орлов. Вы получите 8, или 13, или 7. Стандартное отклонение числа орлов — √(20 × 0,5 × 0,5) = 2,24. То есть разброс ±2–3 орла — норма.
Теперь то же самое с CTR. Истинный CTR фото = 3,0%. Вы получили 1 000 показов. Ожидаемое число кликов — 30. Стандартное отклонение:
σ = √(n·p·(1−p)) = √(1000 × 0,03 × 0,97) = √29,1 = 5,39
То есть в 68% случаев вы увидите от 25 до 35 кликов, а в 95% — от 19 до 41. В процентах: наблюдаемый CTR при истинном 3,0% и 1 000 показов гуляет от 1,9% до 4,1%.
Перечитайте это ещё раз. Одно и то же фото, ничего не менялось, истинный CTR постоянен — а наблюдаемое значение спокойно принимает значения от 1,9% до 4,1%.
Теперь представьте продавца, который поменял фото, увидел «было 2,1%, стало 3,8%» и радостно пишет в чат: «инфографика решает, CTR +80%!». Он не измерил ничего. Он измерил дисперсию.
3.2. Регрессия к среднему
Второй механизм самообмана.
Вы меняете фото не на случайной карточке. Вы меняете его на той, где сейчас всё плохо. А «сейчас плохо» — это часто результат случайного отклонения вниз плюс реального ухудшения. Даже если вы вообще ничего не сделаете, в следующем периоде метрика подтянется вверх — просто потому, что экстремальные значения имеют свойство сменяться менее экстремальными.
Это называется регрессией к среднему, и она гарантирует, что любое вмешательство в проседающую карточку будет выглядеть успешным.
Отсюда — почему нужен контроль. Не «до/после», а «одновременно A и B». Контрольная группа регрессирует к среднему ровно так же, как тестовая, и разница между ними остаётся чистой.
3.3. Базовые ставки: сколько тестов вообще выигрывают
В зрелых программах экспериментов больших продуктовых компаний доля тестов с реальным положительным эффектом — примерно 10–30%. Публично об этом писали Microsoft (Bing), Booking, Airbnb: подавляющее большинство гипотез не срабатывает или срабатывает в ноль.
Почему это важно? Потому что это ваш априор — и он превращает p-value в нечто гораздо менее убедительное, чем кажется.
Пусть:
- доля истинных гипотез среди тестируемых: 20%
- α = 5% (ложноположительные)
- мощность = 80% (истинноположительные)
Запускаем 100 тестов:
Истинных гипотез: 20 → значимыми станут 20 × 0,80 = 16
Ложных гипотез: 80 → значимыми станут 80 × 0,05 = 4
Всего «значимых» результатов: 20
Из них реально верных: 16
Positive Predictive Value = 16/20 = 80%. Уже не 95%. Каждый пятый «победитель» — фикция.
А теперь возьмите реалистичного продавца: он подглядывает, останавливает тест на пике, тестирует 6 фото и берёт лучшее, не корректируя на множественность. Его фактическая α не 5%, а 30%. Пересчитаем:
Истинных: 20 × 0,80 = 16
Ложных: 80 × 0,30 = 24
«Значимых»: 40, из них верных 16.
PPV = 40%.
Больше половины его «побед» — шум. И он масштабирует этот шум на весь ассортимент, платит дизайнеру за производство «выигрышного стиля» и учит ему других в своём Telegram-канале.
Это не гипербола. Это арифметика.
3.4. Почему мнение эксперта — тоже данные, но плохие
Дизайнер, продакт, вы сами, ваша жена, чат селлеров — все они дают вам оценку с огромной дисперсией и неизвестным смещением. Проблема не в том, что мнение бесполезно, а в том, что у мнения нет доверительного интервала, и потому его невозможно сложить с данными.
Правильное место для экспертного суждения — генерация гипотез и формирование априорного распределения (см. часть IV). Неправильное — принятие решения.
Формулировка, к которой стоит привыкнуть:
«Я на 70% уверен, что лайфстайл-фото победит студийное в этой категории, и жду прирост CTR в диапазоне от −5% до +25%. Тест это проверит.»
Такая фраза уже является статистическим объектом. «Мне кажется, лайфстайл лучше» — нет.
Часть II. Статистический фундамент
4. Биномиальная модель и почему CTR — это подбрасывание монеты
Формально. Пусть карточка получила n показов. Каждый показ независимо приводит к клику с вероятностью p (истинный, ненаблюдаемый CTR фотографии). Число кликов s — случайная величина:
s ~ Binomial(n, p)
E[s] = n·p
Var[s] = n·p·(1−p)
Наблюдаемый CTR — это оценка p̂ = s/n. Она несмещённая:
E[p̂] = p
Var[p̂] = p(1−p)/n
SE(p̂) = √(p(1−p)/n)
Ключевой вывод, который надо вытатуировать: точность оценки CTR растёт как корень из числа показов. Чтобы сузить интервал вдвое, нужно вчетверо больше данных. Чтобы вдесятеро — в сто раз больше.
Второй вывод: Var[p̂] зависит от самого p. При маленьком CTR (а на маркетплейсе это 1–5%) относительная погрешность огромна:
Относительная погрешность = SE/p = √((1−p)/(n·p))
При p = 0,03 и n = 1 000: √(0,97/30) = 0,18 → 18% При p = 0,03 и n = 10 000: √(0,97/300) = 0,057 → 5,7% При p = 0,03 и n = 100 000: √(0,97/3000) = 0,018 → 1,8%
Отсюда практическое правило: число кликов важнее числа показов. Если у вас 100 000 показов, но CTR 0,5% (500 кликов) — точность будет хуже, чем при 20 000 показов и CTR 5% (1 000 кликов). Ориентируйтесь на количество событий (кликов, заказов), а не на объём трафика.
Грубый ориентир: минимум 300–400 событий на вариант, чтобы вообще о чём-то говорить. Ниже 100 событий не тестируйте — интервал будет шире, чем любой эффект, который вы способны создать фотографией.
4.1. Когда биномиальная модель ломается
Она предполагает:
- Независимость показов. — Нарушается: один юзер видит карточку многократно.
- Постоянство
p. — Нарушается: CTR утром и вечером, в будни и выходные, на 1-й и 5-й позиции выдачи разный. - Отсутствие обратной связи. — Нарушается: клики влияют на ранг, ранг влияет на показы.
Пункты 1 и 2 приводят к сверхдисперсии (overdispersion): реальная дисперсия больше биномиальной. Практическое следствие — все ваши интервалы у́же, чем должны быть, и все p-value меньше, чем должны быть. Вы систематически переоцениваете значимость.
Как чинить:
- Кластерная поправка: если единица рандомизации — пользователь, а наблюдение — показ, дисперсию нужно умножить на design effect
1 + (m̄ − 1)·ρ, гдеm̄— среднее число показов на пользователя,ρ— внутрикластерная корреляция. Приm̄ = 3иρ = 0,1дисперсия вырастет в 1,2 раза, интервал — в 1,1. - Бета-биномиальная модель вместо биномиальной (см. часть IV) — она естественно допускает сверхдисперсию.
- Практический костыль: умножьте ширину интервала на 1,1–1,3. Это грубо, но честнее, чем игнорировать проблему.
5. Доверительные интервалы для одной пропорции
Это тот раздел, ради которого стоило читать. Здесь большинство калькуляторов в интернете делают неправильно.
5.1. Интервал Вальда (Wald) — тот, который вы знаете, и который не надо использовать
CI = p̂ ± z₁₋α/₂ · √(p̂(1−p̂)/n)
где z₀.₉₇₅ = 1,96 для 95%.
Почему он плох:
Может выйти за [0, 1]. Пример: 2 клика из 200 показов.
p̂ = 0,01.SE = √(0,01 × 0,99 / 200) = √0,0000495 = 0,00704 CI = 0,01 ± 1,96 × 0,00704 = 0,01 ± 0,0138 = [−0,0038; 0,0238]Отрицательный CTR. Прекрасно.
Схлопывается в точку при s = 0 или s = n. Ноль кликов из 500 показов →
p̂ = 0,SE = 0,CI = [0; 0]. То есть «мы на 95% уверены, что CTR ровно нулевой». Это, мягко говоря, не так.Фактическое покрытие сильно ниже номинального. При малых
pи умеренныхn«95%-й» интервал Вальда покрывает истинное значение в 80–90% случаев. Причём покрытие ведёт себя хаотично — оно не монотонно по n, оно «осциллирует».
Единственное оправдание Вальда: при n·p̂ > 30 и n·(1−p̂) > 30 он практически совпадает с интервалом Уилсона. То есть на больших числах кликов — можно. На маленьких — нельзя, а именно там вы и находитесь.
5.2. Интервал Уилсона (Wilson score) — дефолтный выбор
Вывод: вместо того чтобы подставлять p̂ в дисперсию, решаем уравнение относительно p:
|p̂ − p| / √(p(1−p)/n) = z
Решение:
p̂ + z²/(2n) z ⎧ p̂(1−p̂) z² ⎫
CI = ─────────────── ± ───────── · √ ⎨ ─────── + ──── ⎬
1 + z²/n 1 + z²/n ⎩ n 4n² ⎭
Более удобная для расчёта форма (через число успехов s):
center = (s + z²/2) / (n + z²)
half_width = (z / (n + z²)) · √( s·(n−s)/n + z²/4 )
CI = center ± half_width
Свойства:
- Всегда внутри [0, 1].
- При
s = 0даёт[0; z²/(n+z²)]— то есть при 0 из 500 верхняя граница ≈ 0,77%. Разумно. - Покрытие близко к номинальному даже при
n = 20. - Немного консервативен «в среднем», но без катастрофических провалов.
Пример: 2 клика из 200.
z = 1,96; z² = 3,8416
center = (2 + 1,9208) / (200 + 3,8416) = 3,9208 / 203,8416 = 0,019235
half = (1,96 / 203,8416) · √( 2·198/200 + 0,9604 )
= 0,0096155 · √(1,98 + 0,9604)
= 0,0096155 · 1,71476 = 0,016488
CI = [0,00275; 0,03572] → [0,27%; 3,57%]
Сравните с Вальдом [−0,38%; 2,38%]. Уилсон честно говорит: «истинный CTR где-то между 0,3% и 3,6%, мы не знаем». Вальд врёт дважды: и границей ниже нуля, и слишком узким верхним краем.
Асимметрия — это фича, а не баг. Интервал Уилсона смещён к 0,5. При малом p̂ верхняя граница дальше, чем нижняя. Это правильно: увидеть 2 клика при истинном CTR 3% гораздо вероятнее, чем при истинном 0,1%.
5.3. Агрести — Коулл (Agresti–Coull) — Уилсон для тех, кто любит Вальда
Идея гениально проста: добавь к данным 2 успеха и 2 неудачи, потом считай Вальда.
ñ = n + z² (≈ n + 4)
p̃ = (s + z²/2) / ñ (≈ (s+2)/(n+4))
CI = p̃ ± z · √( p̃(1−p̃)/ñ )
Это «плюс-четыре» интервал. Работает почти так же хорошо, как Уилсон, считается в уме. Для быстрой прикидки на салфетке — отлично.
Пример: 2 из 200. p̃ = 4/204 = 0,0196, SE = √(0,0196×0,9804/204) = 0,00970, CI = [0,0006; 0,0386] → [0,06%; 3,86%]. Чуть шире Уилсона, но адекватно.
5.4. Клоппер — Пирсон (exact / Beta) — когда нужна гарантия
Строится инверсией биномиального теста. Границы выражаются через квантили бета-распределения:
lower = Beta⁻¹(α/2; s, n − s + 1) (0, если s = 0)
upper = Beta⁻¹(1−α/2; s+1, n − s) (1, если s = n)
Свойства:
- Покрытие гарантированно ≥ 95% при любых
nиp. Никогда не проваливается. - Ценой этого — консервативность. Часто покрытие 97–99%, интервал шире необходимого.
- Требует численного счёта (в Python:
scipy.stats.beta.ppf).
Когда использовать: когда цена ошибки очень высока, когда данных мало, когда нужно защищать результат перед скептиком. В регуляторных задачах (медицина) это стандарт.
Пример: 2 из 200 → примерно [0,12%; 3,55%].
5.5. Джеффрис (Jeffreys) — байесовский интервал, притворяющийся частотным
Берём априор Beta(0.5, 0.5) (априор Джеффриса — неинформативный, инвариантный к параметризации), получаем апостериорное Beta(s + 0.5, n − s + 0.5) и берём его квантили:
lower = Beta⁻¹(α/2; s + 0,5, n − s + 0,5)
upper = Beta⁻¹(1−α/2; s + 0,5, n − s + 0,5)
Замечательно тем, что имеет отличное частотное покрытие (лучше среднее, чем у Клоппера — Пирсона, без его консервативности) и при этом является честным байесовским кредибельным интервалом. Мост между двумя мирами.
Многие статистики (в т.ч. Браун, Кай, ДасГупта в классической работе 2001 года об интервалах для биномиальной пропорции) рекомендуют именно Уилсона или Джеффриса как дефолт.
5.6. Сводная таблица
| Метод | Формула | Покрытие при малых n | Границы в [0,1] | s=0 работает | Сложность счёта | Вердикт |
|---|---|---|---|---|---|---|
| Вальд | p̂ ± z·√(p̂q̂/n) |
Плохое (80–90%) | Нет | Нет ([0;0]) | Тривиально | ❌ Не использовать |
| Уилсон | см. выше | Хорошее | Да | Да | Легко | ✅ Дефолт |
| Агрести — Коулл | +2/+2, потом Вальд |
Хорошее | Да | Да | Тривиально | ✅ Для устного счёта |
| Клоппер — Пирсон | Инверсия бинома | Гарантированное ≥95% | Да | Да | Нужен scipy | ✅ Когда нужна гарантия |
| Джеффрис | Beta(s+½, n−s+½) |
Отличное | Да | Да | Нужен scipy | ✅ Лучший компромисс |
5.7. Численный пример: одна и та же карточка, разные объёмы
Истинный CTR = 3,0%. Смотрим, как сужается 95% интервал Уилсона.
| Показов | Кликов (ожид.) | 95% CI (Уилсон) | Ширина | Отн. погрешность |
|---|---|---|---|---|
| 100 | 3 | [1,03%; 8,45%] | 7,4 п.п. | ±123% |
| 500 | 15 | [1,83%; 4,89%] | 3,1 п.п. | ±51% |
| 1 000 | 30 | [2,11%; 4,25%] | 2,1 п.п. | ±36% |
| 5 000 | 150 | [2,56%; 3,51%] | 0,95 п.п. | ±16% |
| 10 000 | 300 | [2,68%; 3,35%] | 0,67 п.п. | ±11% |
| 50 000 | 1 500 | [2,85%; 3,15%] | 0,30 п.п. | ±5% |
| 100 000 | 3 000 | [2,90%; 3,11%] | 0,21 п.п. | ±3,5% |
| 500 000 | 15 000 | [2,95%; 3,05%] | 0,09 п.п. | ±1,6% |
Читайте таблицу так: чтобы уверенно отличить 3,0% от 3,1% (эффект +3,3%), вам нужен интервал шириной сильно меньше 0,1 п.п. — то есть сотни тысяч показов на вариант.
А теперь честный вопрос: сколько показов в день получает ваша карточка? Если 3 000 — то на надёжное обнаружение +3,3% вам нужно примерно 400 дней. Именно поэтому профессионалы:
- тестируют крупные изменения (не оттенок фона, а концепцию кадра), где эффект 10–30%;
- пулят данные по нескольким карточкам одной категории (иерархическая модель);
- используют байесовский априор, чтобы не начинать с нуля;
- принимают решения по ожидаемым потерям, а не по «значимости».
6. Доверительный интервал на разницу двух конверсий
Здесь начинается собственно A/B.
6.1. Абсолютная разница
Δ̂ = p̂_B − p̂_A
SE(Δ̂) = √( p̂_A(1−p̂_A)/n_A + p̂_B(1−p̂_B)/n_B ) ← НЕ pooled!
CI = Δ̂ ± z · SE(Δ̂)
Важно: для доверительного интервала используется непулированная стандартная ошибка. Для проверки гипотезы H₀: p_A = p_B — пулированная. Это разные вещи, и путаница между ними — распространённая ошибка в самописных калькуляторах.
Более точный вариант для малых выборок — интервал Ньюкомба (Newcombe hybrid score): строим интервалы Уилсона [l_A, u_A] и [l_B, u_B] отдельно, затем
lower(Δ) = (p̂_B − p̂_A) − √( (p̂_B − l_B)² + (u_A − p̂_A)² )
upper(Δ) = (p̂_B − p̂_A) + √( (u_B − p̂_B)² + (p̂_A − l_A)² )
Работает существенно лучше наивного подхода при малых числах кликов.
6.2. Относительный лифт
В бизнесе всех интересует не «+0,3 п.п.», а «+10,7%». Относительный лифт:
Lift = (p̂_B − p̂_A) / p̂_A
Его интервал нельзя получить делением границ. Это отношение случайных величин, оно смещено и имеет тяжёлые хвосты (особенно если p̂_A мало).
Три способа:
1. Дельта-метод (быстро, приближённо).
Var(ln(p_B/p_A)) ≈ (1−p_A)/(n_A·p_A) + (1−p_B)/(n_B·p_B)
CI для ln(лифт+1) = ln(p̂_B/p̂_A) ± z·√Var
CI для лифта = exp(...) − 1
2. Бутстрап (см. часть V).
3. Байесовская симуляция — самый честный: сэмплим p_A ~ Beta(...), p_B ~ Beta(...), считаем (p_B − p_A)/p_A для каждой пары, берём перцентили. Именно так и надо.
6.3. Числовой пример, к которому мы будем возвращаться
Тест главного фото. Вариант A — текущее студийное фото. Вариант B — лайфстайл-кадр.
Вариант A: n_A = 60 000 показов, s_A = 1 680 кликов → p̂_A = 2,800%
Вариант B: n_B = 60 000 показов, s_B = 1 860 кликов → p̂_B = 3,100%
Абсолютная разница: Δ̂ = 0,300 п.п.
Относительный лифт: +10,71%
Считаем SE:
Var_A = 0,028 × 0,972 / 60 000 = 4,536 × 10⁻⁷
Var_B = 0,031 × 0,969 / 60 000 = 5,007 × 10⁻⁷
SE(Δ) = √(9,543 × 10⁻⁷) = 9,769 × 10⁻⁴ = 0,0977 п.п.
95% CI на абсолютную разницу:
0,300 ± 1,96 × 0,0977 = 0,300 ± 0,191 п.п.
CI = [0,109 п.п. ; 0,491 п.п.]
95% CI на относительный лифт (примерно):
[+3,9% ; +17,6%]
Что мы на самом деле узнали. Мы узнали, что B почти наверняка лучше A. Но истинный размер эффекта — где-то между +4% и +18%. Точечная оценка +10,7% — это самая вероятная, а не «настоящая» цифра. Если вы строите финансовую модель на +10,7%, вы строите её на середине довольно широкого интервала.
Это, кстати, и есть ответ на вопрос, почему «выигравшие» A/B-тесты почти всегда дают в проде меньше, чем обещали. Явление называется winner's curse (проклятие победителя): вы отбираете варианты по наблюдённому эффекту, а наблюдённый эффект у победителей систематически завышен за счёт случайной удачи. Байесовская усадка (shrinkage) — единственное честное лекарство.
Практическая поправка на winner's curse: если тест был на грани значимости (p ≈ 0,04), закладывайте в модель нижнюю границу интервала, а не точечную оценку. Если тест был уверенным (p < 0,001), точечная оценка приемлема.
Часть III. Частотный подход
7. Гипотезы, ошибки I и II рода, мощность
Формализация. До запуска теста вы обязаны записать (буквально записать, в файл, с датой):
H₀ (нулевая): p_B = p_A — фото B не отличается от A
H₁ (альтернативная): p_B ≠ p_A — отличается (двусторонняя)
или p_B > p_A — лучше (односторонняя)
α = 0,05 — вероятность объявить победу, когда её нет (ошибка I рода)
β = 0,20 — вероятность не заметить победу, когда она есть (ошибка II рода)
Power = 1−β = 0,80
MDE = +10% относительно — минимальный эффект, который мы хотим уметь ловить
Односторонний или двусторонний? Практический ответ: двусторонний. Односторонний тест соблазнителен (нужно на ~20% меньше выборки), но он означает «я заранее решил, что B не может быть хуже». А B очень даже может быть хуже, и вам критически важно это заметить. Одностороннее тестирование в индустрии — почти всегда способ протащить недостаточную выборку.
Матрица исходов:
| H₀ верна (B = A) | H₁ верна (B ≠ A) | |
|---|---|---|
| Объявили значимость | Ошибка I рода, вероятность α — внедрили плохое фото | Верно, вероятность 1−β |
| Не объявили | Верно, 1−α | Ошибка II рода, вероятность β — упустили хорошее фото |
Для маркетплейса цена ошибок несимметрична и зависит от контекста:
- Ошибка I рода дорога, если внедрение — это перерисовка 500 карточек и перезапуск рекламы. Тогда α = 0,01.
- Ошибка II рода дорога, если внедрение бесплатно (просто поменять картинку) и обратимо. Тогда можно α = 0,10 и сэкономить на выборке.
Профессионалы выбирают α под цену решения. Лузеры всегда берут 0,05, потому что так было в учебнике.
8. MDE и расчёт размера выборки
8.1. Формула
Для двух пропорций, двусторонний тест, равные группы:
( z₁₋α/₂ + z₁₋β )² · ( p_A(1−p_A) + p_B(1−p_B) )
n = ────────────────────────────────────────────────────
( p_B − p_A )²
где n — размер каждой группы.
Упрощённая (через среднее p̄):
n ≈ 2 · p̄(1−p̄) · ( z₁₋α/₂ + z₁₋β )² / Δ²
при α=0,05, power=0,80: (1,96 + 0,84)² = 7,849
при α=0,05, power=0,90: (1,96 + 1,282)² = 10,51
при α=0,01, power=0,80: (2,576 + 0,84)² = 11,67
Обратите внимание: Δ в знаменателе в квадрате. Хотите ловить вдвое меньший эффект — платите вчетверо большей выборкой.
8.2. Таблица: сколько показов нужно на вариант
Базовый CTR = 2,8%, α = 0,05 (двусторонний), мощность 80%.
| MDE (отн.) | MDE (абс.) | Показов на вариант | Всего показов | Дней при 5 000 показов/день на вариант |
|---|---|---|---|---|
| +3% | 0,084 п.п. | 614 298 | 1 228 596 | 123 |
| +5% | 0,140 п.п. | 223 260 | 446 520 | 45 |
| +10% | 0,280 п.п. | 57 132 | 114 264 | 11,4 |
| +15% | 0,420 п.п. | 25 976 | 51 952 | 5,2 |
| +20% | 0,560 п.п. | 14 939 | 29 878 | 3,0 |
| +30% | 0,840 п.п. | 6 930 | 13 860 | 1,4 |
| +50% | 1,400 п.п. | 2 702 | 5 404 | 0,5 |
(точные значения по полной формуле §8.1; функция sample_size() из §35 их воспроизводит)
Аналогично для конверсии «клик → корзина», базовое значение 8%:
| MDE (отн.) | Посетителей на вариант |
|---|---|
| +5% | 73 851 |
| +10% | 18 869 |
| +20% | 4 918 |
| +30% | 2 273 |
8.3. Как этим пользоваться
Правильный порядок мышления:
- Посмотрите, сколько показов ваша карточка получает в неделю. Допустим, 40 000.
- Значит, за 2 недели вы соберёте 80 000 показов, по 40 000 на вариант.
- По таблице: 40 000 на вариант ≈ MDE +12% (между строками +10% и +15%).
- Вопрос себе: способно ли моё изменение фото дать +12% CTR?
- Если вы меняете концепцию кадра (студия → лайфстайл, добавили лицо, поменяли ракурс) — да, вполне.
- Если вы двигаете плашку на 20 пикселей влево — нет. Не запускайте тест. Вы гарантированно получите «нет значимой разницы» и потратите две недели.
Это и есть главная функция расчёта мощности: отсеивать тесты, которые бессмысленно запускать.
Лузер думает: «запустим тест, посмотрим что получится». Профессионал думает: «при моём трафике я смогу поймать только эффект от 12% и выше; значит, я буду тестировать только крупные, смелые гипотезы, а мелкие правки внедрю без теста или соберу в пакет».
8.4. Как сократить нужную выборку честно
- Тестируйте на пакете карточек. Если у вас 30 карточек в одной категории и одна гипотеза («лайфстайл лучше студии»), тестируйте её на всех 30 сразу и агрегируйте. Суммарный трафик в 30 раз выше. Это иерархический (multilevel) дизайн, и это то, чего почти никто не делает.
- Снижайте дисперсию через CUPED — используйте предэкспериментальные данные карточки как ковариату. На стабильном трафике даёт снижение дисперсии на 20–50%, то есть эквивалент увеличения выборки в 1,3–2 раза. Реализовано в GrowthBook, Statsig, Eppo.
- Стратифицируйте. Балансируйте группы по устройству (моб/десктоп), по источнику трафика (поиск/каталог/реклама/рекомендации). Пост-стратификация снижает дисперсию бесплатно.
- Увеличьте базовый CTR перед тестом. Дисперсия относительной оценки падает с ростом
p. - Не увеличивайте α. Это не «честный» способ. Это способ обмануть себя.
- Не тестируйте 6 вариантов, когда можно 2. Каждый лишний вариант либо делит трафик, либо требует поправки на множественность.
9. Критерии проверки
9.1. Z-тест для двух пропорций (основной инструмент)
Под H₀ пропорции равны, поэтому используем пулированную оценку:
p̄ = (s_A + s_B) / (n_A + n_B)
SE_pooled = √( p̄(1−p̄) · (1/n_A + 1/n_B) )
z = (p̂_B − p̂_A) / SE_pooled
p-value (двусторонний) = 2 · (1 − Φ(|z|))
Наш пример:
p̄ = (1680 + 1860) / 120 000 = 0,0295
SE_pooled = √( 0,0295 × 0,9705 × (1/60000 + 1/60000) )
= √( 0,02863 × 3,3333e−5 ) = √(9,543e−7) = 9,769e−4
z = 0,003 / 0,0009769 = 3,071
p-value = 2 × (1 − Φ(3,071)) = 2 × 0,001067 ≈ 0,0021
Вывод: p = 0,0021 < 0,05. Отвергаем H₀. Разница статистически значима.
Что это НЕ означает:
- Не означает «вероятность, что B лучше, равна 99,79%».
- Не означает «вероятность, что H₀ верна, равна 0,21%».
- Означает буквально: если бы фото были одинаковы, вероятность увидеть разницу такую же или бо́льшую по модулю равна 0,21%.
Это неинтуитивно и именно поэтому байесовский подход так соблазнителен: он отвечает на вопрос, который вы на самом деле задавали.
9.2. Хи-квадрат (χ²)
Для таблицы 2×2 (клик/не клик × A/B) χ²-тест Пирсона математически эквивалентен двустороннему z-тесту: χ² = z². В нашем примере χ² = 9,43, df = 1, p = 0,0021. То же самое.
Поправка Йейтса на непрерывность делает тест консервативнее; при больших n её обычно не применяют.
Преимущество χ²: легко обобщается на k вариантов (таблица 2×k). Но тогда он отвечает лишь «есть ли где-то разница», а не «какой вариант лучший» — нужны попарные сравнения с поправкой.
9.3. Точный тест Фишера
Не использует нормальное приближение, считает точную гипергеометрическую вероятность. Обязателен, когда ожидаемое число событий в какой-то ячейке < 5.
На маркетплейсе это ситуация «тестируем конверсию в заказ на карточке с 40 заказами». Там z-тест врёт, Фишер — нет.
Минус: консервативен, вычислительно дорог на больших n (но scipy.stats.fisher_exact справляется).
9.4. G-тест / likelihood-ratio
Практически идентичен χ² при больших выборках, лучше себя ведёт при малых ожидаемых частотах. В индустрии редко, в биостатистике часто.
9.5. Что выбрать
Событий на вариант ≥ 30 и n ≥ 1000 → z-тест (или χ²)
Событий на вариант < 30 → точный тест Фишера
Метрика непрерывная (выручка/визит) → бутстрап или t-тест Уэлча + винзоризация
Нужно 3+ варианта → χ² на однородность, затем попарно с поправкой
Данные приходят потоком, хочу смотреть → последовательный тест (см. §10)
10. Проблема подглядывания (peeking) — главный убийца тестов
10.1. Суть
Классический тест сконструирован под фиксированный горизонт: вы заранее объявляете n = 57 000 на вариант, ждёте, считаете p-value один раз, принимаете решение. При этом P(отвергнуть H₀ | H₀ верна) = α = 5%.
Что делает живой человек? Открывает дашборд каждое утро. И останавливает тест в тот день, когда увидел p < 0,05.
Это называется optional stopping, и это меняет всё.
Интуиция: p-value под H₀ — это случайная величина, равномерно распределённая на [0, 1]. Каждый день вы делаете новый розыгрыш. Если проверять 14 дней подряд, вероятность хотя бы раз увидеть p < 0,05 радикально больше 5%.
Аналитически (Армитедж, 1969): при непрерывном мониторинге вероятность когда-нибудь пересечь порог значимости стремится к 100%, даже если H₀ идеально верна. То есть любой A/A-тест рано или поздно «покажет значимую разницу», если ждать достаточно долго и смотреть достаточно часто.
10.2. Порядок величины
Симуляция (см. код в части V) при истинно нулевом эффекте даёт примерно такую фактическую вероятность ложной «победы»:
| Число проверок за тест | Фактическая α |
|---|---|
| 1 (правильно) | 5% |
| 2 | ≈ 8% |
| 5 | ≈ 14% |
| 10 | ≈ 19% |
| 20 | ≈ 25% |
| Каждый час, 14 дней (336) | ≈ 40%+ |
Продавец, который смотрит статистику теста «просто из интереса» два раза в день две недели, работает с фактической вероятностью ложного открытия около 30%. Он не проводит эксперимент. Он ищет момент, когда шум скажет ему то, что он хочет услышать.
10.3. Дополнительный эффект: завышение размера эффекта
Мало того что вы чаще объявляете ложные победы. Вы ещё и систематически завышаете эффект у настоящих побед. Потому что останавливаетесь в момент, когда случайность толкнула метрику вверх. Наблюдённый лифт при optional stopping завышен в среднем на 20–50%.
Это и есть тот механизм, из-за которого «мы подняли CTR на 40% в тесте», а в проде — 8%.
10.4. Как это чинят взрослые
Вариант 1. Дисциплина. Зафиксируйте n. Не смотрите. Посчитайте один раз. Работает, но у людей нет такой силы воли, и бизнесу нужно уметь останавливать провальные тесты досрочно.
Вариант 2. Групповые последовательные границы (group sequential). Планируете K промежуточных анализов и распределяете α между ними по функции трат (alpha spending function).
- Границы Покока (Pocock): одинаковый порог на всех проверках, но строже 0,05. При 5 проверках порог ≈ 0,0158 на каждой.
- Границы О'Брайена — Флеминга: очень строгий порог в начале (
p < 0,0001), почти обычный в конце (p ≈ 0,046). Логика: чтобы остановить тест рано, нужны очень сильные доказательства. Это дефолт в клинических испытаниях и лучший выбор для бизнеса. - Функция трат Лана — ДеМетса — обобщение, позволяет неравные интервалы между проверками.
Вариант 3. Всегда валидные p-value / SPRT. Последовательный тест отношения правдоподобия (Wald's SPRT) и его смешанное расширение mSPRT дают статистику, на которую можно смотреть непрерывно, не тратя α. Реализовано в Optimizely (Stats Engine), GrowthBook (sequential mode), Statsig (по умолчанию).
Цена: доверительные интервалы становятся шире (обычно на 20–40%), то есть нужен больший объём выборки, если эффект не большой. Это честная плата за право подглядывать.
Вариант 4. Байесовское решающее правило с ожидаемыми потерями и минимальным объёмом выборки. Формально байесовский апостериор не «портится» от подглядывания в том смысле, в каком портится p-value (он всегда корректно отражает информацию в данных). Но правило остановки «останавливаюсь, когда P(B>A) > 0,95» всё равно даёт смещённые оценки эффекта и повышенный процент ошибочных внедрений при слабом априоре. Лечится:
- содержательным (informative) априором;
- минимальным объёмом выборки до первого просмотра;
- порогом по ожидаемым потерям, а не по вероятности.
Практическая рекомендация для маркетплейса:
Зафиксируйте минимальный срок теста в полных неделях (7, 14, 21 день) — это снимает недельную сезонность. Не смотрите первые 7 дней вообще. Начиная с 8-го дня разрешите себе одну проверку в неделю по правилу ожидаемых потерь. Границу «остановить как провальный» ставьте отдельно от границы «остановить как успешный» — провальные тесты можно и нужно убивать раньше.
11. Множественные сравнения
11.1. Проблема
Тестируете 4 фото. Попарных сравнений: C(4,2) = 6. При α = 0,05 на каждое:
P(хотя бы одна ложная победа) = 1 − 0,95⁶ = 26,5%
Тестируете 20 гипотез за квартал — в среднем одна из них окажется «значимой» случайно.
Множественность возникает не только из числа вариантов. Она возникает из:
- числа метрик (посмотрели CTR, CR, AOV, выручку — четыре шанса);
- числа сегментов («а давай посмотрим отдельно на мобильных, на десктопе, на новых пользователях, в Москве…»);
- числа временных срезов (то самое подглядывание — это множественность во времени).
Сегментный p-hacking особенно коварен: тест провалился, вы режете данные на 8 сегментов, находите один, где p = 0,03, и пишете «фото B работает на женщинах 25–34». Вероятность найти такой сегмент случайно ≈ 34%.
11.2. Поправки
Бонферрони. α' = α / m. Простая, консервативная, всегда корректная. При 6 сравнениях: α' = 0,0083.
Холм — Бонферрони (step-down). Сортируем p-value по возрастанию, сравниваем p₍ᵢ₎ с α/(m − i + 1). Равномерно мощнее Бонферрони, так же строго контролирует FWER. Используйте вместо Бонферрони всегда.
Бенджамини — Хохберг (BH, FDR). Контролирует не вероятность хоть одной ошибки (FWER), а ожидаемую долю ошибок среди объявленных побед (FDR). Сортируем p-value, ищем наибольшее i, для которого p₍ᵢ₎ ≤ (i/m)·q, отвергаем все до него.
Когда что:
- Одно ключевое решение, дорогая ошибка → Холм (FWER).
- Скрининг гипотез, где вы готовы к 10% брака среди «побед» → BH (FDR,
q = 0,1). - Одна первичная метрика (OEC) заранее объявлена, остальные — вторичные → поправка не нужна для первичной, вторичные помечаются как «исследовательские, без вывода».
Последний пункт — самый практичный. Заранее объявите одну метрику главной. Тогда никакой множественности по метрикам нет. Всё остальное вы смотрите «для понимания», а не «для решения».
11.3. Байесовский взгляд
В байесовской иерархической модели проблема множественности решается усадкой (shrinkage) автоматически: если вы моделируете эффекты 6 фото как выборку из общего распределения, экстремальные оценки притягиваются к среднему, и ложные «победители» гасятся без явных поправок. Это не магия — это тот же самый эффект, что и поправка Бонферрони, но выраженный через априор.
Часть IV. Байесовский подход
12. Бета-биномиальная модель
12.1. Почему именно бета
Мы хотим говорить о p (истинном CTR) как о случайной величине, у которой есть распределение, отражающее наше знание. До эксперимента — априорное P(p). После — апостериорное P(p | данные).
Теорема Байеса:
P(p | s, n) ∝ P(s, n | p) · P(p)
↑ ↑
правдоподобие априор
(биномиальное)
Если взять априор в виде бета-распределения Beta(α, β), то апостериорное получается тоже бета — просто с обновлёнными параметрами. Это называется сопряжённостью (conjugacy), и это делает всю математику тривиальной:
Априор: p ~ Beta(α₀, β₀)
Данные: s кликов из n показов
Апостериор: p | данные ~ Beta(α₀ + s, β₀ + n − s)
Всё. Никаких MCMC, никаких численных интегралов. Две строчки арифметики.
Интерпретация параметров: α — «сколько кликов мы как бы видели», β — «сколько не-кликов». α + β — «эквивалентный размер выборки» априора, то есть сила вашего убеждения.
12.2. Свойства апостериорного распределения
Среднее: E[p] = α / (α + β)
Мода: (α − 1) / (α + β − 2) при α, β > 1
Дисперсия: αβ / ((α+β)² (α+β+1))
При больших n апостериор быстро сходится к нормальному с центром s/n и дисперсией p(1−p)/n — то есть совпадает с частотной картиной. Байес и частотник расходятся ровно там, где данных мало. Там, где вы живёте.
13. Выбор априора
Это единственное место, где байесовский подход даёт свободу — и, соответственно, единственное место, где его можно испортить.
13.1. Стандартные варианты
| Априор | Параметры | «Вес» | Комментарий |
|---|---|---|---|
| Равномерный (Байеса — Лапласа) | Beta(1, 1) |
2 наблюдения | Нейтрально, безопасно, но глупо: он говорит, что CTR 90% так же вероятен, как 3% |
| Джеффриса | Beta(0.5, 0.5) |
1 наблюдение | Инвариантный, отличное частотное покрытие |
| Хальдейна | Beta(0, 0) |
0 | Несобственный, апостериор = MLE. Ломается при s=0 |
| Эмпирический | Beta(α̂, β̂) из ваших данных |
50–5000 | Правильный ответ |
13.2. Эмпирический байес — то, чего вам не хватало
У вас есть 200 карточек. У каждой известен CTR за последний месяц. Распределение этих CTR по вашему ассортименту — это и есть ваш априор.
Как посчитать. Пусть по вашим карточкам средний CTR m = 0,030, а стандартное отклонение CTR между карточками s = 0,012. Метод моментов:
Пусть ν = α + β (сила априора)
m = α / ν
s² = m(1−m) / (ν + 1)
⇒ ν = m(1−m)/s² − 1 = 0,03 × 0,97 / 0,000144 − 1 = 202,1 − 1 = 201,1
⇒ α = m·ν = 0,030 × 201,1 = 6,03
⇒ β = ν − α = 195,1
Итого априор Beta(6, 195). Он эквивалентен 201 «виртуальному показу» с 6 кликами. Это разумно: он говорит «CTR почти наверняка между 1% и 6%», но не мешает данным.
Что это даёт на практике. Карточка получила 3 клика из 50 показов (наблюдённый CTR 6%!). Наивная оценка: 6%. Эмпирический байес:
Апостериор = Beta(6+3, 195+47) = Beta(9, 242)
E[p] = 9/251 = 3,59%
Байес говорит: «не радуйтесь, скорее всего у вас 3,6%, а 6% — это удача». Это и есть усадка (shrinkage), и это буквально автоматическая защита от winner's curse.
13.3. Правила гигиены априора
- Априор фиксируется до данных. Записан, датирован. Иначе вы просто подгоняете.
- Априор должен быть слабее данных. Если
α₀ + β₀сопоставимо сn, вы делаете вывод об априоре, а не о фото. - Проверьте чувствительность. Пересчитайте вывод при
Beta(1,1), при вашем эмпирическом, при вдвое более сильном. Если решение меняется — данных мало, тест не закончен. - Никогда не используйте разные априоры для A и B. Это то же самое, что подкрутить весы.
14. P(B > A), ожидаемые потери, HDI и ROPE
14.1. Вероятность превосходства
P(p_B > p_A) = ∫∫ [p_B > p_A] · Beta(p_A; α_A, β_A) · Beta(p_B; α_B, β_B) dp_A dp_B
Есть точная формула через ряд (Эванс, Кук), но на практике все считают Monte Carlo — сэмплим по 200 000 точек из каждого апостериора и считаем долю случаев p_B > p_A. Три строчки кода.
Наш пример (априор Beta(1,1)):
Апостериор A: Beta(1 + 1680, 1 + 58320) = Beta(1681, 58321) E[p] = 2,8016%
Апостериор B: Beta(1 + 1860, 1 + 58140) = Beta(1861, 58141) E[p] = 3,1014%
P(p_B > p_A) ≈ 0,9989 → 99,89%
Вот теперь это можно говорить бизнесу: «вероятность того, что фото B лучше, — 99,9%». Это ровно то утверждение, которое частотный p-value = 0,0021 не позволяет сделать, хотя все его именно так и трактуют.
14.2. Почему одного P(B>A) недостаточно
Возьмём тот же тест, но на маленьких данных:
A: 56 кликов из 2 000 (2,80%)
B: 62 клика из 2 000 (3,10%)
P(p_B > p_A) ≈ 0,71 → 71%
Продавец видит «71% вероятность, что B лучше» и внедряет. Это ошибка. 71% — это почти монетка. Но главное — эта цифра ничего не говорит о величине возможного ущерба.
14.3. Ожидаемые потери (Expected Loss)
Правильная величина для принятия решения:
Loss(выбрать B) = E[ max(p_A − p_B, 0) ]
Loss(выбрать A) = E[ max(p_B − p_A, 0) ]
Смысл: «если я выберу B, а на самом деле лучше был A, сколько CTR я в среднем потеряю?» Считается той же симуляцией.
Большой тест (60 000 на вариант):
Loss(B) ≈ 3,1 × 10⁻⁷ = 0,00003 п.п.
Ничтожно. Внедряем.
Маленький тест (2 000 на вариант):
Loss(B) ≈ 9,7 × 10⁻⁴ = 0,097 п.п.
То есть в среднем вы рискуете потерять почти 0,1 п.п. CTR — 3,5% от базового значения. При том что ожидаемый выигрыш — 10,7%. Соотношение риск/доход паршивое.
Порог решения (threshold of caution). Заранее фиксируете ε — сколько вы готовы потерять. Разумный дефолт:
ε = 0,5% от базовой метрики в относительном выражении
для CTR 2,8%: ε = 0,014 п.п. = 1,4 × 10⁻⁴
Правило: внедряем B, если Loss(B) < ε.
В большом тесте 0,00003 п.п. < 0,014 п.п. → внедряем.
В маленьком 0,096 п.п. > 0,014 п.п. → продолжаем собирать данные.
Обратите внимание, насколько это правило умнее, чем «P > 95%». Оно учитывает и вероятность, и величину ошибки. Оно естественно переводится в деньги. И оно не требует поправок на подглядывание в такой же степени, потому что ожидаемые потери — это не тестовая статистика, а прямая оценка риска решения.
14.4. HDI и ROPE
HDI (Highest Density Interval) — байесовский аналог доверительного интервала: самый узкий интервал, содержащий 95% апостериорной массы. В отличие от частотного CI, его можно трактовать по-человечески: «с вероятностью 95% истинный CTR лежит здесь».
ROPE (Region Of Practical Equivalence) — зона практической эквивалентности. Вы объявляете: «разница меньше ±2% относительно для меня равна нулю» (потому что перерисовывать 500 карточек ради 1% не стоит).
Решающее правило:
95% HDI разницы целиком ВНЕ ROPE и справа → внедряем B
95% HDI целиком ВНУТРИ ROPE → варианты эквивалентны, оставляем A (дешевле)
95% HDI пересекает границу ROPE → данных недостаточно, продолжаем
Это единственная известная мне схема, которая позволяет доказать отсутствие эффекта. Частотный тест этого не умеет: «не отвергли H₀» ≠ «H₀ верна». А для бизнеса вывод «эти два фото реально одинаковы, перестаньте спорить» стоит дорого.
14.5. Байес vs частотник: честное сравнение
| Частотный | Байесовский | |
|---|---|---|
| Что вычисляет | P(данные | H₀) |
P(гипотеза | данные) |
| Отвечает на вопрос, который вы задавали | Нет | Да |
| Требует априора | Нет (притворяется) | Да (честно) |
| Подглядывание | Ломает α | Не ломает апостериор, но смещает решения при слабом априоре |
| Доказать отсутствие эффекта | Нельзя | Можно (ROPE) |
| Малые выборки | Плохо | Хорошо (если есть разумный априор) |
| Множественность | Нужны поправки | Решается иерархией/усадкой |
| Объяснить топ-менеджеру | Невозможно | Легко |
| Регуляторный статус | Стандарт | Растёт |
| Скорость счёта | Мгновенно | Мгновенно (для бета-биномиальной) |
Мой практический вердикт для маркетплейса:
Используйте байесовскую бета-биномиальную модель с эмпирическим априором по своей категории, принимайте решения по ожидаемым потерям, но всегда рассчитывайте нужный размер выборки частотным способом заранее и не смотрите на результат раньше первой недели. Это гибрид, но он работает.
Часть V. Monte Carlo
16. Зачем симуляция, если есть формулы
Формулы существуют для простых величин: разности пропорций, отношения пропорций. Как только целевая метрика становится составной, формул нет.
А целевая метрика на маркетплейсе именно составная:
RPM (выручка на 1000 показов) = 1000 × CTR × CR × AOV × BuyoutRate
Здесь четыре случайные величины с четырьмя разными распределениями:
CTR~ Beta (биномиальная природа)CR~ BetaAOV~ логнормальное или эмпирическое, тяжёлый хвостBuyoutRate~ Beta
Доверительный интервал для их произведения аналитически не выводится (можно дельта-методом, но он врёт на хвостах). Monte Carlo решает это в лоб:
- Сэмплируем 100 000 раз каждую величину из её апостериорного распределения.
- Перемножаем поэлементно.
- Получаем 100 000 сэмплов RPM.
- Берём перцентили 2,5% и 97,5% → готовый интервал.
- Считаем долю случаев
RPM_B > RPM_A→ готоваяP(B>A).
Это не приближение и не хак. Это точный ответ (с точностью до ошибки Монте-Карло ~1/√N, которая при N = 100 000 составляет 0,3%).
17. Симуляция апостериорного распределения выручки
17.1. Ключевой сценарий, который ломает наивные тесты
Вернёмся к нашему примеру, но добавим второй этап воронки.
Вариант A: CTR 2,80%, CR (клик→заказ) 6,00%, AOV 1 800 ₽
Вариант B: CTR 3,10%, CR (клик→заказ) 5,70%, AOV 1 800 ₽
B выиграл по CTR (+10,7%), но проиграл по CR (−5,0%). Что с выручкой?
RPM_A = 1000 × 0,0280 × 0,0600 × 1800 = 3 024 ₽
RPM_B = 1000 × 0,0310 × 0,0570 × 1800 = 3 181 ₽ (+5,2%)
B всё ещё выигрывает. Но найдём точку безубыточности по CR:
CR_B* = CTR_A × CR_A / CTR_B = 0,028 × 0,06 / 0,031 = 5,42%
Если бы CR у B упал до 5,4% — B проиграл бы, несмотря на CTR +10,7%.
Это не гипотетика. Это ровно то, что происходит, когда лайфстайл-фото или яркая инфографика привлекает кликами людей, которым товар на самом деле не нужен. CTR растёт, качество трафика падает.
Продавец, который остановился на метрике «CTR», не имеет ни малейшего шанса это заметить.
17.2. Код
import numpy as np
from scipy import stats
rng = np.random.default_rng(42)
N = 200_000
# ---------- Данные эксперимента ----------
# Показы / клики / заказы
data = {
"A": dict(impr=60_000, clicks=1680, orders=101, buyout=0.78),
"B": dict(impr=60_000, clicks=1860, orders=106, buyout=0.74),
}
AOV = 1800.0
# ---------- Априоры (эмпирический байес по категории) ----------
CTR_PRIOR = (6.0, 195.0) # Beta(6, 195): среднее ~3%
CR_PRIOR = (5.0, 78.0) # Beta(5, 78): среднее ~6%
BUY_PRIOR = (78.0, 22.0) # Beta(78, 22): среднее 78%
def posterior_samples(v):
d = data[v]
ctr = rng.beta(CTR_PRIOR[0] + d["clicks"],
CTR_PRIOR[1] + d["impr"] - d["clicks"], N)
cr = rng.beta(CR_PRIOR[0] + d["orders"],
CR_PRIOR[1] + d["clicks"] - d["orders"], N)
buy = rng.beta(BUY_PRIOR[0] + d["buyout"] * d["orders"],
BUY_PRIOR[1] + (1 - d["buyout"]) * d["orders"], N)
rpm = 1000 * ctr * cr * AOV * buy
return ctr, cr, buy, rpm
ctr_a, cr_a, buy_a, rpm_a = posterior_samples("A")
ctr_b, cr_b, buy_b, rpm_b = posterior_samples("B")
def report(name, a, b, scale=1.0, unit=""):
diff = b - a
lift = diff / a
print(f"{name}:")
print(f" A = {a.mean()*scale:.4f}{unit} "
f"95% HDI [{np.percentile(a,2.5)*scale:.4f}; {np.percentile(a,97.5)*scale:.4f}]")
print(f" B = {b.mean()*scale:.4f}{unit} "
f"95% HDI [{np.percentile(b,2.5)*scale:.4f}; {np.percentile(b,97.5)*scale:.4f}]")
print(f" P(B>A) = {(diff>0).mean():.4f}")
print(f" Лифт = {lift.mean()*100:+.2f}% "
f"95% CI [{np.percentile(lift,2.5)*100:+.2f}%; {np.percentile(lift,97.5)*100:+.2f}%]")
# Ожидаемые потери при выборе B
loss_b = np.maximum(a - b, 0).mean()
loss_a = np.maximum(b - a, 0).mean()
print(f" E[Loss | выбрали B] = {loss_b*scale:.6f}{unit}")
print(f" E[Loss | выбрали A] = {loss_a*scale:.6f}{unit}\n")
report("CTR", ctr_a, ctr_b, 100, "%")
report("CR", cr_a, cr_b, 100, "%")
report("Выкуп", buy_a, buy_b, 100, "%")
report("RPM", rpm_a, rpm_b, 1, " ₽")
Что вы увидите: CTR — уверенная победа B. CR — неопределённость (заказов мало, интервал широкий). Выкуп — падение, но статистически шаткое. RPM — победа B, но с интервалом, который может задевать ноль.
И это правильный ответ. Он честно говорит: «CTR вырос, но по деньгам мы не уверены, потому что заказов слишком мало». Наивный тест сказал бы «победа!».
17.3. Практический вывод про воронку
Заказов на два порядка меньше, чем показов. Значит, доверительный интервал для CR всегда будет на порядок шире, чем для CTR. Значит:
Тест главного фото по метрике «выручка» почти всегда недомощён. У вас никогда не хватит заказов. Реалистичный дизайн: принимаем решение по CTR как первичной метрике, а CR/выкуп используем как guardrail с широким порогом («не упало больше чем на 10% с вероятностью 90%»).
Это компромисс, но осознанный. Хуже — делать вид, что вы измерили выручку, когда у вас 100 заказов.
18. Симуляция дизайна: считаем мощность и цену подглядывания
Monte Carlo нужен не только для анализа результата, но и до эксперимента — чтобы проверить сам дизайн.
18.1. Проверка мощности через симуляцию
import numpy as np
from scipy.stats import norm
rng = np.random.default_rng(0)
def z_test(sa, na, sb, nb):
pa, pb = sa/na, sb/nb
p = (sa+sb)/(na+nb)
se = np.sqrt(p*(1-p)*(1/na + 1/nb))
if se == 0:
return 1.0
z = (pb-pa)/se
return 2*(1-norm.cdf(abs(z)))
def power_sim(p_a, lift, n, alpha=0.05, sims=20_000):
p_b = p_a * (1 + lift)
wins = 0
for _ in range(sims):
sa = rng.binomial(n, p_a)
sb = rng.binomial(n, p_b)
if z_test(sa, n, sb, n) < alpha and sb/n > sa/n:
wins += 1
return wins / sims
print(power_sim(0.028, 0.10, 57_000)) # ≈ 0.80 — сходится с формулой
print(power_sim(0.028, 0.05, 57_000)) # ≈ 0.29 — тест почти слеп к +5%
print(power_sim(0.028, 0.10, 10_000)) # ≈ 0.24
Третья строчка — приговор большинству реальных тестов. При 10 000 показов на вариант вы поймаете реальный эффект +10% лишь в 24% случаев. Три из четырёх настоящих улучшений вы выбросите как «незначимые».
18.2. Симуляция цены подглядывания
def peeking_sim(p, n_total, n_peeks, alpha=0.05, sims=5_000):
"""Истинного эффекта НЕТ. Считаем, как часто мы ложно объявим победу."""
false_pos = 0
checkpoints = np.linspace(n_total/n_peeks, n_total, n_peeks).astype(int)
for _ in range(sims):
a = rng.random(n_total) < p
b = rng.random(n_total) < p
for k in checkpoints:
if z_test(a[:k].sum(), k, b[:k].sum(), k) < alpha:
false_pos += 1
break
return false_pos / sims
for peeks in [1, 2, 5, 10, 20]:
print(peeks, round(peeking_sim(0.028, 60_000, peeks), 3))
Запустите. Вы получите примерно 0.05 / 0.08 / 0.14 / 0.19 / 0.25. Распечатайте и повесьте над рабочим местом.
18.3. Симуляция всей программы экспериментов
Самое ценное применение. Задайте:
- сколько тестов вы делаете в год (например, 24);
- какова доля истинных гипотез (ваш априор, например 20%);
- каково распределение размеров истинных эффектов (например,
N(+8%, 6%)); - ваш трафик и правило остановки.
Прогоните 10 000 симуляций года. Получите: сколько побед вы объявите, сколько из них настоящих, каков будет суммарный реальный прирост метрики за год, и какова доля внедрений, которые на самом деле ухудшили карточку.
Это единственный способ сравнить, например, «24 быстрых недомощных теста» против «8 медленных мощных». Ответ обычно неожиданный: при доле истинных гипотез 20% и мощности 25% программа из 24 быстрых тестов даёт отрицательный суммарный эффект, потому что внедряет больше мусора, чем находит золота.
19. Бутстрап для тяжёлых хвостов
Когда метрика — деньги (выручка на посетителя), биномиальная модель неприменима. Распределение выручки: 94% нулей, потом длинный правый хвост до 40 000 ₽ за заказ.
t-тест на таких данных при n < 10 000 даёт заниженные p-value. Решение — бутстрап:
def bootstrap_diff(x, y, B=20_000, alpha=0.05):
rng = np.random.default_rng(1)
nx, ny = len(x), len(y)
diffs = np.empty(B)
for b in range(B):
xb = x[rng.integers(0, nx, nx)]
yb = y[rng.integers(0, ny, ny)]
diffs[b] = yb.mean() - xb.mean()
lo, hi = np.percentile(diffs, [100*alpha/2, 100*(1-alpha/2)])
return diffs.mean(), lo, hi, (diffs > 0).mean()
Дополнительно к бутстрапу:
- Винзоризация: обрежьте верхний 0,5% значений до 99,5-го перцентиля. Резко снижает дисперсию, чуть смещает оценку. Statsig делает это автоматически. Обязательно объявляйте порог до просмотра данных.
- Разложение метрики:
Revenue/visitor = CR × AOV. Тестируйте компоненты отдельно — уCRхорошая биномиальная дисперсия, уAOV(по заказавшим) хвост короче.
Часть VI. Маркетплейсная реальность
20. Почему «чистый A/B» на WB и Ozon почти невозможен
В веб-эксперименте вы контролируете сервер: делите пользователей по хешу user_id, показываете разные версии, логируете всё сами. На маркетплейсе вы не контролируете ничего. Вы отдаёте картинку в чужую систему и получаете агрегированную статистику.
Из этого следует четыре фундаментальных ограничения.
1. Вы не можете рандомизировать сами. Либо площадка даёт вам сплит (WB «А/Б-тесты», Ozon A/B, Amazon MYE), либо вы физически не можете показать двум разным покупателям одновременно разные фото одной карточки — кроме как через API-ротацию во времени.
2. Ранжирование реагирует на результат теста. Если вариант B получает больше кликов, карточка растёт в выдаче — и получает больше показов, часто на более выгодных позициях. Это интерференция: воздействие на одну группу меняет условия для другой. В веб-экспериментах это редкость, здесь — норма.
3. Позиция — доминирующий конфаундер. CTR на 1-й позиции выдачи в 5–10 раз выше, чем на 20-й. Любая разница в среднеих позициях между вариантами полностью перекрывает эффект фото. Именно поэтому «сравнить неделю до и неделю после» — метод, у которого отношение сигнал/шум близко к нулю.
4. Данных вам дают мало и с задержкой. Часовая гранулярность, агрегаты, отсутствие индивидуальных логов. Забудьте про CUPED на уровне пользователя.
21. Каталог конфаундеров
| Конфаундер | Как проявляется | Как лечить |
|---|---|---|
| Позиция в выдаче | B стоял выше, потому что тест начался после буста | Встроенный сплит площадки; либо контроль по средней позиции; либо фиксировать рекламу |
| Ранжирование (обратная связь) | B поднял CTR → поднял ранг → ещё больше CTR | Мерить CTR (отношение), а не абсолютные клики; короткие тесты |
| Реклама | Изменили ставку или запустили АРК/Трафареты в середине теста | Заморозить рекламные настройки на весь тест. Записать это в протокол |
| Сезонность внутри недели | Выходные конверсят иначе | Только полные недели: 7 / 14 / 21 день |
| Сезонность года, праздники | 8 марта, 11.11, чёрная пятница | Не тестировать в пиковые недели вообще |
| Акции и скидки площадки | Ваш товар попал в акцию в среду | Guardrail-проверка: цена постоянна? |
| Эффект новизны | Постоянные покупатели реагируют на смену картинки | Смотреть динамику эффекта по дням: если лифт затухает — это новизна |
| Остатки | Товар кончился на складе на 4-й день | WB прямо отменяет тест в этом случае. Проверяйте сток |
| Отзывы | За период теста пришло 30 новых отзывов и рейтинг вырос | Действует на оба варианта одинаково при рандомизации; ломает pre/post |
| Конкуренты | Сосед по выдаче поменял фото и цену | Ничего не сделать; ещё один аргумент за одновременный сплит |
| Изменение алгоритма площадки | Ozon/WB катят свой A/B-тест поверх вашего | Ничего не сделать. Аргумент за повторяемость тестов |
Последний пункт стоит осмыслить отдельно: маркетплейсы сами постоянно проводят A/B-тесты на покупателях — по расположению видеообложек, по отображению отзывов, по вёрстке выдачи. Часть вашей аудитории в момент вашего теста находится внутри чужого эксперимента. При корректной рандомизации это просто добавляет дисперсии. При pre/post-сравнении это добавляет смещения, и вы никогда не узнаете об этом.
22. Квазиэксперименты: когда рандомизации нет
22.1. Ротация во времени (то, что делают сервисы через API)
Механика: скрипт меняет главное фото каждые 30–60 минут, собирает статистику по интервалам, в конце сравнивает.
Это switchback-эксперимент. Он валиден при трёх условиях:
- Достаточно много переключений. Не 2 блока по неделе, а 300+ блоков. Тогда случайные факторы (час, день, позиция) распределяются между вариантами примерно поровну.
- Порядок блоков рандомизирован, а не строго чередуется. Строгое чередование A-B-A-B синхронизируется с суточным циклом: если период 1 час, а вы меняете каждые 30 минут, вариант A всегда попадает на первую половину часа. Реальные периодичности бывают неожиданными.
- Нет carryover-эффекта. Покупатель, увидевший фото A, кликает не сразу; клик логируется, когда уже висит фото B. При 30-минутных блоках это загрязняет данные на несколько процентов.
Как чинить:
- Рандомизируйте порядок блоков (не
ABABAB, аABBABAAB…). - Балансируйте по часам: каждый час дня должен получить примерно поровну A и B.
- Отбрасывайте первые 2–5 минут каждого блока (washout period).
- Анализируйте как парные наблюдения по часам, а не как две большие кучи.
Что произойдёт, если этого не делать: вы получите систематическое смещение, которое невозможно обнаружить по данным. Именно поэтому «мы прогнали 50 тестов через ротатор, у нас статистика» — само по себе не аргумент.
22.2. Difference-in-Differences (DiD)
Если нельзя рандомизировать, можно взять контрольную группу карточек, на которых вы ничего не меняете.
Эффект = (CTR_тест_после − CTR_тест_до) − (CTR_контроль_после − CTR_контроль_до)
Второй член вычитает всё, что случилось со всем рынком за период: сезонность, изменение алгоритма, праздники.
Критическое допущение — параллельные тренды. До вмешательства обе группы должны двигаться синхронно. Обязательно проверьте это на 4–8 неделях истории: постройте графики, посмотрите, идут ли линии параллельно. Если нет — DiD невалиден.
Как выбирать контроль: карточки той же категории, того же ценового сегмента, схожего объёма трафика, у которых вы гарантированно ничего не трогаете. Минимум 5–10 карточек. Идеально — matched pairs по предэкспериментальному CTR.
22.3. Синтетический контроль / CausalImpact
Развитие DiD: строим взвешенную комбинацию контрольных карточек, которая лучше всего воспроизводит траекторию тестовой карточки до вмешательства, затем экстраполируем и сравниваем с фактом. Байесовская структурная модель временных рядов (пакет CausalImpact от Google, есть порт на Python tfcausalimpact).
Когда применять: тест на одной большой карточке, где рандомизация невозможна, но есть хорошие «соседи» и 8+ недель истории. Даёт апостериорное распределение эффекта и, что важно, кумулятивный эффект в деньгах.
Когда не применять: если контрольные карточки конкурируют с тестовой (каннибализация) — тогда вмешательство влияет и на контроль, и оценка смещена.
22.4. Иерархия достоверности методов
1. Рандомизированный сплит показов площадкой ← золотой стандарт
2. Рандомизированный switchback с washout ← хорошо
3. Матчинг карточек-близнецов + DiD ← приемлемо
4. Синтетический контроль на одной карточке ← приемлемо
5. Наивное сравнение «две недели до / две недели после» ← мусор
6. «Я поменял фото и продажи выросли» ← не является данными
23. SRM, A/A-тесты и парадокс Симпсона
23.1. Sample Ratio Mismatch — первое, что надо проверять
Вы ждали сплит 50/50. Получили 60 000 показов на A и 57 300 на B. Это нормально?
χ²-проверка:
Ожидание: 58 650 / 58 650
χ² = (60000−58650)²/58650 + (57300−58650)²/58650 = 31,1 + 31,1 = 62,2
p ≈ 3 × 10⁻¹⁵
Это катастрофа. Расхождение в 2,3% при такой выборке невозможно случайно. Значит, что-то в механике сплита сломано: показы теряются, один вариант чаще не догружается, модерация задержала B на два дня, товар кончался и т.д.
Правило: если SRM p < 0,001 — тест недействителен. Не анализируйте результат. Ищите баг.
Это правило спасает от огромного числа ложных выводов, потому что причина, которая перекосила сплит, почти всегда перекосила и метрику.
23.2. A/A-тест
Запустите тест, где A и B — одна и та же фотография. Прогоните полный цикл: сплит, сбор, анализ.
Что должно получиться: p-value равномерно распределён, значимость встречается в 5% случаев, SRM отсутствует, интервалы покрывают ноль в 95% случаев.
Что часто получается: значимость в 15% случаев (значит, ваша дисперсия занижена — сверхдисперсия из-за повторных показов), или систематический перекос (значит, механика сплита кривая).
Профессионалы делают A/A-тест перед тем, как доверять новому инструменту. Один раз. Это стоит две недели трафика на одной карточке и экономит год иллюзий. Особенно это касается сторонних сервисов-ротаторов, где никто не проверял корректность рандомизации.
23.3. Парадокс Симпсона
Реальный сценарий. Ваш тест дал:
| Показы | Клики | CTR | |
|---|---|---|---|
| A | 60 000 | 2 100 | 3,50% |
| B | 60 000 | 1 280 | 2,13% |
Вывод: A разгромно побеждает. Меняем обратно.
Теперь разрежем по устройствам:
| Сегмент | Показы | Клики | CTR | |
|---|---|---|---|---|
| Мобильные | A | 50 000 | 2 000 | 4,00% |
| Мобильные | B | 20 000 | 840 | 4,20% |
| Десктоп | A | 10 000 | 100 | 1,00% |
| Десктоп | B | 40 000 | 440 | 1,10% |
B побеждает в каждом сегменте. И всё же проигрывает в целом — потому что B получил втрое больше низкоконверсионного десктопного трафика.
Это и есть парадокс Симпсона. Он возникает всегда, когда распределение трафика между сегментами различается по вариантам — то есть при SRM внутри сегментов.
Что делать:
- Проверять SRM не только глобально, но и по каждому крупному сегменту (устройство, источник трафика, регион).
- Использовать стратифицированную оценку: считать эффект внутри страт и взвешивать по общей доле страты, а не по фактическому распределению внутри вариантов (метод Мантеля — Хензеля).
- При корректной рандомизации показов парадокс Симпсона практически невозможен — что ещё раз объясняет, почему встроенный сплит площадки лучше самодельной ротации.
Часть VII. Методики тестирования фото
24. Семь уровней валидности
| Уровень | Метод | Что меряет | Валидность | Стоимость | Скорость | Риск для карточки |
|---|---|---|---|---|---|---|
| 0 | Экспертная оценка, чек-лист | Ничего | — | 0 | Минуты | Нет |
| 1 | Опрос своей аудитории (TG, VK) | Заявленное предпочтение | Низкая | 0 | Часы | Нет |
| 2 | Панельный тест (PickFu, Lyssna) | Предпочтение в лабораторных условиях | Средняя | $15–150 | 1–24 ч | Нет |
| 3 | Панельный тест в макете выдачи | Выбор среди конкурентов | Выше средней | $30–300 | 1–24 ч | Нет |
| 4 | Внешний трафик на клон выдачи (Директ/VK) | CTR на реальном трафике | Хорошая | 5–50 тыс. ₽ | 2–5 дней | Нет |
| 5 | Внутренняя реклама площадки, ротация по API | CTR на реальных покупателях, но во времени | Хорошая (при правильном switchback) | Стоимость рекламы | 3–14 дней | Средний |
| 6 | Встроенный A/B площадки | Всё, на реальном сплите | Максимальная | 0–1 000 ₽ | 7–56 дней | Низкий |
Правильная стратегия — воронка методов, а не выбор одного:
10 идей фото
↓ уровень 2–3 (панель, 50 респондентов, $50) отсеиваем 7
3 кандидата
↓ уровень 4 (реклама на макет выдачи, 5 000 ₽) отсеиваем 1
2 финалиста
↓ уровень 6 (встроенный A/B, 14 дней) выбираем 1
1 победитель → раскатываем на категорию
Смысл: дорогой и медленный трафик реального A/B тратится только на гипотезы, пережившие дешёвый отсев. Панельный тест не заменяет A/B — он уменьшает число A/B-тестов, которые нужно провести.
25. Как правильно проводить опросные (предиктивные) тесты
Здесь 90% продавцов делают одну и ту же ошибку, и она обнуляет весь смысл.
25.1. Ошибка: показывать два фото рядом
Респонденту показывают фото A и фото B бок о бок и спрашивают: «какое нравится больше?»
Проблемы:
- В реальности покупатель никогда не видит два ваших фото рядом. Он видит ваше фото среди 40 чужих, в сетке 2×N, размером 160 пикселей, за 0,4 секунды скролла.
- Прямое сравнение включает аналитическое мышление («на этом видно фактуру»), а покупка в выдаче — это распознавание паттерна за доли секунды.
- Респондент отвечает на вопрос «что красивее», а не «на что бы я кликнул».
Корреляция между результатом такого теста и реальным CTR — умеренная. Иногда положительная, иногда нулевая, иногда отрицательная (эстетически «дорогие» фото часто проигрывают «дешёвым, но понятным»).
25.2. Правильный опросный тест
Реконструируйте контекст.
- Сделайте скриншот реальной выдачи по вашему ключу. 20–40 карточек конкурентов, ваш товар на типичной позиции.
- Соберите два макета: в одном на вашем месте фото A, в другом — фото B. Всё остальное идентично.
- Задайте вопрос действия, а не вкуса: «Вы ищете [товар] до 2 000 ₽. На какие 2 карточки вы бы нажали?»
- Ограничьте время показа (5-second test) или используйте click-test с тепловой картой.
- Метрика — доля респондентов, выбравших вашу карточку. Это прокси CTR, а не прокси красоты.
Дополнительно:
- Показывайте изображение в реальном размере превью, а не на весь экран. Если ваш текст на инфографике не читается при ширине 160 px — он не существует.
- Squint-test: размойте фото по Гауссу до неузнаваемости. Осталась ли различимой силуэт-композиция? Это то, что ловит периферическое зрение при скролле.
- Спрашивайте «почему» — открытые комментарии обычно ценнее самих голосов. Именно из них рождаются следующие гипотезы.
25.3. Ограничения панелей
- Панель ≠ ваша аудитория. PickFu — американские респонденты. Для российского маркетплейса их эстетические реакции переносятся плохо (особенно на категории с культурной спецификой).
- Респонденты замотивированы отвечать, а не покупать. Их «клик» ничего не стоит.
- Мотивированные респонденты пишут развёрнуто и вдумчиво — то есть ведут себя противоположно реальному покупателю в состоянии скролла.
Вывод: опросный тест — это фильтр гипотез, а не критерий истины. Он хорошо отсеивает откровенно плохое. Он плохо различает два хороших варианта. Разницу в 3% CTR он не поймает никогда.
26. Многорукие бандиты
26.1. Когда бандит уместнее A/B
A/B-тест разделяет трафик поровну на весь срок, а значит половина трафика гарантированно идёт на худший вариант. Это цена знания. Бандит перераспределяет трафик в пользу лидера по мере накопления данных, снижая эту цену.
| Ситуация | Что использовать |
|---|---|
| Нужна оценка эффекта и её интервал | A/B |
| Нужно решение «какой вариант оставить навсегда» | A/B |
| Много вариантов (5–20), нужно быстро найти лучший | Бандит |
| Короткое окно (распродажа, праздник), цена потерь высока | Бандит |
| Метрика нестационарна (мода, сезон) | Бандит с забыванием |
| Нужно защитить результат перед скептиком | A/B |
Главный подвох: бандит оптимизирует, но не измеряет. Он скажет «фото 3 лучше», но не скажет, насколько и с какой уверенностью — оценки эффекта для проигравших рук сильно смещены (они получили мало трафика, причём именно тогда, когда им не везло).
26.2. Thompson Sampling — лучший бандит для CTR
Идея безупречна: на каждом шаге вытяни по одному сэмплу из апостериорного распределения каждой руки и покажи ту руку, чей сэмпл оказался наибольшим. Разведка и эксплуатация балансируются автоматически, без гиперпараметров.
import numpy as np
rng = np.random.default_rng(7)
class ThompsonPhotos:
def __init__(self, n_arms, prior=(6.0, 195.0)): # эмпирический априор CTR≈3%
self.a = np.full(n_arms, prior[0])
self.b = np.full(n_arms, prior[1])
def choose(self):
return int(np.argmax(rng.beta(self.a, self.b)))
def update(self, arm, clicked):
self.a[arm] += clicked
self.b[arm] += 1 - clicked
def probabilities_best(self, N=50_000):
samples = rng.beta(self.a[:, None], self.b[:, None], size=(len(self.a), N))
winners = samples.argmax(axis=0)
return np.bincount(winners, minlength=len(self.a)) / N
# --- симуляция: 4 фото, истинные CTR ---
true = np.array([0.028, 0.031, 0.026, 0.034])
bandit = ThompsonPhotos(4)
for t in range(200_000):
arm = bandit.choose()
bandit.update(arm, rng.random() < true[arm])
print("Показов на руку:", (bandit.a + bandit.b - 201).astype(int))
print("P(рука лучшая):", np.round(bandit.probabilities_best(), 3))
После 200 000 показов бандит отдаст ~85–95% трафика четвёртому фото и потеряет на разведке лишь несколько процентов кликов — против ~4,5% потерь у равномерного A/B/C/D-теста.
26.3. Варианты и подводные камни
- ε-greedy: с вероятностью ε показываем случайную руку, иначе лучшую. Просто, но неэффективно расходует разведку.
- UCB1: детерминированно выбирает руку с максимальной верхней доверительной границей. Хорош теоретически, хуже на практике при малых различиях.
- Нестационарность: если мода меняется, добавьте забывание — умножайте
aиbна коэффициентγ = 0,995каждый шаг (скользящее окно памяти). - Batch-обновления: маркетплейс не даёт вам решать по каждому показу. Обновляйте раз в час — Thompson сохраняет корректность при батчах.
- Не используйте бандит на карточке с малым трафиком. Он «залипнет» на случайно удачливой руке.
Часть VIII. Практика
27. Что именно тестировать: карта гипотез
Тестировать надо концепции, а не пиксели. Помните таблицу мощности: эффект меньше 10% вы не поймаете. Значит, варианты должны различаться радикально.
27.1. Главное фото — иерархия рычагов по силе эффекта
Сильные (ожидаемый эффект 10–40%):
- Тип кадра: студия на белом / лайфстайл в контексте / макро-фактура / товар в руках / on-model.
- Наличие человека и лица. Лицо ловит взгляд быстрее любого объекта. Работает не везде: в «утилитарных» категориях (крепёж, кабели) мешает.
- Масштаб товара в кадре. Товар на 85% кадра vs товар на 40%. Один из самых недооценённых рычагов: в превью 160 px мелкий товар просто не читается.
- Контраст с фоном и с соседями по выдаче. Если вся выдача белая, цветной фон = +CTR. Если вся выдача пёстрая, белый фон = +CTR. Эффект зависит от конкурентов, а не от вашего фото. Это значит, что «лучшее фото» не существует в вакууме — оно существует относительно выдачи.
- Инфографика на первом слайде: да/нет. Разрешена не везде и не всегда; на WB работает мощно, на Ozon требования жёстче.
Средние (3–10%): 6. Ракурс (фронт / 3/4 / сверху). 7. Цвет модели/товара, который выносится на превью (при мультиварианте). 8. Наличие 1–3 слов текста-крючка («2 в 1», «120 шт», «−40%»). 9. Тени, отражение, «парение» товара.
Слабые (<3%) — не тестируйте по отдельности, только пакетом: 10. Оттенок фона, кегль шрифта, положение плашки, скругление углов.
27.2. Галерея (влияет на CR, не на CTR)
- Порядок слайдов. Второй слайд просматривают ~60% зашедших, пятый — ~20%. Ставьте на 2–3 позицию ответ на главное возражение категории (размер / состав / комплектация).
- Инфографика с 3 смыслами, а не с 12. Читаемость с телефона: минимум 28–32 px кегль в исходнике 1000×1000.
- Видео / видеообложка. На разных площадках правила и позиция видео отличаются и меняются; проверяйте перед тестом — на WB видео на первом месте может блокировать A/B-тест фото.
- Фото «в масштабе» (рядом с рукой, монетой, стандартным предметом) — прямое снижение возвратов.
- Rich-контент / A+: влияет на CR2 и на возвраты; тестируется отдельно, метрика — конверсия в заказ и % возвратов.
27.3. Факторные дизайны
Хотите проверить 3 фактора сразу (фон × наличие лица × плашка)? Полный факторный 2³ = 8 вариантов. Трафика не хватит.
Дробный факторный 2³⁻¹ = 4 варианта позволяет оценить главные эффекты при допущении, что взаимодействия малы. Но на маркетплейсе взаимодействия как раз велики («лицо работает только на цветном фоне»), так что дробные планы опасны.
Практичный ответ: не делайте факторный дизайн. Делайте последовательность: победитель раунда 1 становится контролем в раунде 2. Это медленнее, но надёжно, и каждый раунд даёт понятную интерпретацию.
28. Полный разбор кейса
Контекст. Продавец, категория «термокружки», 6 карточек. Гипотеза: «лайфстайл-кадр (кружка в руке на фоне размытого офиса) даст выше CTR, чем текущее студийное фото на белом».
Шаг 1. Предрегистрация (до запуска)
Дата: 2026-02-02
Гипотеза: лайфстайл-кадр повысит CTR главного фото на ≥10% относительно.
Первичная метрика (OEC): CTR (клики / показы).
Guardrail: CR клик→заказ (не должна упасть >10% отн. с вероятностью 90%);
% выкупа (не ниже 74%); средний рейтинг новых отзывов (не ниже 4,6).
Дизайн: встроенный A/B-тест главного фото, сплит 50/50.
Срок: 14 дней (2 полные недели). Не смотреть результат до дня 8.
Априор CTR: Beta(6, 195) — эмпирический, по 6 карточкам категории.
Правило решения: внедряем B, если E[Loss | B] < 0,014 п.п. И guardrail не нарушены.
Заморозка: рекламные ставки, цена, остатки — без изменений с 02.02 по 16.02.
Ответственный: [имя].
Этот текст — 12 строк. Он делает разницу между экспериментом и гаданием.
Шаг 2. Проверка мощности (до запуска)
Карточка получает ≈ 8 500 показов в день, значит за 14 дней — 119 000, по 59 500 на вариант. По таблице из §8.2: MDE ≈ +10%. Гипотеза заявляет ≥10%. Дизайн адекватен. Запускаем.
Если бы карточка получала 1 500 показов в день — MDE был бы ≈ +23%, и тест надо было бы либо удлинить до 6 недель, либо запускать сразу на всех 6 карточках категории с общим анализом.
Шаг 3. Результат (день 14)
Показы Клики CTR Заказы CR Выкуп
A (студия) 60 000 1 680 2,800% 101 6,01% 78%
B (лайфстайл) 60 000 1 860 3,100% 106 5,70% 74%
Шаг 4. Проверка целостности
SRM: 60 000 / 60 000. χ² = 0, p = 1. ✅
Цена не менялась, реклама заморожена, остатки > 0 всё время. ✅
A/A-тест на этом инструменте проводился в декабре, аномалий нет. ✅
Шаг 5. Частотный анализ (первичная метрика)
p̄ = 0,0295; SE_pooled = 9,769e−4
z = 3,071; p-value = 0,0021 → значимо
95% CI на абсолютную разницу (непулированный SE):
0,300 ± 0,191 п.п. → [0,109; 0,491] п.п.
95% CI на относительный лифт: [+3,9%; +17,6%]
Шаг 6. Байесовский анализ
Апостериор A: Beta(6+1680, 195+58320) = Beta(1686, 58515) E = 2,8003%
Апостериор B: Beta(6+1860, 195+58140) = Beta(1866, 58335) E = 3,1005%
P(B > A) = 0,9989
E[Loss | B] = 0,00003 п.п. < порог 0,014 п.п. ✅
E[Loss | A] = 0,299 п.п. (цена бездействия — сколько теряем, оставив A)
95% HDI лифта = [+3,7%; +18,1%]
ROPE (±2%) = HDI целиком правее → эффект практически значим ✅
Шаг 7. Guardrail
CR: A = 6,01% (101/1680), B = 5,70% (106/1860)
Апостериоры: Beta(5+101, 78+1579) vs Beta(5+106, 78+1754)
P(CR_B < CR_A) = 0,66 → 66%, не уверены
P(CR_B < 0,9 × CR_A) = 0,21 → 21% < 10%-й порог? НЕТ, 21% > 10%
Стоп. Guardrail по CR нарушен: вероятность падения CR больше чем на 10% составляет 21%, а мы объявили порог 10%. Формально тест не проходит.
Шаг 8. Что делает лузер и что делает профессионал
Лузер: «CTR вырос, p = 0,002, победа, раскатываю на все карточки». Через месяц удивляется, почему выручка не выросла.
Профессионал: «CTR почти наверняка вырос. Но у меня всего 207 заказов, и по CR я ничего не знаю. Совместный эффект на выручку неопределён».
Считает RPM симуляцией (код из §17.2):
RPM_A: 3 024 ₽ 95% HDI [2 480; 3 610]
RPM_B: 3 181 ₽ 95% HDI [2 620; 3 790]
P(RPM_B > RPM_A) = 0,68
E[Loss по RPM | B] = 68 ₽ на 1000 показов
Вывод профессионала: «По CTR — уверенная победа. По деньгам — 68% вероятности, что лучше, ожидаемые потери 68 ₽ на 1000 показов при среднем выигрыше 157 ₽. Соотношение приемлемое, но неопределённость велика. Решение: внедрить B на 2 карточках из 6 и продлить наблюдение ещё на 4 недели, отслеживая выкуп и возвраты. Параллельно — тест B′: тот же лайфстайл, но с крупным планом товара (гипотеза: падение CR вызвано тем, что покупатель хуже понимает, что именно он покупает)».
Заметьте: правильный вывод — не «да/нет», а «да, с уточнением и следующим тестом». И заметьте, что гипотеза следующего теста родилась из анализа guardrail, а не из головы.
29. Как делают лузеры и как делают профессионалы
29.1. Сводная таблица
| Аспект | Лузер | Профессионал |
|---|---|---|
| Гипотеза | «Попробуем это фото» | Записана до теста, с ожидаемым эффектом и обоснованием |
| Метрика | Продажи за неделю | Одна OEC + драйверы + guardrail, объявлены заранее |
| Размер выборки | «Посмотрим, когда наберётся» | Рассчитан из MDE, α, мощности |
| Момент остановки | Когда увидел «значимо» | Заранее назначенная дата или последовательная граница |
| Интервал | Не считает | Уилсон / байесовский HDI |
| Решение | «p < 0,05 → внедряем» | Ожидаемые потери vs порог + guardrail |
| Число вариантов | 6 фото, берёт лучшее | 2 варианта, либо бандит с поправкой |
| Сегменты | Режет данные, пока не найдёт победу | Сегменты объявлены заранее или помечены как исследовательские |
| Контроль | «До и после» | Одновременный сплит или DiD с контрольной группой |
| Реклама во время теста | Крутит как обычно | Заморожена, зафиксирована в протоколе |
| Длительность | 3 дня | Целые недели, минимум 7 дней |
| Что делает с провалом | Забывает | Записывает в реестр; провалы обновляют априор |
| Winner's curse | Планирует бюджет по наблюдённому лифту | Использует нижнюю границу или усадку |
| Инструмент | Ротатор без A/A-проверки | Инструмент прошёл A/A-тест |
| Знание об эффекте | «Инфографика работает» | «В этой категории инфографика даёт +8% (CI +2…+14), в той — ноль» |
29.2. Двадцать антипаттернов
- Тест на 300 показах. Интервал шире эффекта в 10 раз. Вы измеряете шум.
- Peeking. Смотреть каждый день и останавливаться на «значимо» = фактическая α ≈ 25%.
- Одновременная смена фото и рекламной ставки. Эффект неразделим. Навсегда.
- Сравнение «неделя до / неделя после». Сезонность, ранг, конкуренты, регрессия к среднему — всё внутри.
- Тест на новинке. У карточки нет стабильного ранга; CTR растёт сам по мере набора истории.
- Тест в праздничную неделю. Аудитория другая, конкуренция другая, всё другое.
- Метрика = продажи. Слишком далеко от вмешательства, слишком шумно.
- CTR как единственная метрика. Ведёт к кликбейт-инфографике и обвалу выкупа.
- Шесть фото, берём лучшее, без поправки. FWER = 40%, «победитель» случаен.
- HARKing (Hypothesizing After Results are Known) — придумать объяснение постфактум и записать его как «мы так и думали».
- Сегментный p-hacking. «На женщинах 25–34 фото сработало» — найдено после теста, значит, не найдено.
- Игнорирование SRM. Сплит 55/45 — это красный флаг, а не «ну почти поровну».
- Вера в чужой кейс. Вы видите только тех, у кого сработало. Survivorship bias.
- «Мне/жене/дизайнеру нравится». Ваша выборка — 1 человек, не входящий в целевую аудиторию.
- Оценка фото в полном размере на 27" мониторе. Покупатель видит 160 px на телефоне.
- Остановка провального теста ради «спасения продаж», без записи. Вы уничтожаете информацию.
- Незамороженные остатки. Товар кончился на 5-й день — вариант B получал показы без стока.
- Ротация по строгому расписанию A-B-A-B. Синхронизируется с суточным циклом.
- Планирование бюджета по наблюдённому лифту победителя. Winner's curse: реальный эффект в проде будет ниже.
- Ноль записей. Через год у вас нет ни одного накопленного знания, только ощущения.
- Источник — статья агентства, а не справка площадки. «В марте 2026 года в чатах селлеров говорят…» — это не источник. Половина таких текстов сгенерирована, ссылается на несуществующие чаты и противоречит соседнему такому же тексту. Проверяемое утверждение об инструменте живёт ровно в одном месте: в справке маркетплейса (см. дисклеймер к части IX).
29.3. Отдельно: почему «у меня 50 тестов, я знаю, что работает»
Если каждый из 50 тестов проведён с фактической α ≈ 30% и мощностью ≈ 25%, то при доле истинных гипотез 20%:
Истинных: 10 → найдено 10 × 0,25 = 2,5
Ложных: 40 → «найдено» 40 × 0,30 = 12
«Побед»: 14,5, из них настоящих: 2,5
Доля настоящих открытий: 17%
Человек с 50 такими тестами имеет 14 убеждений, из которых 12 — ложные. И он абсолютно уверен, потому что «у меня данные». Это опаснее, чем не тестировать вовсе: неверные убеждения масштабируются на весь ассортимент.
Мощность важнее значимости. Недомощный тест — это не «слабый тест». Это генератор ложных убеждений.
30. Guardrail-метрики и OEC — регламент
OEC (одна): RPM = 1000 × CTR × CR × AOV × Выкуп
(если заказов мало — временно CTR, с явной оговоркой)
Драйверы: CTR, CR1 (клик→корзина), CR2 (корзина→заказ), AOV
Guardrail (жёсткие, нарушение = откат):
• % выкупа не ниже baseline − 3 п.п. (95% HDI)
• % возвратов не выше baseline + 2 п.п.
• средний рейтинг новых отзывов не ниже 4,5
• доля отзывов «не соответствует описанию» не выше baseline × 1,5
Guardrail (мягкие, требуют объяснения):
• CR не ниже baseline × 0,9 с вероятностью 90%
• средняя позиция в выдаче не хуже baseline + 2
Метрики целостности (проверяются до анализа):
• SRM: χ²-тест, p > 0,001
• Отсутствие изменений цены, ставок, остатков
• Полные недели
Часть IX. Инструменты
⚠️ Данные этого раздела сверены с первоисточниками 10 июля 2026 года. Условия, тарифы и наличие инструментов меняются каждые несколько месяцев. Там, где официальной документации нет, я это прямо оговариваю — и объясняю, почему это важно.
Дисклеймер, который сам по себе является уроком
Готовя эту часть, я перепроверял факты по открытым источникам. И столкнулся с иллюстрацией всего, о чём написана статья.
По запросу «A/B-тесты Ozon» поисковик первым делом выдаёт статьи агентств с заголовками вида «Мои исследования Ozon 2026: как проводить A/B-тесты карточек». В них — «народные решения из чатов», «в марте 2026 года селлеры называют это детектором лжи для дизайнеров», конкретные цифры («тест стоит 299 рублей», «CTR вырос на 0,8%, а конверсия в корзину на 15%»), уверенные лайфхаки. Внизу — форма заявки на консультацию.
Ни одна из этих цифр не подтверждается справкой Ozon. Разные статьи противоречат друг другу: одна пишет «до трёх вариантов и доступ от оборота 500 тыс. ₽», другая — «два варианта, 299 ₽, 7 дней». Одна из них честно приписывает в подвале: «Эта статья подготовлена с помощью ИИ на основе открытых источников. Возможны неточности».
Это и есть экосистема, в которой селлер принимает решения. Сгенерированный текст ссылается на несуществующие чаты, второй сгенерированный текст ссылается на первый, третий агрегирует оба — и через полгода «все знают», что на Ozon тест главного фото стоит 299 рублей.
Правило: если про инструмент площадки нельзя найти страницу в её собственной справке — считайте, что инструмента нет, пока не увидите его в своём кабинете. Ниже я отделяю подтверждённое от слухов явно.
31. Встроенные инструменты маркетплейсов
31.1. Wildberries — «А/Б-тесты» главного фото
Источник: справочный центр WB, статья «А/Б-тестирование главного фото в карточке товара», обновлена 18.05.2026.
Единственный на WB нативный способ получить настоящую рандомизацию.
Как работает. «Товары и цены → А/Б-тесты» → «+ Тест». Текущее главное фото автоматически становится вариантом А, вы загружаете вариант Б. Модерация — обычно до 3 часов. Аудитория делится на две примерно равные группы, параллельно: половина видит только А, половина — только Б.
Ключевые параметры (проверено):
| Параметр | Значение |
|---|---|
| Сплит | 50/50, назначается площадкой |
| Длительность | от 7 до 56 дней, задаётся при создании |
| Дата старта | текущий день выбрать нельзя |
| Требования к фото Б | PNG/JPG/WEBP, минимум 700×900 px, сжатие не ниже 65%, до 10 Мб |
| Промежуточные результаты | со второго дня после запуска |
| Финальный результат | считается в течение 2 календарных дней после окончания (статус «Ожидание результатов») |
| Метрики в отчёте | показы в поиске, переходы в карточку, добавления в корзину, заказы |
| Выгрузка | да, Excel, из раздела «Статистика» |
| Доступ | только по подписке «Джем» |
| Бесплатные тесты | 5/мес на тарифе «Стандартный», 10/мес на «Продвинутом»; в опции «Подписка „Джем“» из конструктора тарифов — 7 |
| Сверх лимита | 1 000 ₽ за тест. Неизрасходованные сгорают, на новый месяц не переходят |
| Параллельные тесты | можно, если периоды тестов одной карточки не пересекаются |
Условия отмены теста площадкой (важно знать заранее, иначе потеряете две недели):
- на первом месте в карточке стоит видео, а не фото;
- главное фото было изменено вручную во время теста;
- в карточке не осталось ни одного фото;
- карточку заблокировали;
- обнулились остатки на складе;
- техническая ошибка.
Отдельно: тест недоступен при включённом автозапуске видео — его нужно отключить. Перезапустить отменённый тест можно только в случае технической ошибки (и в случае истёкшей подписки — после её продления). Во всех остальных — нет.
Если вы сами остановите тест до модерации — лимит бесплатных тестов сохранится. После модерации — минус один тест.
Тест не даёт карточке дополнительных показов. Это WB подтверждает прямым текстом. Чтобы набрать выборку, нужен собственный трафик или продвижение. С 2026 года кампанию WB Продвижения можно запустить прямо из раздела А/Б-тестов (пока в тестовом режиме, доступно не всем): вы указываете бюджет, площадка подбирает ставку и показывает прогноз показов. Арифметика простая: бюджет ÷ ставка × 1 000 = показы. При бюджете 20 000 ₽ и ставке 200 ₽ за 1 000 показов получится 100 000 показов. Есть галка «остановить продвижение при остановке теста» — ставьте её обязательно, иначе после теста кампания продолжит крутиться.
Интерфейсные вердикты WB и что они значат на самом деле:
| Что показывает WB | Что это значит статистически |
|---|---|
| «Победитель» (корона, зелёный) | Площадка объявила значимый результат по своей (недокументированной) методике. Критерий, α и поправка на множественность метрик неизвестны |
| «Победитель не выявлен» | По одним метрикам лучше А, по другим Б. То есть у вас нет OEC (см. §2) — вы не решили заранее, что важнее |
| «Не стат. значимый результат» | Либо мало трафика, либо эффекта нет. Это две принципиально разные ситуации, и WB их не различает. Различить может только расчёт мощности (§8) или байесовский ROPE (§14) |
Последняя строка таблицы — главное, что нужно вынести. «Не значимо» ≠ «нет разницы». Разберитесь сами, что у вас было: мало данных или действительно нулевой эффект.
Плюсы: реальная рандомизация, нулевой SRM-риск, отсутствие риска для позиций, выгрузка в Excel. Минусы: только главное фото (описание и прочее WB обещает «в будущем»); только два варианта; нужна подписка; при слабом трафике 56 дней может не хватить; интерфейс показывает промежуточные результаты со второго дня и тем самым подталкивает к подглядыванию.
Практика: отключите себе привычку заходить в отчёт раньше 8-го дня. Заранее рассчитайте, хватит ли трафика (§8.2). Заморозьте рекламу и цену. Выберите OEC до старта — тогда вердикт «победитель не выявлен» вас не коснётся.
Сам WB, кстати, в своём FAQ формулирует принцип правильно: разница между недельным и восьминедельным тестом — «в достоверности; если выборка слишком маленькая, результат может оказаться случайным совпадением». Это ровно то, что написано в §3 этой статьи. Инструмент честнее, чем большинство пишущих о нём.
31.2. Ozon — что подтверждается, а что нет
Подтверждается справкой и профильными СМИ: «A/B-тесты цен».
Это инструмент тестирования скидки, а не контента. Раздел «Товары и цены → A/B-тесты цен».
- Сплит 5% / 95%: скидочную цену видят 5% покупателей, обычную — 95%. Премиум-покупатели всегда видят минимальную цену (то есть они выпадают из эксперимента — это, между прочим, нарушение рандомизации по подгруппе).
- Скидка задаётся в диапазоне порядка 5–15%, срок 7–14 дней.
- Можно включить в один тест несколько товаров; одновременно допускается несколько тестов на разные товары.
- Нельзя тестировать товары с включёнными стратегиями ценообразования или акциями (включая автоприменение).
- Метрики: просмотры, добавления в корзину, заказы.
- Результаты — в разделе аналитики «Ваши исследования».
Обратите внимание на дизайн: 5/95 — это не про статистическую эффективность (при таком сплите мощность резко падает: эффективный размер выборки определяется меньшей группой), а про минимизацию потерь маржи от скидки. Площадка оптимизирует свой риск, а не вашу точность. Если считать MDE по формуле из §8 для сплита 5/95, то при том же общем трафике вам понадобится примерно в 5 раз больше показов, чем при 50/50, — это цена «дешёвого» эксперимента.
Подтверждается анонсом Ozon (май 2024): платный A/B-тест главного фото.
Ozon рассылал продавцам предложение с формулировкой: аудитория делится на две группы, первой показывается текущее главное фото, второй — экспериментальное; показ одновременный, чтобы на результат не влияли сезонность, распродажи и новинки конкурентов. Цена — 299 ₽ за тест одного товара, доступ по заявке.
Дизайн правильный, и обоснование Ozon дал ровно то, которое изложено в §22 этой статьи: одновременность нужна, чтобы убрать конфаундеры времени. За 299 ₽ это самый дешёвый рандомизированный эксперимент на российском рынке.
Не подтверждается: всё остальное, что пишут про «Мои исследования» в 2026 году.
В блогах агентств широко описан раздел «Мои исследования» / «A/B-тесты контента» с тестом фото, заголовка, описания и rich-контента, «до трёх вариантов», порогом «оборот от 500 тыс. ₽ в месяц», длительностью «7/14/30 дней». Официальной страницы в базе знаний Ozon, документирующей эту механику, я не нашёл. Публикации противоречат друг другу в ключевых деталях, часть помечена как сгенерированные ИИ. Документированный раздел «Исследования» в аналитике Ozon описывает только тесты цены.
Похоже, что реальность такова: фото-тест существует с 2024 года как платная услуга (299 ₽), а «тестирование заголовков, описаний и rich-контента с тремя вариантами» — надстройка, придуманная контент-маркетологами поверх реального анонса. Проверьте в своём кабинете.
Отдельно отмечу для честности: в первой редакции этого раздела я написал, что фото-тест на Ozon вообще не подтверждается. Это было неверно — я не нашёл анонс 2024 года. Ошибка того же класса, о которой предупреждает вся статья: отсутствие доказательства я принял за доказательство отсутствия. Формально §14 про ROPE ровно об этом: чтобы утверждать «эффекта нет», нужны отдельные основания, а не просто «значимости не обнаружено».
Что делать: откройте свой кабинет и посмотрите. Если раздел есть — прекрасно, вы получили нативную рандомизацию. Если нет — не платите агентству за «настройку инструмента, которого у вас нет».
Что точно верно про Ozon: площадка сама постоянно ставит эксперименты на покупателях. В феврале–марте 2026 года Ozon, по ответам поддержки продавцам, тестировал отображение отзывов: части аудитории отзывы показывались иначе или не показывались вовсе — включая закреплённые, за которые продавцы платят. Ранее так же тестировалось расположение видеообложек.
Это фундаментально важно для вашей методологии. Ваш «шум» — это чей-то чужой эксперимент. Если в вашем pre/post-сравнении конверсия упала на 12%, это может быть не ваше новое фото, а то, что половина ваших покупателей две недели не видела отзывов. Рандомизированный тест устойчив к этому (обе группы одинаково попадают в чужие эксперименты). Последовательное сравнение периодов — нет. Это ещё один аргумент в пользу §22.
31.3. Яндекс Маркет и другие RU-площадки
Публично документированного нативного A/B-инструмента для главного фото нет (проверено 10.07.2026). Есть только требования к контенту: главное фото квадратное, от 600×600 до 2000×2000 px (для одежды и обуви допускается 3:4), JPG/PNG, до 10 Мб, до 30 изображений в карточке.
Тестирование — только через ротацию по API и квазиэкспериментальные схемы (см. §22). Проверяйте справку продавца: инструменты появляются быстро.
31.4. Amazon — Manage Your Experiments (MYE)
Самый зрелый инструмент на рынке, полезный как образец того, каким должен быть встроенный A/B. Источник: Seller Central и sell.amazon.com.
- Доступен продавцам с Brand Registry на профессиональном тарифе; нужна роль Brand Representative. Amazon в собственной формулировке ограничивает доступ рынком США; на европейских форумах Seller Central функциональность тоже обсуждается, так что проверяйте свой маркетплейс.
- ASIN должен иметь достаточный трафик за последние недели. Неподходящие ASIN просто не отображаются в списке.
- Тестируются: главное изображение, заголовок, буллеты, описание, A+ Content (включая Brand Story) и видео.
- Сплит 50/50, назначается Amazon.
- Есть мультиатрибутные (одновременные) эксперименты — заголовок, изображения и буллеты в одном эксперименте, — и ML-подсказки для экспериментов с заголовком и A+ Content, построенные на данных тысяч прошлых экспериментов по похожим товарам.
- Рекомендуемая длительность при ручном выборе — 8–10 недель. При предустановленном режиме «до значимости» (run to significance) результат иногда бывает через 4 недели.
- Отчёт: единицы на уникального посетителя, конверсия, продажи, размер выборки, вероятность превосходства варианта и прогноз годового эффекта победителя.
- Победитель может публиковаться автоматически.
- Amazon в маркетинговых материалах заявляет прирост продаж «до 25%». Это заявление продавца инструмента, а не результат независимого исследования; относитесь к нему как к любому «до 25%».
Три вещи, которые Amazon делает правильно, а российские аналоги — нет:
- Инструмент требует записать гипотезу при создании эксперимента. Поле обязательное. Это ровно §37, вшитый в интерфейс.
- Инструмент предупреждает, если варианты слишком похожи, и прямо советует делать их максимально разными — потому что маленький эффект требует огромной выборки (§8).
- Инструмент советует не останавливать эксперимент досрочно, объясняя, что ранние результаты бывают обманчивыми (§10).
И обратите внимание на длительность: 8–10 недель. Amazon, у которого трафика на порядки больше, чем у среднего WB-селлера, считает нормальным гонять тест два месяца. Российский селлер, который «протестировал фото за 3 дня», должен над этим задуматься.
32. Топ-10 сервисов для тестирования фото: Wildberries и Ozon
32.0. Как построен этот рейтинг
Обычный «топ-10 сервисов» в интернете отсортирован по размеру партнёрской комиссии. Этот отсортирован по уровню валидности из §24 — то есть по тому, насколько результат сервиса вообще имеет отношение к реальности.
Позиция в рейтинге = какой ответ вы получите, а не сколько кнопок в интерфейсе.
Классы инструментов:
| Класс | Что это | Уровень валидности (§24) |
|---|---|---|
| 🟢 РКТ | Рандомизированный контролируемый тест на реальных покупателях площадки | 7 |
| 🟡 SW | Switchback: ротация во времени, не рандомизация людей | 4–5 |
| 🟡 РЕК | Тест на рекламном трафике: другая аудитория и позиция | 4 |
| 🟠 ПАН | Панель / опрос: заявленное предпочтение, не поведение | 2–3 |
| 🔴 НАБЛ | Наблюдение, мониторинг, pre/post: не эксперимент | 1 |
Достоверность источника: ✅ официальная документация — ⚠️ сайт/документация сервиса — ❓ только сторонние публикации.
Читать так: 🟢 — можно принимать решение. 🟡 — сигнал для гипотезы, которую надо перепроверить в 🟢. 🟠 — отсев заведомо плохих вариантов до запуска. 🔴 — не тестирование вовсе.
32.1. Топ-10 для Wildberries
| # | Сервис | Класс | Механика | Цена | Честная оценка |
|---|---|---|---|---|---|
| 1 | Нативные А/Б-тесты WB (Джем) ✅ | 🟢 РКТ | Сплит 50/50 живых покупателей, 7–56 дней, два фото, метрики до заказов, выгрузка в Excel | Подписка «Джем» + 5–10 тестов/мес бесплатно, далее 1 000 ₽ | Единственный настоящий эксперимент на WB. Всё остальное в этом списке — либо подготовка к нему, либо суррогат. Минусы: 2 варианта, только главное фото, нужен свой трафик |
| 2 | PickFu ⚠️ (не WB-сервис, но лучший способ отсеять кандидатов) | 🟠 ПАН | Head-to-head + click-test, письменные объяснения каждого голоса | от $1/ответ, минимум $15 | Не измеряет CTR. Измеряет почему. Прогоняйте 4 варианта здесь за $60 → лучшие 2 отправляйте в п. 1. Комментарии дают гипотезы, которых не даст ни один CTR |
| 3 | MPSTATS, «A/B-тесты» ⚠️ | 🟡 РЕК+SW | Внутри рекламной кампании, 1 тест = 1 товар = 1 РК. До 10 фото/видео. Смена по дням или по метрикам. Стратегия «Лучшая позиция». Победитель — автоматически по CTR | В составе тарифа | Мощная механика с двумя встроенными ловушками: победитель по точечной оценке и стратегия, меняющая позицию (см. ниже). Годится, чтобы отсеять явно провальные фото из 10 |
| 4 | MP Manager ⚠️ | 🟡 РЕК+SW | A/B-тесты в кампаниях Автоставок. Два режима: «% кликов» (данные за десятки минут) и «Корзины и заказы» (часы–сутки). Можно тестировать не только главное фото, но и внутренние; варианты крутятся по кругу | Входит в любой тариф Автоставок | Единственный, кто честно разделил метрики по скорости поступления данных. Важно: старое фото после тестов не возвращается автоматически. Режим «% кликов» с обновлением за 40 минут — прямое приглашение к подглядыванию |
| 5 | Marpla (M.Тесты) ⚠️ | 🟡 РЕК+SW | A/B главного фото, фотоворонки и видеообложек; работа по официальному API | Есть бесплатный тариф, лимит тестов снимается доплатой | Тест видеообложек — редкая функция. Аккуратно: маркетинговая формула «повысьте CTR до ×10» на сайте — ровно тот язык, от которого статья предостерегает |
| 6 | ВБ Радар ❓ | 🟡 РЕК+SW | A/B фото внутри РК; тест можно вести на двух кампаниях (Аукцион + АРК) с суммированием показателей; настраивается число ротаций | Пробный период | Суммирование данных из двух разных типов кампаний — это объединение двух разных популяций. Анализируйте кампании раздельно, иначе получите парадокс Симпсона (§23) в чистом виде |
| 7 | WBTest.PRO ❓ | 🟡 РЕК | Замер CTR фото и сплит-тесты на закупаемом трафике; входит агрегатор внешнего трафика | Тарифы по подписке, trial 30 дней | Позиционирование строится на тезисе «WB не даёт честных сплит-тестов» — с 2024 года это неверно (см. п. 1). Оценивайте соответственно |
| 8 | Opticard ⚠️ | 🟠 ПАН | Панель живых респондентов голосует между вариантами карточки, оставляя комментарии; результаты за 1–24 часа | Есть бесплатный период | Русскоязычный аналог PickFu. Панель непрозрачна: неизвестно, кто респонденты и покупают ли они на WB. Для отсева — годится, для решения — нет |
| 9 | Яндекс Директ (РСЯ) / VK Реклама ✅ | 🟠 ПАН+ | Два объявления с макетами выдачи, одинаковые бюджет и таргетинг, метрика — CTR объявления | 5–15 тыс. ₽ | Не сервис для WB, а метод (см. §33.3). Аудитория не та, но реакция измеряется в условиях беглого просмотра, а не «что вам больше нравится». Часто валиднее панели |
| 10 | SellerMoon / SelSup / Sellego / Uniseller ⚠️ | 🔴 НАБЛ | Мониторинг карточек, трекеры позиций, отметки событий на графиках | По подписке | Это не тестирование. Полезны как guardrail-детекторы: заметить, что WB отменил ваш тест, обнулились остатки или упала позиция. Не путайте отметку на графике с экспериментом |
Чего в этом списке нет и почему. Сервисов, обещающих «A/B-тест органического трафика WB» без подписки «Джем», не существует — у стороннего сервиса физически нет доступа к сплиту органической аудитории. Всё, что он может: менять фото по API (switchback) или крутить рекламу. Если сервис утверждает иное — он либо не понимает, что продаёт, либо понимает слишком хорошо.
32.2. Топ-10 для Ozon
Сразу оговорка: на Ozon экосистема тестирования беднее, чем на WB. Настоящих ротаторов немного, зато есть два нативных инструмента. Десять позиций набирается только если считать панели и прокси-методы, что я и сделал — с честными пометками.
| # | Сервис | Класс | Механика | Цена | Честная оценка |
|---|---|---|---|---|---|
| 1 | Нативный A/B-тест главного фото Ozon ❓ | 🟢 РКТ | Аудитория делится на две группы, оба фото показываются одновременно | 299 ₽ за товар (анонс 2024) | Если он есть в вашем кабинете — это лучший инструмент на площадке и, возможно, самый дешёвый рандомизированный эксперимент в русском e-commerce. Справочной страницы нет; всё, что пишут о нём агентства сверх анонса, не проверено |
| 2 | Sellium ⚠️ | 🟡 SW | Ротация целых наборов (до 10 наборов × 30 фото) через API каждые 30 или 60 мин; длительность в днях/часах/показах/кликах; CTR и CR «показ → корзина»; автопобедитель | Есть бесплатные первые тесты | Лучший ротатор для Ozon и единственный, кто тестирует воронку целиком, а не первый слайд. Ловушки: получасовые блоки дают carryover, порядок не рандомизирован, победитель по точечной оценке. Прогоните A/A перед тем, как верить |
| 3 | Нативные «A/B-тесты цен» Ozon ✅ | 🟢 РКТ | Сплит 5/95, скидка 5–15%, 7–14 дней, метрики: просмотры → корзина → заказ | Бесплатно (платите скидкой) | Не про фото, но про то же решение — «стоит ли менять карточку или цену». Помните: 5/95 требует примерно в 5 раз больше трафика, чем 50/50 (§8) |
| 4 | PickFu ⚠️ | 🟠 ПАН | То же, что для WB | от $1/ответ | Для Ozon применим ровно так же. Панель американская — для чисто российских категорий (детские товары, продукты) её выводы переносятся плохо |
| 5 | Opticard ⚠️ | 🟠 ПАН | Голосование российской панели между вариантами карточки, комментарии | Бесплатный период | Заявлена поддержка Ozon и WB. Единственный русскоязычный сервис такого рода, который я нашёл с работающим сайтом |
| 6 | Яндекс Директ (РСЯ) / VK Реклама ✅ | 🟠 ПАН+ | Макеты выдачи Ozon как креативы, метрика — CTR | 5–15 тыс. ₽ | На Ozon работает даже лучше, чем на WB: карточка в выдаче Ozon визуально ближе к обычному рекламному баннеру |
| 7 | Яндекс Толока ⚠️ | 🟠 ПАН | Микрозадача «кликните на товар, который купили бы» по скриншоту выдачи | Копейки за ответ | Дёшево и близко к поведению, а не к мнению. Требует жёсткого контроля качества исполнителей: контрольные задания обязательны |
| 8 | Оплата за клик (бывш. Трафареты) ✅ | 🟡 РЕК | Собственный switchback: меняете фото по дням при фиксированной ставке и бюджете, сравниваете CTR блоками | Мин. недельный бюджет от 14 000 ₽ | Не инструмент тестирования, а сырьё для него. Рандомизируйте порядок дней сами, не чередуйте A-B-A-B (§22) |
| 9 | SelSup / Uniseller / MPSTATS (Ozon-модуль) ⚠️ | 🔴 НАБЛ | Мониторинг карточек, конверсий, позиций | По подписке | Критично именно на Ozon: площадка постоянно ставит свои эксперименты на ваших карточках (отзывы, видеообложки). Мониторинг нужен, чтобы не принять чужой эксперимент за свой результат |
| 10 | GrowthBook как калькулятор ✅ | — | Выгружаете агрегаты из кабинета, получаете байесовский вывод, интервалы, SRM-проверку | Бесплатно (self-hosted) | Не «сервис для Ozon», а то, чем нужно обрабатывать выгрузку из любого пункта выше. Самая недооценённая позиция в обоих списках |
Главный вывод из обоих топов. Позиции №1 в обеих таблицах — нативные инструменты площадок. Всё остальное существует потому, что нативные ограничены: два варианта, одно фото, нужна подписка. Правильная стратегия не «выбрать сервис из топа», а построить конвейер:
Панель (4–8 вариантов, дёшево, отсев)
↓ оставили 2 лучших
Ротатор или реклама (сигнал, гипотеза, отсев ошибок дизайна)
↓ оставили 1 претендента
Нативный A/B площадки (решение)
↓
Реестр экспериментов (§36)
Каждая ступень дешевле следующей и грубее её. Лузер начинает с последней ступени, прогоняет через неё 20 случайных фото и жалуется, что тесты «ничего не показывают». Профессионал тратит $60 на панель, чтобы не тратить 8 недель на A/B заведомо проигрышного варианта.
32.3. Ключевое, что нужно понимать про ротаторы
Про MPSTATS-подобные тесты.
Тест «внутри рекламной кампании со стратегией лучшей позиции» — это не A/B-тест карточки. Это A/B-тест креатива в рекламе. Между ними три разрыва:
- Аудитория. Рекламные показы получают не те же люди и не в том же настроении, что органические.
- Позиция. Стратегия «лучшая позиция» динамически меняет место в выдаче. Позиция — сильнейший конфаундер CTR (§21). Если фото Б крутилось в среднем на 3-м месте, а фото А — на 6-м, вы измерили позицию, а не фото.
- Цель. CTR рекламного показа коррелирует с органическим CTR, но не равен ему.
Это не значит, что инструментом нельзя пользоваться. Это значит, что его результат — сигнал для гипотезы, а не решение. Ставьте победителя в нативный А/Б-тест WB и проверяйте.
Ротатор — законный и полезный инструмент, если вы понимаете, что получаете switchback-эксперимент, и чините его дизайн:
- Строгое чередование опасно. Просите (или реализуйте сами) случайный порядок блоков.
- Смена «по метрикам» (например, «меняем фото после каждых 2 000 показов») — это адаптивная остановка, зависящая от данных. Формально она смещает оценку. Предпочитайте смену по времени.
- Автоматический выбор «фото с самым высоким CTR» — это выбор по точечной оценке без интервала. При 10 вариантах и нескольких тысячах показов на каждый победитель почти случаен (см. §11.1: 45 попарных сравнений).
- Всегда прогоняйте A/A через ротатор, прежде чем доверять его выводам: загрузите две копии одного фото и посмотрите, покажет ли сервис «победителя».
Последний пункт я считаю обязательным. Если сервис при A/A уверенно объявляет одну из копий победителем — вы знаете о нём всё, что нужно.
33. Панельные и опросные сервисы
33.1. Международные
| Сервис | Что даёт | Цены (проверено 07.2026) | Замечания |
|---|---|---|---|
| PickFu | Head-to-head, ranked, open-ended, click-test, 5-second test; панель с таргетингом по 100+ признакам; письменные комментарии к каждому голосу | От $1 за ответ, минимальный опрос $15 (15 респондентов, США). Таргетинг, число вариантов, видео и сложные типы опросов повышают цену за ответ. Подписка PickFu+ снижает цену и даёт бесплатный мини-опрос на 5 человек ежедневно | Де-факто стандарт у Amazon-селлеров. Панель англоязычная. Комментарии — самое ценное. Отзывы на G2 хвалят скорость и ругают, как быстро растёт цена при узком таргетинге |
| Lyssna (ранее UsabilityHub) | Preference test, first-click, five-second test | От бесплатного тарифа | Хорош именно для «клик по макету выдачи» |
| Prolific | Панель респондентов + ваш собственный опросник (Qualtrics/Google Forms) | ~£1–2 / респондент | Максимальная гибкость дизайна теста. Мой выбор, если нужен нестандартный тест |
| Maze, UserTesting, Helio, Poll the People, Wynter | UX-тесты, качественная обратная связь | $$ | Скорее для лендингов, чем для превью |
33.2. Российские
Изменение рынка, которое надо знать. «Яндекс Взгляд» — главный российский инструмент количественных онлайн-опросов, работавший с 2017–2018 годов, — закрыл платные опросы. Хронология по сообщению «Яндекса» изданию Sostav и справке сервиса:
- до 20 марта 2026 — можно было запускать новые платные опросы и тратить остаток на счёте;
- с 6 апреля 2026 — платные опросы остановлены, сбор ответов прекращён;
- +3 месяца — доступ к результатам прошлых исследований для выгрузки данных.
Бесплатные опросы по собственной аудитории (сайт, рассылка) остались; «Яндекс» обещает предупредить заранее, если и их закроют. Причина по официальному комментарию — снижение интереса пользователей и перераспределение ресурсов; над сервисом работала команда из 10 человек.
Если вы читали статью, где «Взгляд» рекомендуется как способ протестировать креатив, — эта рекомендация устарела, а статья, скорее всего, не обновлялась с 2025 года. Хороший тест на свежесть любого материала про инструменты.
Что осталось:
| Сервис | Что даёт |
|---|---|
| Foquz | Опросы + панель; чаще всего называется прямой заменой «Взгляда» |
| Анкетолог | Собственная панель по РФ, таргетинги, доп. услуги по обработке данных |
| Fastuna | «Коробочные» тесты креативов с бенчмарками (отклонение от нормы по категории) — редкая и полезная вещь |
| Тестограф (Testograf), Oprosso | Конструкторы опросов + панель |
| Tiburon Research, OMI / Enjoy Survey, Survey Studio | Профессиональные исследовательские панели: дороже, качество выше |
| Яндекс Толока | Микрозадачи: можно собрать клики по макету выдачи; дёшево, но требует аккуратного контроля качества исполнителей |
| Собственная аудитория (Telegram-канал, VK-сообщество, база клиентов) | Бесплатно и быстро, но выборка смещена: ваши подписчики — не средний покупатель WB |
33.3. Самый честный дешёвый метод: реклама на макет выдачи
Если панелей нет, сделайте так:
- Соберите два макета выдачи (с фото A и с фото B) как две картинки-креатива.
- Запустите два объявления в Яндекс Директ (РСЯ) или VK Рекламе с одинаковым таргетингом и бюджетом.
- Метрика — CTR объявления.
Это не идеальный прокси (аудитория РСЯ ≠ покупатели WB, контекст показа другой), но он измеряет реакцию на изображение в условиях беглого просмотра, а не эстетическое предпочтение. Стоит 5–15 тыс. ₽ и даёт данные за 2–3 дня.
Более точный вариант — рекламировать реальную карточку с внешнего трафика с UTM и мерить переходы, чередуя фото по дням (switchback).
34. Статистические движки и open source
34.1. Платформы экспериментов
Рынок за последние полтора года консолидировался, и это стоит знать, прежде чем на что-то подписываться.
| Платформа | Статистика | Состояние на середину 2026 |
|---|---|---|
| GrowthBook | Байес (probability-to-be-best) и частотный; CUPED, sequential testing, SRM-проверки, post-stratification, бандиты, поправки на множественность | Open core (MIT), self-hosted бесплатно и без ограничений; облако — бесплатный тариф до 3 пользователей, Pro ~$40/чел/мес. Warehouse-native: 11 источников данных. Самый вменяемый вариант для селлера |
| Statsig | Частотный движок с последовательным тестированием, CUPED, винзоризация, switchback, стратификация | Осторожно. Сентябрь 2025 — OpenAI купила Statsig за $1,1 млрд (all-stock), команда ушла в OpenAI. Май 2026 — Amplitude забрала бренд, платформу и клиентскую базу. Код у одних, авторы у других |
| Eppo | Байес с усадкой, частотный, sequential, CUPED, GeoLift | Куплена Datadog (~$220 млн). В апреле 2026 запущен Datadog Experiments — методы Eppo (sequential, CUPED) внутри observability-стека Datadog |
| Optimizely | Stats Engine — always-valid p-values (последовательный) + контроль FDR | Работает, независим, но enterprise-ценник |
| VWO | SmartStats — байесовский, решения по ожидаемым потерям | Есть бесплатный тариф (лимиты проверяйте) |
| PostHog | Аналитика + флаги + эксперименты | Open source; статистика проще, чем у GrowthBook |
| Split → Harness, AB Tasty, ABsmartly, Amplitude Experiment | Разные комбинации | Split поглощён Harness |
Мораль этой таблицы выходит за рамки статистики: три из четырёх лидеров категории за 12 месяцев сменили владельца. Если вы строите на них процесс, стройте так, чтобы данные и определения метрик жили у вас (warehouse-native), а не в чужом кабинете.
Для маркетплейс-селлера ни одна из платформ не подключится к WB напрямую. Но GrowthBook можно использовать как калькулятор: выгрузили агрегаты из кабинета, загрузили, получили корректный байесовский вывод с проверкой SRM. Это лучше, чем самописный Excel.
Одна оговорка, важная в контексте §13: байесовский движок GrowthBook по умолчанию использует неинформативный априор Beta(1,1), и задать свой информативный априор в интерфейсе нельзя. То есть усадки к вашей категорийной базовой ставке вы не получите — её придётся считать руками (код в §35) или в PyMC. Для CTR порядка 3% при небольшой выборке это заметная разница.
34.2. Python
# Базовое
scipy.stats.norm, scipy.stats.beta, scipy.stats.fisher_exact
statsmodels.stats.proportion.proportion_confint(count, nobs, method='wilson')
statsmodels.stats.proportion.proportions_ztest
statsmodels.stats.power.NormalIndPower().solve_power(...)
statsmodels.stats.multitest.multipletests(pvals, method='holm' | 'fdr_bh')
# Байес
bayesian-testing # готовые BinaryDataTest, expected loss, P(best)
pymc / numpyro # иерархические модели по категориям
arviz # HDI, ROPE, диагностика
34.3. Онлайн-калькуляторы
- Evan Miller's Awesome A/B Tools — расчёт размера выборки, sequential sampling.
- ABTestGuide — интервалы и значимость.
- VWO / Optimizely sample size calculators — быстрые прикидки MDE.
- Wilson interval calculator — для проверки своих расчётов.
35. Код: минимальный калькулятор
import numpy as np
from scipy import stats
def wilson(s, n, conf=0.95):
if n == 0: return (0.0, 1.0)
z = stats.norm.ppf(1 - (1-conf)/2)
c = (s + z*z/2) / (n + z*z)
h = (z / (n + z*z)) * np.sqrt(s*(n-s)/n + z*z/4)
return (max(0.0, c-h), min(1.0, c+h))
def clopper_pearson(s, n, conf=0.95):
a = 1 - conf
lo = 0.0 if s == 0 else stats.beta.ppf(a/2, s, n-s+1)
hi = 1.0 if s == n else stats.beta.ppf(1-a/2, s+1, n-s)
return (lo, hi)
def z_test_props(sa, na, sb, nb):
pa, pb = sa/na, sb/nb
p = (sa+sb)/(na+nb)
se = np.sqrt(p*(1-p)*(1/na + 1/nb))
z = (pb-pa)/se
return z, 2*(1 - stats.norm.cdf(abs(z)))
def sample_size(p_a, mde_rel, alpha=0.05, power=0.8):
p_b = p_a*(1+mde_rel)
za = stats.norm.ppf(1-alpha/2); zb = stats.norm.ppf(power)
num = (za+zb)**2 * (p_a*(1-p_a) + p_b*(1-p_b))
return int(np.ceil(num / (p_b-p_a)**2))
def srm_check(na, nb, expected=(0.5, 0.5)):
obs = np.array([na, nb]); exp = np.array(expected)*obs.sum()
chi2 = ((obs-exp)**2/exp).sum()
return chi2, 1 - stats.chi2.cdf(chi2, 1)
def bayes_ab(sa, na, sb, nb, prior=(6.0, 195.0), N=300_000, seed=0):
rng = np.random.default_rng(seed)
a = rng.beta(prior[0]+sa, prior[1]+na-sa, N)
b = rng.beta(prior[0]+sb, prior[1]+nb-sb, N)
lift = (b-a)/a
return {
"P(B>A)": float((b > a).mean()),
"lift_mean": float(lift.mean()),
"lift_hdi95": tuple(np.percentile(lift, [2.5, 97.5])),
"E_loss_B": float(np.maximum(a-b, 0).mean()),
"E_loss_A": float(np.maximum(b-a, 0).mean()),
}
# --- применение ---
sa, na, sb, nb = 1680, 60000, 1860, 60000
print("Wilson A:", wilson(sa, na))
print("Wilson B:", wilson(sb, nb))
print("SRM:", srm_check(na, nb))
print("z-test:", z_test_props(sa, na, sb, nb))
print("n на вариант для MDE +10%:", sample_size(0.028, 0.10))
print("Bayes:", bayes_ab(sa, na, sb, nb))
Часть X. Операционка
36. Реестр экспериментов и метаанализ
Одна таблица, которая через год стоит дороже любого курса.
| # | Дата старта | Дата конца | Карточка / категория | Гипотеза | Вариант A | Вариант B | Первичная метрика | n_A | s_A | n_B | s_B | Лифт (точечн.) | 95% CI лифта | P(B>A) | E[Loss|B] | Guardrail OK? | Решение | Факт через 30 дней |
|---|
Три правила ведения:
Записывать провалы. Они ценнее побед: именно из провалов складывается ваш априор. Продавец, у которого записаны 15 провалов «инфографика с плашкой скидки не работает в категории X», знает больше, чем тот, у кого записаны 3 победы.
Записывать «факт через 30 дней». Сравните обещанный лифт с реализованным. Систематическое расхождение (обещали +18%, получили +6%) — это ваша личная мера winner's curse и подглядывания. Если расхождение велико, ваш процесс сломан.
Раз в квартал делать метаанализ. Соберите все тесты одного типа («лайфстайл vs студия»), посчитайте средневзвешенный эффект и его интервал через модель случайных эффектов. Это даст вам знание уровня категории, а не уровня карточки. Именно так рождается настоящее конкурентное преимущество: вы знаете, что в термокружках лайфстайл даёт +9% (CI +3…+15), а в крепеже — минус 4%, а ваши конкуренты копируют «лучшие практики» из телеграм-каналов.
Метаанализ же обновляет ваш эмпирический априор — и следующие тесты становятся мощнее при том же трафике. Это компаундинг.
37. Чек-лист профессионала
До запуска
- Гипотеза записана одним предложением, с ожидаемым направлением и величиной эффекта
- Объявлена ОДНА первичная метрика (OEC)
- Объявлены guardrail-метрики и их пороги
- Рассчитан размер выборки под заявленный MDE, α и мощность 80%
- Проверено: хватит ли трафика за разумный срок. Если нет — тест не запускается
- Срок — целое число недель, минимум 7 дней
- Не праздничная неделя, не старт распродажи
- Заморожены: цена, рекламные ставки, остальные элементы карточки
- Остатков хватит на весь период
- Априор зафиксирован (если байес)
- Заранее записано правило остановки и правило решения
- Инструмент прошёл A/A-тест
Во время
- Не смотреть результат до заранее назначенного дня
- Ежедневно проверять только целостность: остатки, цена, статус теста
- Ничего не менять
После
- Проверить SRM (χ², p > 0,001). Если SRM — анализ отменяется
- Проверить, что цена/реклама не менялись
- Посчитать интервал Уилсона для каждого варианта
- Посчитать z-тест и p-value ИЛИ байесовский апостериор
- Посчитать ожидаемые потери и сравнить с порогом
- Проверить guardrail-метрики
- Посчитать эффект на OEC (симуляцией, если метрика составная)
- Проверить устойчивость эффекта по дням (не эффект новизны?)
- Записать в реестр — включая провал
- При внедрении закладывать в модель нижнюю границу интервала, а не точечную оценку
- Сформулировать следующую гипотезу из того, что узнали
38. Шаблон отчёта об эксперименте
ЭКСПЕРИМЕНТ #024 — «Лайфстайл vs студия, термокружки»
1. КОНТЕКСТ
Карточка: 123456789. Категория: термокружки. Трафик: ~8 500 показов/день.
Базовый CTR: 2,80%. Базовый CR: 6,0%. Базовый выкуп: 78%.
2. ГИПОТЕЗА (записана 02.02.2026)
Лайфстайл-кадр (кружка в руке, размытый офис) повысит CTR на ≥10% отн.
Механизм: контраст с белой выдачей + контекст использования.
3. ДИЗАЙН
Встроенный A/B WB, 50/50, 14 дней (03.02–16.02).
Первичная метрика: CTR. Guardrail: CR, выкуп, рейтинг.
Требуемая выборка: 57 132 показа/вариант при MDE +10%, α=0,05, power=0,80.
Правило решения: E[Loss|B] < 0,014 п.п. И guardrail не нарушены.
4. ЦЕЛОСТНОСТЬ
SRM: 60 000 / 60 000, χ²=0, p=1,00 ✅
Цена, ставки, остатки — без изменений ✅
Полные недели ✅
5. РЕЗУЛЬТАТ
CTR: A 2,800% [2,67; 2,94] B 3,100% [2,96; 3,24] (Уилсон, 95%)
Δ = +0,300 п.п. [+0,109; +0,491]; лифт +10,7% [+3,7%; +18,1%]
z = 3,07; p = 0,0021
P(B>A) = 99,89%; E[Loss|B] = 0,00003 п.п.; E[Loss|A] = 0,299 п.п.
6. GUARDRAIL
CR: A 6,01% B 5,70%. P(CR_B < 0,9·CR_A) = 21% > порог 10% ⚠️
Выкуп: A 78% B 74%. Заказов мало, интервал широк ⚠️
Рейтинг: без изменений ✅
7. OEC (симуляция, 300k сэмплов)
RPM_A = 3 024 ₽ [2 480; 3 610]
RPM_B = 3 181 ₽ [2 620; 3 790]
P(RPM_B > RPM_A) = 68%. E[Loss|B] = 68 ₽ / 1000 показов.
8. РЕШЕНИЕ
Частичное внедрение: B на 2 из 6 карточек, наблюдение 4 недели с фокусом
на выкуп и возвраты. Полная раскатка отложена.
9. ЧТО УЗНАЛИ
Лайфстайл уверенно выигрывает по кликам, но, вероятно, ухудшает
соответствие ожиданиям. Гипотеза следующего теста (#025): лайфстайл +
крупный план товара на 2-м слайде компенсирует падение CR.
10. ОБНОВЛЕНИЕ АПРИОРА
Эффект «лайфстайл vs студия» по CTR в категории: теперь 3 теста,
средневзвешенный лифт +8,4% [+2,1%; +14,9%].
39. FAQ
«У меня 500 показов в день. Мне вообще можно тестировать?» Формально — да, практически — только очень крупные изменения (эффект 30%+) и на горизонте 4–8 недель. Лучший ход: объедините 5–10 однотипных карточек и тестируйте одну гипотезу на всех сразу, анализируя суммарно. Второй ход: используйте панельные и рекламные тесты (уровни 2–4) вместо A/B.
«Сколько дней должен идти тест?» Целое число недель. Минимум 7 дней (недельная сезонность), обычно 14. Верхняя граница определяется не статистикой, а риском изменения внешних условий — свыше 6–8 недель среда меняется настолько, что предпосылка о стационарности рушится.
«Можно ли смотреть промежуточные результаты, если площадка их показывает?» Смотреть можно. Принимать решение — нельзя, если только вы не используете последовательный тест или байесовское правило с порогом по ожидаемым потерям и минимальной выборкой. Самое честное — не смотреть до 8-го дня.
«p = 0,06. Это ведь почти значимо?»
Нет. Это «мы не набрали данных». Правильный ответ: посмотреть на интервал и ожидаемые потери. Если E[Loss|B] мал, а внедрение бесплатно — внедряйте. Если внедрение дорогое — добирайте данные. Слово «почти значимо» не существует.
«Байес или частотник?» Для решения — байес (ожидаемые потери). Для планирования — частотник (мощность, MDE). Для защиты перед скептиком — оба. Они почти всегда согласуются на достаточных данных; расхождение — сигнал, что данных мало.
«Разве встроенный A/B площадки не считает всё сам?» Считает. Но: (а) не раскрывает критерий и поправки; (б) показывает промежуточные результаты, провоцируя подглядывание; (в) выбирает победителя по одной метрике, игнорируя ваши guardrail. Забирайте сырые числа (показы/клики/заказы) и считайте сами.
«Ротатор через API — это нормально?» Это switchback. Нормально, если много блоков, рандомизированный порядок, washout и парный анализ. Ненормально, если сервис просто чередует фото по часам и объявляет победителя по большему CTR.
«Что делать с эффектом новизны?» Разбейте период теста на дни и посмотрите на динамику лифта. Если лифт монотонно затухает к концу — это новизна, а не улучшение. Если стабилен — эффект реален. При коротком тесте эффект новизны неотличим от эффекта фото, и это ещё один довод за 14 дней вместо 3.
«Как понять, что мой рост — не сезонность?» Только через одновременный контроль. Либо встроенный сплит, либо контрольная группа карточек и DiD. Календарь и «поправка на сезонность» из головы — не работают.
«Сколько вариантов фото можно тестировать сразу?» Два — если нужна оценка эффекта. До 4–6 — если нужен только выбор лучшего и вы используете бандит или поправку на множественность и понимаете, что оценки эффекта будут смещены.
«WB написал „не стат. значимый результат“. Значит, фото одинаковые?» Нет. Это одно из двух: либо в тесте поучаствовало мало покупателей, либо разницы действительно нет. Сам WB перечисляет обе причины и не различает их. Различить можете только вы: посчитайте, какой MDE вы вообще могли обнаружить при набранной выборке (§8), или постройте байесовский ROPE (§14). Если MDE оказался 25%, а вы искали 8% — вы не «не нашли разницу», вы просто не могли её найти.
«WB написал „победитель не выявлен“. Что делать?» Это значит, что по одним метрикам лучше А, по другим Б. И это ваша ошибка, а не площадки: вы не выбрали OEC до старта (§2, §30). Выберите его сейчас — но честно, до того как посмотрите на цифры, иначе выберете ту метрику, где победил понравившийся вариант.
«Правда ли, что инфографика всегда повышает CTR?» Нет. Правда в том, что у людей, которые об этом пишут, инфографика повышала CTR. Вы не видите тех, у кого не повысила. Это классический survivorship bias. Проверьте на своей категории.
40. Глоссарий
- A/A-тест — эксперимент, где оба варианта идентичны; проверка корректности инструмента.
- α (alpha) — вероятность ложноположительного вывода (ошибка I рода).
- BH (Бенджамини — Хохберг) — процедура контроля доли ложных открытий (FDR).
- CTR — clicks / impressions.
- CUPED — снижение дисперсии с помощью предэкспериментальных данных.
- DiD (difference-in-differences) — квазиэксперимент: разность разностей между тестовой и контрольной группой до/после.
- Expected Loss — ожидаемая величина потерь метрики при выборе варианта; байесовское правило решения.
- FDR / FWER — доля ложных открытий / вероятность хотя бы одной ошибки.
- HDI — интервал наивысшей апостериорной плотности.
- MDE — минимальный обнаружимый эффект при заданных α и мощности.
- OEC — единственная целевая метрика эксперимента.
- Peeking — многократный просмотр результата с возможностью досрочной остановки; раздувает α.
- Power (мощность) — вероятность обнаружить эффект, если он есть; 1 − β.
- ROPE — зона практической эквивалентности; позволяет доказать отсутствие эффекта.
- SRM — расхождение фактического сплита с ожидаемым; признак поломки эксперимента.
- Switchback — квазиэксперимент с переключением варианта во времени.
- Thompson sampling — байесовский многорукий бандит.
- Winner's curse — систематическое завышение эффекта у отобранных победителей.
- Сопряжённый априор — априор, дающий апостериор того же семейства (Beta для Binomial).
- Сверхдисперсия — реальная дисперсия выше модельной; типична при повторных показах одному пользователю.
- Усадка (shrinkage) — притягивание экстремальных оценок к среднему; байесовская защита от шума.
Последнее
Всё вышенаписанное сводится к одной мысли.
Тестирование фотографий — это не способ узнать, какое фото красивее. Это способ узнать, насколько вы можете доверять собственным выводам.
Продавец, который прочитал эту статью и не поменял ни одного фото, но начал вести реестр экспериментов, замораживать рекламу на время теста и считать ожидаемые потери, — за год обгонит того, кто провёл 50 «тестов» и накопил 12 ложных убеждений.
Статистика здесь — не украшение. Это единственный доступный инструмент, отличающий знание от совпадения. На рынке, где все смотрят на одни и те же цифры и делают одни и те же ошибки, умение не обмануть самого себя и есть конкурентное преимущество.
Тестируйте крупные гипотезы. Считайте интервалы. Не подглядывайте. Записывайте провалы.
