Как посчитать effect size в SQL

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

Зачем effect size

P-value говорит «есть ли эффект», effect size — «насколько он большой в стандартных единицах». На больших выборках любой пшик становится p < 0.001 — без effect size непонятно, стоит ли катить. Стандарт для отчёта в A/B и продуктовой аналитике: «conversion uplift +0.5pp, Cohen's h = 0.04 (small)».

Cohen's d для непрерывных

d = (μ_A − μ_B) / s_pooled
s_pooled = sqrt(((n_A − 1) × σ_A² + (n_B − 1) × σ_B²) / (n_A + n_B − 2))
WITH stats AS (
    SELECT
        variant,
        COUNT(*) AS n,
        AVG(revenue) AS mean,
        VAR_SAMP(revenue) AS variance
    FROM ab_users
    WHERE experiment_id = 'pricing_v2'
    GROUP BY variant
),
pair AS (
    SELECT
        MAX(CASE WHEN variant = 'A' THEN n END) AS n_a,
        MAX(CASE WHEN variant = 'A' THEN mean END) AS mean_a,
        MAX(CASE WHEN variant = 'A' THEN variance END) AS var_a,
        MAX(CASE WHEN variant = 'B' THEN n END) AS n_b,
        MAX(CASE WHEN variant = 'B' THEN mean END) AS mean_b,
        MAX(CASE WHEN variant = 'B' THEN variance END) AS var_b
    FROM stats
)
SELECT
    mean_a,
    mean_b,
    mean_b - mean_a AS raw_diff,
    SQRT(((n_a - 1) * var_a + (n_b - 1) * var_b)::NUMERIC / NULLIF(n_a + n_b - 2, 0)) AS pooled_sd,
    (mean_b - mean_a)
    / NULLIF(SQRT(((n_a - 1) * var_a + (n_b - 1) * var_b)::NUMERIC / (n_a + n_b - 2)), 0) AS cohens_d
FROM pair;

Cohen's h для пропорций

Бинарная метрика (конверсия). Берём arcsin-преобразование, чтобы получить нормированную разницу:

φ_p = 2 × arcsin(sqrt(p))
h = φ_a − φ_b
WITH conv_rates AS (
    SELECT
        variant,
        AVG(CASE WHEN converted THEN 1.0 ELSE 0 END) AS p_hat,
        COUNT(*) AS n
    FROM ab_users
    WHERE experiment_id = 'checkout_v2'
    GROUP BY variant
),
phi AS (
    SELECT
        variant,
        p_hat,
        n,
        2 * ASIN(SQRT(p_hat)) AS phi_transformed
    FROM conv_rates
)
SELECT
    MAX(CASE WHEN variant = 'A' THEN p_hat END) AS p_a,
    MAX(CASE WHEN variant = 'B' THEN p_hat END) AS p_b,
    MAX(CASE WHEN variant = 'B' THEN phi_transformed END)
    - MAX(CASE WHEN variant = 'A' THEN phi_transformed END) AS cohens_h
FROM phi;

ASIN в Postgres ожидает аргумент в [-1, 1]SQRT(p_hat) всегда подойдёт.

Интерпретация

Условные пороги Cohen (1988):

Effect d h
Small 0.2 0.2
Medium 0.5 0.5
Large 0.8 0.8

В продукте Cohen's d для revenue 0.1 уже хорошо — 0.5 редкость. Привязывайтесь к историческому baseline, а не строго к таблице.

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

Effect size vs p-value

SELECT
    p_value,
    cohens_d,
    CASE
        WHEN p_value < 0.05 AND ABS(cohens_d) < 0.1 THEN 'значимо, но эффект тривиальный — копать не стоит'
        WHEN p_value < 0.05 AND ABS(cohens_d) >= 0.1 THEN 'значимо и заметно — катить'
        WHEN p_value >= 0.05 AND ABS(cohens_d) < 0.1 THEN 'эффекта нет'
        WHEN p_value >= 0.05 AND ABS(cohens_d) >= 0.1 THEN 'эффект есть, мало мощности — увеличить n'
    END AS interpretation
FROM ab_results;

Частые ошибки

Ошибка 1. Pooled SD без n − 2. Делить на n_a + n_b, а не на n_a + n_b − 2 — biased. На больших выборках разница не критична, на маленьких — да.

Ошибка 2. d для пропорций. Cohen's d на бинарных значениях технически работает, но плохо интерпретируется. Для proportions — Cohen's h.

Ошибка 3. Effect size без контекста бизнеса. 0.1 в Cohen's d может означать +5% revenue (огромно) или +5 секунд time-on-page (мелочь). Всегда сообщайте raw diff рядом.

Ошибка 4. Hedges' g вместо Cohen's d на больших n. Hedges' g — поправка на малую выборку. На n > 50 совпадает с d.

Ошибка 5. Сравнивать effect size между разными метриками. d по revenue и d по time — несравнимы напрямую. Они в стандартных отклонениях разных метрик.

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

FAQ

Когда Cohen's d, когда Cohen's h?

d — для непрерывных метрик (revenue, time). h — для пропорций (conversion, retention rate).

Какой минимальный «практически значимый» effect?

Зависит от продукта. Для растущих стартапов 0.05–0.1 в d уже стоит катить. Для зрелых — 0.2+.

Effect size учитывает направление?

Да — знак показывает, в какую сторону отличие.

Hedges' g нужно?

Для n > 30 в каждой группе разницы нет. Для маленьких выборок — да.

Effect size CI?

Да, считается через bootstrap или асимптотические формулы. В отчёте лучше с CI.