Как посчитать Statistical Power в SQL
Содержание:
Зачем Power
Power (мощность) = 1 − β — это вероятность обнаружить реальный эффект, если он есть (true positive rate). По соглашению берут 80%. Без достаточной мощности отрицательный результат теста ничего не доказывает: непонятно, эффекта правда нет или просто не хватило выборки, чтобы его заметить.
Формула
Для долей:
Power = Φ(z_α/2 - δ × sqrt(n / (2 × p × (1-p)))) + extra_correctionsУпрощённо:
Power ≈ Φ(δ × sqrt(n/(2pq)) - z_α/2)Базовый расчёт
Допустим, базовая конверсия 5%, ожидаемый относительный прирост 10% (эффект = 0.005), n = 10 000 на вариант:
WITH params AS (
SELECT
0.05 AS baseline,
0.055 AS treatment,
10000 AS n_per_variant,
1.96 AS z_alpha_2
)
SELECT
baseline,
treatment,
treatment - baseline AS delta,
n_per_variant,
(treatment - baseline) * SQRT(n_per_variant / (2.0 * baseline * (1-baseline))) - z_alpha_2 AS z_power
-- Power = Φ(z_power)
FROM params;z_power ≈ 0.5. Φ(0.5) ≈ 0.69 → мощность 69%. Тест недобрал мощности (нужно 80%).
Power curve
Как мощность растёт с ростом выборки:
WITH ns AS (
SELECT unnest(ARRAY[1000, 5000, 10000, 20000, 50000, 100000]) AS n
),
calc AS (
SELECT
n,
0.05 AS baseline,
0.055 AS treatment,
1.96 AS z_alpha
FROM ns
)
SELECT
n,
(treatment - baseline) * SQRT(n / (2.0 * baseline * (1-baseline))) - z_alpha AS z_power
FROM calc;Удваиваем выборку → z_power растёт в sqrt(2) раз.
Post-hoc power
Мощность, посчитанная уже после теста (спорная практика — многие статистики её не рекомендуют):
WITH observed AS (
SELECT
COUNT(DISTINCT user_id) FILTER (WHERE variant = 'A') AS n_a,
COUNT(DISTINCT user_id) FILTER (WHERE variant = 'A' AND converted) AS x_a,
COUNT(DISTINCT user_id) FILTER (WHERE variant = 'B') AS n_b,
COUNT(DISTINCT user_id) FILTER (WHERE variant = 'B' AND converted) AS x_b
FROM ab_test
)
SELECT
x_a::NUMERIC / n_a AS p_a,
x_b::NUMERIC / n_b AS p_b,
n_a, n_b,
-- Post-hoc power calc
ABS((x_b::NUMERIC/n_b) - (x_a::NUMERIC/n_a)) * SQRT(n_a / (2.0 * (x_a::NUMERIC/n_a) * (1 - (x_a::NUMERIC/n_a)))) - 1.96 AS z_power
FROM observed;Частые ошибки
Ошибка 1. Тесты с недостаточной мощностью. Мощность 50% — это подбрасывание монетки. Такой тест почти наверняка пропустит реальный эффект, а трафик и время потрачены зря.
Ошибка 2. Post-hoc power бесполезна для решений. Если результат отрицательный, post-hoc power жёстко связана с p-value — это тавтология, никакой новой информации она не добавляет.
Ошибка 3. Мощность посчитана для не той метрики. Тест мощён для основной метрики (primary), но не для guardrail- и вторичных метрик, а решение в итоге принимают именно по ним.
Ошибка 4. Забыли про дисперсию. Для непрерывных метрик мощность зависит от σ. Занизили σ на этапе планирования → на практике тест окажется недомощным.
Ошибка 5. Несколько вариантов. Тест на 4 группы делит выборку на 4 → мощность каждого сравнения падает примерно вдвое.
Связанные темы
- Как посчитать MDE в SQL
- Как посчитать sample size в SQL
- Как посчитать p-value в SQL
- Как посчитать confidence interval в SQL
FAQ
Какая мощность считается нормальной?
Стандарт де-факто — 80%: именно на такую мощность планируют большинство A/B-тестов. Для решений с высокой ценой ошибки планку поднимают до 90–95%.
Чем мощность отличается от значимости?
Мощность — это 1 − β, доля истинно положительных (true positive rate): вероятность заметить реальный эффект. Значимость завязана на α: 1 − α — это доля истинно отрицательных (true negative rate), то есть насколько мы защищены от ложной тревоги, когда эффекта нет.
Как повысить мощность?
Рычагов четыре. Первый — увеличить выборку. Второй — чем крупнее ожидаемый эффект, тем легче его поймать. Третий — снизить дисперсию σ, взяв более чистую метрику. Четвёртый — ослабить α, но это компромисс: вместе с мощностью растёт и риск ложноположительного результата.
Калькулятор мощности или SQL?
SQL хорош для быстрых прикидок прямо на данных. Но для полноценного планирования эксперимента лучше взять специализированный калькулятор — например, Statsig или Evan Miller.
Падает ли мощность в тесте с несколькими вариантами?
Да, падает: пользователи делятся между всеми группами, и на каждое сравнение их приходится меньше. Планируйте размер выборки с запасом, учитывая число вариантов.