Дисперсия, стандартное отклонение и распределения
«Два продукта имеют одинаковую среднюю оценку 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-тесты».