Как посчитать Standard Deviation в SQL
Содержание:
Зачем 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_POPSample (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).
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 не помогает.
Связанные темы
- Как посчитать z-score в SQL
- Как посчитать AOV в SQL
- Percentile в SQL — шпаргалка
- Как посчитать confidence interval в SQL
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.