Среднее, медиана и мода в Python
Как вычислить среднее, медиану и моду в Python с numpy и statistics. Примеры, советы по выбору меры и работа с пропущенными значениями.
Среднее значение, медиана и мода — три фундаментальные меры центральной тенденции в статистике. Каждая из них описывает «центр» набора данных по-своему, и умение выбирать нужную меру — один из первых практических навыков, необходимых при подготовке данных для машинного обучения.
В этой главе рассматриваются:
- Что означает каждая мера и как она вычисляется
- Как рассчитать их в Python с помощью
numpyи модуляstatistics - Когда предпочесть одну меру другой
- Как использовать их для заполнения пропущенных значений (импутация)
Что такое среднее, медиана и мода?
Все три меры сводят набор данных к одному представительному значению, но отражают разные аспекты распределения:
| Мера | Определение | Лучше всего подходит для |
|---|---|---|
| Среднее | Сумма всех значений ÷ количество | Симметричных, нормально распределённых данных |
| Медиана | Среднее значение при сортировке | Асимметричных данных или данных с выбросами |
| Мода | Наиболее часто встречающееся значение | Категориальных данных или дискретных счётчиков |
Понимание распределения данных поможет вам выбрать наиболее подходящую меру для вашего набора данных.
Среднее значение
Среднее арифметическое складывает все значения и делит их на количество.
Формула: mean = (x₁ + x₂ + … + xₙ) / n
Используйте numpy.mean() для вычисления в Python:
Найти среднее значение списка с помощью numpy
Когда использовать среднее
Среднее хорошо работает, когда в данных нет экстремальных выбросов и они следуют примерно симметричному распределению. При наличии выбросов они тянут среднее к себе, делая его плохим представителем «типичного» значения.
Среднее и медиана при наличии выброса
import numpy as np
salaries = [40000, 42000, 45000, 48000, 50000, 300000]
print(f"Mean: {np.mean(salaries):.0f}") # Output: 87500
print(f"Median: {np.median(salaries):.0f}") # Output: 46500Здесь среднее равно 87 500 — значительно выше пяти из шести зарплат — потому что одно экстремальное значение (300 000) смещает его вверх. Медиана (46 500) лучше отражает типичный заработок сотрудника.
Медиана
Медиана — это среднее значение отсортированного набора данных.
- Нечётное количество значений: средний элемент.
- Чётное количество значений: среднее двух средних элементов.
Используйте numpy.median():
Найти медиану списка с помощью numpy
Набор данных чётной длины — медиана усредняет два средних значения
import numpy as np
data_even = [1, 3, 5, 7]
print(np.median(data_even)) # Output: 4.0 (average of 3 and 5)Когда использовать медиану
Медиана является предпочтительной мерой центральной тенденции, когда данные асимметричны или содержат выбросы, поскольку на неё не влияют экстремальные значения. Доходы, цены на недвижимость и возрастные распределения — классические примеры, где медиана информативнее среднего.
Мода
Мода — это значение, которое встречается в наборе данных чаще всего. Набор данных может иметь:
- Нет моды — если все значения встречаются одинаковое количество раз.
- Одна мода (унимодальный) — наиболее распространённый случай.
- Несколько мод (мультимодальный) — два или более значения делят первое место по частоте.
Используйте statistics.mode() из стандартной библиотеки:
Найти моду списка с помощью модуля statistics
Работа с мультимодальными данными
statistics.mode() вызывает StatisticsError в Python 3.7 и более ранних версиях при наличии нескольких мод. В Python 3.8+ возвращается первая обнаруженная мода. Чтобы безопасно получить все моды, используйте statistics.multimode():
Найти все моды, когда данные имеют несколько пиков
import statistics
votes = [1, 1, 2, 2, 3]
print(statistics.multimode(votes)) # Output: [1, 2]Мода для числовых данных
Мода наиболее естественна для категориальных или дискретных целочисленных данных, но работает и с непрерывными числовыми данными:
import statistics
scores = [10, 20, 20, 30, 40]
print(statistics.mode(scores)) # Output: 20Когда использовать моду
Используйте моду при работе с категориальными признаками (цвета, метки, категории продуктов) или когда нужно знать наиболее популярный элемент — например, наиболее распространённый тип дефекта в наборе данных контроля качества.
Сравнение всех трёх мер
Пример ниже показывает, как среднее, медиана и мода расходятся на асимметричном наборе данных. Несколько пожилых сотрудников тянут среднее вверх, тогда как медиана и мода остаются близко к тому месту, где фактически сосредоточены данные:
Сравнить среднее, медиану и моду на асимметричных данных
import numpy as np
import statistics
ages = [22, 23, 24, 24, 25, 25, 25, 26, 60]
print(f"Mean: {np.mean(ages):.1f}") # Output: 28.2
print(f"Median: {np.median(ages):.1f}") # Output: 25.0
print(f"Mode: {statistics.mode(ages)}") # Output: 25Среднее (28,2) смещено вверх единственным 60-летним сотрудником. Медиана и мода (обе равны 25) точно отражают типичного сотрудника.
Использование среднего и медианы для импутации пропущенных значений
Распространённый шаг предобработки перед обучением модели — замена пропущенных значений (NaN) репрезентативной статистикой. Этот процесс называется импутацией.
- Импутация средним — замена
NaNсредним значением столбца. Быстро, но чувствительно к выбросам. - Импутация медианой — замена
NaNмедианой. Устойчива к выбросам; предпочтительна для асимметричных признаков. - Импутация модой — замена
NaNнаиболее частым значением. Подходит для категориальных столбцов.
Импутация средним с помощью numpy
import numpy as np
data = [10.0, 20.0, float('nan'), 40.0, 50.0]
mean_val = np.nanmean(data) # ignores NaN: (10+20+40+50)/4 = 30.0
imputed = [mean_val if np.isnan(x) else x for x in data]
print(imputed)
# Output: [10.0, 20.0, 30.0, 40.0, 50.0]В продакшн-коде обычно используют sklearn.impute.SimpleImputer, который удобно интегрируется в конвейеры scikit-learn и применяет одни и те же подобранные статистики как к обучающему, так и к тестовому набору данных.
Краткий справочник: какую меру выбрать
| Сценарий | Рекомендуемая мера |
|---|---|
| Нормально распределённые числовые данные | Среднее |
| Асимметричные числовые данные (доходы, цены) | Медиана |
| Данные с экстремальными выбросами | Медиана |
| Категориальные данные (метки, цвета) | Мода |
| Импутация числовых столбцов с выбросами | Медиана |
| Импутация категориальных столбцов | Мода |
| Поиск наиболее популярного значения | Мода |
Связанные темы
- Распределение данных — разберитесь в нормальном, асимметричном и равномерном распределениях перед выбором меры.
- Стандартное отклонение — измерьте разброс данных вокруг среднего.
- Персентиль — ранжирование значений относительно остального набора данных.
- Масштабирование — методы масштабирования признаков, основанные на этих статистиках.
Заключение
Среднее, медиана и мода каждая по-своему отражают центр данных. Среднее — наиболее распространённый выбор по умолчанию, но оно неустойчиво при наличии выбросов. Медиана устойчива к выбросам и должна быть первым выбором для асимметричных распределений. Мода незаменима для категориальных данных и запросов на «наиболее распространённое значение». В машинном обучении все три меры регулярно используются при разведочном анализе данных и импутации пропущенных значений — правильный выбор для каждого столбца приводит к более чистым признакам и лучшей производительности модели.