Параллельные A/B-тесты: как проверить взаимодействие

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

Посмотрим на четыре клетки: старая карточка со старым блоком, новая карточка со старым блоком, старая карточка с новым блоком и оба изменения вместе. Эффект A без B — разница между первыми двумя. Эффект A при включённом B — разница между последними двумя. Разница этих эффектов называется взаимодействием.

cells = {
    ('A0','B0'): [10,10], ('A1','B0'): [12,12],
    ('A0','B1'): [13,13], ('A1','B1'): [20,20],
}
mean = lambda values: sum(values)/len(values)
effect_a_without_b = mean(cells['A1','B0']) - mean(cells['A0','B0'])
effect_a_with_b = mean(cells['A1','B1']) - mean(cells['A0','B1'])
print('A effect if B off:', effect_a_without_b)
print('A effect if B on:', effect_a_with_b)
print('interaction:', effect_a_with_b - effect_a_without_b)

Код даёт эффект A без B = 2, при B = 7 и взаимодействие = 5 единиц метрики. Значит, совмещённый вариант ведёт себя иначе, чем простая сумма отдельных сдвигов. Эти небольшие числа иллюстрируют вычисление; статистический вывод потребует разброса и достаточного числа пользователей в каждой клетке.

Когда независимое распределение помогает

Если система рандомизирует A и B независимо, каждая клетка получает сопоставимых пользователей в ожидании. Тогда можно оценивать основные эффекты и взаимодействие на данных 2×2. Это не значит, что группы обязаны быть равными до последнего человека; важно проверить назначение и потерю событий. При зависимом распределении, когда B включают только пользователям A1, клеток A0/B1 вообще нет и отделить взаимодействие невозможно.

Общий эффект A, усреднённый по B, зависит от доли пользователей с B. В примере при половинном распределении это среднее эффектов 2 и 7, то есть 4,5. При будущем выпуске B на всех пользователей ожидаемый эффект A ближе к 7, если условия сохранятся. Поэтому план выпуска должен учитывать, какая комбинация реально окажется в продукте.

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

В отчёте по клеткам укажите число пользователей и разброс метрики. Наблюдаемые средние 10, 12, 13 и 20 сами по себе не доказывают взаимодействие: при двух людях в клетке случайное колебание может быть огромным. Для проверки используют модель с индикаторами A, B и членом A×B либо эквивалентное сравнение разностей с оценкой неопределённости. При планировании теста нужно обеспечить достаточную выборку именно для этого члена, если он важен.

Бывает и техническое наложение: два теста одновременно меняют один DOM-элемент, и комбинация A1/B1 показывает не предусмотренный дизайн. Тогда взаимодействие описывает реальное поведение продукта, но его причина — несовместимость реализации. Перед запуском полезно пройти все четыре комбинации вручную и записать, какой экран увидит пользователь в каждой.

Если тест B включён только для части стран, а A — для всех, общие средние по A могут отличаться из-за состава стран. В таком случае сравнивайте клеточные эффекты внутри подходящей популяции и учитывайте правила распределения. Слово «параллельный» не гарантирует независимость назначений — её нужно проверить в данных.

В курсе «A/B тесты и анализ данных на Python» разбираются дизайн, интерпретация uplift и конкуренция эффектов. В практических задачах вы связываете статистический вывод с продуктовым решением. Откройте программу, чтобы планировать совместимые эксперименты и читать результаты без ложного запрета на параллельность.

Когда групп несколько, по-прежнему нужно проверить распределение участников в назначениях A и B.

Продолжить на практике

  • A/B тесты и анализ данных на Python ↗

    Практический курс по A/B-тестированию и продуктовым метрикам: формулируем гипотезы, считаем размер выборки, запускаем эксперименты и анализируем результаты. От первой идеи до внедрения изменений в продукт — без «воды» и лишней теории.