Часть 1. Отмерь дважды, отрежь один раз

Этот пост был впервые опубликован в The Craft, техническом блоге Faire. Это первая в нашей серии статей, посвященных ускорению принятия решений с помощью A / B-тестирования.

Как и многие стремительно развивающиеся стартапы, Faire использует эксперименты, чтобы быстро усовершенствовать наш продукт и принять более обоснованные решения. Однако, в отличие от многих наших коллег, которые обслуживают потребительские рынки с сотнями миллионов или даже миллиардами потенциальных пользователей, наша торговая площадка создана для малых предприятий, из которых примерно 30 миллионов находятся в Соединенных Штатах [0]. В сочетании с тем фактом, что нам едва исполнилось три года, это означает, что размеры выборки для наших экспериментов, как правило, меньше, чем у специалистов по анализу данных в других технологических компаниях, которые могут позволить себе роскошь экспериментировать. Например, наша платформа в настоящее время обслуживает порядка 100 000 розничных продавцов и 10 000 производителей.

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

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

Экспериментальная дизайн

Выделение времени на разработку экспериментов, которые в кратчайшие сроки принесут наиболее полезные результаты, - это эффективный способ гарантировать, что команды не будут тратить время на тесты, которые отвечают на неправильные вопросы или требуют слишком много времени, чтобы ответить на правильные. Кроме того, систематизированное документирование экспериментов мешает компаниям забыть или неправильно запомнить результаты предыдущих тестов [1]. Это особенно важно для экспериментов с неинтуитивными результатами и тех, которые не распространяются на все ваши пользователи. А наличие этого хранилища исторических данных позволяет командам лучше сформировать предварительные представления о том, какие виды обработки продукта работают, а какие нет, для каких сегментов пользовательской базы, какие показатели они перемещают и в какой степени.

Лучшие показатели

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

Близость

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

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

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

print(proportion.proportions_chisquare(summary_treatment_1['signed_up'], summary_treatment_1['count'])[1])
print(proportion.proportions_chisquare(summary_treatment_1['added_to_cart'], summary_treatment_1['count'])[1])
print(proportion.proportions_chisquare(summary_treatment_1['ordered'], summary_treatment_1['count'])[1])
4.826037697355727e-06
0.0027419906333688462
0.11399561233236452

Общее решение этой проблемы - выбрать основную метрику, близкую к изменению, которое мы вносим в продукт. В этом случае очевидным выбором будет переход с посещения на регистрацию. Однако мы не можем быть уверены, что какие-либо дополнительные регистрации в результате нашего лечения на самом деле приведут к нижестоящему поведению, которое мы в конечном итоге хотим стимулировать, например, к размещению заказов. Мы можем смягчить это двумя способами: выбрать подходящие вторичные метрики (в этом случае хорошими кандидатами могут быть добавление в корзину и преобразование заказа), а также использование наших репозиториев предыдущих экспериментов и наблюдательных исследований для развития предварительных убеждений о силе взаимосвязи между лифтов в нашей основной метрике и нижестоящих. Короче говоря, если у нас есть основания полагать, что рост числа регистраций приводит к увеличению количества заказов, тогда нам не обязательно ждать, пока рост конверсии заказов достигнет значимости (но не делайте вывод, что изменений в вторичная метрика с недостаточной мощностью теста [2].) Наконец, в случае, если мы поднимем конверсию регистраций, но не метрики нисходящего потока, будущие эксперименты с подписками все равно выиграют от увеличения размера выборки, что позволит нам начать наш путь к более значительным результаты с течением времени.

Дисперсия

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

Выбор показателей пропорции вместо неограниченных показателей, таких как GMV для розничных торговцев, является для нас обычным способом сократить время, необходимое для достижения значимого результата в эксперименте. Но в наборе доступных математически неограниченных показателей некоторые из них в действительности «более неограниченны», чем другие. Что касается розничных продавцов на Faire, они фактически не ограничены в количестве посещений страниц производителей на сайте, в то время как их способность размещать заказы у нас ограничена объемом запасов, которые они могут продать через свои магазины. Это означает, что распределение заказов по розничным торговцам обычно имеет гораздо меньшую дисперсию, чем распределение посещений бренда по розничным торговцам.

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

print(stats.ttest_ind(experiment_2['visits'][experiment_2['treatment'] == 1], experiment_2['visits'][experiment_2['treatment'] == 0]))
print(stats.ttest_ind(experiment_2['orders'][experiment_2['treatment'] == 1], experiment_2['orders'][experiment_2['treatment'] == 0]))
Ttest_indResult(statistic=0.7573654245170063, pvalue=0.44884881305779467)
Ttest_indResult(statistic=2.5239860524427873, pvalue=0.011618610895742018)

Ускорение

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

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

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

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

Меньше показателей

Наконец, когда дело доходит до выбора показателей эксперимента, обычно лучше меньше, да лучше. По мере того, как вы увеличиваете количество гипотез, которые вы проверяете в своем эксперименте, вы также увеличиваете вероятность ошибок типа I. В зависимости от вашей терпимости к совершению этих ошибок, вы захотите контролировать частоту ошибок в семействе (FWER) или менее строгую частоту ложных обнаружений (FDR). Методы FWER, такие как метод Холма – Бонферрони, контролируют вероятность по крайней мере одной ошибки типа I, в то время как процедуры FDR, такие как широко используемая процедура Бенджамини – Хохберга, обеспечивают более слабые гарантии в отношении ожидаемой доли ошибки неверно отвергнутые нулевые гипотезы. Ниже мы демонстрируем, как в эксперименте с десятью метриками использование контроля FDR сокращает количество значимых тестов с шести до четырех. Независимо от используемого вами подхода или конкретного метода, чем больше сравнений вы сделаете с помощью дополнительных показателей, тем больше данных вам понадобится для достижения значимого результата.

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

Машинное обучение

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

Благодарности

Спасибо, Даниэле Перито, за ваш вклад и советы.

[0] Профиль малого бизнеса 2018

[1] Институциональная память

[2] Грязная дюжина: Двенадцать распространенных ошибок интерпретации показателей в контролируемых онлайн-экспериментах

[3] Обнаружение эффекта новизны / первенства в рандомизированных контролируемых онлайн-экспериментах