Медиана 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).