Модуль statistics в Python: когда и как использовать встроенные статистические функции

Содержание
- Что такое модуль statistics в Python?
- Описательная статистика
- Регрессия и корреляция
- Нормальное распределение
- Когда переходить на NumPy, SciPy и pandas
- Быстрый справочник и чек-листы
- Решающее дерево выбора библиотеки
- Часто задаваемые вопросы
Что такое модуль statistics в Python?
Модуль statistics — это стандартная библиотека Python для базовых статистических операций: средние (арф., геом., гармоническое), медиана, мода, дисперсия, стандартное отклонение, квантильные разрезы и простая линейная регрессия. Он доступен во всех стандартных установках Python и не требует установки дополнительных пакетов.
Определение в одну строку: statistics — это «набор калькуляторных» статистических инструментов для быстрой интерактивной работы и обучения.
Импорт модуля в коде:
import statistics
# или для интерактивной работы
from statistics import mean, median, stdev
Важно: в скриптах лучше импортировать модуль полностью (import statistics), чтобы избежать случайного переопределения встроенных имён.
Описательная статистика
Описательная статистика отвечает на вопросы: какова «средняя» величина, насколько значения рассредоточены, какие квантили и какие экстремумы присутствуют. Модуль statistics покрывает большинство базовых потребностей.
Примеры и пояснения (коротко и понятно):
- mean — арифметическое среднее (сумма делённая на количество);
- fmean — быстродействующее среднее с переводом в float, поддерживает веса;
- geometric_mean — геометрическое среднее, полезно для роста/процентных изменений;
- harmonic_mean — гармоническое среднее, полезно для скоростей и показателей со скоростью в знаменателе;
- median — медиана, центральный элемент;
- mode — мода, наиболее часто встречающееся значение;
- stdev / pstdev — выборочное / популяционное стандартное отклонение;
- variance / pvariance — аналогично для дисперсии;
- quantiles — функция для вычисления квантилей.
Пример: простая последовательность и вычисления
from statistics import mean, fmean, geometric_mean, harmonic_mean, median, mode, stdev, pstdev, variance, quantiles
a = [4, 4, 3, 6]
print('mean', mean(a)) # 4.25
print('fmean (с весами)', fmean(a))
print('geometric_mean', geometric_mean(a))
print('harmonic_mean', harmonic_mean(a))
print('median', median(a))
print('mode', mode(a))
print('stdev (выборочная)', stdev(a))
print('pstdev (популяционная)', pstdev(a))
print('variance (выборочная)', variance(a))
print('quantiles', quantiles(a))
print('min/max', min(a), max(a))
Пояснение к весам: fmean принимает необязательный параметр weights — список чисел той же длины, что и данные. Взвешенное среднее полезно, когда наблюдения имеют разную «важность».
Когда использовать каждое среднее — эмпирические правила:
- Если данные аддитивны и равнозначны — используйте arithmetic mean.
- Для средних скоростей и масштабированных величин — harmonic mean.
- Для мультипликативного роста (проценты, ROI) — geometric mean.
Критерии приёмки: функции возвращают значения корректных типов (int/float) и выбрасывают понятные исключения при пустых входах или неверных типах.
Важно: в интерактивных сессиях (Jupyter, IPython) удобно импортировать нужные функции напрямую; в production-скриптах так можно случайно затереть имена.
Регрессия и корреляция
Для быстрого вычисления простой линейной регрессии по двум переменным statistics предоставляет linear_regression — обычный метод наименьших квадратов. Результат — наклон (slope) и сдвиг (intercept) для формулы y = m*x + b.
Пример:
from statistics import linear_regression, correlation
x = [1, 2, 3, 4, 5]
y = [5, 7, 9, 11, 13]
slope, intercept = linear_regression(x, y)
print('slope', slope, 'intercept', intercept) # slope 2, intercept 3
r = correlation(x, y)
print('correlation r', r) # 1.0 — идеальная положительная корреляция
Ограничения:
- linear_regression рассчитывает только простую линейную регрессию (одна зависимая переменная, одна независимая).
- Не возвращает подробную статистику (p-значения, доверительные интервалы, остатки) — для этого применяют statsmodels или SciPy.
- Не строит графики — для визуализации используйте matplotlib, Seaborn.
Когда использовать: быстрые проверки гипотез о линейной зависимости при малом объёме данных. Когда нужен полноценный статистический анализ — переходите на более мощные библиотеки.
Нормальное распределение
Модуль предоставляет класс NormalDist для работы с нормальным распределением: создание объекта по среднему и стандартному отклонению, вычисление плотности, кумулятивной функции и обратной функции.
Пример с данными о росте мужчин (дано в источнике): среднее 175.1 см. В статье использовалась стандартная ошибка 0.3 и размер выборки 2690. Чтобы оценить стандартное отклонение популяции, произведём расчёт:
import math
sd = math.sqrt(2690) * 0.3
print(sd) # примерно 15.56
Используя это стандартное отклонение, создадим NormalDist и оценим долю мужчин с ростом между 160 и 180 см:
from statistics import NormalDist
men_height = NormalDist(mu=175.1, sigma=15.56)
prob = men_height.cdf(180) - men_height.cdf(160)
print('Доля между 160 и 180 см ≈', prob) # примерно 0.458 ≈ 45.8%
Пояснение: cdf(x) возвращает вероятность того, что непрерывная нормальная переменная ≤ x. Поскольку распределение симметрично, разность cdf(верх) − cdf(низ) даёт вероятность попадания в интервал.
Примечание: NormalDist удобен для быстрых оценок и демонстраций, но для больших вычислений и моделирования вероятностных процессов предпочтительнее SciPy и специализированные библиотеки.
Когда переходить на NumPy, SciPy, pandas и др.
Модуль statistics подходит, когда:
- набор данных небольшой (несколько тысяч элементов или меньше);
- важно быстро получить понятные числовые характеристики в интерактивной сессии;
- цель — обучение или проверка гипотез без сложных требований к производительности.
Следует выбрать более мощные библиотеки в этих случаях:
- Большие массивы чисел и нужда в векторизированных операциях — NumPy;
- Табличные данные с разными типами колонок, удобная агрегация, группировка — pandas;
- Статистический анализ с тестами, доверительными интервалами, регрессией с несколькими предикторами — statsmodels или SciPy;
- Машинное обучение и обработка больших наборов данных — scikit-learn.
Короткая шпаргалка: если вы заметили, что операции становятся медленными или код превращается в циклы над элементами списков — это сигнал перейти на NumPy/pandas.
Быстрый справочник функций и когда их применять
Задача | Функция в statistics | Когда применять |
---|---|---|
Среднее арифметическое | mean | Малые наборы, образовательные примеры |
Быстрое среднее с float | fmean | Скорость и пропуск int→float |
Геометрическое среднее | geometric_mean | Рост/проценты, мультипликативные эффекты |
Гармоническое среднее | harmonic_mean | Средние скорости, отношение величин |
Медиана | median | Робастная оценка центра при выбросах |
Мода | mode | Дискретные данные, часто встречающиеся значения |
Стандартное отклонение выборочного типа | stdev | Стандартное отклонение для выборки |
Стандартное отклонение популяции | pstdev | Когда у вас данные всей популяции |
Дисперсия выборочная | variance | Аналог stdev, в квадрате |
Квантили | quantiles | Разрезание распределения на квартели/дециль |
Простая регрессия | linear_regression | Две переменные, быстрый наклон/интерсепт |
Корреляция | correlation | Мера линейной связи r |
Нормальное распределение | NormalDist | Быстрая модель нормального распр. |
Ментальные модели и практические эвристики
- «Калькулятор» vs «инструментальная панель»: statistics — калькулятор; NumPy/pandas — инструментальная панель для построения конвейеров данных.
- «Когда сомневаешься, начни со statistics»: быстрый эксперимент в REPL часто даёт понимание данных; затем масштабируй.
- «Проверяй типы и пустые входы»: большинство функций ожидают непустые и корректно типизированные итерации.
Мини‑методология для анализа небольшого датасета
- Инициализация: импортируйте statistics и базовые функции.
- Быстрое исследование: min, max, mean, median, stdev, quantiles.
- Визуальная проверка: постройте гистограмму и scatter (matplotlib).
- Быстрая регрессия/корреляция: linear_regression и correlation.
- Решение: если время выполнения и размер данных ОК — продолжайте; если нет — мигрируйте в NumPy/pandas.
Критерии приёмки: результаты совпадают с ожиданиями по типу и величине, нет неожиданных NaN, диапазон значений адекватен.
Чек-листы по ролям
Data Scientist
- Использовал statistics для первичных проверок.
- Оценил распределение, выбросы и квантили.
- При необходимости мигрировал в pandas/statsmodels для продвинутых тестов.
Аналитик
- Получил mean/median/mode и проверил корреляции.
- Сгенерировал графики для презентации.
- При больших данных использовал агрегации в pandas.
Студент/учащийся
- Понял разницу между средними видами.
- Практиковался с NormalDist и интерпретацией CDF.
- Не боялся экспериментировать в Jupyter.
Инженер (production)
- Не использует from statistics import mean в модуле, чтобы не затереть имена.
- Пишет тесты на крайние случаи (пустые списки, None, нечисловые значения).
- При больших потоках данных выбирает векторизованные решения.
Решающее дерево выбора библиотеки
flowchart TD
A[Начало: есть числовой анализ?] --> B{Нужна ли интерактивность и простота?}
B -- Да --> C{Объем данных мал?}
C -- Да --> D[Использовать statistics]
C -- Нет --> E{Нужна векторизация и скорость?}
E -- Да --> F[Использовать NumPy/pandas]
E -- Нет --> D
B -- Нет --> G{Требуется продвинутая статистика?}
G -- Да --> H[Использовать statsmodels/SciPy]
G -- Нет --> F
Тестовые случаи и проверки качества
- Пустой список: большинство функций выбросят StatisticsError — важно проверять вход заранее.
- Неполные данные (None, NaN): приводите к числам или фильтруйте перед вызовом функций.
- Взвешенные средние: длины данных и списка весов должны совпадать.
- Регрессия: проверьте, что x и y одинаковой длины и содержат хотя бы 2 точки.
Примеры типичных ошибок и когда statistics не подойдёт
- Большие массивы и узкие временные рамки — statistics медленнее, чем NumPy.
- Многомерная регрессия — statistics не справится.
- Нужны p-values, доверительные интервалы, F-тесты — используйте statsmodels.
- Работа с категорическими признаками и групповыми агрегатами — удобнее в pandas.
Советы по миграции на NumPy/pandas
- Замените списки на numpy.array или pandas.Series для векторизованных операций.
- Проверяйте NaN и типы: pandas умеет хранить смешанные типы и предоставляет удобные методы очистки.
- Для регрессии с несколькими переменными используйте statsmodels.OLS или sklearn.linear_model.
Часто задаваемые вопросы
Подходит ли statistics для реальных производственных задач?
Для простых подсчётов и небольших наборов — да. Для масштабируемой обработки и сложной статистики — лучше использовать NumPy/pandas/ SciPy.
Можно ли вычислять взвешенное среднее?
Да, fmean поддерживает параметр weights: fmean(data, weights=weights).
Как обрабатывать отсутствующие или нечисловые значения?
Отфильтруйте None/NaN до передачи в функции: [x for x in data if x is not None].
Возвращает ли linear_regression дополнительные статистики (p-value)?
Нет. linear_regression возвращает только slope и intercept. Для расширенной аналитики используйте statsmodels.
Заключение
Модуль statistics — удобный, понятный и доступный инструмент для быстрой описательной статистики и простой регрессии в Python. Используйте его как стартовую точку: он экономит время при исследовании данных и обучении, а при необходимости плавно заменяется на NumPy/pandas/SciPy для больших и сложных задач.
Важно: всегда проверяйте входные данные и их типы, и при переходе в production учитывайте требования к производительности и точности.
Похожие материалы

Включить тактильный отклик на клавиатуре iPhone

Как открыть десктопный Facebook на Android

Как обойти обнаружение AdBlock на YouTube — 2025

Браузерные трекеры: Ghostery и Firefox Focus

Как использовать AnDoSid для тестирования сети
