Медиана vs среднее — в чём разница и когда что использовать

Коротко

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

Что такое среднее

Среднее арифметическое — самая известная мера центральной тенденции. Складываем все значения и делим на количество.

Зарплаты команды: 80, 90, 100, 110, 120
Среднее = (80 + 90 + 100 + 110 + 120) / 5 = 100

Среднее учитывает каждое значение, поэтому одно экстремальное наблюдение сильно его двигает:

Зарплаты команды: 80, 90, 100, 110, 500
Среднее = (80 + 90 + 100 + 110 + 500) / 5 = 176

Среднее выросло с 100 до 176 из-за одного значения. Остальные 4 сотрудника получают ≤ 110, но «средняя зарплата» — 176. Это вводит в заблуждение.

Что такое медиана

Медиана — срединное значение. Упорядочиваем данные и берём значение посередине. Если элементов чётное число — среднее двух центральных.

Зарплаты: 80, 90, 100, 110, 500
Медиана = 100 (третье из пяти)

Зарплаты: 80, 90, 100, 110
Медиана = (90 + 100) / 2 = 95

Медиана не изменилась при замене 120 на 500. Она устойчива к выбросам — именно поэтому её используют для зарплат, цен недвижимости и времени загрузки страниц.

Ключевые отличия

Среднее Медиана
Формула Σx / n Серединное значение
Чувствительность к выбросам Высокая Низкая
Асимметричные данные Смещается к хвосту Остаётся в центре
Математические свойства Минимизирует сумму квадратов отклонений Минимизирует сумму модулей отклонений
SQL AVG(x) PERCENTILE_CONT(0.5)
Pandas df['x'].mean() df['x'].median()
Когда использовать Симметричные данные, нужна точность Асимметричные данные, нужна типичность

Примеры из аналитики

Средний чек vs медианный чек

-- Средний чек
SELECT AVG(amount) AS avg_check FROM orders;
-- Результат: 2 340 руб.

-- Медианный чек
SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY amount)
    AS median_check
FROM orders;
-- Результат: 890 руб.

Средний чек — 2 340, медианный — 890. Разница в 2.5 раза. Причина: несколько крупных B2B-заказов на сотни тысяч тянут среднее вверх. Медиана точнее отражает «типичного» покупателя.

Время загрузки страницы

-- Среднее время загрузки
SELECT AVG(load_time_ms) FROM page_loads;
-- Результат: 3 200 мс

-- p50 (медиана) и p95
SELECT
    PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY load_time_ms) AS p50,
    PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY load_time_ms) AS p95
FROM page_loads;
-- p50: 800 мс, p95: 12 000 мс

Среднее 3 200 мс пугает, но у 50% пользователей страница грузится за 800 мс. Проблема — у 5% пользователей (p95) загрузка 12 секунд. Смотреть нужно и медиану, и перцентили.

Зарплаты в компании

Классический пример: «средняя зарплата в компании — 200 000 руб.» Звучит хорошо, пока не узнаёшь, что CEO получает 3 000 000, а медиана — 95 000. Среднее тут бессмысленно.

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

  • Данные распределены симметрично (нормальное распределение)
  • Нет экстремальных выбросов
  • Нужна математическая точность (среднее участвует в формулах: дисперсия, t-test)
  • Считаете общий объём: средняя выручка на пользователя x количество пользователей = общая выручка
import pandas as pd

# Среднее — для расчёта общей выручки
total_revenue = df['revenue'].mean() * len(df)

# Среднее — когда данные симметричны
# Пример: рост людей (нормальное распределение)
df['height'].mean()  # среднее ≈ медиана

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

  • Данные скошены (длинный правый хвост — зарплаты, чеки, время ответа)
  • Есть выбросы, которые нельзя удалить
  • Нужен «типичный» пользователь/заказ/событие
  • Отчёт для бизнеса — медиана понятнее и честнее
