IT Blog

Интересные факты из аналитики, разработки, автоматизации и AI

← Все статьи

Почему среднее значение может врать: среднее, медиана и выбросы

Разбираем, почему среднее значение может искажать картину при выбросах, чем оно отличается от медианы и как с помощью Python и графиков выбрать подходящую метрику.

Когда в отчёте говорят, что «средний чек вырос», «средняя зарплата составляет 150 тысяч рублей» или «средний пользователь проводит на сайте 12 минут», это звучит как понятный и полезный вывод.

Но у среднего значения есть проблема: оно очень чувствительно к редким экстремальным наблюдениям — выбросам.

Иногда среднее действительно хорошо описывает данные. Но иногда оно создаёт картину, которая совсем не похожа на опыт большинства пользователей, клиентов или сотрудников.

Среднее и медиана: в чём разница

Среднее арифметическое

Среднее значение — это сумма всех наблюдений, делённая на их количество. Например, у пяти клиентов были такие чеки:

1 000 ₽ 1 200 ₽ 1 400 ₽ 1 500 ₽ 1 900 ₽

Средний чек составит:

Средний чек
(1 000 + 1 200 + 1 400 + 1 500 + 1 900) / 5
= 1 400 ₽

В этом примере среднее хорошо описывает данные: все значения находятся примерно в одном диапазоне.

Медиана

Медиана — это центральное значение в отсортированном наборе данных. В приведённом примере медиана тоже равна 1 400 ₽.

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

1 000 ₽ 1 200 ₽ 1 400 ₽ 1 500 ₽
Медиана
(1 200 + 1 400) / 2
= 1 300 ₽

Что происходит, когда появляется выброс

Представим, что к обычным заказам добавился один крупный корпоративный заказ на 50 000 ₽:

1 000 ₽ 1 200 ₽ 1 400 ₽ 1 500 ₽ 1 900 ₽ 50 000 ₽

Теперь среднее значение будет таким:

Средний чек с крупным заказом
(1 000 + 1 200 + 1 400 + 1 500 + 1 900 + 50 000) / 6
= 9 500 ₽

Средний чек — 9 500 ₽. Но почти все покупатели потратили от 1 000 до 2 000 ₽. Значит, это число плохо описывает типичного клиента.

Медиана при этом почти не изменится:

Медиана с крупным заказом
(1 400 + 1 500) / 2
= 1 450 ₽

Медиана лучше отражает типичный заказ, а среднее показывает финансовый эффект с учётом крупной покупки.

Среднее не обязательно является неправильной метрикой. Важно понимать, на какой вопрос оно отвечает.

Пример на Python

Создадим небольшой набор заказов: девять обычных покупок и один крупный заказ, который будет выбросом.

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

orders = pd.DataFrame({
    'order_id': range(1, 11),
    'order_amount': [
        900, 1100, 1200, 1250, 1300,
        1400, 1500, 1600, 1800, 50000
    ]
})

orders
order_id order_amount
0 1 900
1 2 1100
2 3 1200
3 4 1250
4 5 1300
5 6 1400
6 7 1500
7 8 1600
8 9 1800
9 10 50000

Посчитаем основные показатели:

mean_value = orders['order_amount'].mean()
median_value = orders['order_amount'].median()

def format_currency(value):
    return f'{value:_.2f}'.replace('_', ' ')

print(f'Средний чек: {format_currency(mean_value)} ₽')
print(f'Медианный чек: {format_currency(median_value)} ₽')
Средний чек: 6 205.00 ₽
Медианный чек: 1 350.00 ₽

Средний чек почти в 4,6 раза больше медианного. Если показать в отчёте только среднее значение, можно создать ошибочное впечатление о поведении большинства покупателей.

Визуализация: среднее и медиана на графике

На столбчатом графике хорошо видно, насколько один крупный заказ влияет на среднее значение.

plt.figure(figsize=(12, 5))

sns.set_theme(style='whitegrid')

sns.barplot(
    data=orders,
    x='order_id',
    y='order_amount',
    color='#4C78A8'
)

plt.axhline(
    mean_value,
    color='#E45756',
    linestyle='--',
    label=f'Среднее: {format_currency(mean_value)} ₽'
)

plt.axhline(
    median_value,
    color='#54A24B',
    linestyle='--',
    label=f'Медиана: {format_currency(median_value)} ₽'
)

plt.title('Чеки заказов: среднее и медиана')
plt.xlabel('Номер заказа')
plt.ylabel('Сумма заказа, ₽')
plt.legend()

plt.tight_layout()
plt.show()
Столбчатая диаграмма чеков заказов со средним и медианой

