A/B-тесты — важный инструмент в арсенале продуктовой команды. Это один из немногих способов понять, как изменения в продукте повлияли на поведение пользователей. 

При этом любой человек, который погружается в тему A/B-тестов, сталкивается с двумя противоречивыми утверждениями:

Первое: t-тест — самый популярный критерий для оценки A/B-тестов. 

Второе: t-тест можно применять только на данных, распределенных нормально.

Однако нормально распределенные данные в продуктах встречаются крайне редко.

В таком случае, что же делать, когда наши данные не подчиняются нормальному распределению? Можем ли мы все же полагаться на традиционные статистические методы (в частности, на t-тест), или нужно использовать другие методы, например бутстрап или непараметрические тесты?

В этом материале — ответ на этот вопрос и универсальный алгоритм для подбора подходящего статистического теста для ваших данных.

Этот материал совместно с GoPractice написал участник сообщества, Senior Product Analyst Тимур Ахмет (Массоми).

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

Далее — текст от лица автора.

***

Что такое t-тест?

T-тест — это статистический метод для определения того, есть ли значимая разница между средними двух выборок. Он вычисляет t-статистику с учетом разницы между средними, вариабельности и размеров выборок, после чего сравнивает ее с теоретическим распределением для получения p-value.

Прикладная применимость t-тестов

На самом деле t-тест прекрасно справляется с оценкой практически любых распределений данных при наличии большого количества данных.

Заблуждение же о его неприменимости для не нормально распределенных данных основывается на двух моментах:

1. Требования для нормального распределения является обязательным для небольшого количества наблюдений (несколько десятков).

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

2. Чтобы тест отработал как надо, распределение выборочных средних* должно быть нормальным.

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

Нормальное распределение выборочных средних гарантирует центральная предельная теорема (ЦПТ) при достаточно больших выборках. Кратко обозначим основные требования ЦПТ, которые обычно выполняются в продуктовых экспериментах:

  1. Независимость наблюдений. Поведение одного пользователя не влияет на другого.
  2. Одинаковое распределение. Пользователи взяты из одной генеральной совокупности (например, все — посетители одного продукта).
  3. Большой размер выборки. В продуктах обычно тысячи и даже миллионы наблюдений, что с запасом покрывает требуемый минимум (n ≥ 30 даже для не нормальных данных).
  4. Конечная дисперсия. Практически всегда выполняется, так как реальные продуктовые метрики редко имеют бесконечную дисперсию.

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

* Важно: нормально должны быть распределены именно выборочные средние, а не сама выборка.

Практическая проверка эффективности t-теста на разных распределениях

Мнения аналитиков по поводу того, когда и какой тест применять, расходятся довольно сильно. Тем не менее t-тест остается одним из самых популярных статистических критериев, используемых на практике.

Давайте проведем практическое исследование, чтобы доказать его эффективность.

Что мы будем делать

Для начала сгенерируем данные для теста из разных распределений (нормальное, одномодальное, логнормальное) с заранее заданными параметрами.

Далее — много раз (в нашем случае — 200) повторим следующий процесс: 

Симуляция A/A-теста:

  • Из каждого распределения будем брать две выборки по 1000 наблюдений. Так как обе выборки из одного распределения, мы точно знаем, что разницы между ними нет.
  • Эти выборки мы будем использовать для симуляции A/A-теста: для каждой выборки посчитаем метрики (например, среднее), а затем сравним их между собой с помощью статистического теста.

Симуляция A/B-теста:

  • Затем для одной из изначальных выборок данных добавим небольшой эффект (например, умножим все значения на 1.05, чем увеличим среднее значение метрики на 5%, что соответствует незначительному, но практически важному изменению поведения пользователей).
  • Сравним выбранную метрику (среднее) между группами, симулируя проведение A/B-теста.

A/A-тесты используются для проверки корректности работы статистического критерия:

  • Так как мы точно знаем, что в A/A-тесте разницы между группами нет, то все результаты со статзначимой разницей будут являться ложноположительными (статистический тест сказал, что разница есть, хотя ее в реальности нет).
  • Процент ложноположительных тестов должен быть равен установленному уровню значимости теста (также его называют «альфа»). Уровень значимости вы выбираете сами при использовании статистического критерия; он определяет, с какой вероятностью мы ошибочно найдем эффект там, где его нет (обычно это значение равно 5%).

При этом в A/B-тесте все статзначимые результаты будут означать обнаружение реального эффекта (мы же ведь заложили разницу между группами в 5%): 

  • Поскольку мы добавили разницу в 5%, ожидается, что мощность теста (1 — β) определит, в каком проценте случаев тест правильно выявит этот эффект. 
  • Чем выше мощность, тем больше реальных эффектов мы сможем выловить с помощью А/Б теста — и тем меньше будет вероятность пропустить реальный эффект, когда он есть (ошибка II рода).

В итоге, сравнивая результаты A/A- и A/B-тестов, мы сможем оценить, насколько хорошо t-test работает на реальных данных с разным распределением.

Сначала — нормальное распределение

Начнем с нормального распределения данных. На графике ниже исходное нормальное распределение обозначено голубым цветом, а оранжевым — аналогичное распределение, у которого среднее значение увеличено на 5%

Возьмем по 1000 случайных значений из каждой группы, посчитаем среднее для каждой выборки. Повторим 200 раз. У нас получится распределение выборочных средних для каждой группы:

Распределение средних значений выборок

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

Теперь давайте проведем множество A/A- и A/B-тестов по логике, описанной выше.

  • В A/A-тестах будем считать долю случаев, когда тест показывает статистически значимую разницу (хотя мы точно знаем, что ее нет). Тест работает корректно, если доля таких ошибок равна уровню значимости (α).
  • В A/B-тестах будем считать долю случаев, когда тест обнаруживает разницу (которая действительно была нами добавлена). Этот показатель покажет нам мощность теста.

Результаты отобразим на графике: доля ложноположительных результатов A/A-тестов отмечена синим цветом, а доля истинно положительных результатов A/B-тестов — зеленым.

Синяя линия (A/A-тесты)

По оси X у нас указаны выбранные уровни значимости для теста (α), а по оси Y — процент статзначимых тестов.

Если статистический тест работает корректно, то для A/A-тестов (где разницы между группами нет) процент статзначимых тестов должен соответствовать уровню значимости. Это будет выглядеть как прямая под углом 45 градусов, означающая, что мы получаем ожидаемое количество ложноположительных тестов.

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

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

Зеленая линия (A/B-тесты)

В A/B-тестах мы добавляем небольшой эффект (5%), поэтому здесь процент статзначимых тестов показывает, насколько хорошо тест выявляет реальную разницу. Если тест работает правильно, то процент значимых результатов должен соответствовать мощности теста (1 — β).

В идеале мы хотим, чтобы мощность теста была не ниже 80% — это значит, что тест способен выявить реальный эффект как минимум в 80% случаев. Поэтому зеленая линия должна быстро выходить на уровень 80% или даже выше. Если же зеленая линия остается ниже этого уровня, то тест слишком часто пропускает реальный эффект (это называется ошибкой II рода или ложноотрицательным результатом).

На графике выше мы наблюдаемая мощность теста быстро приближается к 100%.

Таким образом, t-тест ведет себя предсказуемо и надежно при данных, взятых из нормального распределения. Никаких сюрпризов!

Раскрытие интриги: за пределами нормальных распределений

Все становится еще интереснее, когда мы исследуем, как t-тест обрабатывает данные из других распределений. Рассмотрим одномодальное, логнормальное и половинное нормальное распределения.