Меню

A b тестирование ошибка первого рода

A/B-тесты это основной способ решения споров об интерфейсах в команде. Но часто эти споры решаются неверно, потому что ключевая ошибка при анализе результатов A/B теста это сравнение двух средних, без подбора критерия, оценки выборки. Беглый визуальный анализ отчетов в GA по принципу «где график выше, та версия и лучше» приводит к ошибочным выводам и стоит бизнесу кучу денег. Если до этого момента вы обходились знаниями, что онлайн-калькуляторы должны показать «p < 0.05» и «нормальное распределение похоже на колокол», то в этой статье я постараюсь расширить ваш кругозор.

Все примеры будут продемонстрированы для R-Studio. Общий процесс анализа: экспериментальный дизайн → сырые данные → обработанные данные → выбор статистической модели → суммарная статистика → p value. С экспериментальным дизайном дизайнеры справляются, про остальные шаги давайте говорить подробнее.

Формируем гипотезу

При формировании гипотезы руководствоваться лучше простыми понятиями: цели бизнеса, как эти цели достигаются клиентами и как это можно измерить (Single A/B test или Multi A/B test). Не менее важно понимать, как данные будут собираться и валидироваться, и как будут вноситься изменения по результатам теста. При этом предполагается, что проблема репрезентативности и достаточности объёма выборки решена. По умолчанию в данном уроке мы будем считать, что стандартное отклонение (корень из дисперсии) не зависит от размера выборки, так как выборка репрезентативна.

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

Либо, в качестве источника гипотезы банальный спор менеджеров продукта и проекта, результат коридорного опроса, желание оптимизировать CRO. Я не люблю тестировать фичи, которые очевидно улучшат конверсию, это достаточно бесполезная работа. Лучше тестировать фичи, у которых отдача бизнесу непредсказуема. В таких фичах обычно кроется рост всех ключевых метрик: CTR (Click Through Rate), конверсия, CPA, ROAS, CPI. Должен сказать, что при малом количестве данных очень сложно оценивать небинарные метрики (средний чек, выручка), результаты обычно очень шумные: работает принцип garbage in garbage out. А вот A/B тесты для бинарных задач проводить просто (выполнено/не выполнено). Но в любом случае самый первый шаг это определиться с целевой метрикой.

Далее мы должны определиться с математикой. Например, у нас частотный подход, а не Байес. Выбираем класс критериев. Если распределение нормальное, то параметрические критерии (Стьюдент, Anova для равенства средних; F-test, Бартлетта, Левана на равенство дисперсий; тест пропорций для биномиальных метрик; формальные тесты на принадлежность распределению). Они считают свою статистику на основе информации об оригинальной функции распределения, т.е. мы должны задать некие переменные. Если сравниваем средние и данных не много, то Bootstrap (траты внутри приложения). Последняя инстанция это непараметрические тесты, им нужна только информация из выборки. Есть подклассы: критерии случайности, симметрии, корреляции, сдвига и масштаба, сдвига. Они не такие мощные, но применимы везде. Так, Манна-Уитни и Краскала-Уоллисана наличие сдвига, для зависимых выборок тест Фридмана и «знаковый» критерий Уилкоксона, Bootstrap для сравнения распределения характеристик по квантилям и хи-квадрат Пирсона для изменения функций распределения.

Отличная практика для реальных данных со смещением влево, это сравнить две выборки непараметрикой, и сравнить эти же выборки после логарифма t-test’ом. Двойная проверка результата.

Хорошая гипотеза учитывает принципы индукции и фальсифицируемости. Индукция это отрицание гипотезы, возможность сформулировать негативного суждения. Древнегреческие боги были? Нет, не было. Фальсифицируемость же про попытки опровергнуть гипотезу, и если не получилось, тогда гипотезу можно принять. Докажи что не было Древнегреческих богов, а до тех пор считаем, что они были.

При проверке гипотезы помним, что нулевая гипотеза про отсутствие отличий, для ее доказательства нужна вся популяция, а не выборка. Альтернативная гипотеза говорит о значимости различий. Все отличия в выборках это всегда альтернативная гипотеза, а проверяется всегда нулевая. Ошибка первого рода (α, false positive) происходит, когда мы отклоняем нулевую гипотезу в пользу альтернативной гипотезы, при условии что справедлива нулевая гипотеза. H0 считается верной, пока не доказано обратное, и если она отвергается, значит нам пора бежать предпринимать действия. Это та самая альфа 0,05, которая говорит что в одном случае из 20 будет ошибка первого рода. Ошибка второго рода (false negative) происходит, когда верна альтернативная гипотеза, но было принято решение принять нулевую гипотезу. Другими словами, во время дизайна теста мы задаем уровень значимости. который показывает вероятность верности нулевой гипотезы. На основе significance level мы принимаем или отвергаем гипотезу с полученным p-value, это вероятность совершить ошибку первого рода. Вероятность ошибки второго рода это 1 — power, шанс не заметить значимые изменения. Поэтому нет смысла делать дизайна тестов базируясь только на ошибке первого рода. Низкое значение уровня значимости уменьшает шанс совершить ошибку первого рода, но растет шанс совершить ошибку второго рода, поэтому значение p-value подбирается исходя из критичности допуска ошибок. Например, нельзя допустить ошибку второго рода в таком кейсе: не сработать сигнализацией при попытке угона машины, это критично. При работе с калькуляторами вроде evanmiller для расчёта доверительных интервалов разницы мы не учитываем ошибку второго рода.

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

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

Итак, summary: если человек болен и мы это подтвердили — true positive (TP). Если человек не болен и мы это подтвердили — true negative (TN). Ошибка первого рода — здоровому человеку сказали, что он болен (FP). Или ошибка второго рода, сказали больному человеку что он здоров (FN).

Ошибки будут всегда, и для определения их существенности есть две метрики: полнота и точность (recall и precision), они про количество ошибок первого и второго рода. Recall = TP/(TP+FN), Precision = TP/(TP+FP). Метрики между собой конкурируют, поэтому надо учитывать обе метрики по интегральной характеристике.