# Медиана — для описания «типичного» пользователя
median_session = df['session_duration'].median()

# Перцентили — для полной картины
percentiles = df['load_time'].quantile([0.25, 0.5, 0.75, 0.95])

Как считать медиану в SQL

В разных СУБД синтаксис отличается:

-- PostgreSQL
SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY amount) FROM orders;

-- ClickHouse
SELECT median(amount) FROM orders;
-- или
SELECT quantile(0.5)(amount) FROM orders;

-- MySQL (нет встроенной функции, обходной путь)
SELECT AVG(amount) AS median_amount
FROM (
    SELECT amount, ROW_NUMBER() OVER (ORDER BY amount) AS rn,
           COUNT(*) OVER () AS cnt
    FROM orders
) t
WHERE rn IN (FLOOR((cnt + 1) / 2), CEIL((cnt + 1) / 2));

Типичная ошибка

Использование среднего для асимметричных данных и принятие решений на его основе:

Данные: время ответа API (мс)
50, 55, 60, 48, 52, 58, 51, 55, 3000, 5000

Среднее: 842 мс — «наш API медленный!»
Медиана: 55 мс — «API быстрый, но у 20% пользователей проблемы»

Среднее говорит «всё плохо», медиана говорит «в целом хорошо, но есть хвост». Правильный вывод — смотреть оба показателя и перцентили (p95, p99).

Вопросы с собеседований

Когда медиана лучше среднего? — Когда данные асимметричны или содержат выбросы: зарплаты, размеры чеков, время загрузки. Медиана показывает «типичное» значение, не смещаясь к экстремумам.

Средний чек в e-commerce: mean или median? — Для описания «типичного покупателя» — медиана. Для расчёта выручки — среднее (mean x число заказов = выручка). Для мониторинга обоих: если среднее растёт, а медиана нет — скорее всего, крупные заказы стали крупнее, а типичный покупатель не изменился.

Как связаны среднее и медиана при нормальном распределении? — При нормальном (симметричном) распределении среднее = медиана = мода. Если среднее значительно отличается от медианы — распределение скошено.

Что такое робастная статистика? — Робастные (устойчивые) метрики слабо меняются при выбросах. Медиана — робастная, среднее — нет. Другие робастные метрики: trimmed mean (усечённое среднее), winsorized mean, MAD (медианное абсолютное отклонение).

Какой показатель вы бы использовали для мониторинга времени ответа API? — Перцентили: p50 (медиана) для «типичного» пользователя, p95 и p99 для «хвоста». Среднее маскирует проблемы — один запрос в 30 секунд поднимет среднее, но 95% пользователей этого не замечают. SLA обычно задаётся через перцентили.


Потренируйтесь решать задачи — откройте тренажёр с 1500+ вопросами для подготовки к собеседованиям аналитиков.

FAQ

Можно ли использовать медиану в A/B-тестах?

Можно, но классические тесты (t-test, z-test) работают со средними. Для тестирования медиан используют тест Манна-Уитни или бутстрап. На практике часто применяют трансформацию данных (логарифм) и тестируют среднее трансформированных значений.

Что такое trimmed mean (усечённое среднее)?

Усечённое среднее — компромисс между средним и медианой. Убираете крайние X% с каждой стороны и считаете среднее оставшихся. Например, 5% trimmed mean отбрасывает 5% минимальных и 5% максимальных значений. Устойчивее среднего, точнее медианы.

Почему в новостях пишут «средняя зарплата», а не медианная?

Средняя зарплата всегда выше медианной (распределение зарплат скошено вправо). Для красивых отчётов выгоднее показывать среднее. Медианная зарплата честнее — она показывает, сколько получает «типичный» работник. В аналитике данных всегда уточняйте, какую метрику используете.

Как считать медиану в Pandas?

df['column'].median() — медиана столбца. df.groupby('category')['value'].median() — медиана по группам. Для произвольных перцентилей: df['column'].quantile(0.95).