Выбросы в данных: что это, как находить и что с ними делать

Что такое выброс

Выброс (outlier) — наблюдение, которое резко отклоняется от остальных значений в выборке. Это не формальный термин с единственным определением, а рабочее понятие: значение выглядит подозрительно непохожим на соседей.

Примеры из практики:

  • Средний чек интернет-магазина — 3 000 рублей, а один заказ — на 1 200 000. Это корпоративная закупка, ошибка ввода или фрод?
  • У сайта 2 000 визитов в день, а в один из дней — 45 000. Вирусный пост или бот-трафик?
  • В таблице зарплат значение 12 рублей. Кто-то забыл дописать нули.

Выброс — это не всегда ошибка. Иногда это самое ценное наблюдение в датасете. Задача аналитика — отличить одно от другого.

Почему выбросы важны для аналитика

Выбросы искажают статистики, на которых строятся решения.

Среднее. Одно экстремальное значение может сдвинуть среднее так, что оно перестанет отражать типичного пользователя. Медиана устойчивее, но не всегда её используют в отчётах.

Дисперсия и стандартное отклонение. Выбросы раздувают разброс. Доверительные интервалы расширяются, статистические тесты теряют мощность.

A/B-тесты. Один пользователь с аномально высоким доходом в тестовой группе может показать значимый эффект там, где его нет. Или наоборот — замаскировать реальный эффект за ростом дисперсии. На собеседованиях часто спрашивают: «Как выбросы влияют на A/B-тест и что с этим делать?»

Регрессия. Линейная регрессия минимизирует сумму квадратов остатков — выбросы получают непропорционально большой вес и перетягивают прямую на себя.

Методы обнаружения выбросов

Метод межквартильного размаха (IQR)

Самый распространённый непараметрический метод. Не зависит от предположений о распределении.

  1. Вычислите Q1 (25-й перцентиль) и Q3 (75-й перцентиль).
  2. IQR = Q3 - Q1.
  3. Нижняя граница: Q1 - 1.5 * IQR.
  4. Верхняя граница: Q3 + 1.5 * IQR.
  5. Всё, что выходит за границы, — потенциальный выброс.

Коэффициент 1.5 — конвенция, а не закон природы. Для более строгого отсечения используют 3 * IQR (тогда ловятся только экстремальные выбросы).

Z-score

Показывает, на сколько стандартных отклонений значение отстоит от среднего:

z = (x - mean) / std

Пороговое значение — обычно |z| > 3. Если распределение нормальное, за три сигмы выходит менее 0.3% наблюдений. Порог |z| > 2 более агрессивный — отсекает около 5%.

Ограничение: z-score работает хорошо только на данных, близких к нормальному распределению. Если распределение сильно скошено, метод даст ложные срабатывания на одном хвосте и пропустит выбросы на другом.

Визуальные методы

Часто самый быстрый способ обнаружить выбросы — посмотреть на данные. Подробнее о визуализации — в статье про типы графиков.

Box plot (ящик с усами). Классический инструмент. Ящик — от Q1 до Q3, линия внутри — медиана, усы — до 1.5 * IQR от краёв ящика, точки за усами — выбросы. Один взгляд даёт полную картину.

Гистограмма. Длинный хвост справа или отдельно стоящий столбик вдали от основной массы — сигнал выброса.

Scatter plot. Для двумерных данных — точки, лежащие далеко от основного облака.

SQL-пример: поиск выбросов в выручке через IQR

Допустим, есть таблица orders с полем revenue. Найдём заказы-выбросы:

WITH quartiles AS (
    SELECT
        PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY revenue) AS q1,
        PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY revenue) AS q3
    FROM orders
    WHERE revenue > 0
),
bounds AS (
    SELECT
        q1,
        q3,
        q3 - q1 AS iqr,
        q1 - 1.5 * (q3 - q1) AS lower_bound,
        q3 + 1.5 * (q3 - q1) AS upper_bound
    FROM quartiles
)
SELECT
    o.order_id,
    o.revenue,
    CASE
        WHEN o.revenue < b.lower_bound THEN 'low_outlier'
        WHEN o.revenue > b.upper_bound THEN 'high_outlier'
    END AS outlier_type
FROM orders o
CROSS JOIN bounds b
WHERE o.revenue < b.lower_bound
   OR o.revenue > b.upper_bound
ORDER BY o.revenue DESC

Запрос возвращает все заказы, выходящие за границы 1.5 * IQR, с пометкой — выброс сверху или снизу. Подробнее про агрегатные функции и перцентили — в разделе SQL.

Python-пример: обнаружение через z-score

import numpy as np
from scipy import stats

data = np.array([120, 130, 125, 128, 135, 122, 980, 127, 131, 126])

z_scores = stats.zscore(data)

outliers = np.where(np.abs(z_scores) > 2)

print("Индексы выбросов:", outliers[0])
print("Значения:", data[outliers])
# Индексы выбросов: [6]
# Значения: [980]

Значение 980 при среднем около 130 — очевидный выброс. Z-score для него будет больше 3.

Для больших датасетов удобен pandas:

import pandas as pd

df = pd.DataFrame({"revenue": [120, 130, 125, 128, 135, 122, 980, 127, 131, 126]})

