Как посчитать Statistical Power в SQL

Проверь себя · 1/3разбор после ответа
Хотите добавить к каждой транзакции колонку «доля от общей суммы транзакций этого пользователя» и при этом не терять детализацию по транзакциям. Какой фрагмент корректен?

Зачем 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) раз.

Закрепи формулу statistical power в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать statistical power в Telegram

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 → мощность каждого сравнения падает примерно вдвое.

Связанные темы

FAQ

Какая мощность считается нормальной?

Стандарт де-факто — 80%: именно на такую мощность планируют большинство A/B-тестов. Для решений с высокой ценой ошибки планку поднимают до 90–95%.

Чем мощность отличается от значимости?

Мощность — это 1 − β, доля истинно положительных (true positive rate): вероятность заметить реальный эффект. Значимость завязана на α: 1 − α — это доля истинно отрицательных (true negative rate), то есть насколько мы защищены от ложной тревоги, когда эффекта нет.

Как повысить мощность?

Рычагов четыре. Первый — увеличить выборку. Второй — чем крупнее ожидаемый эффект, тем легче его поймать. Третий — снизить дисперсию σ, взяв более чистую метрику. Четвёртый — ослабить α, но это компромисс: вместе с мощностью растёт и риск ложноположительного результата.

Калькулятор мощности или SQL?

SQL хорош для быстрых прикидок прямо на данных. Но для полноценного планирования эксперимента лучше взять специализированный калькулятор — например, Statsig или Evan Miller.

Падает ли мощность в тесте с несколькими вариантами?

Да, падает: пользователи делятся между всеми группами, и на каждое сравнение их приходится меньше. Планируйте размер выборки с запасом, учитывая число вариантов.