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

С какими инструментами работал для построения A/B-тестов

1.0 Junior🔥 181 комментариев
#A/B-тестирование#Визуализация и BI-инструменты#Опыт работы и проекты

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

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

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

A/B тестирование: инструменты и практика

Моя история с A/B тестами

Работал с A/B тестами в разных масштабах:

  • Маленькие тесты (100 пользователей, 1 неделя)
  • Глобальные тесты (1M+ пользователей, месяцы)
  • Мультивариативные тесты (5+ вариантов)
  • Байесовские тесты с адаптивным выделением трафика

1. Инструменты для проведения тестов

Amplitude

Использовал для: Product analytics и экспериментов в мобильном приложении

# Код события в мобильном приложении
amplitude.logEvent('button_clicked', {
    'experiment_id': 'ab_test_cta_color',
    'variant': 'red_button',
    'user_segment': 'premium'
})

Возможности:

  • Встроенный A/B test builder
  • Разделение трафика
  • Результаты в real-time
  • Когортный анализ

Мой опыт: Тестировали цвет кнопки CTA

  • Контроль: синяя кнопка (базовое состояние)
  • Вариант A: красная кнопка
  • Вариант B: зелёная кнопка
  • Результат: красная выиграла на 12% в click-through rate

Google Optimize

Использовал для: Website и landing pages

// Условное перенаправление пользователя
if (document.location.hash === '#variation1') {
    // Показываем новый дизайн
    document.body.classList.add('new-design');
}

Возможности:

  • Простая интеграция с Google Analytics
  • Visual editor для изменения элементов
  • Геотаргетирование
  • Автоматическая оптимизация (Multi-Armed Bandit)

Кейс: Тестировали текст CTA на лендинге

  • Контроль: "Купить сейчас"
  • Вариант: "Начать бесплатный пробный период"
  • Результат: вариант выиграл в конверсии на 8%

VWO (Visual Website Optimizer)

Использовал для: E-commerce сайты

Возможности:

  • Нет-кодовой тестирование
  • Heatmaps
  • Session recordings
  • Интеграция с CRM

Optimizely

Использовал для: Enterprise тесты

{
  "experiment_id": "checkout_flow_test",
  "variations": [
    {
      "id": "control",
      "name": "3-step checkout",
      "traffic": 50
    },
    {
      "id": "variant_1",
      "name": "1-step checkout",
      "traffic": 50
    }
  ],
  "duration": "2 weeks"
}

2. Статистические инструменты

Python для анализа

import numpy as np
from scipy import stats
import pandas as pd

# Данные из теста
control_conversions = 150
control_users = 10000
variant_conversions = 180
variant_users = 10000

control_rate = control_conversions / control_users
variant_rate = variant_conversions / variant_users

print(f"Control: {control_rate:.2%}")
print(f"Variant: {variant_rate:.2%}")
print(f"Lift: {(variant_rate / control_rate - 1):.2%}")

# Chi-square тест для binary outcomes
contingency_table = [
    [control_conversions, control_users - control_conversions],
    [variant_conversions, variant_users - variant_conversions]
]

chi2, p_value, dof, expected = stats.chi2_contingency(contingency_table)

print(f"\nChi-square: {chi2:.2f}")
print(f"p-value: {p_value:.4f}")

if p_value < 0.05:
    print("Result is STATISTICALLY SIGNIFICANT")
else:
    print("No significant difference detected")

# Confidence interval для разницы долей
from statsmodels.stats.proportion import proportions_ztest

count = [control_conversions, variant_conversions]
nobs = [control_users, variant_users]

z_stat, p_val = proportions_ztest(count, nobs)
print(f"\nZ-statistic: {z_stat:.2f}")
print(f"p-value: {p_val:.4f}")

3. Расчет размера выборки

from statsmodels.stats.power import tt_ind_solve_power
from scipy.stats import norm

def calculate_sample_size(
    baseline_rate,
    expected_uplift,
    confidence=0.95,
    statistical_power=0.80
):
    """
    Расчет необходимого размера выборки
    
    baseline_rate: текущая конверсия (0-1)
    expected_uplift: ожидаемое улучшение (0-1)
    """
    
    variant_rate = baseline_rate * (1 + expected_uplift)
    
    # Effect size (Cohen's h)
    effect_size = 2 * (np.arcsin(np.sqrt(variant_rate)) - np.arcsin(np.sqrt(baseline_rate)))
    
    # Z-value
    z_alpha = norm.ppf(1 - (1 - confidence) / 2)  # двусторонний
    z_beta = norm.ppf(statistical_power)
    
    # Размер выборки
    n = ((z_alpha + z_beta) ** 2) / (effect_size ** 2)
    
    return int(np.ceil(n))

# Пример: текущая конверсия 2%, хотим поднять на 10%
sample_size = calculate_sample_size(
    baseline_rate=0.02,
    expected_uplift=0.10
)
print(f"Sample size per group: {sample_size:,}")
print(f"Total sample: {sample_size * 2:,}")
print(f"Duration (10k users/day): {sample_size * 2 / 10000:.1f} days")