q1 = df["revenue"].quantile(0.25)
q3 = df["revenue"].quantile(0.75)
iqr = q3 - q1

mask = (df["revenue"] < q1 - 1.5 * iqr) | (df["revenue"] > q3 + 1.5 * iqr)
print(df[mask])

Когда удалять, когда оставлять

Универсального ответа нет. Решение зависит от природы выброса.

Удалять или исправлять:

  • Ошибка ввода данных (зарплата 12 рублей вместо 120 000). Исправьте, если можете восстановить правильное значение, иначе — удалите.
  • Технический артефакт (дубль транзакции, тестовый аккаунт разработчика). Удалите.
  • Фрод (накрутка кликов, мошенническая транзакция). Удалите из основного анализа, но сохраните для отдельного расследования.

Оставлять и сегментировать:

  • Whale-пользователи (топ-клиенты с крупными покупками). Это не ошибки, а ценный сегмент. Анализируйте отдельно.
  • Вирусный всплеск трафика. Реальное событие — сегментируйте, чтобы отделить органику от всплеска.
  • Сезонные пики (Black Friday, Новый год). Не выбросы, а предсказуемые паттерны.

Правило: прежде чем удалять выброс, поймите его природу. Слепое удаление — потеря информации. Слепое включение — искажение статистик.

Устойчивые альтернативы: trimmed mean и винсоризация

Если вы не хотите удалять выбросы из данных, но нужна устойчивая оценка центра, есть два подхода.

Усечённое среднее (trimmed mean). Отбрасываете верхние и нижние p% значений и считаете среднее по оставшимся. Обычно p = 5% или 10%. В Python — scipy.stats.trim_mean(data, 0.05).

Винсоризация (winsorization). Не удаляете крайние значения, а заменяете их на значения ближайших перцентилей. Например, все значения ниже 5-го перцентиля заменяются на значение 5-го перцентиля, выше 95-го — на значение 95-го. Размер выборки сохраняется.

Оба метода часто применяют при подготовке метрик для A/B-тестов, чтобы снизить дисперсию и повысить мощность теста.

Асимметрия и выбросы

Положительная асимметрия (right skew) означает, что правый хвост распределения длиннее левого. Именно в правом хвосте скапливаются выбросы: аномально высокие значения выручки, длительности сессий, размеров заказов. Большинство бизнес-метрик имеют положительную асимметрию — ноль снизу ограничивает, а сверху потолка нет.

Отрицательная асимметрия — зеркальная ситуация: длинный левый хвост, выбросы слева. Встречается реже — например, в данных об оценках (большинство ставят высокие баллы, но есть единицы).

Если распределение сильно асимметрично, z-score плохо работает для обнаружения выбросов. В таких случаях метод IQR надёжнее, или стоит предварительно применить логарифмическое преобразование, чтобы привести данные ближе к нормальному виду.

Вопросы с собеседований

На интервью аналитиков тему выбросов поднимают в контексте статистики, A/B-тестов и SQL-задач. Типичные формулировки:

  1. Что такое выброс? Какое значение можно считать выбросом? Ожидают не только определение, но и конкретный метод: IQR-правило или z-score с порогом.
  2. Как выбросы влияют на среднее и медиану? Среднее чувствительно, медиана устойчива. Приведите числовой пример.
  3. В A/B-тесте один пользователь принёс 80% выручки тестовой группы. Что делать? Варианты: винсоризация, trimmed mean, бутстрэп, перевод метрики в бинарную (конверсия вместо ARPU).
  4. Напишите SQL-запрос для обнаружения выбросов. Ожидают IQR через PERCENTILE_CONT — пример выше.
  5. Когда выбросы нельзя удалять? Когда они несут бизнес-информацию: whale-пользователи, фрод (нужен для расследования), реальные аномалии рынка.
  6. Что означает положительная асимметрия распределения? Длинный правый хвост, выбросы справа. Среднее больше медианы.

Что дальше

Потренируйтесь решать задачи по статистике и анализу данных в Карьернике — тренажёре для подготовки к собеседованиям аналитиков.

FAQ

Что такое выброс в данных?

Выброс (outlier) — наблюдение, которое резко отклоняется от остальных значений в выборке. Это может быть ошибка ввода, технический артефакт, фрод или реальное экстремальное значение. Задача аналитика — определить природу выброса, прежде чем решать, что с ним делать.

Как обнаружить выбросы в данных?

Два основных метода: IQR (межквартильный размах) — значения за пределами Q1 - 1.5IQR и Q3 + 1.5IQR считаются выбросами; z-score — значения с |z| > 3 (более 3 стандартных отклонений от среднего). IQR надёжнее для скошенных распределений, z-score — для данных, близких к нормальному.

Когда выбросы нельзя удалять?

Когда они несут бизнес-информацию: whale-пользователи с крупными покупками — ценный сегмент, вирусные всплески трафика — реальное событие, сезонные пики — предсказуемые паттерны. Слепое удаление выбросов означает потерю информации.

Как выбросы влияют на A/B-тесты?

Выбросы раздувают дисперсию, расширяют доверительные интервалы и снижают мощность теста. Один пользователь с аномально высоким доходом может показать ложный эффект или замаскировать реальный. Для борьбы применяют винсоризацию, trimmed mean или перевод метрики в бинарную (конверсия вместо ARPU).