Когда A/B-тест невозможен: квазиэксперименты и разность разностей
Разность разностей на учебном магазине Wave: mobile против desktop до и после редизайна, проверка предтрендов, расчёт −2,79 п.п. и границы вывода.
Содержание статьи
Чекаут учебного магазина Wave обновили сразу для всех мобильных покупателей 1 августа 2024 года. A/B-группы нет; откат для части аудитории тоже не подготовили. В отчёте mobile-конверсия сессии в заказ резко падает, а desktop почти не двигается. Можно ли назвать это эффектом редизайна? Квазиэксперимент с разностью разностей помогает отделить общее изменение календаря от специфического движения mobile — но лишь при предпосылках, которые надо проверить и честно ограничить.
Коротко: что делать без рандомизации
Квазиэксперимент сравнивает группы или периоды, которые возникли без случайного назначения. Он не наследует автоматически защиту A/B от различий между людьми. Вместо этого исследователь заранее формулирует, почему выбранная контрольная группа могла бы показать движение целевой метрики без вмешательства, а затем ищет факты против этой истории.
Для Wave мобильные сессии — затронутая группа, десктопные — кандидат в контроль. Разность разностей (DiD) вычитает из изменения mobile изменение desktop. На полных CSV это −2,79 процентного пункта конверсии сессии в заказ. Это оценка по наблюдениям, а не доказанная потеря из-за интерфейса: до запуска доступны только июнь и июль, и их разрывы тоже двигались.
Если можете честно провести A/B с назначением пользователей, он обычно даёт более ясный причинный дизайн. Если нет, начните с карты вмешательства, проверки измерения и выбора контрфакта. Процесс полноценного случайного опыта разобран в хабе A/B-тестирования.
| Ситуация | Кандидат | Главное условие |
|---|---|---|
| Есть незатронутая сопоставимая группа | Разность разностей | Её тренд без вмешательства был бы параллелен |
| Одна группа, длинный ряд без хорошего контроля | Прерванный временной ряд | Нет совпавшего внешнего шока и смены измерения |
| Есть несколько доноров с длинной историей | Синтетический контроль | Их смесь хорошо воспроизводит период до вмешательства |
| Ни одного из условий нет | Диагностика без оценки эффекта | Не выдавать простое до/после за причинный результат |
Когда A/B не запускают и что теряют
Запуск на всех сразу иногда навязан сроком, регуляторным требованием или аварийным исправлением. В офлайне единицы могут быть целыми магазинами; число независимых магазинов слишком мало для обычного индивидуального сплита. При сетевых эффектах люди разных вариантов взаимодействуют, и контроль уже чувствует изменение: например, перераспределение продавцов меняет ассортимент для обеих сторон. Тогда простой пользовательский A/B отвечает не на тот вопрос.
Отсутствие рандомизации не означает, что анализ бессмыслен. Оно меняет силу вывода. Сравнение только «до/после» путает вмешательство с сезонностью, рекламой, составом трафика и исправлением трекинга. Сравнение с другой группой убирает общий сдвиг времени, если он действительно действует на обе группы сходным образом. Специфический для mobile маркетинговый запуск такое сравнение не уберёт.
Ещё до запроса запишите дату и механизм вмешательства, кто мог быть затронут, что должно было произойти с метрикой без него и какие другие события пришлись на дату. Если невозможно назвать контроль, который не получил воздействие, DiD лучше не обещать. Может понадобиться локальный пилот, гео-эксперимент или просто расследование инцидента.
Разность разностей на четырёх числах
У DiD есть четыре средних: показатель затронутой группы до и после, показатель контроля до и после. Сначала считаем каждое изменение; затем вычитаем изменение контроля из изменения затронутой группы. Контроль допускается на другом уровне. Нам не нужно, чтобы mobile и desktop имели одинаковую исходную конверсию; требуется более сильное и менее видимое допущение: без редизайна их тренды были бы параллельны.
Обзор Roth и соавторов подробно формулирует эту предпосылку и показывает, почему тесты предтрендов не должны служить единственным разрешением на причинный вывод. В нашем коротком учебном ряду она остаётся гипотезой, которую нужно проверять независимыми сведениями о продукте и трафике.
Для сессионной конверсии единица наблюдения — сессия, заказ считается не более одного раза для каждой сессии. Сумма заказов делится на число сессий в той же группе и периоде. Такая доля отвечает на вопрос «какая часть сессий завершилась заказом»; это не доля пользователей, купивших хотя бы раз. Повторные сессии одного покупателя не независимы, поэтому без поюзерной модели не стоит прикреплять к этим четырём агрегатам наивный p-value.
Формула измеряет изменение разрыва в процентных пунктах. Относительный процент, например «упало на 47%», отвечает на другой вопрос и зависит от выбранной базы. На этапе диагностики важнее показать четыре исходных счётчика и даты, чтобы читатель мог воспроизвести знаменатели.
DiD = (mobile после − mobile до) − (desktop после − desktop до)Процентные пункты, если каждая ячейка — доля сессий с заказом в процентах. Для причинной трактовки требуется контрфактическая параллельность трендов и отсутствие отдельного шока для mobile.
Данные Wave: одна строка на сессию, заказ — исход
В учебном магазине Wave sessions.csv содержит session_id, дату начала и device; orders.csv связывает заказ с session_id. Все 6 328 заказов имеют статус paid, повторных заказов на один ID сессии нет. Мы берём mobile и desktop с 1 июня по 31 октября 2024 года, исключая tablet; «до» — дата сессии раньше 1 августа, «после» — начиная с 1 августа. Заказ привязывается к своей сессии, а не группируется отдельно по дате платежа.
Это важно для смещений. Если сначала агрегировать orders по месяцу placed_at, а сессии — по started_at, покупка на границе суток может попасть в соседний период. Здесь связь через ID сессии делает числитель подмножеством знаменателя. Если один человек приходит пять раз, он даёт пять сессий и не превращается в пять независимых людей при последующей оценке неопределённости.
В датасете нет надёжного поля «чекаут сломан» и точной экспозиции редизайна каждому человеку. Поэтому измеряемый исход шире: сессия → заказ. Падение может быть связано с чекаутом, но таблица сессий сама по себе не локализует конкретную кнопку или платёжный способ.
Если переносите расчёт в боевую базу, сначала проверьте уникальность ключа сессии и дату возникновения заказа. Разбор A/B в SQL показывает ту же дисциплину зерна на рандомизированном опыте; здесь дополнительная сложность в том, что сама сопоставимость групп не создана назначением.
Запрос: четыре ячейки до и после 1 августа
Запрос сначала сворачивает заказы до одной строки на сессию, потом соединяет с сессиями и делит число сессий с заказом на все сессии соответствующего устройства и периода. В этом учебном файле повторов session_id в заказах нет; отдельный CTE сохраняет определение метрики и при появлении дублей. Даты в CSV уже календарные даты, здесь не выполняется дополнительный часовой сдвиг.
Результат ниже даёт не только процент, но и оба счётчика. Проверьте, что суммарные mobile и desktop сессии действительно относятся к тому же окну, что и заказы. Если выгрузка ещё пополняется, зафиксируйте дату среза и не сравнивайте незрелый последний день с полными предыдущими.
| Устройство | До: заказов / сессий | После: заказов / сессий | Конверсия до → после |
|---|---|---|---|
| mobile | 451 / 7 548 | 2 209 / 71 507 | 5,9751% → 3,0892% |
| desktop | 309 / 3 797 | 2 943 / 36 587 | 8,1380% → 8,0438% |
WITH bought AS (
SELECT DISTINCT session_id FROM orders
), cells AS (
SELECT s.device,
CASE WHEN s.started_at < DATE '2024-08-01' THEN 'до' ELSE 'после' END AS period,
COUNT(*) AS sessions,
COUNT(b.session_id) AS buyers
FROM sessions AS s
LEFT JOIN bought AS b USING (session_id)
WHERE s.device IN ('mobile', 'desktop')
AND s.started_at BETWEEN DATE '2024-06-01' AND DATE '2024-10-31'
GROUP BY 1, 2
)
SELECT device, period, sessions, buyers,
ROUND(100.0 * buyers / sessions, 4) AS conversion_pct
FROM cells
ORDER BY device, period;Оценка: −2,79 п.п. сверх изменения desktop
Mobile просел с 451/7 548 = 5,9751% до 2 209/71 507 = 3,0892%: изменение около −2,886 процентного пункта. Desktop изменился с 309/3 797 = 8,1380% до 2 943/36 587 = 8,0438%: около −0,094 пункта. Вычитаем второе из первого: −2,7917 п.п. Это наблюдаемое дополнительное изменение mobile относительно desktop.
Если бы без редизайна mobile повторил изменение desktop, его после-конверсия по такому простому контрфакту была бы около 5,8809%, а не 3,0892%. Умножение разницы на 71 507 сессий даст около двух тысяч «недостающих» заказов, но это не смета ущерба: повторные сессии, изменение состава трафика и неверная параллельность могут изменить число. В рабочем отчёте не ставьте рублёвую оценку до проверки этих условий.
Эта оценка отличается от сравнения «июль против августа»: курс показывает резкий июльский 6,1% → августовский 2,92%. Наш DiD объединяет два месяца до и три после, взвешивая каждую ячейку числом сессий. Октябрьский трафик велик, поэтому итог не равен простому среднему месячных процентов.
Проценты по полным CSV. Сравнивать следует изменения, а не высоты mobile и desktop напрямую.
Предтренды: доступных месяцев недостаточно для уверенности
Перед тем как говорить о причине, нужно посмотреть, расходились ли группы ещё до 1 августа. В июне mobile — 93/1 722 = 5,40%, desktop — 68/859 = 7,92%; разрыв mobile минус desktop равен −2,52 п.п. В июле mobile — 358/5 826 = 6,15%, desktop — 241/2 938 = 8,20%; разрыв −2,06 п.п. Сам разрыв сдвинулся на +0,46 п.п. ещё до запуска.
Это не тот же масштаб, что изменение после 1 августа, но нельзя объявить тренды доказанно параллельными. У нас лишь два предшествующих месяца, причём в июне сессий намного меньше, чем в июле. Два агрегата не показывают сезон внутри недели, рекламную волну или подвижность аудитории. Проверка «тест на различие предтрендов незначим» тоже не доказывала бы равенство трендов: при короткой истории мощность такой проверки низка.
Практическое продолжение — выгрузить более длинный период до редизайна, построить недельные траектории с объёмами, сверить маркетинговые и продуктовые изменения по устройствам и проверить состав источников. Если предтренды расходятся систематически, подберите другую контрольную группу или представьте расчёт как описательную диагностику. Этот материал именно так и трактует текущую оценку.
| До 1 августа | Mobile | Desktop | Разрыв mobile − desktop |
|---|---|---|---|
| Июнь | 93 / 1 722 = 5,40% | 68 / 859 = 7,92% | −2,52 п.п. |
| Июль | 358 / 5 826 = 6,15% | 241 / 2 938 = 8,20% | −2,06 п.п. |
| Изменение разрыва | — | — | +0,46 п.п. |
Что ещё может объяснить разрыв без эффекта редизайна
Desktop подходит как контроль лишь если на него не повлиял тот же запуск и если остальные факторы двигали устройства сопоставимо. Возможно, мобильная реклама в августе привела более холодную аудиторию. Возможно, трекинг mobile-заказов изменился отдельно от desktop. Возможно, сайт стал недоступен на части старых телефонов или другая функция выпущена одновременно. Каждая история даст разницу изменений без того, чтобы причиной был именно новый чекаут.
Нужно сверить доли каналов, новые и вернувшиеся сессии, версии приложения или браузера, географии и события промежуточных шагов. Стабильность агрегата desktop — полезный контрольный сигнал, но он не исключает специфический для mobile шок. Точно так же общий сезонный шок может действовать по-разному на два устройства.
Есть и интерференция: один покупатель ищет товар на телефоне, а оформляет заказ с компьютера. Если редизайн заставил его перейти на desktop, контрольная группа уже не незатронута. Тогда DiD смешает потери mobile с переносом заказа. Проверка по связанным пользовательским ID и кросс-девайс пути помогает увидеть такое нарушение, но в текущем наборе данных нет полной карты этих переходов.
Прерванный временной ряд и синтетический контроль
Прерванный временной ряд сравнивает уровень и наклон метрики до и после вмешательства в одной группе. Ему нужны достаточно длинная история, заранее названный момент изменения и правдоподобное отсутствие другого события в ту же дату. При двух месяцах «до» Wave такой дизайн не спасёт: короткий ряд не знает привычной сезонности и не отличит скачок из-за релиза от одновременной рекламной кампании.
Синтетический контроль строит взвешенную комбинацию нескольких незатронутых групп, которая хорошо повторяла траекторию затронутой группы до вмешательства. Например, при запуске в одном регионе до релиза можно подобрать смесь других регионов. Нужны несколько доноров и достаточный предшествующий период; если весь мобильный продукт изменился сразу, пригодных доноров может не быть. Не следует просто усреднить desktop и tablet, потому что они «под рукой»: требуется показать качество совпадения до запуска.
Такой дизайн описан в работе Abadie, Diamond и Hainmueller. Он полезен именно тогда, когда есть содержательные доноры и история, по которой можно оценить качество синтетической группы; название метода само по себе не создаёт контрфакт.
Иногда разумнее отказаться от оценки величины эффекта и сообщить о проблеме продукта с доказательствами, которые уже есть: дата релиза, резкий разрыв по устройству, журналы ошибок, воспроизводимый сценарий сбоя. Для решения об экстренном исправлении такого набора может хватить, даже если точные потерянные заказы пока неидентифицируемы.
Пять ошибок в квазиэксперименте и их последствия
Первая: взять контроль потому, что он виден в той же таблице. Desktop удобен, но его параллельность mobile без редизайна — содержательная гипотеза, а не свойство JOIN. Вторая: сравнить уровни 3% и 8% после запуска. Исходный разрыв уже существовал; сравнивать надо изменения. Третья: сослаться на два похожих предшествующих числа как на доказательство параллельности. Два месяца не позволяют увидеть устойчивую структуру тренда.
Четвёртая: принять стабильность desktop за исключение всех альтернатив. Специфический для телефона маркетинг, баг событий или перенос покупок на компьютер остаются. Пятая: сложить средние месячные проценты и назвать это общей конверсией. Месяцы имеют разные числа сессий; нужны суммарные числители и знаменатели. Шестая: поместить на четыре агрегата обычный p-value без учёта повторных сессий одного человека и календарных шоков.
И, наконец, нельзя путать диагностическую оценку с контрактом на выручку. Даже если дополнительное падение составляет 2,79 п.п., маржа, средний заказ и повторные попытки покупки требуют отдельного анализа. Как интервал превращается в решение полезно читать и здесь, но в наблюдательном дизайне к выборочной неопределённости добавляется неопределённость самой причинной предпосылки.
Что сообщить команде Wave сейчас
Я бы не утверждал «редизайн доказанно стоил 2,79 п.п.». Точный текст для продакта: «С 1 августа мобильная сессионная конверсия снизилась с 5,98% до 3,09%, у desktop — с 8,14% до 8,04%; дополнительное снижение mobile относительно desktop — 2,79 п.п. Это сильный сигнал исследовать мобильный путь. Два месяца до релиза не дают убедительно подтвердить параллельные тренды, поэтому причинную и денежную оценку пока не называем».
Дальше — проверить логирование заказов и ошибок чекаута, сравнить mobile по браузеру и источнику, поднять релизный журнал и найти более длинную историю до августа. Если воспроизводится технический дефект, исправлять его можно без ожидания идеального эконометрического дизайна. После исправления полезен ступенчатый или рандомизированный выпуск, чтобы измерить восстановление и снизить риск нового общего запуска.
Для практики аналитика задача остаётся конкретной: воспроизвести четыре счётчика SQL, построить месячные разрывы и написать в отчёте альтернативные объяснения. В SQL-симуляторе есть задания, где приходится разделять эффект, качество данных и решение.
Частые вопросы
Что такое квазиэксперимент простыми словами? Это анализ воздействия без случайного назначения; сопоставимость групп обеспечивают дизайн и проверяемые предпосылки, а не сам факт наличия контрольной строки в таблице.
В чём отличие DiD от сравнения до/после? Разность разностей вычитает изменение контрольной группы из изменения затронутой. Так удаляется общий временной сдвиг, если контроль действительно показывает подходящий контрфакт.
Параллельные тренды означают одинаковый уровень конверсии? Нет. Уровни могут различаться. Предположение касается того, как разница между ними менялась бы без воздействия; эту невидимую будущую траекторию нельзя доказать по прошлому.
Можно ли применить DiD при двух месяцах до запуска? Посчитать описательную оценку можно. Но два предшествующих месяца с разным объёмом не подтверждают устойчивость разрыва, поэтому причинный вывод будет ограниченным.
Что делать, если у контроля тоже изменился продукт? Искать действительно незатронутый контроль или иной дизайн. Если обе группы испытали один и тот же релиз, стандартная разность разностей не отделит его эффект от календаря.
Материалы по теме

A/B-тестирование: как провести тест от гипотезы до решения
Пошаговый A/B-тест на учебной игре: гипотеза, метрика, MDE, сплит, D7 retention, интервал и решение. Где ломается сравнение и что проверить до раскатки.

Результаты A/B-теста: как читать числа и принимать решение
Эффект, доверительный интервал, p-value, MDE и защитные метрики на двух экспериментах DragonKeep. Матрица решений и шаблон отчёта менеджеру.

A/A-тест: как проверить систему экспериментов до первого A/B
A/A-тест проверяет назначение, экспозиции и метрики до анализа эффекта. Учебный menu_color показывает SRM 54/46 при плане 50/50 и путь расследования.