Если в A/B “всё выросло”, но на срезах каша — это не эффект, это конфаундинг

Классика: общий uplift есть, а в новых/старых, iOS/Android, платных/органике — то плюс, то минус, то метрика прыгает по дням. Команда уже спорит про “сезонность” и “шум”. Цена ошибки простая: вы раскатываете не продукт, а чужую скрытую переменную. И потом месяцами чините последствия, потому что “по эксперименту же ок”.

Почему это происходит. Эксперимент меняет не только фичу, но и то, кто вообще увидел фичу и в каком контексте. Триггеры конфаундинга обычно три:

  • таргетинг и доставка: аудитория в тесте и контроле начинает отличаться неслучайно
  • алгоритмы ранжирования: меняется распределение экспозиций, а вместе с ним качество трафика и “поведение до клика”
  • саппорт/операции: ручные процессы, очереди, лимиты, модерация, фрод, акции — всё это может по-разному задеть группы и дни

Дерево диагностики я держу в голове как “симптом → вероятная причина → что проверить первым”:

  1. Симптом: неожиданный перекос по платформам/каналам/гео, хотя фича “для всех” Вероятная причина: доставка/таргетинг/логика включения зависит от атрибутов Проверить первым: баланс базовых признаков до экспозиции и стабильность состава трафика по дням

  2. Симптом: эффект есть только у heavy users или только у новичков Вероятная причина: разные шансы попасть в эксперимент или разная интенсивность экспозиций Проверить первым: распределение числа показов/сессий/контактов с фичей, не только факт попадания в группу

  3. Симптом: метрика-цель выросла, но “простые” инварианты поехали Вероятная причина: измерение, атрибуция, трекинг, изменения в пайплайне Проверить первым: инвариантные метрики и события, которые не должны реагировать (доли платформ, базовые технические события, стабильные конверсии до точки воздействия)

  4. Симптом: пилой по времени, особенно после релиза/раскатки/перезапуска модели Вероятная причина: внешний шок или вмешательство системы (ранжирование, лимиты, саппорт) Проверить первым: календарь операционных изменений и метрики нагрузки (очереди, latency, отклонения, ручные вмешательства)

  5. Симптом: “в целом ок”, но в одном-двух срезах аномально жирно Вероятная причина: leakage или пересечение сегментов, разные правила исключений Проверить первым: корректность исключений, пересечения аудиторий, SRM и причины пропусков/потерь логов

Правильная практика выглядит скучно: вы заранее фиксируете инварианты и контрольные срезы, логируете экспозицию и её интенсивность, и первым делом доказываете, что группы сравнимы по тому, что было до воздействия. Про размер эффекта спорят потом. Ограничение одно: если система доставки или ранжирования сама адаптируется на результаты, “чистый” A/B без дополнительных guardrails и анализа экспозиций почти всегда врёт.