Что такое сетевой эффект?
Классический A/B стоит на простом допущении: контроль и тест не влияют друг на друга.
Поведение юзера из группы B определяется только тем, что ему показали, и никак не отражается на юзерах из группы A. Это называется SUTVA, Stable Unit Treatment Value Assumption.
Именно поэтому эффект фичи можно посчитать как обычную разницу средних между группами.
Проблема в том, что иногда это допущение не выполняется.
Представим тест реферальной программы. Или группового заказа. Или чата. Или ленты, где люди видят активность друг друга.
Юзер из группы в тестовой группе рассказывает о фиче другу, который находится в контрольной группе и контроль тоже подвергается воздействию.
Теперь контроль загрязнён тем самым эффектом, который хотелось измерить только в тесте.
Группы перетекают друг в друга, и разница между ними схлопывается.
Это и есть сетевой эффект (он же network interference).
Что при этом происходит на практике.
1. Эффект недооценивается.
Если тест протекает в контроль, контроль подрастает вместе с тестом, и разница между группами оказывается меньше реальной, что сказывается на значении инкремента метрики.
2. Эффект переоценивается.
Обратная история: фича создаёт ценность только при высокой плотности участников.
Хороший пример - платный буст для продавцов на маркетплейсе.
Буст поднимает карточку продавца выше в выдаче. Но общее число покупателей и заказов от этого не растёт: спрос фиксированный, буст лишь перераспределяет его.
Если буст в тесте только у пяти процентов продавцов, эти счастливчики забирают заказы у всех остальных и показывают отличный прирост продаж.
Метрика радует, фича катится на всех.
И тут выясняется, что когда буст есть у каждого, вверх не поднимается никто - все вернулись на свои места, спрос делится примерно как раньше, а прирост, который был в тесте, испарился.
В тесте измерялось преимущество над теми, у кого буста нет, а после раскатки таких просто не осталось.
Как с этим работать.
Для начала стоит честно ответить на вопрос, есть ли вообще в продукте канал, по которому юзеры влияют друг на друга?
Примеры каналов: приглашения, общий контент, общий инвентарь, общая очередь, конкуренция за один ресурс.
Если каналов нет, можно выдохнуть и использовать классический A/B.
Если нет - читаем дальше.
Дальше имеет смысл поменять единицу рандомизации.
Вместо отдельных юзеров в группы A и B распределяются целые кластеры - группы людей, которые связаны между собой.
Тогда друзья, коллеги, соседи по городу попадают в одну и ту же группу, и влияние перетоков между ними снижается.
Вариантов, что считать кластером, несколько.
Гео-эксперименты.
Рандомизируются города или регионы целиком: весь один город в тесте, весь другой в контроле.
Перетекание между географиями минимально.
Сложность в том, что резко падает число независимых единиц (было сто тысяч юзеров, стало сорок городов), доверительные интервалы разъезжаются, и нужен либо длинный тест, либо аккуратный подбор похожих пар городов с матчингом.
Кластеризация по графу.
Строится граф связей и режется на слабосвязанные сообщества (community detection), которые уже рандомизируются.
Внутри группы связей много, между группами мало, значит, и утечка мала.
Это дороже и требует данных о связях, но для социальных фич подход самый честный.
Switchback
Также часто гоняют switchback: один и тот же пользователь переключается между A и B по временным окнам и затем оценивается эффект между этими окнами.
Главная мысль вот в чём.
Сетевой эффект не экзотика для соцсетей.
Он живёт везде, где действие одного юзера меняет опыт другого: реферальные программы, лояльность с приглашением друга, групповые заказы, любые двусторонние рынки, даже банальная нагрузка на инфраструктуру.
Так что прежде чем доверять результату теста, стоит задать себе один вопрос: может ли юзер из одной группы повлиять на юзера из другой?
Если да, тест что-то измеряет, но не то, что кажется.
Классический A/B стоит на простом допущении: контроль и тест не влияют друг на друга.
Поведение юзера из группы B определяется только тем, что ему показали, и никак не отражается на юзерах из группы A. Это называется SUTVA, Stable Unit Treatment Value Assumption.
Именно поэтому эффект фичи можно посчитать как обычную разницу средних между группами.
Проблема в том, что иногда это допущение не выполняется.
Представим тест реферальной программы. Или группового заказа. Или чата. Или ленты, где люди видят активность друг друга.
Юзер из группы в тестовой группе рассказывает о фиче другу, который находится в контрольной группе и контроль тоже подвергается воздействию.
Теперь контроль загрязнён тем самым эффектом, который хотелось измерить только в тесте.
Группы перетекают друг в друга, и разница между ними схлопывается.
Это и есть сетевой эффект (он же network interference).
Что при этом происходит на практике.
1. Эффект недооценивается.
Если тест протекает в контроль, контроль подрастает вместе с тестом, и разница между группами оказывается меньше реальной, что сказывается на значении инкремента метрики.
2. Эффект переоценивается.
Обратная история: фича создаёт ценность только при высокой плотности участников.
Хороший пример - платный буст для продавцов на маркетплейсе.
Буст поднимает карточку продавца выше в выдаче. Но общее число покупателей и заказов от этого не растёт: спрос фиксированный, буст лишь перераспределяет его.
Если буст в тесте только у пяти процентов продавцов, эти счастливчики забирают заказы у всех остальных и показывают отличный прирост продаж.
Метрика радует, фича катится на всех.
И тут выясняется, что когда буст есть у каждого, вверх не поднимается никто - все вернулись на свои места, спрос делится примерно как раньше, а прирост, который был в тесте, испарился.
В тесте измерялось преимущество над теми, у кого буста нет, а после раскатки таких просто не осталось.
Как с этим работать.
Для начала стоит честно ответить на вопрос, есть ли вообще в продукте канал, по которому юзеры влияют друг на друга?
Примеры каналов: приглашения, общий контент, общий инвентарь, общая очередь, конкуренция за один ресурс.
Если каналов нет, можно выдохнуть и использовать классический A/B.
Если нет - читаем дальше.
Дальше имеет смысл поменять единицу рандомизации.
Вместо отдельных юзеров в группы A и B распределяются целые кластеры - группы людей, которые связаны между собой.
Тогда друзья, коллеги, соседи по городу попадают в одну и ту же группу, и влияние перетоков между ними снижается.
Вариантов, что считать кластером, несколько.
Гео-эксперименты.
Рандомизируются города или регионы целиком: весь один город в тесте, весь другой в контроле.
Перетекание между географиями минимально.
Сложность в том, что резко падает число независимых единиц (было сто тысяч юзеров, стало сорок городов), доверительные интервалы разъезжаются, и нужен либо длинный тест, либо аккуратный подбор похожих пар городов с матчингом.
Кластеризация по графу.
Строится граф связей и режется на слабосвязанные сообщества (community detection), которые уже рандомизируются.
Внутри группы связей много, между группами мало, значит, и утечка мала.
Это дороже и требует данных о связях, но для социальных фич подход самый честный.
Switchback
Также часто гоняют switchback: один и тот же пользователь переключается между A и B по временным окнам и затем оценивается эффект между этими окнами.
Главная мысль вот в чём.
Сетевой эффект не экзотика для соцсетей.
Он живёт везде, где действие одного юзера меняет опыт другого: реферальные программы, лояльность с приглашением друга, групповые заказы, любые двусторонние рынки, даже банальная нагрузка на инфраструктуру.
Так что прежде чем доверять результату теста, стоит задать себе один вопрос: может ли юзер из одной группы повлиять на юзера из другой?
Если да, тест что-то измеряет, но не то, что кажется.