Чому аналітики повинні розуміти A/B-тестування
A/B-тестування — це спосіб, яким продуктові команди приймають рішення на основі даних, а не думок. Як аналітик даних, тебе попросять розробити експерименти, розрахувати необхідний розмір вибірки, проаналізувати результати й пояснити, чи є спостережувана різниця статистично значущою. Помилка тут призводить або до хибнопозитивних результатів (випуск фіч, які не працюють), або до хибнонегативних (відмова від фіч, які реально допомагають).
Цей посібник охоплює повний воркфлоу A/B-тестування з точки зору практикуючого аналітика: формулювання гіпотези, розрахунок вибірки, статистичне тестування в Python та комунікація результатів.
Крок 1 — Сформулюй перевіряємо гіпотезу
Коректна гіпотеза для A/B-тесту має три складові: що ти змінюєш, яка метрика має змінитись і в якому напрямку.
❌ Погано: «Ми думаємо, що новий дизайн кнопки буде краще.»
Обери первинну метрику до запуску тесту — ніколи після. Вибір метрики постфактум — це p-hacking і дає ненадійні результати. Визнач критерій успіху: який мінімальний ефект має сенс для бізнесу?
Крок 2 — Розрахуй необхідний розмір вибірки
Найпоширеніша помилка в A/B-тестуванні — завершити тест надто рано, тому що «результати виглядають добре». Без розрахунку розміру вибірки ти вимірюєш шум. Використовуй Python для розрахунку необхідного розміру вибірки перед запуском тесту.
from statsmodels.stats.power import NormalIndPower
from statsmodels.stats.proportion import proportion_effectsize
analysis = NormalIndPower()
baseline_rate = 0.05 # поточна конверсія: 5%
min_effect = 0.01 # мінімальний виявний ефект: +1 п.п. (до 6%)
alpha = 0.05 # рівень значущості
power = 0.80 # статистична потужність
effect_size = proportion_effectsize(
baseline_rate + min_effect,
baseline_rate
)
n = analysis.solve_power(
effect_size=effect_size,
alpha=alpha,
power=power,
alternative='two-sided'
)
print(f"Необхідний розмір вибірки на групу: {int(n) + 1:,}")
Крок 3 — Проаналізуй результати
Коли тест досяг необхідного розміру вибірки, проведи z-тест для двох пропорцій (для конверсій) або t-тест (для безперервних метрик, як-от дохід на користувача).
import numpy as np
from statsmodels.stats.proportion import proportions_ztest
# Результати експерименту
control_visitors = 10_420
control_conversions = 521 # 5.00%
variant_visitors = 10_380
variant_conversions = 572 # 5.51%
count = np.array([variant_conversions, control_conversions])
nobs = np.array([variant_visitors, control_visitors])
z_stat, p_value = proportions_ztest(count, nobs, alternative='two-sided')
control_rate = control_conversions / control_visitors
variant_rate = variant_conversions / variant_visitors
relative_lift = (variant_rate - control_rate) / control_rate * 100
print(f"Контроль: {control_rate:.2%}")
print(f"Варіант: {variant_rate:.2%}")
print(f"Відносне зростання: +{relative_lift:.1f}%")
print(f"p-значення: {p_value:.4f}")
print(f"Результат: {'Статистично значущий ✓' if p_value < 0.05 else 'Не значущий ✗'}")
Крок 4 — Правильна інтерпретація результатів
p-значення нижче 0.05 не означає «є 95% ймовірності, що варіант кращий». Це означає: якби різниці не було, ми б побачили результати настільки екстремальні лише у 5% випадків. Поширені помилки інтерпретації призводять до поганих рішень.
| Сценарій | Що означає | Дія |
|---|---|---|
| p < 0.05, позитивний приріст | Статистично значуще покращення | Випускай, якщо ефект практично значущий |
| p < 0.05, негативний приріст | Статистично значуща регресія | Не випускай, досліджуй причину |
| p > 0.05 | Недостатньо доказів різниці | Продовж тест або прийми нульову гіпотезу |
| p < 0.05 але мікроефект (0.1%) | Статистично значущий, але практично неважливий | Чи виправдовує ефект витрати на розробку? |
Типові помилки в A/B-тестуванні
Підглядання: щоденна перевірка результатів і зупинка коли p < 0.05 різко збільшує хибнопозитивні результати. Доводь до розрахованого розміру вибірки.
Множинне тестування: одночасне тестування 10 метрик означає, що одна виявиться значущою випадково. Застосовуй корекцію Бонфероні або визнач одну первинну метрику.
Парадокс Сімпсона: агреговані результати можуть змінитись на протилежні при розбивці за сегментами. Завжди сегментуй результати за пристроєм, типом користувача та каналом.
Ефект новизни: користувачі взаємодіють з новими речами по-іншому просто тому, що вони нові. Для деяких тестів чекай 2–3 тижні, поки ефект стабілізується.