И вернемся к метрикам бизнеса, нельзя про них забывать в ходе погружения в техническую часть. Надо видеть картину целиком. Если игнорировать LTV (lifetime value или сколько денег принес клиент за свой жизненный цикл) и ROI (return on investment или окупилась ли сумма привлечения клиента), то в краткосрочной перспективе можно хорошо поднять метрики ARPU diary, ARPU month и процент платящих, чем часто пользуются продуктовые менеджеры, бегающие из компании в компанию. Для краткосрочного поднятия ARPU достаточно ввести дополнительные регулярные акции. Но в долгосрочной перспективе такой подход приведет к финансовым проблемам, так как каннибализирует остальные механики привлечения денег, и это будет видно на LTV 6 month. Еще можно выполнить краткосрочный KPI если uplift-нуть CTR одной кнопки, и каннибализировать CTR других кнопок. Или остановить трафик для мобильного приложения, очень краткосрочно подрастет ROI. В общем, любые временные изменения в базовой экономике всегда ведут к временному увеличению метрик с дальнейшей трагической просадкой. Можно привести более наглядный пример: промо-ловушка из продуктовых магазинов. Покупатель думает, что цены растут и доходы снижаются, значит нужно меньше тратить. Продавцы это видят и снижают цены в рамках акций, это увеличивает выручку на короткий промежуток времени. Покупатели привыкают к акциям и идут в магазин целенаправленно в поисках товаров по скидке, продавец вынужден еще раз снижать цену, и далее делать это постоянно. При чем тут тесты? Бизнес после запуска разовой акции видит, что прибыль пошла вверх, трафик увеличился, клиентов стало больше, но вы как аналитик должны сказать, что не смотря на это выгода/маржа/грязный вал в разрезе трех месяцев упали. Это вечная дилема: выполнить план и получить просадку по марже, или не выполнить план, разово увеличить прибыль, но просесть по выручке. Говорите бизнесу про положительную EBITDA, тогда они вас будут слушать

Я буду приводить p-value = 0,05, так как это общепринятое значение. В реальных проектах p-value куда меньше.

Либо вы идете к разработчику и он каким то образом все делает за вас, и при работе с мобилками это основной способ проведения A/B теста. Либо используете GTM или Google Optimize, где разделяем трафик, готовите визуальное представление гипотезы и задаете условия ее отображения (сегменты и тому подобное). В результате будет возможность менять не только цвет и тексты на странице, но и создавать новые функциональные сущности или развивать имеющиеся, а также успешно сегментировать гипотезы еще на этапе запуска. Это дает большое преимущество в условиях ограниченных технических и финансовых ресурсов крупного бизнеса.

С Optimize надо быть осторожным, нельзя полагаться на автоматику. Так, предположим что у вас есть два варианта страницы, но только второй вариант проходит через переадресацию. Тогда latency и частота отказов у второго варианта будет больше, как следствие, когорта меньше. Если смотреть более глобально на вопрос «в какой момент пользователь должен попасть в свою группу во время теста», то очевидным ответом будет «чем раньше, тем лучше». Тесты могут быть exposed и non-exposed, в первом случае мы сталкиваем пользователя с изменениями на сайте и тем самым уменьшаем дисперсию (не факт), во втором — глобально делим на когорты, тем самым экстраполируем эффект на весь трафик. Кейс из практики: мы устанавливаем виджет с такси только на главную страницу нашего сайта и только для пользователей, у кого накопилось более 20 000 баллов. Тогда используем exposed тест, считаем A2C, получаем бОльший эффект, чем при подсчете метрики глобально. 

Вот как все происходит в подавляющем большинстве случаев: случайно делите весь новый трафик из новичков на тест и контроль. На основании опыта или теории получаем ожидаемый размер эффекта, и от него считаем выборку. Получив результаты, проверяем их на статистическую значимость. Дополнительно, можно провести АAB-тест, это позволит убедиться, что различия только на уровне поведения пользователей, а не на уровне багов системы, изменения погоды и прочих факторов. Аудиторию перед тестом можно раскидывать простым рандомом, а можно престратификацией (CUPED). Если почти все пользователи новые, то CUPED с дополнительной ковариатой.

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

Данные не обязательно собирать самостоятельно, основные источники данных это:
1. Данные из собственных приложений, сайтов, расширений и т.д (CRM, ERP, транзакции, метрика, Amplitude).
2. Снифферинг незашифрованного траффика на крупных узлах обмена данными.
3. Покупка данных сторонних поставщиков — создателей приложений, расширений, рекламных/баннерных сетей, малвари, червей и т.д., как легитимным, так и не очень образом.
4. Открытые данные рынка и исследования агентств (Росстат, GFK).
5. Сырые events из продукта.
6. Покупка данных о посещаемости каких-нибудь ресурсов, которые готовы продать данные.
7. Хантинг людей, опросы и исследования, фокус-группы.

Характеристика и нормализация данных

Предположим, данные готовы, они могут быть в формате csv или Excel. Их может быть много или мало, плотность распределения вероятностей среднего значения выборки может быть нормальной и ненормальной. Проверка на нормальность данных нужна, чтобы центральная предельная теорема выполнялась на малых выборках. Если выборки большие и наблюдения независимые, то предположение о нормальном распределении для теста Стьюдента не нужно (т.к. работает центральная предельная теорема). На 1000 пользователях не удастся отследить мелкие изменения (1-2%), но изменения в 20-30% можно. Проще говоря, при большой выборке результаты теста будут точные, при маленькой выборке не факт, что есть смысл проводить A/B тест.

Предположим, что данных мало, значит, нужна проверка о типе распределения данных. Не факт, что удастся отличить равномерное распределение от нормального на очень маленькой выборке. В общем случае, нужно построить график столбчатой диаграммы и посмотреть его форму. Нормальное распределение выглядит как колокол с тремя сигмами с каждой стороны. Правило трех сигм: каждая сигма это одно стандартное отклонение, данные нормально распределены, и 99,7% выборки попадает влево по графику на три сигмы, и вправо по графику на 3 сигмы. Если выборки гомогенные и распределение нормальное, то наш выбор это t-Критерий Стьюдента. На Стьюденте сложно контролировать мощность, и значит, растет шанс совершить ошибку второго рода. Если же по графику видно, что распределение с отклонением на левую сторону графика, то используется хи-квадрат Пирсона, это непараметрический критерий. Он хорошо подходит для проверки равномерного налива трафика, но требует сгруппировать данные по бакетам (создать таблицу сопряженности). Если распределение отлично от нормального, то правило трех сигм — не лучший выбор, если наше распределение вырожденное. Но на картинке ниже слева распределение вполне может быть логнормальное, и можно отрезать по квантилям.

Встречается еще мультимодальное или бимодальное распределение, но чаще после ресемплинга. Если мы говорим про оценку средних, то при достаточном кол-ве наблюдений данные будут распределены нормально. Это большой плюс работы над крупным продуктом, в котором всегда много данных: при любом распределении исходных величин распределение выборочных средних будет стремиться к нормальному. Результат попросту зависит от мощности, т.е. от размера выборки. Идеально нормальных данных быть не может, если под реальной жизнью не понимать результат работы функции rnorm(). Да и данные в нашем случае дискретны и являются набором точек. Поэтому на большой выборке shapiro-wilk всегда будет значимым. А вот на выборках 10-15 значений он всегда незначимый из-за недостаточной мощности. В статистике мощность асимптотически стремится к 1.

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

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