4. Процесс проведения A/B теста

Шаг 1: Гипотеза

Нулевая гипотеза (H0): Новый дизайн не влияет на конверсию
Альтернативная гипотеза (H1): Новый дизайн влияет на конверсию

Статистический уровень значимости: 0.05
Мощность теста: 0.80

Шаг 2: Определение метрик

-- Primary metric
CREATE TABLE ab_test_metrics AS
SELECT 
  experiment_id,
  variant,
  DATE(event_timestamp) as test_date,
  COUNT(DISTINCT user_id) as users,
  COUNT(CASE WHEN action = 'conversion' THEN 1 END) as conversions,
  COUNT(CASE WHEN action = 'conversion' THEN 1 END) * 100.0 / COUNT(DISTINCT user_id) as conversion_rate,
  AVG(revenue) as avg_revenue_per_user,
  SUM(revenue) as total_revenue
FROM ab_test_events
GROUP BY experiment_id, variant, DATE(event_timestamp)
ORDER BY test_date DESC;

Шаг 3: Мониторинг

import matplotlib.pyplot as plt
import pandas as pd

# Загружаем данные каждый день
df = pd.read_sql("SELECT * FROM ab_test_metrics WHERE experiment_id = 'test_123'", connection)

# Визуализируем тренд конверсии
plt.figure(figsize=(12, 6))
for variant in df['variant'].unique():
    data = df[df['variant'] == variant]
    plt.plot(data['test_date'], data['conversion_rate'], label=variant, marker='o')

plt.xlabel('Date')
plt.ylabel('Conversion Rate (%)')
plt.title('A/B Test Progress')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

5. Байесовский подход

import numpy as np
from scipy.stats import beta

def bayesian_ab_test(control_successes, control_trials, 
                     variant_successes, variant_trials,
                     alpha_prior=1, beta_prior=1):
    """
    Байесовский анализ A/B теста
    alpha_prior, beta_prior: параметры Beta распределения
    """
    
    # Posterior distributions
    control_dist = beta(alpha_prior + control_successes, 
                       beta_prior + control_trials - control_successes)
    variant_dist = beta(alpha_prior + variant_successes, 
                       beta_prior + variant_trials - variant_successes)
    
    # Симуляция: вероятность что вариант лучше контроля
    samples = 10000
    control_samples = control_dist.rvs(samples)
    variant_samples = variant_dist.rvs(samples)
    
    prob_variant_better = np.mean(variant_samples > control_samples)
    
    return {
        'prob_variant_better': prob_variant_better,
        'expected_lift': np.mean(variant_samples) / np.mean(control_samples) - 1,
        'credible_interval': np.percentile(variant_samples - control_samples, [2.5, 97.5])
    }

# Результат
result = bayesian_ab_test(150, 10000, 180, 10000)
print(f"Вероятность что вариант лучше: {result['prob_variant_better']:.1%}")
print(f"Ожидаемый лифт: {result['expected_lift']:.2%}")
print(f"95% credible interval: {result['credible_interval']}")

6. Типичные ошибки, которые видел

Ошибка 1: Подглядывание (Peeking)

❌ Неправильно:
- Запустили тест
- Через 2 дня результат выглядит хорошо
- Останавливаем тест досрочно

✅ Правильно:
- Рассчитали размер выборки (14 дней)
- Дождались конца периода
- Потом анализируем

Ошибка 2: Множественное сравнение

# Каждый день смотрим результаты
# 20 дней проверки = 20 возможностей ошибки
# Нужно применять correction (Bonferroni, FDR)

from statsmodels.stats.multitest import multipletests

p_values = [0.04, 0.03, 0.05, ...]
rejected, corrected_p, _, _ = multipletests(p_values, method='fdr_bh')

Ошибка 3: Обесчасчивание величины эффекта

✅ Правильно:
- p-value = 0.04 (статистически значим)
- Lift = 1.2% (небольшой практический эффект)
- Вывод: хотя результат значим, улучшение маленькое

❌ Неправильно:
- p-value = 0.04
- Запускаем вариант в production
- Не смотрим на размер эффекта

7. Примеры реальных тестов

Тест 1: Цена доставки

  • Контроль: "Доставка 200 руб"
  • Вариант: "Бесплатная доставка при заказе >5000"
  • Результат: конверсия +8%, AOV +12%
  • Решение: запустить для всех

Тест 2: Email frequency

  • Контроль: 1 письмо в неделю
  • Вариант A: 2 письма в неделю
  • Вариант B: 3 письма в неделю
  • Результат: Вариант A +15% CTR, но +10% unsubscribe
  • Решение: использовать Вариант A с опцией настройки

Итоговый процесс

1. Гипотеза (что тестируем)
2. Выбор метрик (на что смотрим)
3. Расчет размера выборки
4. Реализация (запускаем на 50/50)
5. Мониторинг (сбор данных)
6. Анализ (статистика)
7. Вывод (что делаем дальше)

Ключевое правило: "Не верь интуиции, верь данным. Но проверь данные правильно."

С какими инструментами работал для построения A/B-тестов | PrepBro