На графике линия среднего значения находится заметно выше большинства заказов, а линия медианы — рядом с типичными значениями.

Boxplot: быстрый способ заметить выбросы

Для первичного анализа полезно строить boxplot, или «ящик с усами». Он помогает быстро увидеть аномально большие или маленькие значения.

plt.figure(figsize=(10, 3))

sns.boxplot(
    x=orders['order_amount'],
    color='#72B7B2'
)

plt.xscale('log')

plt.title('Распределение суммы заказа')
plt.xlabel('Сумма заказа, ₽ (логарифмическая шкала)')

plt.tight_layout()
plt.show()
Boxplot распределения суммы заказов с крупным выбросом

В этом примере заказ на 50 000 ₽ будет сильно отделён от основной группы значений. Это не означает, что его нужно автоматически удалить: сначала важно понять его природу.

Нужно ли удалять выбросы

Выброс может быть ошибкой, но может быть и важным реальным событием. Например, крупный заказ может оказаться:

  • ошибкой загрузки или дублирующей записью;
  • отменённым или возвращённым заказом;
  • корпоративной покупкой;
  • заказом VIP-клиента;
  • редким, но реальным поведением пользователя.

Если крупная покупка реальна, удалять её из данных нельзя. Но для анализа массового сегмента можно рассматривать такие заказы отдельно.

orders_without_outlier = orders[
    orders['order_amount'] < 10000
].copy()

mean_without_outlier = (
    orders_without_outlier['order_amount'].mean()
)

median_without_outlier = (
    orders_without_outlier['order_amount'].median()
)

print(f'Средний чек без выброса: {format_currency(mean_without_outlier)} ₽')
print(f'Медианный чек без выброса: {format_currency(median_without_outlier)} ₽')
Средний чек без выброса: 1 338.89 ₽
Медианный чек без выброса: 1 300.00 ₽

Когда среднее и медиана близки, это может указывать на отсутствие сильной асимметрии распределения. Но выбросы всё равно стоит проверять отдельно — с помощью графиков, перцентилей и анализа причин их появления.

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

Среднее полезно, если нужно:

  • оценить общую выручку;
  • построить финансовый прогноз;
  • рассчитать unit-экономику;
  • оценить совокупный вклад всех клиентов;
  • сравнить показатели при относительно равномерном распределении.

Медиана полезнее, если нужно:

  • описать типичного пользователя или клиента;
  • понять обычный размер заказа;
  • оценить пользовательский опыт;
  • анализировать время ответа поддержки;
  • работать с данными, в которых много выбросов.

Не ограничивайтесь одной метрикой

Помимо среднего и медианы полезно смотреть на перцентили — значения, ниже которых находится определённая доля наблюдений.

orders['order_amount'].describe(
    percentiles=[0.25, 0.5, 0.75, 0.9, 0.95]
)
count       10.000000
mean      6205.000000
std      15390.120388
min        900.000000
25%       1212.500000
50%       1350.000000
75%       1575.000000
90%       6620.000000
95%      28310.000000
max      50000.000000
Name: order_amount, dtype: float64

Например:

  • 25-й перцентиль показывает нижнюю четверть значений;
  • 50-й перцентиль — это медиана;
  • 75-й перцентиль показывает верхнюю границу основной массы данных;
  • 90-й и 95-й перцентили помогают изучать верхнюю часть распределения.

Вместо формулировки «среднее время ответа составляет 8 часов» полезнее написать:

Медианное время первого ответа — 2 часа, а 90% обращений получают ответ в течение 12 часов.

Такой вывод лучше отражает реальный опыт пользователей.

Практический чек-лист

Перед тем как использовать среднее значение в отчёте, стоит:

  1. Построить распределение данных: histogram или boxplot.
  2. Сравнить среднее значение с медианой.
  3. Посмотреть на перцентили.
  4. Проверить выбросы и понять их причину.
  5. Разделить данные на сегменты: B2B и B2C, новые и постоянные клиенты, регионы или каналы привлечения.
  6. Выбрать метрику исходя из бизнес-вопроса, а не только потому, что она привычна.

Вывод

Среднее значение удобно и часто полезно, но оно может плохо описывать типичного пользователя, если в данных есть выбросы или длинный хвост распределения.

Хороший аналитик редко ограничивается одной цифрой. Минимальный набор для анализа метрики — это среднее, медиана, перцентили, визуализация распределения и сегментация данных.

Не спрашивайте только: «Какое среднее значение?».
Спросите: «Как распределены значения и что на самом деле описывает эта метрика?»
← Все статьи