Сегментация нужна. Хотя бы на уровне киты/планктон и рандомом, сверяясь на A/A-тесте. Или по странам, месяцу регистрации. Если нет параметрического критерия, тогда делим данные на две одинаковые группы, задаем α — уровень значимости, n — размер выборки, mde — эффект. Одну из групп сдвигаем на mde, применяем критерий и бутстрэп.

Итоговый процент принятия нулевых гипотез будет 1 — β. По завершению A/A-теста важно посмотреть на распределения p-value. Оно должно быть равномерным. Если наблюдается скос, то значит, есть сильные зависимости между данными и анализ делать нельзя. А вот для a/b такой подход не пойдёт.

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

Выбросы надо смотреть на box-plot и удалять ручками, как и дубли. Если мы работает с финансовыми метриками и удалять выбросы невозможно, то значит увеличивается разброс значений и доверительные интервалы также увеличиваются. Применяется правило трех сигм: убрать все значения, которые выходят за три стандартных отклонения и посмотреть, как изменятся наши данные. Но будет большая потеря данных, что может быть критично. Другой способ это метод трансформации по Боксу-Коксу. При этом надо понимать, что удаление выбросов только для применения того или иного критерия—не верный подход. Прагматичнее для начала посмотреть срезы, где явно будут видны различия.

Давайте сгенерируем данные таким способом usersExport <- data.frame(n = 3:90) и построим график boxplot(usersExport). Мы получим практически идеальный график, на котором есть квантили.

Как читать график boxplot: точка или линия соответствуют средней арифметической, эту точку окружает квадрат, его длина соответствует точности оценки генерального параметра. Усы от квадрата соответствуют своей длиной одному из показателей разброса или точности. Для формирования boxplot нужно написать комманду boxplot(имя переменной). Можно для эксперимента создать дырки в данных usersExport <- usersExport[-sample(3:90, 23), ] и посмотреть, как изменится график boxplot.

Вот пример графика с выбросами:

Проверить данные на нормальность можно простым взглядом по qqplot(). При больших объемах тесты практически всегда покажут отклонения от нормального распределения. Поэтому, если данные получились очень ненормальные, например у времени, проведенного за смартфоном или финансовых показателей всегда есть ограничение снизу, то нужна нормализация или хотя бы удаление выбросов. Переходя к цифрам, различие в 5% не такое уж и большое. На большой выборке будет совсем близко к 0,05. Кроме того, многие тесты устойчивы к умеренным отклонениям от нормального распределения. Даже очень небольшие отклонения от нормальности будут значимы на больших выборках, но это справедливо для всех стат. тестов.

qqplot(rt(a,df=3), x, main="t(3) Q-Q Plot")
abline(0,1)

Мы видим, что R-Studio нарисовал график Q-Q (слева). На таком графике отображаются данные в отсортированном порядке по сравнению с квантилями из стандартного нормального распределения. За исключением выбросов, точки расположены более менее по прямой, хотя и скашиваются. Значит, наши данные искажены. На это также указывает, что точки расположены вдоль линии в середине графика, но отгибаются в конце. Такое поведение характеризует наличие в выборке более высокие значений, чем ожидалось от нормального распределения. Пример нормального распределения показан на графике Q-Q справа.

Еще один пример нормальных данных: вводим команду для генерирования данных x <- rnorm(100). Строим график с линией qqline(x), и добивает гистаграммой hist(x).

Пример ненормальных данных: y <- rgamma(100, 1), затем qqnorm(y); qqline(y), и гистограмма hist(y).

Выбираем победителя

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

Тест на нормальность (Шапиро - Уилка)

Тест на нормальность (Шапиро — Уилка)

Для начала рассмотрим тест Шапиро-Уилка как критерий для определения нормальности, он очень мощный. Критерий Шапиро-Уилка это W-критерий, который также позволяет оценить нормальность. Если W=1, то выборка точно нормально распределена. Так, нулевая гипотеза = выборка принадлежит нормальному распределению. Если Шапиро-Уилка дает маленький p-value, то значит есть выбросы. Все, что выше 0,75, можно считать нормальным распределением. Для выполнения теста Шапиро-Уилка предназначена функция shapiro.test(x), принимающая на вход выборку x объема не меньше 3 и не больше 5000. Генерируем нормальные данные, x <- rnorm(4600), и используем тест shapiro.test(x). Мы видим следующий текст:

Shapiro-Wilk normality test
data: x
W = 0.99947, p-value = 0.222

Смотрим на p-value = 0.222 и принимаем нулевую гипотезу.

W это значение статистики теста, в данном случае это 0.99947, что считается отличным результатом, т.к. выборка изначально имеет нормально распределенные данные. Чтобы отклонить нулевую гипотезу, p-value должно быть не выше альфы 0,05 (максимум 0,1). Проверим на ненормальных данных:  y <- rgamma(100, 1), shapiro.test(y).

Shapiro-Wilk normality test
data: y
W = 0.9829, p-value < 2.2e-16

P-value < 2.2e-16, что намного меньше 0.05, практически 0. И это при том, что R сообщает только значения p-value выше порога 2.2×10−16. Мы отклоняем нулевую гипотезу. Сначала смотрим, меньше ли 0.05, потом сравниваем средние или медианы. На несимметричных данных медиана значительно лучше отразит центральную тенденцию, чем обычное среднее. Если распределение одной из выборок заметно отличается от нормального, то в качестве центра берется медиана и соответственно, критерий Уилкоксона — Манна-Уитни, непараметрический и хорошая замена Хи-квадрату Пирсона. Если у данных положительный длинный хвост (прибыль) и ненормальное распределение, то это Манна-Уитни, перестановочные тесты или бутстреп. Перестановочные тесты про гипотезу о схожести распределений двух выборок. 

Если же распределение всех выборок нормальное, то среднее арифметическое это наш выбор, и какой-либо из Стьюдентов (критерий сдвига). 

Проблема это ограничение на 5000 наблюдений. Если наша выборка больше, то применяем Shapiro-francia w’ test. Или Anderson-Darling test, его попроще найти в готовом виде, он может проверить данные на любые распределения. Либо тест Колмогорова-Смирнова (критерий согласия), но для решения реальных задач лучше его не использовать.


A/B-тесты подразумевают два набора данных, поэтому тест нужно проводить для обоих выборок. Это не обязательно тест Шапиро-Уилка, это может быть и непараметрический ранговый U-критерий Уилкоксона — Манна-Уитни. Проверяет гипотезу сдвига, кушает любые выборки, но понятное дело, что обе выборки должны быть примерно схожи по распределению. Тест робастый, оперирует рангами. Сдвиг это не про проверку медианы, а про проверку «скошенности» данных относительно друг друга. Если в одной выборке у нас значения [2,3,4,5], а во второй [5,6,7,8], то это явно сдвиг. 

