Что такое сетевой эффект?

Классический A/B стоит на простом допущении: контроль и тест не влияют друг на друга.

Поведение юзера из группы B определяется только тем, что ему показали, и никак не отражается на юзерах из группы A. Это называется SUTVA, Stable Unit Treatment Value Assumption.

Именно поэтому эффект фичи можно посчитать как обычную разницу средних между группами.

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

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

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

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

Группы перетекают друг в друга, и разница между ними схлопывается.

Это и есть сетевой эффект (он же network interference).

Что при этом происходит на практике.

1. Эффект недооценивается.

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

2. Эффект переоценивается.

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

Хороший пример - платный буст для продавцов на маркетплейсе.

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

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

Метрика радует, фича катится на всех.

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

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

Как с этим работать.

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

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

Если каналов нет, можно выдохнуть и использовать классический A/B.

Если нет - читаем дальше.

Дальше имеет смысл поменять единицу рандомизации.

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

Тогда друзья, коллеги, соседи по городу попадают в одну и ту же группу, и влияние перетоков между ними снижается.

Вариантов, что считать кластером, несколько.

Гео-эксперименты.

Рандомизируются города или регионы целиком: весь один город в тесте, весь другой в контроле.

Перетекание между географиями минимально.

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

Кластеризация по графу.

Строится граф связей и режется на слабосвязанные сообщества (community detection), которые уже рандомизируются.

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

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

Switchback Также часто гоняют switchback: один и тот же пользователь переключается между A и B по временным окнам и затем оценивается эффект между этими окнами.

Главная мысль вот в чём.

Сетевой эффект не экзотика для соцсетей.

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

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

Если да, тест что-то измеряет, но не то, что кажется.