← Назад к вопросам

Когда лучше использовать медиану вместо среднего?

2.0 Middle🔥 181 комментариев
#Статистика и теория вероятностей

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Медиана vs Среднее (Mean)

Среднее и медиана — это разные способы описания «центра» распределения. Выбор между ними критичен, потому что они могут дать совершенно разные картины данных, особенно при наличии выбросов.

Определения

Среднее (Mean):

Сумма всех значений, разделённая на количество:

import numpy as np

data = [10, 20, 30, 40, 50]
mean = np.mean(data)  # (10+20+30+40+50)/5 = 30
print(f"Среднее: {mean}")  # 30

Медиана (Median):

Средний элемент при сортировке (или среднее двух середин при чётном количестве):

data = [10, 20, 30, 40, 50]
median = np.median(data)  # Середина отсортированного списка = 30
print(f"Медиана: {median}")  # 30

# Чётное количество элементов
data2 = [10, 20, 30, 40]
median2 = np.median(data2)  # (20+30)/2 = 25
print(f"Медиана: {median2}")  # 25

Основное отличие: чувствительность к выбросам

Пример: зарплаты в небольшой компании

import numpy as np

# Нормальные зарплаты
zarplata = [30000, 32000, 35000, 38000, 40000]

mean = np.mean(zarplata)      # 35000
median = np.median(zarplata)  # 35000

print(f"Средняя зарплата: ${mean:,.0f}")
print(f"Медианная зарплата: ${median:,.0f}")
# Обе показывают 35000 — всё в порядке

# Теперь добавим одного миллиардера-CEO
zarplata_with_ceo = [30000, 32000, 35000, 38000, 1000000]

mean_with_ceo = np.mean(zarplata_with_ceo)      # 227000
median_with_ceo = np.median(zarplata_with_ceo)  # 35000

print(f"\nСо сверхвысокой зарплатой CEO:")
print(f"Средняя зарплата: ${mean_with_ceo:,.0f}")  # Выглядит странно!
print(f"Медианная зарплата: ${median_with_ceo:,.0f}")  # Реальная картина

Визуально:

Данные: [10, 20, 30, 40, 50]
Среднее:  30 ████░░░░░░
Медиана:  30 ░░░░█░░░░░

Данные: [10, 20, 30, 40, 5000000]
Среднее:  1000000 ████████████████░░░░
Медиана:  30 ░░░░█░░░░░

Таблица сравнения

ПараметрСреднееМедиана
ФормулаΣ/nСредний элемент
ВыбросыОчень чувствительнаУстойчива
Нормальное распределениеИдеальноОдинаково хорошо
Асимметричные данныеСмещено в сторону хвостаТочнее отражает центр
ВычислениеПростоеНужна сортировка
Использование в моделяхЧасто (МНК)Реже (но устойчивее)
Интерпретация"Среднее значение""Типичное значение"

Когда использовать медиану

1. Данные с выбросами или асимметричные

Примеры реальной жизни:

# Цены на недвижимость в районе
prices = [200000, 220000, 250000, 280000, 300000, 15000000]  # Дворец!

mean = np.mean(prices)      # 2708333 (смещено вверх!)
median = np.median(prices)  # 265000 (реальная картина)

print(f"Средняя цена: ${mean:,.0f}")
print(f"Медианная цена: ${median:,.0f}")

2. Доходы и зарплаты

Доходы обычно имеют длинный правый хвост (несколько очень богатых людей):

# Реальный пример: США
# Медианный доход: ~$55,000
# Средний доход: ~$92,000
# Разница из-за миллиардеров!

3. Интернет трафик, время ответа сервера

import numpy as np

# Время ответа сервера (миллисекунды)
response_times = [100, 110, 105, 108, 120, 5000]  # Одна ошибка!

mean = np.mean(response_times)      # 905 ms (преувеличено!)
median = np.median(response_times)  # 109 ms (типичный ответ)

print(f"Средний ответ: {mean:.0f} ms")
print(f"Медианный ответ: {median:.0f} ms")

# В мониторинге используют медиану, потому что она не искажается
# одним багом или скачком нагрузки

4. Количество друзей в соцсети

