Дисперсия и стандартное отклонение простыми словами

Проверь себя · 1/3разбор после ответа
В A/B тесте разница средних всего 0.1%, но p-value < 0.001 из-за очень большого n. Что корректнее всего сказать про результат?

Что такое дисперсия

Дисперсия (variance) — мера разброса значений относительно среднего. Формально: среднее квадратов отклонений каждого наблюдения от среднего арифметического.

Var(X) = Σ(xᵢ - x̄)² / N

Квадраты нужны по двум причинам: отклонения влево и вправо от среднего не компенсируют друг друга, а большие отклонения штрафуются сильнее.

Числовой пример. Пять кандидатов решили тестовое задание за 10, 12, 14, 16, 18 минут.

  1. Среднее: (10 + 12 + 14 + 16 + 18) / 5 = 14
  2. Отклонения от среднего: -4, -2, 0, 2, 4
  3. Квадраты отклонений: 16, 4, 0, 4, 16
  4. Дисперсия (генеральная): (16 + 4 + 0 + 4 + 16) / 5 = 8

Дисперсия равна 8. Единица измерения — минуты в квадрате. Это неудобно для интерпретации, и тут на помощь приходит стандартное отклонение.

Что такое стандартное отклонение

Стандартное отклонение (standard deviation, std) — корень из дисперсии:

σ = √Var(X)

Для примера выше: σ = √8 ≈ 2,83 минуты. Теперь единицы совпадают с данными — можно сказать: «время решения отклоняется от среднего примерно на 2,8 минуты».

Стандартное отклонение — основная мера разброса в аналитике. Именно σ стоит в формулах доверительных интервалов, z-score и расчёта мощности A/B тестов.

Генеральная vs выборочная дисперсия

Ключевое различие, которое спрашивают на собеседованиях.

Генеральная Выборочная
Делитель N N - 1
Обозначение σ²
Когда Есть все данные популяции Есть выборка

Выборочная дисперсия:

s² = Σ(xᵢ - x̄)² / (N - 1)

Для нашего примера: s² = 40 / 4 = 10, s = √10 ≈ 3,16 минуты.

Почему N - 1 (поправка Бесселя)? Выборочное среднее x̄ ближе к данным выборки, чем истинное среднее μ. Из-за этого сумма квадратов отклонений от x̄ систематически занижена. Деление на N - 1 вместо N компенсирует это смещение и даёт несмещённую оценку дисперсии. Формально: при вычислении x̄ из выборки мы «потратили» одну степень свободы — осталось N - 1.

На практике при большом N разница между N и N - 1 мизерная. Но в малых выборках она заметна, и использование N вместо N - 1 занижает дисперсию.

Правило 68-95-99.7

Если данные распределены по нормальному закону, стандартное отклонение даёт наглядную интерпретацию:

  • 68.3% значений лежат в пределах μ ± 1σ
  • 95.4% — в пределах μ ± 2σ
  • 99.7% — в пределах μ ± 3σ

Пример: средний чек 2000 ₽, σ = 300 ₽. Если чеки распределены нормально, 95% из них лежат в диапазоне 1400–2600 ₽. Чек в 3000 ₽ — это более 3σ от среднего, потенциальный выброс.

Зачем дисперсия аналитику

Мощность A/B теста. Формула минимального размера выборки содержит σ² в числителе. Чем больше разброс метрики, тем больше нужно наблюдений, чтобы поймать эффект. Высокая дисперсия revenue — причина, почему A/B тесты на выручку требуют огромных выборок.

Ширина доверительного интервала. CI = x̄ ± z × (σ / √n). Стандартное отклонение напрямую определяет ширину доверительного интервала. Больше σ — шире интервал — менее точная оценка.

Сравнение распределений. Среднее без дисперсии — половина картины. Два датасета со средним 100, но σ = 5 и σ = 50 — совершенно разные ситуации.

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

SQL: VAR_SAMP и STDDEV_SAMP

В PostgreSQL есть встроенные агрегатные функции:

SELECT
    topic,
    AVG(score)              AS avg_score,
    VAR_SAMP(score)         AS variance,      -- выборочная дисперсия (N-1)
    STDDEV_SAMP(score)      AS std_dev,        -- выборочное стд. отклонение
    VAR_POP(score)          AS var_pop,        -- генеральная дисперсия (N)
    STDDEV_POP(score)       AS std_pop         -- генеральное стд. отклонение
FROM training_events
GROUP BY topic;

