Подсчёт статистики в Python: с чего начать новичку
Как посчитать среднее, медиану, частоты и разброс на встроенных средствах Python и подключить статистику без установки лишних библиотек. Первые шаги с проверками на каждом этапе.

За полчаса вы научитесь считать базовую статистику по списку чисел: среднее, медиану, моду, разброс и частоты значений. Всё — на том, что уже установлено вместе с Python: встроенных функциях и модулях statistics и collections. Ставить pandas или numpy на этом этапе не нужно, они пригодятся позже, на больших таблицах.
Материал написан для Python 3.10 и новее. Проверить версию: команда python --version в терминале должна показать Python 3.10.x или выше. Если у вас 3.6–3.9, почти всё сработает, кроме пары функций — об этом отдельно ниже.
Что нужно до начала
- Установленный Python 3.10+ (проверка — командой выше).
- Любой редактор или интерактивная оболочка. Подойдёт даже встроенный
pythonв терминале. - Данные в виде списка чисел. Для примеров возьмём выдуманный набор — время загрузки страницы в секундах.
Никаких pip install на этом уроке не будет: модули statistics и collections входят в стандартную библиотеку и доступны сразу.
Считаем по шагам
Все фрагменты ниже можно копировать целиком и запускать.
Шаг 1. Готовим данные и считаем среднее
import statistics
# время загрузки страницы в секундах, 12 замеров
load_times = [1.2, 0.9, 1.5, 3.4, 1.1, 0.8, 1.3, 1.0, 1.4, 0.95, 1.25, 8.0]
mean_value = statistics.mean(load_times)
print("Среднее:", round(mean_value, 3))
Проверка: в консоли появится строка вида Среднее: 1.9. Среднее — сумма всех значений, делённая на их количество. Обратите внимание на замер 8.0: один выброс уже утянул среднее вверх, хотя большинство запросов были около секунды. Это первая ловушка, к которой мы вернёмся.
Шаг 2. Медиана — устойчивая к выбросам
median_value = statistics.median(load_times)
print("Медиана:", median_value)
Проверка: увидите Медиана: 1.225. Медиана — значение, которое делит упорядоченный ряд пополам. Она почти не заметила выброс 8.0: 1.2 против среднего 1.9. Когда в данных есть аномалии, медиана честнее описывает «типичное» значение.
Шаг 3. Мода и частоты значений
Для чисел с плавающей точкой мода почти бесполезна — точных повторов мало. Она нужна на категориях: города, статусы, оценки. Покажем на целых числах — оценках от 1 до 5.
from collections import Counter
ratings = [5, 4, 5, 3, 5, 4, 2, 5, 4, 3, 5, 1]
# самый частый элемент
most_common = statistics.mode(ratings)
print("Мода:", most_common)
# сколько раз встречается каждое значение
freq = Counter(ratings)
print("Частоты:", freq)
print("Топ-2:", freq.most_common(2))
Проверка: Мода: 5, затем словарь частот и пара самых частых оценок. Counter из collections — самый быстрый способ посчитать, сколько раз встречается каждое значение, без ручных циклов.
Шаг 4. Разброс: дисперсия и стандартное отклонение
# стандартное отклонение выборки
std_dev = statistics.stdev(load_times)
print("Стандартное отклонение:", round(std_dev, 3))
# дисперсия выборки
variance = statistics.variance(load_times)
print("Дисперсия:", round(variance, 3))
Проверка: строки со значениями порядка 1.99 и 3.98. Стандартное отклонение показывает, насколько сильно значения разбросаны вокруг среднего. Большое отклонение при небольшом среднем — сигнал, что в данных есть выбросы.
Выборка или вся совокупность — не перепутайте
В модуле statistics есть две пары функций, и новички путают их постоянно:
| Функция | Что считает | Когда брать |
|---|---|---|
stdev / variance | По выборке (делит на n−1) | Данные — часть большего, вы оцениваете целое по образцу |
pstdev / pvariance | По всей совокупности (делит на n) | У вас все данные без исключения |
На больших наборах разница между ними мала, на десятке значений — заметна. Если сомневаетесь и у вас на руках именно выборка, берите stdev.
Среднее без медианы и разброса врёт. Три числа рядом — среднее, медиана, стандартное отклонение — говорят о данных больше, чем любое из них по отдельности.
Квантили: где проходят границы
Часто нужно не «среднее время ответа», а «сколько ответов уложилось в 95% случаев» — это перцентиль. В Python 3.8+ для этого есть statistics.quantiles.
import statistics
load_times = [1.2, 0.9, 1.5, 3.4, 1.1, 0.8, 1.3, 1.0, 1.4, 0.95, 1.25, 8.0]
# делим на 100 частей — получаем перцентили
deciles = statistics.quantiles(load_times, n=100)
print("95-й перцентиль:", round(deciles[94], 3))
Проверка: печатается значение примерно 7.5 — граница, ниже которой лежат 95% замеров. Обратите внимание: список quantiles при n=100 содержит 99 точек-границ, поэтому 95-й перцентиль — это индекс 94. Функция quantiles появилась в 3.8; на более старых версиях её нет.
Если не получилось
StatisticsError: mean requires at least one data point— вы передали пустой список. Проверьте, что данные действительно загрузились, до вызова добавьтеif not data: ....StatisticsError: no unique mode; found 2 equally common values—modeнашёл несколько одинаково частых значений. В Python 3.8+ используйтеstatistics.multimode(data), она вернёт список всех мод.TypeError: can't convert type 'str' to numerator— в списке затесалась строка, например"1.2"вместо числа. Приведите данные:[float(x) for x in raw].AttributeError: module 'statistics' has no attribute 'quantiles'— у вас Python старше 3.8. Обновите Python или считайте перцентиль вручную по отсортированному списку.- Странно большое среднее — почти всегда виноват выброс. Посмотрите на медиану и на минимум с максимумом:
min(data),max(data).
Что делать дальше
Когда данных станет много — тысячи строк, несколько столбцов, чтение из CSV — встроенный statistics начнёт тормозить, потому что работает на чистом Python. Следующий шаг: освоить pandas (метод DataFrame.describe() сразу выдаёт среднее, медиану, квартили и разброс по всем колонкам) и numpy для быстрых вычислений на массивах. Но логику — среднее против медианы, выборка против совокупности, влияние выбросов — вы уже поняли, и в pandas она ровно та же.
Проверка грамотности: Орфография, пунктуация, стиль — с объяснением каждой правки
Спросить за 10 ₽Источники: statistics — Mathematical statistics functions (docs.python.org), collections.Counter (docs.python.org)
Частые вопросы
А если у меня Python 3.7 или старше?
Когда брать среднее, а когда медиану?
Нужно ли ставить numpy или pandas для базовой статистики?
Почему mode выбрасывает ошибку, хотя данные есть?
В чём разница между stdev и pstdev, если результаты почти совпадают?
Как посчитать статистику по столбцу в CSV-файле?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.