Что такое статистическая мощность теста (statistical power)?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Statistical Power: Мощность Статистического Теста
Статистическая мощность (Power) — это вероятность того, что тест правильно обнаружит эффект, когда он действительно существует. Другими словами, это способность теста избежать ошибки Type II (ложноотрицательный результат). Обычно целевой уровень мощности составляет 80-90%.
Типы Ошибок в Статистике
| Ошибка | Определение | Обозначение |
|---|---|---|
| Type I (Ложноположительный) | Отклонить H0, хотя она верна | α (alpha) |
| Type II (Ложноотрицательный) | Не отклонить H0, хотя она ложна | β (beta) |
Мощность = 1 - β
Пример
Тестируем новый дизайн кнопки в A/B тесте:
- H0 (нулевая гипотеза): Дизайн не влияет на конверсию
- H1 (альтернативная гипотеза): Дизайн увеличивает конверсию
| Результат | H0 верна (эффекта нет) | H0 ложна (эффект есть) |
|---|---|---|
| Отклонить H0 | Type I Error (α) | ✓ Correct (Power = 1-β) |
| Не отклонить H0 | ✓ Correct | Type II Error (β) |
Высокая мощность означает, что если дизайн действительно работает, мы это обнаружим.
Что Влияет на Мощность?
1. Размер эффекта (Effect Size)
Чем больше реальный эффект, тем выше мощность. Для конверсии:
Effect Size = (p1 - p0) / sqrt(p0 * (1 - p0))
где p0 = базовая конверсия, p1 = новая конверсия
Пример:
- Базовая конверсия: 5%
- Новая конверсия: 6%
- Эффект: 1 percentage point, но относительный рост 20%
2. Размер выборки (Sample Size)
Больше данных = выше мощность. Зависит экспоненциально.
3. Уровень значимости (α)
Обычно α = 0.05 (5%). Меньше α = выше требования к выборке.
4. Двусторонний vs Односторонний тест
Двусторонний тест (мы проверяем изменение в обе стороны) имеет меньше мощности, чем односторонний.
Расчёт Мощности
Python с использованием statsmodels:
from statsmodels.stats.power import proportions_ztest
import numpy as np
# Параметры
effect_size = 0.1 # Малый эффект (Cohen's h)
alpha = 0.05 # Уровень значимости
power = 0.8 # Желаемая мощность
# Размер выборки, нужный для достижения этой мощности
sample_size = proportions_ztest(
effect_size=effect_size,
nobs=None,
alpha=alpha,
power=power,
alternative='two-sided'
)
print(f"Нужно {sample_size:.0f} пользователей на группу")
Python для расчёта мощности по существующей выборке:
from scipy.stats import norm
def calculate_power(n, baseline_p, new_p, alpha=0.05):
"""
n: размер выборки на группу
baseline_p: базовая конверсия
new_p: ожидаемая новая конверсия
alpha: уровень значимости
"""
# Стандартная ошибка
se_baseline = np.sqrt(baseline_p * (1 - baseline_p) / n)
se_new = np.sqrt(new_p * (1 - new_p) / n)
se_diff = np.sqrt(se_baseline**2 + se_new**2)
# Z-статистика для критического значения
z_critical = norm.ppf(1 - alpha / 2)
# Разница в пропорциях
effect = new_p - baseline_p
# Z-статистика для истинного эффекта
z_effect = effect / se_diff
# Мощность
power = norm.cdf(z_effect - z_critical) + (1 - norm.cdf(z_effect + z_critical))
return power
# Пример
power = calculate_power(n=5000, baseline_p=0.05, new_p=0.06)
print(f"Мощность: {power:.1%}")
Правила Расчёта Размера Выборки
Для A/B тестов конверсии:
-- SQL для проверки мощности существующего теста
SELECT
variant,
COUNT(*) as sample_size,
SUM(CASE WHEN converted = TRUE THEN 1 ELSE 0 END) as conversions,
ROUND(100.0 * SUM(CASE WHEN converted = TRUE THEN 1 ELSE 0 END) / COUNT(*), 2) as conversion_rate
FROM ab_test
WHERE test_start_date >= CURRENT_DATE - INTERVAL 30 day
GROUP BY variant;
Практические рекомендации:
| Размер эффекта | Требуемый размер выборки | Время теста |
|---|---|---|
| 0.5% (малый) | 100k+ на группу | 2-4 недели |
| 1% (средний) | 25k-50k на группу | 1-2 недели |
| 2% (большой) | 5k-10k на группу | 3-5 дней |
| 5% (очень большой) | 1k-2k на группу | 1-2 дня |
Практический Пример
Сценарий: Тестируем изменение цены подписки
- Текущая конверсия: 3%
- Ожидаемый эффект: +0.5% (до 3.5%)
- Желаемая мощность: 80%
- Уровень значимости: 5%
from statsmodels.stats.proportion import proportions_ztest
# Требуемый размер выборки
n = proportions_ztest(
effect_size=0.05,
nobs=None,
alpha=0.05,
power=0.80,
alternative='two-sided'
)
print(f"Нужно ~{n:.0f} пользователей на группу")
print(f"Всего: {2 * n:.0f} пользователей")
print(f"При 100k/день: {2*n/100000:.1f} дней")
Результат: ~15,400 на группу, 30,800 всего, 7-8 часов тестирования.
Ошибки и Риски
Низкая мощность:
- Пропускаешь реальные эффекты
- Инвестируешь в изменения, которые имеют смысл, но не обнаруживаешь это
- Пример: дизайн работает (реально +2%), но выборка мала и мощность только 30%
Слишком высокая выборка:
- Обнаруживаешь статистически значимые, но практически неважные эффекты
- Пример: дизайн дал +0.01% конверсии, статистически значимо, но бесполезно
Решение: Используй практическое значение эффекта (Minimum Detectable Effect)
# Какой минимальный эффект для тебя имеет значение?
min_effect = 0.5 # 0.5% поднятие конверсии стоит затрат
# Рассчитай размер выборки для этого эффекта
# (не для любого, а для того, который имеет смысл)
Инструменты
Online калькуляторы:
- https://www.evanmiller.org/ab-testing/sample-size.html
- Statsmodels (Python)
- G*Power (для сложных дизайнов)
Python библиотеки:
pip install statsmodels scipy numpy
Ключевые Выводы
- Мощность = вероятность найти эффект, если он существует
- Целевая мощность: 80-90%
- Мощность зависит от: размера эффекта, размера выборки, α
- Всегда рассчитывай размер выборки до теста
- Не приди к статистической значимости случайно — планируй заранее
- Низкая мощность = высокий риск Type II ошибок
Хороший Data Analyst планирует тесты, а не ждёт результатов: сначала мощность, потом данные.