← Назад к вопросам
Когда медиана описывает данные лучше, чем среднее?
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%!
Когда использовать среднее
Среднее остаётся лучше выбора когда:
- Данные приблизительно нормально распределены
- Нет значительных выбросов
- Вам нужна математическая операция (например, сумма)
- Размер выборки очень большой (закон больших чисел уменьшает влияние выбросов)
# Нормальное распределение: среднее и медиана близки
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
- Всегда вычисляйте обе меры — сравнение указывает на асимметрию
- Используйте медиану для отчётов пользователям — она более интуитивна
- Используйте среднее для вычислений — легче работать математически
- Визуализируйте данные — гистограммы показывают распределение
- Проверяйте на выбросы — удаляйте или обрабатывайте их отдельно
- Используйте robustные методы — trimmed mean, Winsorization для компромисса
Заключение
Медиана лучше среднего когда:
- Есть выбросы
- Распределение асимметричное
- Выборка маленькая
- Данные дискретные или порядковые
Среднее лучше медианы когда:
- Данные нормально распределены
- Нет выбросов
- Выборка очень большая
- Нужны математические операции