Если данные непрерывные, то в простых случаях хорошо работают критерии Уилкоксона — Манна-Уитни/Краскела-Уоллиса, в которых нулевые гипотезы на сравнения распределений и медианы. Распределение 50 на 50 подразумевает использование формулы Бернулли, а может быть и Байесовский многорукий бандит. Если же использовалось сплит-тестирование, то нужно использовать непараметрический дисперсионный анализ — критерий Краскела-Уоллиса. Для сравнения дисперсий хороший вариант Fligner-Killeen и Brown–Forsythe. Рассмотрим с примерами.

Подход Байеса рекомендуется при большом количестве данных, альтернатива частотному подходу. Частотный подход про нулевую гипотезу и про частоту событий, Байес — про принятие нулевой гипотезы, позволяет работать с событиями и причинами. Нельзя применять Байеса и частотный подходы одновременно, это ведёт к «парадоксу Линди».

Частотный подход не позволяет сделать предположение заранее, предлагается полагаться на данные тестовой выборки. Мы повторяем эксперимент бесконечное количество раз для получения гистограммы объективной неопределенности. Сама гипотеза проверяется по классическому p-value. Важно зафиксировать размер выборки до эксперимента, вот две формулы для этого:

  1. В числителе находим дисперсию (α2), в знаменателе mde.
  2. z — стандартная ошибка, 1,96 при 95% уровне значимости.
  3. σ — стандартное отклонение.

Обратите внимание, что практически все переменные взаимосвязаны. Чем меньше эффект, который мы хотим поймать, тем больше размер выборки.

Обобщающая способность. Если мы возьмем гомогенную выборку, то дисперсия будет меньше, функция плотности вероятности будет более сконцентрированная, чем при 100% доступных данных. Но и выводы по гомогенной выборке будутрелевантны выборке, а не всем данным. Вывод: меньше дисперсия = меньше обобщающая способность.

Давайте на примере. Нужно найти размер выборки для теста пропорции категориальных данных. α = 95%, mde = 0.05, p = 70%, z = 1.96. Так, n = 1.96^2 * 0.7 * (1 — 0.7) / 0.05^2 = 3.8416 * 0.7 * 0.3 / 0.0025 = 322.

Идея Байеса в получении 500 раз выпадение орла из 1000 бросаний монетки, и считается по формуле C500(1000) * 0.5^(500) * 0.5^(500), т.к. броски друг от друга никак не зависят. Если бы мы знали все возможные параметры монетки, мы могли бы предсказать результат. Но так как это невозможно, то проводим множество наблюдений. Байес позволяет ответить на задачу индукции, какой из вариантов лучше и на сколько. У Байаса всегда есть априорное распределение, а значит, нужно иметь свои представления о параметрах исследуемового процесса. Что, в принципе, является основой образа мышления дизайнера. Для Байеса можно не считать мощность и значимость, но пропадает понимание эффекта. Если по каким то причинам не нравится Байеc, то можно использовать Стьюдента или Бернулли для больших выборок. Если результаты 0 и 1, то точно Бернулли и биномиальное распределение. А с ним легко работать, интерпретировать, визуализировать.

Критерий Стьюдента

Критерий Стьюдента

Стьюдент. T-тест или определение t-критерия Стьюдента является простейшим способом проверки точности среднего значения для данных с естественными значениями. Выборки должны быть независимыми (не парными) и нормально распределенными (чем больше результатов, тем ближе распределение к нормальному). Это гарантирует концентрацию плотности значений вокруг среднего значения, что позволяет делать выводы о генеральной совокупности, имея только информацию о выборке. Провести тест легко: x = rnorm(1000000) и y = rnorm(1000000). Команда t.test(x,y). Получаем следующие данные:

data: x and y
t = -1.1696, df = 2e+06, p-value = 0.2422
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.004424298 0.001117388
sample estimates:
mean of x mean of y 
-0.0007571144 0.0008963404

И проверяем:

m = length(x); n = length(y)
t = ( mean(x) - mean(y) ) / sqrt( var(x)/m + var(y)/n ); t

В обоих случаях получаем t = -1.1696, и p-value = 0.2422. Так как мы всегда обеспокоены тем, является ли p больше или меньше 0,05, то при 0.2422 > 0.05 есть основания не отвергать нулевую гипотезу. P-Value это достигнутый уровень значимости (пи-величина)—наименьшая величина уровня значимости, при которой нулевая гипотеза отвергается для данного значения статистики. По P-Value происходит проверки (и отклонения) «нулевой гипотезы». Чем меньше значение Р, найденное для набора результатов, тем меньше вероятность того, что результаты случайны. Результаты считаются «статистически значимыми», когда это значение ниже 0,05 (или 5%). Если удастся довести значение до 0,005, то уже хорошо, сильно уменьшится количество позитивных неправильных результатов. При 0,05 считается нормой 1/3 неправильных выводов. В идеальном мире даже 0,005 должно быть лишь приблизительной наводкой на финальное решение. В физике или при исследовании генов используется 0.0000003. Чем ниже значение p, тем выше перевес в пользу альтернативной гипотезы.

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

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

Парный t-тест имеет уменьшенное количество степеней свободы, но при этом устраняется влияние индивидуальных различий. Нужен для сравнения зависимых выборок, он мощнее непарного t-теста. Зависимые выборки это когда элемент из контрольной группы имеет соответствующий ему элемент во второй группе. Например, при тесте одинаковой главной страницы в сентябре 2018 года и в сентябре 2019, или навыки дизайнеров до и после курсов. при зависимых выборках нас интересует, как изменения в одной группе повлияют на другую.

leftGroup <- c(12, 13, 11, 15, 19, 15, 17)
rightGroup <- c(14, 14, 16, 16, 18, 14, 15)
t.test(leftGroup, rightGroup, var.equal=TRUE)
t.test(leftGroup, rightGroup, paired=TRUE)

Получаем p-value = 0.5648 в первом случае и p-value = 0.4539 во втором. Очевидно, что дискриминационная способность у парного теста больше.

Второй по популярности — z-тест пропорций. Это параметрический тест, проверяет равенство средних. Видим биномиальное распределение, применяем z-тест. Например, для метрик отношения/конверсии. Тестируется биномиальная случайная величина (орел или решка, 1 или 0, Да или Нет), значит, z-тест. Нужна независимость выборок. Если же задача в сравнении равенства дисперсий, то наш выбор это Levene, тест Бартлетта. Они параметрические, тест Бартлетта будет помощнее, но и требует более нормальное распределение, чем Levene.

Следующий критерий, Уилкоксона — Манна-Уитни, позволяет протестировать, что результаты случайных наблюдений из одной группы могут быть выше, чем в другой. Это непараметрический критерий, альтернатива t-test. Идея такая: для t-test нужны нормально распределенные данные (нормальность среднего распределения) и его результаты легко интерпретировать, но он чувствителен к выбросам. Если у нас нет информации о нормальности распределения, используем критерий Манна-Уитни, имея ввиду, что он не покажет тонких различий между выборками и его сложнее интерпретировать. Причина в том, что t-критерий работает на основе сравнения средних из фактических наблюдений, в то время как критерий Манна-Уитни использует сравнение рангов (номеров наблюдения в упорядоченной выборке), что позволяет ему быть устойчивым к выбросам. Но при этом критерий Манна-Уитни весьма чувствителен к различию дисперсий, и на больших выборках это становится очень заметно.

