← Назад к вопросам

Что такое novelty effect и как его учитывать при проведении A/B тестов?

2.2 Middle🔥 141 комментариев
#A/B тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Novelty Effect в A/B тестировании: когда новое кажется лучше

Novelty effect (эффект новизны) — это психологическое явление, при котором пользователи показывают повышенный интерес и активность к новому, необычному или незнакомому интерфейсу, функции или дизайну, независимо от его реальной полезности. Это приводит к завышенному лифту в начале теста.

Суть проблемы

Сценарий:

  • Запускаешь A/B тест нового дизайна кнопки
  • На первой неделе конверсия выросла на 15%
  • На второй неделе прирост упал до 5%
  • На третьей неделе эффект исчез вообще

Это и есть novelty effect. Пользователи кликали на новую кнопку из любопытства, а не потому что она реально лучше.

Почему это происходит

  1. Внимание — новый элемент привлекает взгляд и концентрирует внимание
  2. Любопытство — пользователи хотят попробовать что-то новое
  3. Психологический эффект — кажется, что улучшение есть, когда оно поверхностно
  4. Адаптация — спустя время эффект новизны проходит (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

  • Запускаешь улучшение, которое на самом деле не работает
  • Впустую тратишь ресурсы на поддержку фичи
  • Получаешь разочарование когда через месяц видишь, что прироста нет
  • Теряешь доверие команды в метрики

Рекомендация

Для любого теста:

  1. Запусти минимум на 2 недели
  2. Анализируй по когортам (старые vs новые пользователи)
  3. Смотри на тренд лифта, не только финальное число
  4. Фокусируйся на долгосрочных метриках (LTV, retention), не только конверсии

Novelty effect — это напоминание о том, что нужно смотреть не только на статистику, но и на тренды и качество эффекта.

Что такое novelty effect и как его учитывать при проведении A/B тестов? | PrepBro