Что такое novelty effect и как его учитывать при проведении A/B тестов?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Novelty Effect в A/B тестировании: когда новое кажется лучше
Novelty effect (эффект новизны) — это психологическое явление, при котором пользователи показывают повышенный интерес и активность к новому, необычному или незнакомому интерфейсу, функции или дизайну, независимо от его реальной полезности. Это приводит к завышенному лифту в начале теста.
Суть проблемы
Сценарий:
- Запускаешь A/B тест нового дизайна кнопки
- На первой неделе конверсия выросла на 15%
- На второй неделе прирост упал до 5%
- На третьей неделе эффект исчез вообще
Это и есть novelty effect. Пользователи кликали на новую кнопку из любопытства, а не потому что она реально лучше.
Почему это происходит
- Внимание — новый элемент привлекает взгляд и концентрирует внимание
- Любопытство — пользователи хотят попробовать что-то новое
- Психологический эффект — кажется, что улучшение есть, когда оно поверхностно
- Адаптация — спустя время эффект новизны проходит (habituation)
Кто подвержен novelty effect
- Ранние adopters (самые активные пользователи) — они первыми замечают новое и активнее экспериментируют
- Молодая аудитория — более импульсивна и любопытна
- Дорогие пользователи — высокая активность на всё
- Power users — они всегда кликают на новое
Как обнаружить novelty effect
1. Анализ временных рядов (Time Series Analysis)
import pandas as pd
import matplotlib.pyplot as plt
# Загрузи данные теста по дням
daily_data = pd.read_csv('test_daily_metrics.csv')
daily_data['date'] = pd.to_datetime(daily_data['date'])
# Рассчитай конверсию по дням
daily_data['conversion_rate'] = (
daily_data['conversions'] / daily_data['users']
)
# График по временной шкале
fig, ax = plt.subplots(figsize=(12, 6))
ax.plot(daily_data['date'], daily_data['conversion_rate'],
label='Control', marker='o')
ax.plot(daily_data['date'], daily_data['conversion_rate_test'],
label='Test', marker='s')
ax.set_xlabel('Date')
ax.set_ylabel('Conversion Rate')
ax.legend()
plt.show()
# Есть ли падающий тренд в тесте? Это novelty effect
2. Сегментация по когортам (Cohort Analysis)
SELECT
DATE(first_seen) as cohort_date,
DATE(event_date) as event_date,
SUM(CASE WHEN variant = 'test' AND converted THEN 1 ELSE 0 END) as test_conversions,
SUM(CASE WHEN variant = 'test' THEN 1 ELSE 0 END) as test_users,
SUM(CASE WHEN variant = 'control' AND converted THEN 1 ELSE 0 END) as control_conversions,
SUM(CASE WHEN variant = 'control' THEN 1 ELSE 0 END) as control_users,
ROUND(100.0 * SUM(CASE WHEN variant = 'test' AND converted THEN 1 ELSE 0 END)
/ SUM(CASE WHEN variant = 'test' THEN 1 ELSE 0 END), 2) as test_cr,
ROUND(100.0 * SUM(CASE WHEN variant = 'control' AND converted THEN 1 ELSE 0 END)
/ SUM(CASE WHEN variant = 'control' THEN 1 ELSE 0 END), 2) as control_cr
FROM events
GROUP BY cohort_date, event_date
ORDER BY cohort_date, event_date
Если cohort_date в День 1 показывает высокий лифт, а cohort_date в День 7 показывает низкий — это novelty effect.
3. Анализ пользовательских сегментов
# Раздели на старых и новых пользователей
old_users = df[df['user_tenure_days'] > 30]
new_users = df[df['user_tenure_days'] <= 30]
old_lift = calculate_lift(old_users)
new_lift = calculate_lift(new_users)
print(f"Лифт для новых пользователей: {new_lift:.1%}") # Может быть завышен
print(f"Лифт для старых пользователей: {old_lift:.1%}") # Более реалистичен
Как минимизировать novelty effect
1. Достаточная длительность теста
- Минимум 2 недели для большинства случаев
- Минимум 4 недели для социальных сетей и развлечений
- Минимум 8 недель для SaaS с длинным циклом решения
Правило: тест должен быть длительнее среднего цикла адаптации пользователя.
2. Перекрестное тестирование (Sequential Testing)
# Запусти тест на две недели
# Первая неделя: высокий лифт (novelty effect)
# Вторая неделя: нормализующийся лифт
# Берёшь метрики за вторую неделю как базовые
results_week1 = df[df['week'] == 1].groupby('variant').agg(...)
results_week2 = df[df['week'] == 2].groupby('variant').agg(...)
# Целевая статистика — Week 2
print(results_week2)
3. Флаг привычности (Habituation Flag)
# Отметь пользователей, которые уже видели изменение (old exposure)
df['is_habituated'] = (
(df['first_seen'] < df['test_start_date']) &
(df['variant'] == 'test')
)
# Анализируй только habituated пользователей
habituated_df = df[df['is_habituated'] == True]
real_lift = calculate_lift(habituated_df)
4. Двойной тест (Holdout Group)
Раздели test группу на две подгруппы:
- Test A: видит изменение с дня 1
- Test B: видит изменение с дня 7
Неделя 1: Control | Test_A (новое) | Test_B (старое)
Неделя 2: Control | Test_A (старое) | Test_B (новое)
Сравни Test_A неделя 2 с Test_B неделя 1 — получишь реальный эффект
Практический пример
import pandas as pd
from scipy import stats
# Симуляция теста с novelty effect
np.random.seed(42)
data = []
for day in range(1, 15):
# Control (стабильный)
for _ in range(1000):
data.append({
'day': day,
'variant': 'control',
'converted': np.random.random() < 0.10
})
# Test с novelty effect
novelty_lift = max(0.15 - day * 0.01, 0) # Падает на 1% в день
for _ in range(1000):
data.append({
'day': day,
'variant': 'test',
'converted': np.random.random() < (0.10 + novelty_lift)
})
df = pd.DataFrame(data)
# Расчёт по дням
daily = df.groupby(['day', 'variant'])['converted'].agg(['sum', 'count'])
daily['cr'] = daily['sum'] / daily['count']
# Visualизация
daily.xs('test', level='variant')['cr'].plot(label='Test')
daily.xs('control', level='variant')['cr'].plot(label='Control')
plt.legend()
plt.title('Novelty Effect: видно падение лифта со временем')
plt.show()
Признаки novelty effect в твоих тестах
- Высокий лифт в первые дни, потом падение
- Новые пользователи показывают больший лифт, чем старые
- Лифт выше в интерфейсных изменениях, чем в функциональных
- Тренд downward (вниз) в течение недели
- Повтор теста после недели дает меньший результат
Последствия игнорирования novelty effect
- Запускаешь улучшение, которое на самом деле не работает
- Впустую тратишь ресурсы на поддержку фичи
- Получаешь разочарование когда через месяц видишь, что прироста нет
- Теряешь доверие команды в метрики
Рекомендация
Для любого теста:
- Запусти минимум на 2 недели
- Анализируй по когортам (старые vs новые пользователи)
- Смотри на тренд лифта, не только финальное число
- Фокусируйся на долгосрочных метриках (LTV, retention), не только конверсии
Novelty effect — это напоминание о том, что нужно смотреть не только на статистику, но и на тренды и качество эффекта.