Python A/B-тестуванняСтатистика 2026-06-12 9 хв

A/B-тестування для аналітиків: від гіпотези до рішення

A/B-тестування — це спосіб приймати рішення на основі даних, а не думок. Повний воркфлоу: формулювання гіпотези, розрахунок вибірки, статистичне тестування в Python та переведення результатів у бізнес-рішення.

Ісаченко Андрій
Ісаченко Андрій
Аналітик даних · Відкритий до роботи

📋 Зміст

  1. Чому аналітики повинні розуміти A/B-тестування
  2. Крок 1 — Сформулюй гіпотезу
  3. Крок 2 — Розрахуй розмір вибірки
  4. Крок 3 — Проаналізуй результати
  5. Крок 4 — Правильна інтерпретація
  6. Типові помилки

Чому аналітики повинні розуміти A/B-тестування

A/B-тестування — це спосіб, яким продуктові команди приймають рішення на основі даних, а не думок. Як аналітик даних, тебе попросять розробити експерименти, розрахувати необхідний розмір вибірки, проаналізувати результати й пояснити, чи є спостережувана різниця статистично значущою. Помилка тут призводить або до хибнопозитивних результатів (випуск фіч, які не працюють), або до хибнонегативних (відмова від фіч, які реально допомагають).

Цей посібник охоплює повний воркфлоу A/B-тестування з точки зору практикуючого аналітика: формулювання гіпотези, розрахунок вибірки, статистичне тестування в Python та комунікація результатів.

Крок 1 — Сформулюй перевіряємо гіпотезу

Коректна гіпотеза для A/B-тесту має три складові: що ти змінюєш, яка метрика має змінитись і в якому напрямку.

✅ Добре: «Зміна кольору CTA-кнопки з сірого на синій на сторінці оформлення замовлення збільшить CTR щонайменше на 5%.»
❌ Погано: «Ми думаємо, що новий дизайн кнопки буде краще.»

Обери первинну метрику до запуску тесту — ніколи після. Вибір метрики постфактум — це 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 тижні, поки ефект стабілізується.

🎯 Бізнес-питання не «чи p < 0.05?» — а «чи достатньо великий очікуваний ефект, щоб виправдати випуск з урахуванням витрат і ризиків?» Статистична значущість необхідна, але не достатня для рішення про запуск.
Теги: Python A/B-тестування Статистика Продуктова аналітика scipy