Дисперсия, стандартное отклонение и распределения

«Два продукта имеют одинаковую среднюю оценку 4.0. Достаточно ли этого, чтобы считать их одинаковыми?»

Стандартное отклонение — это среднее расстояние наблюдений от среднего значения, выраженное в тех же единицах, что и сами данные. Дисперсия — то же самое, но возведённое в квадрат.

Вопрос 1. Что такое дисперсия и стандартное отклонение?

Что проверяет интервьюер. Понимаете ли вы, что среднее без меры разброса — половина информации. Два сервиса с одинаковым средним временем ответа могут ощущаться совершенно по-разному: один стабильно отвечает за 200 мс, второй скачет от 20 мс до 2 секунд.

import statistics

stable   = [50, 50, 50, 50, 50]
unstable = [10, 30, 50, 70, 90]

print("Средние:", statistics.mean(stable), statistics.mean(unstable))
print("Стандартное отклонение (по всей совокупности):",
      statistics.pstdev(stable), round(statistics.pstdev(unstable), 2))
print("Стандартное отклонение (по выборке):", round(statistics.stdev(unstable), 2))

Вывод:

Средние: 50 50
Стандартное отклонение (по всей совокупности): 0.0 28.28
Стандартное отклонение (по выборке): 31.62

Средние совпадают, поведение — нет. Обратите внимание на две разные функции: pstdev делит сумму квадратов отклонений на n (когда у нас вся генеральная совокупность), stdev — на n − 1 (когда это выборка). Деление на n − 1 называют поправкой Бесселя: она компенсирует то, что отклонения считаются от выборочного среднего, а не от истинного, и без неё оценка дисперсии систематически занижается. На собеседовании этот вопрос звучит как «почему в знаменателе n минус один?».

Вопрос 2. Зачем нужна дисперсия, если стандартное отклонение понятнее?

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

Есть и третья мера, которую полезно назвать самому: коэффициент вариации — отношение стандартного отклонения к среднему. Он безразмерный и позволяет сравнить разброс метрик разного масштаба: разброс чеков в 500 рублей — это много или мало? Если средний чек 1000, коэффициент вариации 0.5 — много; если 50 000, то 0.01 — почти идеальная стабильность.

Вопрос 3. Какие распределения должен знать аналитик?

РаспределениеЧто описываетПример в продукте
Нормальноесумма множества мелких независимых влиянийрост пользователей, ошибка измерения, средние по большим выборкам
Логнормальноевеличина, у которой логарифм нормален; длинный правый хвостчеки, доход, время на сайте, LTV
Биномиальноечисло успехов в n испытанияхчисло конверсий из n визитов
Пуассоначисло редких событий за интервалобращения в поддержку за час
Степенное«80/20», хвост тяжелее логнормальногопросмотры видео, число друзей в соцсети

Для нормального распределения работает правило 68–95–99.7: внутри одного стандартного отклонения от среднего лежит около 68% наблюдений, внутри двух — 95%, внутри трёх — 99.7%. Отсюда растёт «правило трёх сигм» для поиска выбросов — и отсюда же его главное ограничение: к денежным метрикам, распределённым логнормально, оно неприменимо.

Ключевой факт, который обязательно спросят: центральная предельная теорема. Она утверждает, что распределение среднего по выборке стремится к нормальному при росте размера выборки — даже если сами данные распределены как угодно. Именно поэтому A/B-тесты по конверсии и по среднему чеку можно считать нормальными формулами, хотя ни конверсия, ни чек нормальными не являются. Оговорка: при очень тяжёлых хвостах «достаточно большая выборка» может означать десятки тысяч наблюдений, а не тридцать, как пишут в учебниках.

import math, statistics

state = 12345
def rnd():                       # простой детерминированный генератор
    global state
    state = (1103515245 * state + 12345) % 2147483648
    return state / 2147483648

# сильно скошенные чеки: почти все маленькие, изредка — огромные
population = [round(-1000 * math.log(1 - rnd()), 2) for _ in range(5000)]

means = []
for _ in range(2000):
    sample = [population[int(rnd() * 5000)] for _ in range(100)]
    means.append(sum(sample) / 100)

mean_of_means = statistics.mean(means)
sd = statistics.stdev(means)
inside = sum(1 for m in means if abs(m - mean_of_means) <= 2 * sd) / len(means)

print("Популяция: среднее", round(statistics.mean(population)),
      "медиана", round(statistics.median(population)))
print("Средние по выборкам из 100: sd =", round(sd, 1))
print("Доля средних в пределах ±2 sd:", round(inside, 3))

Вывод:

Популяция: среднее 1008 медиана 692
Средние по выборкам из 100: sd = 98.8
Доля средних в пределах ±2 sd: 0.953

Исходные чеки скошены до неузнаваемости — среднее 1008 против медианы 692. Но средние по выборкам из ста чеков ведут себя как нормальное распределение: 95.3% из них уложились в две сигмы, что почти в точности соответствует правилу 68–95–99.7.

Типичные ошибки кандидатов

  • Показывают среднее без меры разброса и не понимают, почему интервьюер переспрашивает.
  • Не могут объяснить, зачем в знаменателе n − 1.
  • Считают, что «данные должны быть нормальными» для A/B-теста. Нормальным должно быть распределение оценки — среднего, а не самих данных.
  • Применяют правило трёх сигм к выручке и удивляются, что оно ничего не находит.
  • Сравнивают разброс двух метрик разного масштаба напрямую, вместо коэффициента вариации.

Как ответить кратко

«Дисперсия — средний квадрат отклонения от среднего, стандартное отклонение — корень из неё, в тех же единицах, что и данные, поэтому интерпретируется проще. Дисперсию всё равно используют в формулах, потому что она складывается для независимых величин. Для выборки делим на n − 1 — поправка Бесселя, иначе оценка занижена. Из распределений в работе встречаются в основном логнормальное (деньги и время — длинный правый хвост) и биномиальное (конверсии). Нормальное важно не потому, что данные нормальны, а из-за центральной предельной теоремы: среднее по выборке становится нормальным даже при скошенных данных — на этом стоят все A/B-тесты».

Проверьте себя
1. Почему при расчёте стандартного отклонения по выборке делят на n−1, а не на n?
AЧтобы результат всегда был больше нуля
BПоправка Бесселя: отклонения считаются от выборочного среднего, и без неё оценка дисперсии систематически занижена
CТак принято для выборок больше 30 наблюдений
DЧтобы совпадало со средним абсолютным отклонением
2. Кандидат говорит: «A/B-тест по среднему чеку нельзя считать нормальными формулами, потому что чеки распределены логнормально». Что не так?
AВсё верно, нужны только непараметрические критерии
BНормальность требуется не от самих данных, а от распределения выборочного среднего — по ЦПТ оно становится нормальным на больших выборках
CЧеки на самом деле распределены нормально
DЛогнормальные данные вообще нельзя усреднять
3. Разброс чеков в двух сегментах — 500 рублей в обоих. Как корректно сравнить их стабильность, если средние чеки 1000 и 50 000?
AСравнить стандартные отклонения напрямую: они равны, значит стабильность одинакова
BЧерез коэффициент вариации — отношение стандартного отклонения к среднему
CЧерез разность средних
DЧерез медиану разностей