Команда поменяла цвет кнопки, запустила сравнение и через два дня увидела рост на двенадцать процентов. Изменение отправили в рабочий контур, а через месяц выяснилось, что конверсия вернулась к прежнему уровню, а иногда падает ниже. Ошибка не в идее эксперимента, а в его проведении: разница оказалась случайной, а решение приняли по ней.

Сравнение двух вариантов опирается на случайное распределение участников

Метод известен также как разделение аудитории и представляет собой разновидность контролируемого эксперимента. Участники случайно делятся на группы, и каждая видит свою версию страницы, письма или объявления.

Случайность здесь ключевое слово. Без неё группы окажутся неравноценными: в одну попадут активные пользователи, в другую случайные. Тогда любое различие в результате объясняется составом групп, а не проверяемым изменением.

Метод применяется для сравнения одного параметра за раз. Если меняются и цвет кнопки, и текст заголовка, невозможно понять, что именно дало эффект. Для одновременной проверки нескольких параметров существует отдельная разновидность, но она требует большего числа участников и усложняет разбор.

Обязательное условие это заранее определённый измеримый результат. Им может быть покупка, переход, регистрация. Если цель размыта, вывод получится двусмысленным: одна версия выиграет по одному показателю, вторая по другому.

Разница между группами оценивается через статистическую значимость

Основной вопрос звучит так: достаточно ли велика разница, чтобы считать её настоящей, а не следствием случайности.

В статистике для этого вводится понятие значимости. Расчёт даёт вероятность получить наблюдаемую разницу при условии, что никакой реальной разницы нет. Если эта вероятность мала, результат признаётся значимым.

Порог обычно выбирают равным пяти процентам. Значение означает, что в одном случае из двадцати мы ошибёмся и признаем эффект там, где его нет. Такую ошибку называют ложноположительной.

Второй вид ошибки это пропуск настоящего эффекта. Она называется ложноотрицательной, и её вероятность зависит от объёма выборки. Мощность теста это вероятность обнаружить эффект, если он есть. Обычно стремятся к значению восемьдесят процентов.

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

Размер выборки считается до запуска и определяет срок теста

Отдельная тема, которую почти всегда недооценивают, это необходимый объём данных.

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

Вторая величина это минимальный эффект, который важно обнаружить. Рост на полпроцента требует на порядок больше данных, чем рост на пять.

Третья величина это выбранная мощность и порог. Чем строже требования, тем больше выборка.

Четвёртая величина это число групп. При нескольких вариантах требуется больше участников.

import math

def sample_size(baseline, min_effect, power=0.8, alpha=0.05):
    p1 = baseline
    p2 = baseline * (1 + min_effect)
    z_alpha = 1.96 if alpha == 0.05 else 2.576
    z_beta = 0.84 if power == 0.8 else 1.28
    numerator = (
        z_alpha * math.sqrt(2 * (p1 + p2) / 2 * (1 - (p1 + p2) / 2))
        + z_beta * math.sqrt(p1 * (1 - p1) + p2 * (1 - p2))
    ) ** 2
    return math.ceil(numerator / ((p2 - p1) ** 2))

print(sample_size(0.05, 0.20))
print(sample_size(0.05, 0.10))

На этом примере видно, как требование уменьшить эффект вдвое увеличивает выборку примерно втрое. Если трафик невелик, тест на маленькое улучшение может длиться месяцами, и это стоит понимать заранее, а не через неделю после запуска.

Проверка результата выполняется по числу конверсий, а не по процентам

Теперь о самом расчёте. Проценты удобны для отчёта, но вычисления ведутся по абсолютным числам.

Для сравнения долей применяется тест для двух пропорций. Он сопоставляет наблюдаемые доли с ожидаемыми при условии отсутствия разницы.

import math

def two_proportions(a_conversions, a_total, b_conversions, b_total):
    p_a = a_conversions / a_total
    p_b = b_conversions / b_total
    p_pool = (a_conversions + b_conversions) / (a_total + b_total)
    se = math.sqrt(p_pool * (1 - p_pool) * (1 / a_total + 1 / b_total))
    if se == 0:
        return 0.0, 0.0
    z = (p_b - p_a) / se
    return z, 2 * (1 - 0.5 * (1 + math.erf(abs(z) / math.sqrt(2))))

z, p_value = two_proportions(250, 5000, 300, 5000)
print("Разница:", round((300 / 5000 - 250 / 5000) * 100, 2), "процента")
print("Вероятность случайности:", round(p_value, 4))

Второй расчёт это доверительный интервал. Он показывает диапазон, в котором с заданной вероятностью лежит настоящая величина эффекта. Если интервал включает ноль, эффект не подтверждён.

Третий расчёт это проверка однородности. Если аудитория делится на сегменты, полезно проверить, одинаков ли эффект в каждом из них. Различие в сегментах часто важнее общего результата.

Длительность теста определяется не только выборкой

Собрав нужное число наблюдений, не стоит останавливаться раньше ещё по одной причине: циклы поведения людей повторяются.

Первое: рабочие дни отличаются от выходных. Тест, начатый в пятницу и законченный в понедельник, покажет искажённую картину.

Второе: месячные циклы влияют на покупки. Зарплата, праздники, сезонные распродажи. Минимальная длительность обычно составляет полную неделю, а для уверенности лучше две.

Третье: эффект новизны. Пользователи замечают изменение и реагируют на него иначе, чем впоследствии. Через неделю эффект может ослабнуть.

