Exploratory Data Analysis: распределения и аномалии
Содержание курса
3. Когда среднее врёт: ловушка скошенного распределения
Среднее — удобная метрика, но у неё есть слабое место: оно чувствительно к крайним значениям. Один магазин с продажами 41 551 тянет среднее вверх, хотя 75% магазинов зарабатывают меньше 7 856. Посмотрим на конкретные числа из rossmann_train.csv:
Sales: mean ≈ 5 774, median ≈ 5 744 — разрыв небольшой, но max = 41 551 создаёт правый хвост.Customers: mean ≈ 633, median ≈ 609, max = 7 388 — схожая картина. Пока разрыв между mean и median умеренный — всё выглядит прилично. Но стоит включить в выборку дни сOpen=0, гдеSales=0, и среднее резко просядет, а медиана останется примерно на месте. Именно так проявляется смещение среднего при смеси режимов. Проверить это легко:
import pandas as pd
df = pd.read_csv('rossmann_train.csv')
print('Все строки:')
print(df['Sales'].agg(['mean', 'median']))
print('\nТолько открытые магазины:')
df_open = df[df['Open'] == 1]
print(df_open['Sales'].agg(['mean', 'median']))
В выводе будет видно, что среднее на полной выборке заметно ниже, чем на отфильтрованной — за счёт нулей от закрытых дней. Медиана реагирует на этот эффект слабее. Вторая ловушка — автоматическое удаление выбросов. Когда видишь Sales = 41 551, первый импульс — выкинуть эту строку как аномалию. Но это может быть реальная акция или крупный магазин в праздник. Удалив такие строки, вы получите модель, которая систематически недооценивает продажи в пиковые периоды. Практическое правило: прежде чем интерпретировать mean или удалять экстремальные значения, посмотри на форму распределения и разберись в контексте точки. Выброс и ошибка — разные вещи, и только предметный анализ позволяет их различить.
