Эффект новизны в A/B-тесте: как увидеть, что первый рост не сохраняется

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

У одного пользователя есть два времени

Календарная неделя описывает внешние условия: праздники, маркетинг, выпуск приложения. Возраст в эксперименте показывает, сколько прошло с первого назначения варианта конкретному человеку. У пользователя, пришедшего 1 октября, третья неделя опыта начинается раньше, чем у пришедшего 15 октября. Если смешать их в одном календарном среднем, зрелые пользователи будут соседствовать с теми, кто только увидел новый экран.

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

Сравнить эффект в одинаковых окнах

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

from statistics import mean
from scipy.stats import ttest_ind
A1 = [2,4,1,5,3,6,2,5]
B1 = [6,8,5,9,7,10,6,9]
A3 = [3,4,2,5,4,5,3,4]
B3 = [4,3,3,4,5,4,4,3]
dA = [late-early for early,late in zip(A1,A3)]
dB = [late-early for early,late in zip(B1,B3)]
interaction = mean(dB)-mean(dA)
test = ttest_ind(dB,dA,equal_var=False)
ci = test.confidence_interval()
print({'week1_effect':mean(B1)-mean(A1),
       'week3_effect':mean(B3)-mean(A3),
       'change_of_effect':interaction,
       'change_ci':(round(ci.low,3),round(ci.high,3))})
assert mean(B1)-mean(A1) == 4
assert mean(B3)-mean(A3) == 0
assert interaction == -4

Снижение эффекта ещё не объясняет причину

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

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

Заранее решить, какой эффект нужен продукту

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

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

Продолжить работу с данными

Для такого плана полезно заранее сформулировать метрику и основной горизонт. В «A/B тесты и анализ данных на Python» вы пройдёте дизайн эксперимента, расчёт длительности, доверительные интервалы и типичные искажения. Эти материалы помогут оформить проверку зрелого поведения до запуска, а затем объяснить результат продуктовой команде. Откройте программу платного курса «A/B тесты и анализ данных на Python».

Продолжить на практике

  • A/B тесты и анализ данных на Python ↗

    Практический курс по A/B-тестированию и продуктовым метрикам: формулируем гипотезы, считаем размер выборки, запускаем эксперименты и анализируем результаты. От первой идеи до внедрения изменений в продукт — без «воды» и лишней теории.