← Назад к вопросам
С какими инструментами работал для построения 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. Вывод (что делаем дальше)
Ключевое правило: "Не верь интуиции, верь данным. Но проверь данные правильно."