# Большинство людей имеет 100-500 друзей
# Но есть знаменитости с миллионами
# Среднее было бы завышено

Когда использовать среднее

1. Нормально распределённые данные (без выбросов)

# Рост людей — примерно нормальное распределение
heights = [170, 172, 175, 178, 180]

mean = np.mean(heights)      # 175
median = np.median(heights)  # 175

# Обе одинаково хороши

2. Когда нужны все значения в вычислениях

# Для дальнейших математических операций
total_salary = mean * number_of_people  # Работает

# С медианой нельзя так просто
total_salary = median * number_of_people  # Неправильно!

3. Контрольный карты и статистический контроль

# В производстве часто используют среднее
# для отслеживания тренда

4. Когда нет явных выбросов

# Тесты студентов в классе (обычно 0-100)
scores = [65, 72, 78, 82, 85]

mean = np.mean(scores)      # 76.4
median = np.median(scores)  # 78

# Обе метрики разумны, используй среднее для моделей

Практический пример: анализ данных

import pandas as pd
import numpy as np

# Реальные данные: время доставки заказов
delivery_times = [2, 2, 3, 3, 3, 4, 4, 5, 5, 120]  # Один заказ потерялся на месяц

df = pd.DataFrame({'delivery_days': delivery_times})

print("Статистика:")
print(df['delivery_days'].describe())
# count    10.000000
# mean      15.400000  ← Завышено из-за 120!
# std       37.659538  ← Огромная дисперсия
# min        2.000000
# 25%        3.000000
# 50%        3.500000  ← Медиана (более честная)
# 75%        4.750000
# max      120.000000  ← Выброс

print(f"\nМедиана: {df['delivery_days'].median():.1f} дней")
print(f"Среднее: {df['delivery_days'].mean():.1f} дней")

# Правильный анализ:
print(f"\nТипичная доставка: {df['delivery_days'].median():.0f} дней")
print(f"Межквартильный размах (25%-75%): {df['delivery_days'].quantile(0.25):.0f}-{df['delivery_days'].quantile(0.75):.0f} дней")

Робастность (устойчивость к выбросам)

# Когда данные могут содержать ошибки:

# Вариант 1: Просто удалить выбросы
clean_data = df[df['value'] < df['value'].quantile(0.95)]  # Удалить top 5%
mean_clean = clean_data['value'].mean()

# Вариант 2: Использовать медиану
median = df['value'].median()  # Работает даже с выбросами

# Вариант 3: Обрезанное среднее (trimmed mean)
from scipy.stats import trim_mean
trimmed_mean = trim_mean(df['value'], 0.1)  # Удаляет 10% с каждого конца

Комбинированный анализ

import pandas as pd
import numpy as np

# Лучше всего смотреть ОБЕ метрики вместе:

data = [10, 20, 30, 40, 1000]

mean = np.mean(data)       # 220
median = np.median(data)   # 30
std = np.std(data)         # 390

print(f"Среднее: {mean}")
print(f"Медиана: {median}")
print(f"Разница: {abs(mean - median)}")

if abs(mean - median) > std:
    print("⚠️ ВНИМАНИЕ! Данные асимметричны или есть выбросы!")
    print("Используй медиану для описания центра.")
else:
    print("✓ Данные примерно нормальные, среднее надежно.")

Практическое правило

Если mean >> median → есть правый хвост выбросов
↓
Успользуй МЕДИАНУ

Если mean << median → есть левый хвост выбросов
↓
Успользуй МЕДИАНУ

Если mean ≈ median → нормальное распределение
↓
Можно использовать ОБА (но среднее немного лучше для моделей)

Итог

Используй МЕДИАНУ, когда:

  • Данные содержат выбросы (зарплаты, цены, доходы)
  • Распределение асимметрично (не нормальное)
  • Нужна мера "типичного" значения
  • Данные экономические или социальные

Используй СРЕДНЕЕ, когда:

  • Данные нормально распределены
  • Нет явных выбросов
  • Нужны данные для дальнейших вычислений
  • Работаешь с физическими измерениями

Лучшая практика: Всегда считай ОБЕ метрики и сравни их. Большая разница между ними — признак асимметрии или выбросов в данных.