Поэтому на практике допускается использовать t-test для оценки средних на большой выборке, так как нормальность обеспечивается «сжиманием» крайних значений по ЦПД (чем больше элементов в выборке, тем меньше дисперсия среднего арифметического). Но при этом помним, что чем больше отклонения от нормальности, тем хуже тест сравнивает выборки. Так что t-test не подойдет для небольших выборок из ненормального распределения, но подойдет для большой выборки из ненормального распределения.

T-test чувствителен к выбросам, и если есть длинный хвост в данных (а он почти всегда есть на реальных финансовых данных), то такой хвост сильно скажется на среднем, и за счет большой дисперсии получим плохой результат работы критерия. Любые популярные метрики, вроде ARPU, количество сессий, время чего-либо, ARPPU, средний чек это не биномиальное распределения. И зачастую они не поддаются анализу параметрическими тестами, длинные хвосты и значит, большее количество денег мы получаем от небольшого кол-ва пользователей. Это можно решить за счет техники бакетов, но опять же, нужна большая выборка. Если маленькая выборка, тогда у нас выбор: либо U-критерий Манна-Уитни, считаем p-value внутри дней с поправкой на множественное сравнение, теряя в мощности. Если можно избежать применения поправок — лучше избежать. Либо накопительный p-value. Либо bootstrap как самое простое решение, получим распределение выборочного среднего и посмотрим на пересечение квантилей с заданным уровнем значимости. Либо CUPED преобразует данные в нормальные, уменьшив отклонения от среднего, и T-Test с поправкой Уэлча. Либо mood’s median test, но понадобится таблица сопряженности.

Используем команду wilcox.test(mpg ~ am, data=mtcars) получаем сообщение, “не могу подсчитать точное p-значение при наличии повторяющихся наблюдений”. Если вас смущает это сообщение, измените команду на wilcox.test(mpg ~ am, data=mtcars, exact=FALSE). Это объяснит программе, что мы все понимаем, и не ждем точного расчета p-value. Получилось W = 42, p-value = 0.001871. Напомню, P-Value должно быть не выше 0,05.

А теперь возьмем два набора наблюдений и протестируем:

a = c(123, 105, 147, 142, 119, 129, 130, 87 ,301, 92, 177, 141, 137, 112, 138, 128, 114, 197, 198, 210, 101, 125, 134, 214, 110, 100, 152, 122, 144, 148 ,153 ,212)
b = c(154, 512, 120 ,131 ,124 ,118 ,178 ,140 ,136, 68, 162, 127, 78 ,106, 133, 655 ,155 ,169 ,199 ,108 ,143, 341 ,121 ,139, 166, 174, 184, 98, 135, 132, 146, 209)
 wilcox.test(a,b)

На выходе получаем:

data: a and b
W = 455, p-value = 0.4507
alternative hypothesis: true location shift is not equal to 0

У нас есть наше любимое P-Value, которое куда больше, чем 0,05. Мы принимаем нулевую гипотезу. W является статистической статистикой Уилкоксона и, как следует из названия, является суммой рангов в одной из двух групп.

Если р < 0,05, то нулевая гипотеза про отсутствие отличий отвергается.

С Бернулли схожая история, берет два вида данных (орел/решка, мальчик/девочка, красное/черное). rbinom(200, size = 1, p = 0.68) где p это шанс получить 1. Грубо говоря, rbinom скажет, сколько будет орлов, если сыграть определенное кол-во раз в монетку. Пример показывает сразу 200 испытаний Бернулли. Посмотрим, как мы можем сравнить два испытания Бернулли, т.к. данные очень похоже на результат бинарного A/B теста:

varA <- rbinom(200, 20, 0.5)
varB <- rbinom(200, 20, 0.25)

И используем hist(varB, probability = TRUE, col = gray(0.9)) для двух наборов данных. На графиках мы видим 200 биномиально распределенных случайных чисел для испытаний размером = 20 и с разной вероятностью возникновения интересующего нас события p = 0,25 и 0,50.

Биномиальные критерии это сравнение пропорций. Позволяют проверить гипотезу про коэффициент удаления приложения. Если выборка маленькая (100), конверсия в покупку 12%, то биномиальный тест лучший выбор. Стьюдент может быть применен к распределению Бернулли, но выборка маловата, должно быть > 200. В данном примере, с бутстрепом будет аналогичная история.

Говоря о типичных финансовых данных, где есть пик-скопление небольших платежей + длинный хвост, и нас не пугает работать с логарифмом от некой велечины (но не от 0), то методом Бокса-Кокса можно транформировать данные в нормально распределенные. Простой логарифм от числа, который тем не менее усложняет интерпретацию результатов. После этого берем привычный параметрический тест (t-критерий Стьюдента), смотрим p-value и оцениваем уровень значимости для закрытия эксперимента.

Процесс выглядит так: узнаем про выбросы с помощью boxplot, проверяем выборку на нормальность с помощью теста Шапиро Уилко, охарактеризовать распределение с помощью QQnorm, и выбрать метод анализа. Если данные нормальные, используем Бернулли, Гаусса, Стьюдента. Ненормальные (график сглажен по одной из сторон): Хи-квадрат, Байес, Пуассон. Обычно данные выглядят как диапазон от 0 до десятков в кучей выбросов до нескольких сотен, и это распределение Пуассона. Распределение Пуассона применяется в теории массового обслуживания. После этого оцениваем параметры, учитываем их при запуске теста хи-квадрат к выборке и распределению Пуассона, и получаем ответ про правильность гипотезы при распределение Пуассона.

Итак, тест прошёл. На что мы можем посмотреть? В первую очередь, нельзя подгонять новые гипотезы по факту завершения эксперимента под найденную разницу, хотя очень хочется. Называется это P-hacking, когда сначала идет сбор данных, проверяют множество разных гипотез, и те, которые соответствуют p<0.05, публикуют в научных журналах. Если вы работаете в науке и нужно собирать гранты на новые научные изыскания, то все на вашей совести. Но в бизнесе такой подход недопустим.

Могло показаться, что t-test это участь исключительно научной работы и он не применим для бизнес-задач. Но вот пример: возьмем метрику отношения (ratio metric), например CTR. Посчитаем соотношение суммы кликов и суммы просмотров, их отношение это конверсия в клик. В таком примере данные зависимы и не можем использовать t-test.

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

После теста проверяем, все ли пользователи завершили целевое действие. Например, среднее время жизни пользователя сервиса для генерации временных e-mail адресов составляет 5 дней. В выборке не должно быть тех, кто начал пользоваться сервисом за 5 дней до конца эксперимента.

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

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

