← К списку уроков
Python·Средний·10 мин

Статистика и выбросы

Среднее vs медиана, IQR, обнаружение выбросов в pandas.

Статистика и выбросы

Выбросы (outliers) — точки, существенно отличающиеся от остальных. Один-два больших заказа могут перетянуть среднее. Аналитик ОБЯЗАН их находить и обрабатывать.

Зачем искать выбросы

  1. Mean врёт: 9 заказов по 100 ₸ + 1 по 100 000 ₸ → mean = 10 000 ₸. Бессмысленно.
  2. Графики ломаются: одна точка делает axis нечитаемым
  3. Модели обучаются неверно: ML reagiert на выбросы
  4. Это могут быть баги в данных: тест-аккаунт, fraud, ошибка ввода

Метод 1: правило 3 сигм

Для нормально-распределённых данных:

  • 68% попадает в [μ - σ, μ + σ]
  • 95% — [μ - 2σ, μ + 2σ]
  • 99.7% — [μ - 3σ, μ + 3σ]

Точки за 3σ — outliers.

mean = df['sales'].mean()
std = df['sales'].std()
df['is_outlier'] = (df['sales'] < mean - 3*std) | (df['sales'] > mean + 3*std)

Проблема: σ сам чувствителен к выбросам. На правом-скошенном распределении (выручка) работает плохо.

Метод 2: IQR (квартили)

Более робастный метод. Подходит для любого распределения.

Q1 = df['sales'].quantile(0.25)
Q3 = df['sales'].quantile(0.75)
IQR = Q3 - Q1

lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR

df['is_outlier'] = (df['sales'] < lower) | (df['sales'] > upper)

Это формула, которую использует boxplot для «усов».

Метод 3: топ-N перцентилей

Простой и понятный: всё что в верхних 1% или нижних 1% — outliers.

upper = df['sales'].quantile(0.99)
df_clean = df[df['sales'] <= upper]

Что делать с выбросами

  1. Удалить — если это явная ошибка (отрицательный возраст)
  2. Заменить на медиану/среднее — если data quality важна, не data integrity
  3. Winsorize — обрезать на 1/99 перцентилях, не удалять
  4. Логарифмироватьnp.log1p(sales). Хвост распределения «сжимается»
  5. Оставить и понять — иногда outliers это самое интересное (VIP-клиенты, viral-event)

Visualization для outliers

import seaborn as sns
sns.boxplot(data=df, x='category', y='sales')   # боксплот покажет выбросы как точки
sns.histplot(df['sales'], bins=50, kde=True)    # гистограмма покажет хвост

Что важно запомнить

  • IQR-метод робастнее 3σ для скошенных распределений
  • Перед удалением — спроси «почему?». Может это ценная информация
  • Логарифм — частое решение для денежных/площадных распределений (lognormal)
  • Mean без отчёта об outliers = неполная аналитика
  • На собеседовании: «как ты найдёшь и обработаешь выбросы» — обязательный вопрос