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

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

1.0 Junior🔥 261 комментариев
#Статистика и A/B тестирование

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

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

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

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

Среднее (mean) и медиана (median) — это две основные меры центральной тенденции в статистике. Выбор между ними критичен для правильного анализа данных, особенно когда речь идёт о распределениях с выбросами и асимметрией.

Основное различие

Среднее (mean):

mean = (x₁ + x₂ + ... + xₙ) / n

Чувствительно к каждому значению в наборе данных.

Медиана (median):

Значение, которое делит отсортированный набор данных пополам.
Для нечётного количества: среднее значение
Для чётного количества: среднее двух центральных значений

Устойчива к экстремальным значениям.

Когда медиана лучше среднего

1. Наличие выбросов (outliers)

import numpy as np

# Данные о зарплате в команде (в тысячах)
salaries = [30, 35, 40, 42, 38, 45, 40000]  # последнее значение — CEO

mean_salary = np.mean(salaries)      # 5761 (искажено выбросом)
median_salary = np.median(salaries)  # 40 (более репрезентативно)

print(f"Среднее: ${mean_salary:.2f}k")     # Среднее: $5761.43k
print(f"Медиана: ${median_salary:.2f}k")   # Медиана: $40.00k

Вывод: среднее завышено из-за зарплаты CEO. Медиана лучше отражает типичную зарплату.

2. Асимметричные распределения (skewed distributions)

import matplotlib.pyplot as plt
from scipy import stats

# Распределение доходов домохозяйств (обычно асимметричное)
# Много домохозяйств с низким доходом, мало с очень высоким
data = np.concatenate([
    np.random.normal(50000, 15000, 900),   # большинство: 50k±15k
    np.random.uniform(200000, 500000, 100)  # 100 богатых домохозяйств
])

mean = np.mean(data)      # ~85000
median = np.median(data)  # ~50000
mode = stats.mode(data)[0]

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

Правило: в асимметричном распределении

  • Если положительная асимметрия (длинный хвост вправо): mean > median
  • Если отрицательная асимметрия (длинный хвост влево): mean < median

3. Небольшие размеры выборок

# Мониторинг времени отклика API (в миллисекундах)
response_times = [50, 55, 48, 52, 5000]  # один крах сервера

mean_time = np.mean(response_times)      # 1041 ms (неверно)
median_time = np.median(response_times)  # 52 ms (верно)

print(f"Среднее время отклика: {mean_time} ms")
print(f"Медиана времени отклика: {median_time} ms")

Практические примеры для Data Scientist

1. Анализ цен на недвижимость

import pandas as pd
import numpy as np

# Типичные данные: много дешёвых домов, несколько дорогих дворцов
prices = [250000, 280000, 270000, 300000, 1500000, 3000000]

df = pd.DataFrame({'price': prices})

print("Среднее:", df['price'].mean())     # ~937500 (завышено)
print("Медиана:", df['price'].median())   # 290000 (репрезентативна)

# Визуализация
plt.figure(figsize=(10, 5))
plt.hist(prices, bins=5, edgecolor='black')
plt.axvline(df['price'].mean(), color='red', label='Mean', linestyle='--')
plt.axvline(df['price'].median(), color='green', label='Median', linestyle='--')
plt.legend()
plt.show()

2. Метрики веб-сайта (время загрузки)

# Время загрузки страницы (в миллисекундах)
load_times = np.array([
    200, 210, 205, 215, 208, 212, 209, 211,  # нормальные
    50000  # один сбой сервера
])

# Статистика
print(f"Среднее: {np.mean(load_times):.0f} ms (завышено)")
print(f"Медиана: {np.median(load_times):.0f} ms (репрезентативна)")
print(f"25-й перцентиль: {np.percentile(load_times, 25):.0f} ms")
print(f"75-й перцентиль: {np.percentile(load_times, 75):.0f} ms")

# Результат
# Среднее: 5548 ms (завышено)
# Медиана: 210 ms (репрезентативна)

3. Анализ рейтингов и оценок

# Оценки фильма (1-5 звёзд): большинство 5 или 1, мало промежуточных
ratings = [1, 1, 1, 2, 5, 5, 5, 5, 5]

mean_rating = np.mean(ratings)      # 3.33 (не существует!)
median_rating = np.median(ratings)  # 5 (правильно)

print(f"Среднее: {mean_rating:.2f}")   # Среднее: 3.33
print(f"Медиана: {median_rating:.1f}")   # Медиана: 5.0

Статистические тесты для выбора между mean и median

Проверка на нормальность (Shapiro-Wilk тест)

from scipy.stats import shapiro, skew

data = np.array([30, 35, 40, 42, 38, 45, 40000])

# Тест Шапиро-Уилка на нормальность
stat, p_value = shapiro(data)
print(f"p-value: {p_value:.4f}")

if p_value < 0.05:
    print("Данные НЕ нормальны -> используйте медиану")
else:
    print("Данные нормальны -> можно использовать среднее")

# Проверка на асимметрию
skewness = skew(data)
print(f"Асимметрия: {skewness:.2f}")
if abs(skewness) > 1:
    print("Сильная асимметрия -> используйте медиану")

Проверка на выбросы (IQR метод)

Q1 = np.percentile(data, 25)
Q3 = np.percentile(data, 75)
IQR = Q3 - Q1

lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

outliers = (data < lower_bound) | (data > upper_bound)
print(f"Найдено выбросов: {outliers.sum()}")

if outliers.sum() > 0:
    print("Выбросы обнаружены -> используйте медиану")

Сравнение устойчивости к выбросам

import pandas as pd

# Исходные данные
original = [10, 20, 30, 40, 50]

# Добавляем выброс
with_outlier = original + [1000]

stats_df = pd.DataFrame({
    'Original': [np.mean(original), np.median(original)],
    'With Outlier': [np.mean(with_outlier), np.median(with_outlier)],
    'Change': [
        (np.mean(with_outlier) - np.mean(original)) / np.mean(original) * 100,
        (np.median(with_outlier) - np.median(original)) / np.median(original) * 100
    ]
}, index=['Mean', 'Median'])

print(stats_df)
# Mean изменилась на 300%, медиана на 0%!

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

Среднее остаётся лучше выбора когда:

  1. Данные приблизительно нормально распределены
  2. Нет значительных выбросов
  3. Вам нужна математическая операция (например, сумма)
  4. Размер выборки очень большой (закон больших чисел уменьшает влияние выбросов)
# Нормальное распределение: среднее и медиана близки
normal_data = np.random.normal(100, 15, 1000)
print(f"Mean: {np.mean(normal_data):.2f}")
print(f"Median: {np.median(normal_data):.2f}")
# Mean: 99.8, Median: 99.7 (очень близки)

Практические рекомендации для Data Science

  1. Всегда вычисляйте обе меры — сравнение указывает на асимметрию
  2. Используйте медиану для отчётов пользователям — она более интуитивна
  3. Используйте среднее для вычислений — легче работать математически
  4. Визуализируйте данные — гистограммы показывают распределение
  5. Проверяйте на выбросы — удаляйте или обрабатывайте их отдельно
  6. Используйте robustные методы — trimmed mean, Winsorization для компромисса

Заключение

Медиана лучше среднего когда:

  • Есть выбросы
  • Распределение асимметричное
  • Выборка маленькая
  • Данные дискретные или порядковые

Среднее лучше медианы когда:

  • Данные нормально распределены
  • Нет выбросов
  • Выборка очень большая
  • Нужны математические операции