Когда лучше использовать медиану вместо среднего?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Медиана 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 → нормальное распределение
↓
Можно использовать ОБА (но среднее немного лучше для моделей)
Итог
Используй МЕДИАНУ, когда:
- Данные содержат выбросы (зарплаты, цены, доходы)
- Распределение асимметрично (не нормальное)
- Нужна мера "типичного" значения
- Данные экономические или социальные
Используй СРЕДНЕЕ, когда:
- Данные нормально распределены
- Нет явных выбросов
- Нужны данные для дальнейших вычислений
- Работаешь с физическими измерениями
Лучшая практика: Всегда считай ОБЕ метрики и сравни их. Большая разница между ними — признак асимметрии или выбросов в данных.