Как посчитать Standard Deviation в SQL

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

Зачем STDDEV

Average AOV $50. Звучит средне. Но если STDDEV $200 — данные сильно разбросанные (киты + микро). STDDEV показывает, насколько данные расходятся от среднего.

Sample vs Population

Sample STDDEV:     SQRT(SUM((x - mean)²) / (n - 1))   -- STDDEV / STDDEV_SAMP
Population STDDEV: SQRT(SUM((x - mean)²) / n)          -- STDDEV_POP

Sample (default в SQL) — для статистической оценки. Population — когда у вас все данные.

Базовый расчёт

SELECT
    AVG(total) AS mean,
    STDDEV(total) AS sample_std,
    STDDEV_POP(total) AS population_std
FROM orders
WHERE status = 'paid';

По группам

SELECT
    category,
    AVG(total) AS mean,
    STDDEV(total) AS std,
    COUNT(*) AS n
FROM orders
WHERE status = 'paid'
GROUP BY category
ORDER BY std DESC;

Категории с высоким std — heterogeneous (есть outliers / sub-categories).

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

Coefficient of Variation

CV = std / mean × 100%. Нормализует std на разных масштабах:

SELECT
    category,
    AVG(total) AS mean,
    STDDEV(total) AS std,
    STDDEV(total) / NULLIF(AVG(total), 0) * 100 AS cv_pct
FROM orders
WHERE status = 'paid'
GROUP BY category
ORDER BY cv_pct DESC;

CV > 100% — extremely high variability. CV < 25% — stable.

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

Ошибка 1. Sample vs Population confusion. STDDEV() в Postgres = sample. В MySQL STDDEV() — population.

Ошибка 2. STDDEV на skewed data. Revenue имеет long tail. STD overstates spread. Используйте IQR / percentiles.

Ошибка 3. NULL в данных. STDDEV игнорирует NULL автоматически. Но если ожидаете все строки — учтите.

Ошибка 4. Сравнить std разных метрик. $10 std для AOV vs $10 std для conversions — несравнимо. Используйте CV.

Ошибка 5. Считать std на n=1. STDDEV возвращает NULL. NULLIF не помогает.

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

FAQ

Sample или Population?

Если у вас всё население — POP. Если выборка для inference — SAMPLE (default).

STDDEV против IQR?

STDDEV для normal data. IQR для skewed (более robust).

STDDEV против variance?

variance = std². В SQL: VARIANCE() или STDDEV()².

CV vs STDDEV?

CV нормализует. Полезно для cross-метрик сравнения.

Negative std?

Невозможно. Std — всегда ≥ 0.