Специалист по данным в OkCupid рассказал, почему стандартный подход к A/B тестированию не подходит для социальных сервисов, и показал решение, которое его команда нашла для этой проблемы.
В OkCupid меня часто просят провести A/B тесты для измерения влияния новой функции или изменения в дизайне на наших пользователей. Обычно A/B тестирование проводится так: пользователи случайным образом делятся на две группы, каждая из которых получает разную версию продукта, а затем исследуются различия в поведении этих групп.
В типичном A/B тесте вариант случайно выбирается для каждого отдельно взятого пользователя. Например, если мы меняем дизайн нашей страницы входа в систему, половина пользователей увидит новую страницу (тестовая группа), а половина — старую (контрольная группа). Такое распределение — это простой и мощный способ протестировать изменение пользовательского поведения при помощи новой функции.
Это идеальный инструмент для многих ситуаций тестирования. К сожалению, если вы тестируете продукт, который полагается на взаимодействие между пользователями, такое распределение может привести к неверным заключениям и ненадежным экспериментам.
Почему распределение пользователей может стать неудачным
Вся суть OkCupid заключается в общении пользователей друг с другом, поэтому мы часто хотим тестировать функции, созданные для того, чтобы сделать взаимодействие пользователей проще или интереснее. Однако запускать A/B тест для функций общения сложно на основании случайного распределения пользователей.
Приведу пример: допустим, мы создали функцию видеочата и до запуска хотим протестировать, нравится ли она людям. Я могу провести A/B-тест и случайным образом распределить эту функцию на половину пользователей… но с кем они будут общаться через эту функцию?
Видеочат работает, если только у обоих пользователей есть эта функция, поэтому существует два способа провести этот эксперимент: вы можете позволить людям в тестовой группе общаться со всеми (включая людей в контрольной группе) или ограничить использование только внутри тестовой группы.
У каждого подхода есть серьезные ограничения. Если вы позволите тестовой группе использовать видеочат со всеми, то контрольная группа перестанет быть контрольной, потому что они также увидят эту функцию. Да и просто это странный и половинчатый опыт — когда люди могут общаться по видео, но не могут сами инициировать видеозвонок.
Может быть, вы решите ограничить видеочат до ситуации, когда оба пользователя находятся в тестовой группе. Люди будут свободны в своих звонках, но это приведет к неровному опыту, потому что опция появится у случайного набора людей. Это может изменить их поведение, что повлияет на результаты эксперимента:
- они могут не заинтересоваться неготовой функцией (“Я проигнорирую её на стадии тестирования”)
- наоборот, они могут полюбить функцию (“Хочу общаться только по видео”), что усложнит контакт между контрольной и тестовой группами — тестовая группа ограничит себя маленькой частью сайта, а у контрольной группы будет масса неотвеченных сообщений.
Любой расклад приведет к предвзятым и неточным результатам эксперимента.
Эффекты высшего порядка
Другое ограничение подобного распределения — это то, что вы не можете измерить “эффекты высшего порядка” (также известные как сетевые эффекты или внешние эффекты). Они происходят, когда новая функция выходит за пределы тестовой группы и влияет на поведение в контрольной группе.
Эти эффекты есть в примере с видеочатом выше, но они могут возникнуть при любом экспериментальном воздействии, даже в простых вещах, которые, казалось бы, не повлияют на взаимодействие пользователей. Например, мы хотим протестировать новое правило, которое требует от пользователя указывать в своем профиле текст из 500 символов.
Мы ожидаем, что новое правило подтолкнет тестовую группу к созданию более интересных профилей, которые приведут к лучшему опыту взаимодействия с сайтом: они получат больше сообщений, потому что другие люди будут знать о них больше. Однако мы можем ожидать, что это изменит опыт и для людей из контрольной группы: они увидят резкий рост количества пользователей с интересными эссе в профиле, и их опыт также улучшится, потому что они найдут больше интересных людей, которым хотели бы написать.
Итак, это изменение теоретически улучшит опыт пользователей и в тестовой, и в контрольной группе, значит, мы захотим реализовать эту функцию для всех. Но если мы протестируем её с распределением по пользователям, мы не увидим такого отличного результата, потому что тест ищет улучшения в тестовой группе относительно контрольной группы.
В этом случае эффект разлива замаскирует реальное изменение пользовательского поведения, потому что улучшение отражается и на контрольной группе. Эти эффекты также могут создавать иллюзию изменения, которая исчезнет, когда вы откроете доступ к функции для всех. Оказывается, что вы не можете доверять A/B-тестированию в социальных сетях.
Использование случайного распределения по сообществам
Альтернативой может стать использование случайного распределения по сообществам. В этом случае “сообщество” — это любая группа пользователей, взаимодействия которых направлены на других пользователей внутри группы. Data-команды в LinkedIn и Instagram уже обсуждали свои кейсы A/B-тестирования, основанного на сообществах, но самое сложное здесь — понять, как определить сообщества для вашего конкретного продукта.
Общий математический подход к определению пользовательских сообществ — моделирование отношений между пользователями с помощью социального графа, а затем применить алгоритмы разбиения графов, чтобы найти изолированные друг от друга группы.
Для многих социальных сайтов и приложений пользовательские взаимодействия несложно объединить в граф. Каждый пользователь — это узел, а грани соединяют узлы, между которыми было взаимодействие. Затем вы можете применить методы разделения графа, например, Normalized Cuts, чтобы разбить узлы на группы с большим количеством внутренних взаимодействий и небольшим количеством межгрупповых связей.
Однако для дейтинговых приложений социальные графы отличаются от платформ социальных сетей. Обычно пользователь хочет найти новых людей для общения, а не поддерживать существующие связи, поэтому сообщество часто определяется не людьми, с которыми вы взаимодействовали, а людьми недалеко от вас. Вместо создания социальной сети для описания связей между парами пользователей, я создал “геосоциальную сеть”, вычислив, как часто связи происходят между парами локаций. Когда этот граф был разбит, мы получили набор географических регионов, которые могут стать тестовыми областями для наших экспериментов.
Определение географических сообществ
Определить географические регионы для эксперимента просто, да? Вы просто привязываете каждый город к каждому экспериментальному состоянию. Но оказалось, что сложно сказать, где город заканчивается.
Это становится еще более сложным, когда вы понимаете, что нет одного конкретного “рынка свиданий” для каждого города. Отдельные люди по-разному определяют свои географические границы. Люди на краю города могут общаться с людьми из ближайшего пригорода, но люди в этом пригороде могут общаться с людьми из пригорода, который находится чуть дальше, а пользователи оттуда могут общаться с людьми из другого города.
Однако я смог определить оптимальные регионы, создав границы, которые заключают в себе максимальное количество связей внутри региона, используя алгоритм Normalized Cut.
Вот общее содержание метода:
- Создайте граф, чтобы описать, сколько сообщений было отправлено между парами местоположений в качестве квадратной матрицы смежности A (num_Locations-by-num_Locations). Значение A [i, j] определяется количеством сообщений, отправленных между пользователями в местоположении i пользователям в местоположении j. Я не делал различий между отправителем или получателем сообщения, поэтому A симметрична.
- Вычислим векторный лапласиан графа L из матрицы смежности A и матрицы степени D как L = D — A. Матрица степени — это всего лишь диагональная матрица со степенью каждого узла на диагонали и нулями.
- Вычислите спектральное разложение матрицы L и вычислите её собственные значения. Каждое полностью изолированное множество узлов будет представлено собственным вектором с соответствующим собственным значением 0. Дальнейшая сегментация этих областей выполняется путем поиска паттернов в собственных векторах с k наименьшими ненулевыми собственными значениями. Значение k может варьироваться в зависимости от того, сколько регионов вы хотите сделать.
Я варьировал k в широком диапазоне от 5 до 250 и тестировал, насколько хорошо каждый набор регионов разделял сообщества пользователей, измеряя соотношение сообщений внутри региона с количеством сообщений между регионами. Оказалось, что для городов Канады и США оптимальным оказалось разделение на 36 регионов. После определения регионов мы оценили их разделенность на свежих данных, которые не участвовали в анализе сегментации и обнаружили, что примерно 95% взаимодействий (сообщения, лайки, просмотры профиля) произошли между пользователями внутри региона.
Заключение
Теперь у нас есть набор регионов, которые в большей степени не взаимодействуют друг с другом, и мы можем проводить эксперименты на основе разделения по сообществам. Это позволяет нам точно тестировать изменения в пользовательских взаимодействиях и избегать пагубного влияния эффектов высшего порядка, которые распространяются по социальной сети.
Однако у такого распределения есть и свои недостатки. Мне пришлось внести изменения в наш статистический анализ, чтобы отразить, что у нас теперь есть вложенная экспериментальная модель (а не отдельные пользователи, которым группа назначена независимо). К сожалению, эта конструкция имеет значительно меньшую статистическую мощность.
A/B-тестирование — это простая концепция, но его может быть сложно проводить, если у вашего продукта есть социальные взаимодействия. Благодаря им и эффектам высшего порядка, стандартный подход к тестированию может быть неверным. Не существует одного подхода для всех продуктов. Поэтому моя финальная рекомендация — наймите специалистов по данным, которые любят экспериментировать.