P-value тоже имеет свой доверительный интервал. Если провести 10000 A/A-тестов при p-value=0.05, то мы ожидаем, что 500 прокрасится. Даже у этих 500 есть доверительный интервал, некий доверительный интервал доверительного интервала. Помогает вероятностный подход: классическая теорема Байеса.

Не только R

Сейчас любой аналитик (не важно, UX, бизнес, дашбордист, ресерчер, разработчик) должен уметь в R и Python. Но базовый навык работы в Excel по прежнему помогает быстро решать многие задачи. При работе над продуктом требуются быстрые выводы по популярным метрикам, dau/mau, конверсия в регистрацию, и показатели метрик часто меняются. Распространенная практика это использовать среднее для всех первичных KPI, если распределение нормальное. Это позволяет делать первичные выводы очень быстро. Понять тип распределение можно с помощью стандартного/среднеквадратичного отклонения. в Excel для этого используется функция =сроткл. Формула выглядит как STD=√[(∑(x-x)2)/n], и расшифровывается как корень из суммы квадратов разниц между элементами выборки и средним, деленной на количество элементов в выборке.

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

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

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


← Предыдущий урок

(Перед вами перевод бесплатного курса по A/B тестированию от компании Dynamic Yield. Если вы здесь впервые, то лучше начните сначала)

Автор английской версии: Идан Михаэли, директор по Data Science в Hippo Insurance

Над переводом работали Оля Жолудова и Ринат Шайхутдинов. При поддержке koptelnya.ru.

Коптельня — команда по быстрой разработке веб-приложений и сайтов.

A/B тестирование — это одна из самых популярных техник оптимизации веб-страниц. Техника позволяет маркетологам, владельцам сайтов принимать более взвешенные и обоснованные решения относительно целесообразности внедрения их творческих идей. Другими словами, когда кто-то предлагает что-то на сайте поменять, мы можем оценить эти изменения не интуитивно и не с высоты чьего-то опыта, а объективно, отталкиваясь от конкретных целей: как ближних (например, CTR кнопки), так и долгосрочных (например, конверсия в покупатели). В то же время, тесты страхуют нас от серьезных ошибок, которые могут подорвать вовлеченность.

Давайте же занырнем глубже в механику классического A/B тестирования, познакомимся с понятием статистическая значимость (statistical significance) и разберемся, что может угрожать достоверности результатов ваших тестов. В конце статьи я приведу пару альтернатив классическому A/B тестированию от Dynamic Yield.

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

Важно помнить, что когда мы выбираем одну из версий, то фактически масштабируем показатели, полученные в результате тестирования, на всю аудиторию потенциальных пользователей, а это — серьезный прыжок веры. Поэтому тестирование должно быть достоверным; иначе есть риск принять неверное решение, которое в долгосрочной перспективе негативно скажется на показателях сайта. Процесс достижения нужной достоверности мы называем тестированием гипотезы (hypothesis testing), а саму искомую достоверность — статистической значимостью (statistical significance).

Тестирование гипотезы начинается с того, что мы формулируем нулевую гипотезу (Null hypothesis) — некое утверждение, которое закрепляет статус кво, например “оригинальная страница (база) дает тот же CTR, что и вариация с новым дизайном”. Далее мы смотрим, можно ли отклонить это утверждение как крайне маловероятное. 

Что важно учесть при отклонении нулевой гипотезы?

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

Ошибки первого рода. На деле же, этой разницы может не быть, а различия в результатах, на которые мы опираемся — это воля случая. Такой тип ошибок называется ошибки первого рода (type I error) или ложноположительные результаты (false positive).

Ошибки второго рода. Второй тип ошибок наблюдается, когда мы не наблюдаем значительной разницы между вариациями страницы, в то время как разница на самом деле есть, а ее отсутствие в тестировании — это случайность. Такие ошибки называют ошибками второго рода (type II error) или ложноотрицательными результатами (false negative). 

Подробнее про ошибки первого и второго рода →

Как избежать ошибок первого и второго рода? 

Краткий ответ такой: устанавливайте правильный размер выборки. Чтобы определить нужный размер выборки, необходимо задать несколько параметров для нашего теста. Чтобы избежать ложноположительных результатов, нужно установить уровень достоверности (confidence level) или, другими словами,  статистическую значимость. Это должно быть небольшое положительное число. Как правило, уровень значимости принимают равным 0,05: это означает, что на действующей модели лишь в 5% случаев есть вероятность выявить ложную разницу между двумя вариациями (то есть пятипроцентная вероятность ошибки). Про эту общепринятую константу обычно говорят “достоверность более 95%”.

Большинство специалистов по проведению тестирований (как и большинство инструментов, доступных на сегодняшний день) довольствуются этим первым параметром. Но, если мы хотим также застраховаться от ложноотрицательных результатов (false negative), нужно определить еще два параметра.

  • Первый — это минимальная разница в результатах, которую мы хотим отслеживать (при условии, что разница была выявлена). Второй — это вероятность выявить эту разницу (при условии, что она существует).
  • Второй параметр называют статистической мощностью (statistical power) и часто по умолчанию принимают его за 80%. Далее нужный размер выборки рассчитывается на основании этих трёх значений (можно воспользоваться онлайн-калькулятором). 

Хотя этот процесс может показаться достаточно сложным, а рассчитанный таким образом размер выборки часто кажется слишком большим, стандартный подход к тестированию диктует именно такую процедуру — иначе о достоверности говорить не приходится. Горькая правда в том, что даже при условии чёткого следования вышеописанному алгоритму, вы всё равно можете получить некорректные результаты. Давайте разберемся почему. 

Я провел все вычисления; теперь можно полностью доверять результатам?

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

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

Второе предположение состоит в том, что элементы каждой выборки распределены одинаково (identically distributed). Проще говоря, это означает, что вероятность конверсии равна для всех посетителей. Конечно, это не так. Вероятность конверсии зависит от времени, местоположения, предпочтений посетителя, источников трафика и многих других факторов. К примеру, если во время проведения эксперимента, на сайте крутится какая-то рекламная кампания, мы можем наблюдать прилив трафика с Facebook. Это может привести к резким изменениям в CTR (click-through rates) — ведь люди, привлеченные рекламой, отличаются от ваших обычных посетителей. Такие колебания влияют не только на A/B тесты, но и на более продвинутые техники оптимизации, которые мы применяем в Dynamic Yield. 

Третье предположение заключается в том, что измеряемые нами показатели (например, CTR или конверсия) имеют нормальное распределение. Возможно для вас это звучит как абстрактный математический термин, но правда в том, что все “магические” формулы расчета уровня достоверности основаны на этом предположении, которое, кстати, очень шаткое и соблюдается далеко не всегда. В целом можно выделить такую зависимость: чем больше размер выборки и чем больше мы наблюдаем конверсий, тем сильнее соблюдается это предположение — согласно центральной предельной теореме.

