Когда в отчёте говорят, что «средний чек вырос», «средняя зарплата составляет 150 тысяч рублей» или «средний пользователь проводит на сайте 12 минут», это звучит как понятный и полезный вывод.
Но у среднего значения есть проблема: оно очень чувствительно к редким экстремальным наблюдениям — выбросам.
Иногда среднее действительно хорошо описывает данные. Но иногда оно создаёт картину, которая совсем не похожа на опыт большинства пользователей, клиентов или сотрудников.
Среднее и медиана: в чём разница
Среднее арифметическое
Среднее значение — это сумма всех наблюдений, делённая на их количество. Например, у пяти клиентов были такие чеки:
Средний чек составит:
В этом примере среднее хорошо описывает данные: все значения находятся примерно в одном диапазоне.
Медиана
Медиана — это центральное значение в отсортированном наборе данных. В приведённом примере медиана тоже равна 1 400 ₽.
Если значений чётное количество, медианой будет среднее двух центральных значений. Например:
Что происходит, когда появляется выброс
Представим, что к обычным заказам добавился один крупный корпоративный заказ на 50 000 ₽:
Теперь среднее значение будет таким:
Средний чек — 9 500 ₽. Но почти все покупатели потратили от 1 000 до 2 000 ₽. Значит, это число плохо описывает типичного клиента.
Медиана при этом почти не изменится:
Медиана лучше отражает типичный заказ, а среднее показывает финансовый эффект с учётом крупной покупки.
Среднее не обязательно является неправильной метрикой. Важно понимать, на какой вопрос оно отвечает.
Пример на Python
Создадим небольшой набор заказов: девять обычных покупок и один крупный заказ, который будет выбросом.
Скачать Jupyter Notebook Открыть в Google Colab
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()
В этом примере заказ на 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 часов.
Такой вывод лучше отражает реальный опыт пользователей.
Практический чек-лист
Перед тем как использовать среднее значение в отчёте, стоит:
- Построить распределение данных: histogram или boxplot.
- Сравнить среднее значение с медианой.
- Посмотреть на перцентили.
- Проверить выбросы и понять их причину.
- Разделить данные на сегменты: B2B и B2C, новые и постоянные клиенты, регионы или каналы привлечения.
- Выбрать метрику исходя из бизнес-вопроса, а не только потому, что она привычна.
Вывод
Среднее значение удобно и часто полезно, но оно может плохо описывать типичного пользователя, если в данных есть выбросы или длинный хвост распределения.
Хороший аналитик редко ограничивается одной цифрой. Минимальный набор для анализа метрики — это среднее, медиана, перцентили, визуализация распределения и сегментация данных.
Не спрашивайте только: «Какое среднее значение?».
Спросите: «Как распределены значения и что на самом деле описывает эта метрика?»