Как посчитать effect size в SQL
Содержание:
Зачем 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 − φ_bWITH 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 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 — несравнимы напрямую. Они в стандартных отклонениях разных метрик.
Связанные темы
- Как посчитать t-test в SQL
- Как посчитать chi-square test в SQL
- Что такое effect size
- Effect size простыми словами
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.