Четвёртое: технические сбои. Если в середине теста упала часть трафика или сломался счётчик, результат надо пересчитывать за вычетом испорченного периода.

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

Ошибки проведения тестов встречаются чаще, чем ошибки расчёта

Разберём провалы, которые сводят работу к нулю.

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

Вторая ошибка это неравные группы. Неверная разбивка приводит к тому, что группы различаются по составу. Проверка однородности до запуска обязательна.

Третья ошибка это одновременные изменения. Параллельно выпустили новую акцию или изменили цены. Тогда эффект смешивается, и приписать его кнопке нельзя.

Четвёртая ошибка это малая выборка. На сотне посещений разница в один процент не значит ничего, но выглядит убедительно.

Пятая ошибка это выбор удобного показателя. Если тест не дал роста покупок, но выросло время на странице, объявлять победу рано.

Шестая ошибка это отсутствие контроля технической части. Если вариант Б грузился медленнее, разница объясняется скоростью, а не содержанием.

Разновидности тестов покрывают разные ситуации

Классический вариант с двумя группами не единственный.

Первый вариант это последовательный тест. Он позволяет проверять данные по ходу, но требует специального расчёта границ, иначе подглядывание искажает результат.

Второй вариант это переключаемый тест. Одна и та же группа видит разные варианты в разное время, и сравнение идёт внутри группы. Такой подход снижает влияние состава групп, но страдает от эффекта переноса.

Третий вариант это тест с несколькими вариантами. Сравниваются сразу несколько версий. Требует больше данных и поправки на множественные сравнения.

Четвёртый вариант это квазиэксперимент. Аудитория делится не случайно, а по естественному признаку: регион, канал, время. Используется, когда случайное деление невозможно, но выводы слабее.

Пятый вариант это проверка на небольшой группе перед запуском. Качественный этап, который помогает отсеять заведомо неудачные идеи до того, как тратить на них трафик.

Культура экспериментов важнее отдельного результата

Отдельная тема это организация работы. Разовый тест даёт мало, а постоянный поток проверок меняет продукт.

Первое правило это гипотеза. Каждый тест начинается с формулировки: если сделать так, то показатель вырастет, потому что причина такая. Без гипотезы невозможно учиться на неудачах.

Второе правило это журнал. Все тесты, включая провалившиеся, записываются. Записи спасают от повторения одной и той же идеи через полгода.

Третье правило это приоритеты. Идеи оцениваются по ожидаемому эффекту, уверенности и стоимости проверки.

Четвёртое правило это скорость. Один тест в месяц не меняет ничего. Ценность появляется на потоке из нескольких проверок в месяц.

Пятое правило это честность. Если тест провалился, об этом сообщают так же открыто, как об успехе. Иначе команда начнёт подгонять результаты.

Разбор числового примера показывает, как ложноотрицательный результат вводит в заблуждение

Полезно пройти расчёт на конкретных числах и увидеть, откуда берётся ошибка.

Пусть в группе А из пяти тысяч посетителей покупку совершили двести пятьдесят, то есть пять процентов. В группе Б из тех же пяти тысяч покупок триста, то есть шесть процентов. Разница составляет один процентный пункт, или двадцать процентов относительно базового уровня.

Расчёт по формуле для двух долей даёт вероятность случайности около половины процента. Значение ниже порога, значит, разницу можно считать подтверждённой.

Теперь изменим условие. Пусть трафик вчетверо меньше: по тысяче двести пятьдесят человек в каждой группе. Доли те же, но число покупок соответственно меньше. Расчёт даёт вероятность случайности около пятнадцати процентов. Результат ниже порога не опускается, и объявлять победу нельзя.

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

Рассчитаем, сколько наблюдений нужно для обнаружения роста на двадцать процентов при базовом уровне пять процентов, мощности восемьдесят процентов и пороге пять процентов. Формула даёт примерно три тысячи восемьсот наблюдений на группу, то есть около семи с половиной тысяч суммарно.

Если сайт посещают полторы тысячи человек в день и в эксперименте участвует вся аудитория, потребуется пять дней. При меньшем трафике срок растягивается, и это стоит понимать до старта.

Отдельно про множественные сравнения и ложные находки

Если проверять сразу пять вариантов, вероятность случайно найти значимую разницу резко возрастает. Каждое сравнение даёт свой шанс ошибки, и они складываются.

Первое следствие состоит в необходимости поправки. Простейшая поправка уменьшает порог пропорционально числу сравнений. Более мягкие варианты учитывают корреляцию между проверками.

Второе следствие связано с сегментами. Разбивка на десять групп по регионам даёт десять проверок. Одна из них почти наверняка покажет значимую разницу случайно.

Третье следствие касается повторных тестов. Если возвращаться к одной и той же идее снова и снова, рано или поздно получится нужный результат, но он будет артефактом.

Четвёртое следствие это осторожность с выводами по подгруппам. Различие между сегментами стоит проверять отдельным тестом, а не выискивать в уже собранных данных.

Пятое следствие это открытость. Если тестов было много, в отчёте указывается общее число проверок, иначе вывод выглядит убедительнее, чем он есть.

Все эти меры не отменяют пользы экспериментов. Они лишь напоминают, что случайность умеет выглядеть закономерностью, и чем больше вариантов просмотрено, тем выше шанс на такую маскировку.

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