Выбросы
1. Определение
Выброс (outlier) — это наблюдение, которое значительно отличается от остальных данных.
Оно может быть слишком большим или слишком маленьким, чтобы соответствовать общей закономерности.
Где под “центром данных” чаще всего понимают среднее, медиану или другую меру центральной тенденции.
2. Почему возникают выбросы
| Причина | Пример |
|---|---|
| Ошибки измерения | сбой датчика температуры |
| Ошибки ввода данных | вместо 25 вписали 250 |
| Особенности выборки | в группе студентов оказался профессор |
| Естественные аномалии | редкие, но реальные наблюдения (например, миллионеры в доходах) |
| Смена условий эксперимента | другой прибор, другой оператор |
3. Почему важно находить выбросы
-
Искажают статистику
Среднее значение может «уплыть» далеко от реального центра. -
Влияют на модели
Регрессия, кластеризация и многие алгоритмы машинного обучения чувствительны к выбросам. -
Иногда полезны
Выброс может быть ценной аномалией, например, сигналом о сбое или мошенничестве.
4. Методы обнаружения выбросов
4.1. Метод по z-оценке (z-score)
Идея: измеряем, насколько далеко элемент от среднего в единицах стандартного отклонения.
- $\bar{x}$ — среднее значение
- $s$ — стандартное отклонение
| Если $ | z_i | > 3$, то $x_i$ обычно считают выбросом (для нормального распределения). |
Пример:
| $x_i$ | $\bar{x}=50$ | $s=5$ | $z_i$ |
|---|---|---|---|
| 48 | - | - | -0.4 |
| 52 | - | - | 0.4 |
| 70 | - | - | 4.0 ⟶ выброс |
Пояснение: точка $70$ лежит на 4 стандартных отклонения выше среднего — выброс.
4.2. Метод межквартильного размаха (IQR)
Используется, если данные несимметричные или не нормальные.
- Найдём:
- Межквартильный размах:
- Границы:
Точки за этими границами — выбросы.
Пример:
$Q_1 = 20$, $Q_3 = 30$, $IQR = 10$
⟹ Границы: $[5, 45]$
⟹ Наблюдение $x=50$ — выброс.
4.3. Метод по медиане абсолютных отклонений (MAD)
Более устойчивый, чем $z$-оценка, особенно при наличии уже существующих выбросов.
Оценка выброса:
| Если $ | z_i | > 3.5$, то выброс. |
4.4. Графические методы
| Метод | Идея | Пример |
|---|---|---|
| Boxplot (ящик с усами) | выбросы — точки за “усами” | в Python: sns.boxplot(data) |
| Scatter plot | выбросы — сильно удалённые точки | полезен для 2D |
| Histogram / KDE | выбросы — редкие хвостовые значения | визуальный контроль |
4.5. Многомерные методы
Если есть несколько признаков $(x_1, x_2, …, x_n)$, выброс может быть не по одному признаку, а по их комбинации.
Махаланобисово расстояние
- $\mu$ — вектор средних
- $S$ — ковариационная матрица
Если $D_M(x)$ слишком велико (по сравнению с $\chi^2$ распределением), точка — выброс.
Пояснение:
Этот метод учитывает корреляцию признаков — то, чего не делает обычная Евклидова дистанция.
Кластерные методы
- DBSCAN — выбросы остаются “непомеченными” (не принадлежат ни одному кластеру).
- LOF (Local Outlier Factor) — выбросы имеют низкую плотность соседей.
Обычно применяются при анализе данных с более чем 2 измерениями.
5. Отличие выбросов от шумов
| Характеристика | Выброс | Шум |
|---|---|---|
| Системный | Да, может указывать на аномалию | Нет, случайный |
| Количество | Мало | Много |
| Полезность | Иногда информативен | Обычно мешает |
| Пример | Мошенническая транзакция | Ошибки округления |
6. Что делать с выбросами
| Действие | Когда применять | Пример |
|---|---|---|
| Удалить | если это явная ошибка | $x=9999$ при измерении температуры |
| Ограничить (winsorize) | если выбросы редки, но реальные | заменить 1% крайних значений |
| Трансформировать | при лог-нормальном распределении | $\log(x)$ или $\sqrt{x}$ |
| Оставить | если выброс информативен | детектирование аномалий, fraude |
7. Связанные понятия
| Термин | Смысл |
|---|---|
| Экстраполяция | предсказание вне диапазона данных; может порождать искусственные выбросы |
| Интерполяция | предсказание внутри диапазона; выбросов не создаёт |
| Аппроксимация | приближение функции; сглаживает выбросы, если модель устойчива |
8. Пример на Python
```python
import numpy as np
import pandas as pd
x = np.array([10, 11, 9, 10, 50]) # явный выброс 50
Z-score
z = (x - x.mean()) / x.std()
outliers = x[np.abs(z) > 3]
print(“Выбросы:”, outliers)