Окей, понятно, что математика не застрахована от ошибок, но на какие подводные камни стоит обратить внимание? 

Таких подводных камней два.

Во-первых, платформы для проведения A/B тестов часто предлагают наблюдать за результатами тестирования в реальном времени. С одной стороны, это дает чувство контроля над ситуацией и позволяет специалисту следить за прозрачностью тестирования. Однако, наблюдая за показателями “в прямом эфире”, мы рискуем приступить к активным действиям раньше времени, отталкиваясь от сырых данных. Кто-то останавливает тестирование, получив первые результаты — даже если нужный размер выборки еще не достигнут, кто-то тормозит, как только достигнута статистическая значимость; оба сценария — прямой путь к ошибкам. Это вызывает статистическую погрешность (statistical bias) в сторону выявления разницы, которой на самом деле нет; более того, эту погрешность мы не можем заранее рассчитать и скорректировать (например, установив более высокий уровень значимости). Больше на тему: Как не надо анализировать A/B тесты. Проблема подглядывания →

Второй подводный камень — это завышенные ожидания от вариации-победителя после проведения тестирования. В результате проявления статистического эффекта известного как регрессия к среднему (regression toward the mean), долговременные результаты вариации-победителя могут быть не такими высокими, как в процессе тестирования. Проще говоря, есть вероятность, что вариация-победитель на самом деле была не объективно лучшей, а просто более “везучей”. Это везение со временем заканчивается и сглаживается, в результате чего возникает ощущение, что результаты падают. 

Есть ли альтернативы A/B тестированию? 

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

К примеру, нам нужно узнать, какой из трёх заголовков статей сработает лучше. При этом сайт, на котором будет размещена статья, относительно новый, а сама статья будет висеть на главной странице лишь несколько часов. Это означает, что нам нужно быстро выявить самый эффективный заголовок и применить это знание в рамках нескольких часов. В этом нам поможет метод “многорукого бандита”. 

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

Более глубокий уровень оптимизации делает ставку на полную персонализацию. Это можно делать вручную или автоматически. Суть в том, что мы показываем определенным пользователям определенные вариации. Рассмотрим пример персонализации вручную. Допустим мы хотим на День Королевы показывать всем посетителям из Нидерландов оранжевый фон страницы. Очень часто такие ручные изменения приносят свои результаты. Минус в том, что они плохо масштабируются. Допустим, у нас на сайте действует рекламная акция для посетителей с Facebook. Что делать, если с Facebook приходит голландец? По мере появления новых групп посетителей, количество вариаций будет расти, а правила оптимизации — усложняться. Кроме того, здесь в игру вступает метод научного тыка — вроде бы эксперименты должны принести какие-то результаты, но никто не знает какие. 

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

Вывод и рекомендация

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

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

Чтобы определить, насколько значимы результаты вашего теста, воспользуйтесь нашим бесплатным калькулятором байесовского A/B тестирования. 


← Назад | Продолжение (Глава 4) →


Ошибки I и II рода при проверке гипотез, мощность

Общий обзор

Принятие неправильного решения

Мощность и связанные факторы

Проверка множественных гипотез

Общий обзор

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

Например, можно сравнить эффективность двух видов лечения, чтобы сократить 5-летнюю смертность от рака молочной железы. Для данного исхода (например, смерть) сравнение, представляющее интерес (напри­мер, различные показатели смертности через 5 лет), называют эффектом или, если уместно, эффектом лечения.

Нулевую гипотезу выражают как отсутствие эффекта (например 5-летняя смертность от рака мо­лочной железы одинаковая в двух группах, получаю­щих разное лечение); двусторонняя альтернативная гипотеза будет означать, что различие эффектов не равно нулю.

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

  1. отвергнуть нулевую гипотезу и принять альтер­нативную гипотезу
  2. остаться в рамках нулевой гипотезы

Важно: В литературе достаточно часто встречается понятие «принять нулевую гипотезу». Хотелось бы внести ясность, что со статистической точки зрения принять нулевую гипотезу невозможно, т.к. нулевая гипотеза представляет собой достаточно строгое утверждение (например, средние значения в сравниваемых группах равны ).

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

Принятие неправильного решения

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

 
Верная гипотеза
H0 H1
Результат

 применения 

критерия
H0 H0 верно принята H0 неверно принята 

(Ошибка второго рода)
H1 H0 неверно отвергнута 

(Ошибка первого рода)
H0 верно отвергнута

Ошибка 1-го рода: нулевую гипотезу отвергают, когда она истинна, и делают вывод, что имеется эффект, когда в действительности его нет. Максимальный шанс (вероятность) допустить ошибку 1-го рода обозначается α (альфа). Это уровень значимости критерия; нулевую гипотезу отвергают, если наше значение p ниже уровня значимости, т. е., если p < α.

Следует принять решение относительно значения а прежде, чем будут собраны данные; обычно назначают условное значение 0,05, хотя можно выбрать более ограничивающее значение, например 0,01.

Шанс допустить ошибку 1-го рода никогда не превысит выбранного уровня значимости, скажем α = 0,05, так как нулевую гипотезу отвергают только тогда, когда p< 0,05. Если обнаружено, что p > 0,05, то нулевую гипотезу не отвергнут и, следовательно, не допустят ошибки 1-го рода.

Ошибка 2-го рода: не отвергают нулевую гипотезу, когда она ложна, и делают вывод, что нет эффекта, тогда как в действительности он существует. Шанс возникновения ошибки 2-го рода обозначается β (бета); а величина (1-β) называется мощностью критерия.

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

В идеале хотелось бы, чтобы мощность критерия составляла 100%; однако это невозможно, так как всегда остается шанс, хотя и незначительный, допустить ошибку 2-го рода.

К счастью, известно, какие факторы влияют на мощность и, таким образом, можно контролировать мощность критерия, рассматривая их.

Мощность и связанные факторы

Планируя исследование, необходимо знать мощность предложенного критерия. Очевидно, можно начинать исследование, если есть «хороший» шанс обнаружить уместный эффект, если таковой существует (под «хорошим» мы подразумеваем, что мощность должна быть по крайней мере 70-80%).

Этически безответственно начинать исследование, у которого, скажем, только 40% вероятности обнаружить реальный эффект лечения; это бесполезная трата времени и денежных средств.

Ряд факторов имеют прямое отношение к мощности критерия.

Объем выборки: мощность критерия увеличивается по мере увеличения объема выборки. Это означает, что у большей выборки больше возможностей, чем у незначительной, обнаружить важный эффект, если он существует.

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

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

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

Уровень значимости: мощность будет больше, если уровень значимости выше (это эквивалентно увеличению допущения ошибки 1-го рода, α, а допущение ошибки 2-го рода, β, уменьшается).

