Python·Средний·10 мин
Статистика и выбросы
Среднее vs медиана, IQR, обнаружение выбросов в pandas.
Статистика и выбросы
Выбросы (outliers) — точки, существенно отличающиеся от остальных. Один-два больших заказа могут перетянуть среднее. Аналитик ОБЯЗАН их находить и обрабатывать.
Зачем искать выбросы
- Mean врёт: 9 заказов по 100 ₸ + 1 по 100 000 ₸ → mean = 10 000 ₸. Бессмысленно.
- Графики ломаются: одна точка делает axis нечитаемым
- Модели обучаются неверно: ML reagiert на выбросы
- Это могут быть баги в данных: тест-аккаунт, 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]
Что делать с выбросами
- Удалить — если это явная ошибка (отрицательный возраст)
- Заменить на медиану/среднее — если data quality важна, не data integrity
- Winsorize — обрезать на 1/99 перцентилях, не удалять
- Логарифмировать —
np.log1p(sales). Хвост распределения «сжимается» - Оставить и понять — иногда 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 = неполная аналитика
- На собеседовании: «как ты найдёшь и обработаешь выбросы» — обязательный вопрос