VAR_SAMP и STDDEV_SAMP делят на N - 1, VAR_POP и STDDEV_POP — на N. В аналитике почти всегда работаем с выборками, поэтому по умолчанию используйте _SAMP-варианты.

Python: numpy и pandas

import numpy as np
import pandas as pd

data = [10, 12, 14, 16, 18]

# numpy: ddof=0 по умолчанию (генеральная)
print(np.var(data))          # 8.0
print(np.std(data))          # 2.83

# выборочная — укажите ddof=1
print(np.var(data, ddof=1))  # 10.0
print(np.std(data, ddof=1))  # 3.16

# pandas: ddof=1 по умолчанию (выборочная)
s = pd.Series(data)
print(s.var())               # 10.0
print(s.std())               # 3.16

Главный подвох: numpy и pandas используют разные значения ddof по умолчанию. np.std() делит на N (ddof=0), а df.std() — на N - 1 (ddof=1). Забыть про это — частая причина расхождений в расчётах. Всегда явно указывайте ddof.

Типичные ошибки

  • Путать генеральную и выборочную дисперсию. На практике генеральная нужна крайне редко. Если вы работаете с выборкой — делите на N - 1.
  • Игнорировать дисперсию при анализе A/B тестов. Средняя конверсия выросла на 0,5%, но при высокой дисперсии это может быть шум. Без оценки разброса нельзя судить о статистической значимости.
  • Забывать про ddof в Python. np.std() и pd.Series.std() дают разные результаты на одних и тех же данных.
  • Интерпретировать дисперсию в исходных единицах. Дисперсия измеряется в квадратах единиц. Для интерпретации используйте стандартное отклонение.

Вопросы с собеседований

«Что такое дисперсия и стандартное отклонение?»

Дисперсия — среднее квадратов отклонений от среднего, мера разброса данных. Стандартное отклонение — корень из дисперсии, выражается в тех же единицах, что и данные. σ удобнее для интерпретации: «значения отклоняются от среднего в среднем на столько-то единиц».

«Чем отличается генеральная дисперсия от выборочной?»

Генеральная делит сумму квадратов отклонений на N (размер популяции), выборочная — на N - 1. Поправка Бесселя (N - 1) компенсирует занижение дисперсии из-за того, что выборочное среднее ближе к данным выборки, чем истинное среднее генеральной совокупности.

«Как дисперсия влияет на A/B тесты?»

Дисперсия метрики определяет мощность теста и необходимый размер выборки. Формула: n = (z_α + z_β)² × 2σ² / δ², где δ — минимальный детектируемый эффект. Чем выше σ², тем больше нужно наблюдений. Поэтому тесты на revenue (высокая дисперсия) требуют больше трафика, чем тесты на конверсию.

«Почему np.std() и pd.Series.std() дают разные результаты?»

Разные значения ddof по умолчанию. NumPy использует ddof=0 (генеральная, делит на N), pandas — ddof=1 (выборочная, делит на N - 1). Для консистентности всегда явно передавайте параметр ddof.

«Как уменьшить дисперсию метрики в A/B тесте?»

Несколько способов: использовать CUPED (ковариатная коррекция на пре-экспериментальные данные), перейти от revenue к конверсии (бинарная метрика с меньшим разбросом), удалить выбросы или использовать робастные метрики (винзоризация, медиана), увеличить длительность эксперимента, стратифицировать рандомизацию.

FAQ

Что такое дисперсия простыми словами?

Дисперсия показывает, насколько сильно значения разбросаны относительно среднего. Чем больше дисперсия — тем больше разброс. Вычисляется как среднее квадратов отклонений от среднего арифметического.

Чем стандартное отклонение лучше дисперсии?

Стандартное отклонение — это корень из дисперсии. Его преимущество в том, что оно выражено в тех же единицах, что и данные. Если данные в минутах, стандартное отклонение тоже в минутах, а дисперсия — в минутах².

Когда делить на N, а когда на N - 1?

На N — если у вас вся генеральная совокупность (все данные, которые существуют). На N - 1 — если работаете с выборкой и хотите оценить дисперсию генеральной совокупности. В аналитике почти всегда используют N - 1, потому что работают с выборками.

Зачем аналитику знать дисперсию?

Дисперсия определяет ширину доверительных интервалов, мощность A/B тестов и размер необходимой выборки. Без понимания разброса данных невозможно корректно интерпретировать результаты экспериментов и статистических тестов. Больше задач — на странице примеры вопросов.