Таким образом, вероятнее всего, исследователь обнаружит реальный эффект, если на стадии планирования решит, что будет рассматривать значение р как значимое, если оно скорее будет меньше 0,05, чем меньше 0,01.

Обратите внимание, что проверка ДИ для интересующего эффекта указывает на то, была ли мощность адекватной. Большой доверительный интервал следует из небольшой выборки и/или набора данных с существенной вариабельностью и указывает на недостаточную мощность.

Проверка множественных гипотез

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

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

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

Например, при подходе Бонферрони (его часто считают довольно консервативным) умножают каждое значение р на число выполненных проверок; тогда любые решения относительно значимости будут основываться на этом уточненном значении р.

Связанные определения:
p-уровень
Альтернативная гипотеза, альтернатива
Альфа-уровень
Бета-уровень
Гипотеза
Двусторонний критерий
Критерий для проверки гипотезы
Критическая область проверки гипотезы
Мощность
Мощность исследования
Мощность статистического критерия
Нулевая гипотеза
Односторонний критерий
Ошибка I рода
Ошибка II рода
Статистика критерия
Эквивалентные статистические критерии

В начало

Содержание портала

В этом модуле вы узнаете:

• как бизнесу измерить реальный эффект от алгоритма по методу A/B-тестирования;
• как провести A/B-тест так, чтобы его результаты были максимально чистыми, и каких ошибок избегать при проведении эксперимента.
А заодно вы научитесь читать результаты таких сравнительных тестов.

Генеральная репетиция: модель машинного обучения против «как было раньше»

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

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

Такой подход, когда мы одновременно тестируем старый и новый вариант одной сущности, чтобы наши пользователи своими действиями подсказали нам лучший, и называется A/B-тест. Он применяется повсеместно: при изменении дизайна сайтов и приложений, для поиска оптимальных заголовков email-рассылок и так далее. A/B-тест позволит вам честно ответить на вопрос, работает ли модель лучше, чем обычная программа или человек, которые выполняли эти же задачи раньше.

Как проводят A/B-тесты для проверки моделей машинного обучения: реальные истории и советы

Лучше один раз увидеть, чем несколько раз прочитать, верно? Мы нашли для вас видео, в котором сотрудник проекта Yandex Data Factory (подразделение «Яндекса», которое разрабатывает модели машинного обучения для крупных внешних бизнес-заказчиков) рассказывает о трех реальных тестированиях: как они организовывались и с какими проблемами специалистам и их заказчикам пришлось столкнуться в процессе. Смотрите внимательно!

© «Яндекс»

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

Вредные советы от экспертов

Тестировать несколько изменений сразу

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

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

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

Менять процесс целиком, а не встраивать модель в существующий

По факту это еще один вариант идеи «а давайте поменяем все и сразу, чтобы посмотреть, что будет». Часто модели машинного обучения внедряют, чтобы оптимизировать уже существующие процессы, которые раньше выполняли программы и люди. Бывает, что при таком внедрении возникает искушение произвести революцию: сильно перестроить процесс или вовсе заменить его на новый.

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

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

Останавливать тестирование слишком рано

Представьте ситуацию: вы показали изменение 1 000 человек и записали их реакцию, в то же время сайт без изменений просмотрели еще 1 200 посетителей. Новая версия показала лучший результат по дополнительным покупкам за счет рекомендаций — на целых 8%. Хочется зафиксировать победный счет и праздновать, но рано. Потому что затем сложно будет объяснить проседание до 0,3%, которое может случиться на отметке в 10 000 человек. Аналогично не стоит расстраиваться, если поначалу модель не проявит себя (время и статистически значимое число показов, реакций или иных взаимодействий все расставят по своим местам).

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

Анализировать результат по не тем показателям

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

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

Сколько участников нужно для A/B-тестирования, чтобы мы могли верить его результатам

Мы упомянули статистическую значимость, без которой результаты теста нельзя будет считать надежными. Наверняка у вас возник вопрос: «А сколько человек в моем случае должны увидеть цифровой продукт без изменений и, наоборот, с изменениями, чтобы результаты исследования были достоверными и значимыми?» Давайте научимся оценивать объем выборки.

До старта эксперимента мы можем выдвинуть два предположения.
Первое: эффекта нет, и результаты вариантов А и B не будут различаться. Утверждение такого типа называют нулевой гипотезой.
Второе: изменение, которое мы внедряем, даст какой-то эффект. Утверждение этого типа называют альтернативной гипотезой.
В ходе A/B-теста мы проверим, какой гипотезе можно верить. А рассчитать, сколько наблюдений (сессий, открытий или других взаимодействий) нам нужно, поможет специальный калькулятор.

В интернете существует множество калькуляторов с готовыми формулами расчета для A/B-тестов, а также доступны описания методик из известных проектов. Найдите те, которые понравятся вам, а мы расскажем, как в принципе работать с любым сервисом. Как правило, вам потребуется указать 4 значения:

1. Среднее значение показателя, на который вы хотите повлиять

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

2. Размер эффекта (как должен измениться показатель)

Это ваше ожидание от внедрения модели — то, насколько вы хотите повлиять на текущий показатель. Эту цифру вы наверняка уже озвучивали, когда формулировали бизнес-цели проекта. Например, если вы говорили, что хотите увеличить конверсию на 2%, эти самые проценты и будут вашим размером эффекта.

Помните: чем меньший эффект вы хотите обнаружить, тем больший объем выборки вам нужен.

3. Вероятность ошибки первого рода (изменений по факту нет, но мы почему-то считаем, что они есть)

Выдавать желаемое за действительное — одна из особенностей человека. Например, по каким-то причинам мы можем посчитать, что конверсия страницы Б превышает конверсию страницы А, но на самом деле статистически две цифры не различаются.

Эта вероятность заложена в формулу расчета выборки и называется уровнем значимости и обозначается греческой буквой α. Вы сами определяете его значение (обычно это 0.1, 0.05 и 0.001 — чем меньше уровень значимости, тем реже ошибочно отвергается нулевая гипотеза).

Помните: чем меньше ошибок первого рода вы хотите допустить, тем больший объем выборки вам нужен.

4. Вероятность ошибки второго рода (изменения по факту есть, но мы их не заметили или проигнорировали)

Ошибка второго рода рассматривает обратную ситуацию. Обычно ее вероятность обозначают как мощность или 1-ß, а рекомендованное стандартное значение — 0.2.

Как A/B-тесты связаны с курсом статистики, который вы изучали в вузе

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

На видео Элен подробнее расскажет о сравнительных тестах с точки зрения математика и их связи с законами распределения, которые вы проходили в вузе или старших классах.

Узнайте, насколько хорошо вы усвоили материал модуля:

ПРОВЕРИТЬ СЕБЯ

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • 9e3b ошибка bmw e60
  • 9d00 ошибка бмв е60