Короткий ответ
IQR и перцентильные границы устойчивы к асимметричным распределениям и не требуют предположения о нормальности, а z-score основан на среднем и стандартном отклонении и чувствителен к самим выбросам, которые искажают эти оценки.
Как это работает подробнее
IQR-метод использует Q1/Q3 и не зависит от формы распределения; перцентильный метод (например, отрезать значения ниже 1-го и выше 99-го перцентиля) задаёт фиксированную долю "крайних" значений независимо от их абсолютной величины; z-score = (x − mean) / std, и чем больше |z|, тем дальше значение от среднего в единицах стандартного отклонения, но сам std может быть "раздут" выбросами.
Пример кода
question-130.py
import pandas as pd
s = pd.Series([10, 12, 11, 13, 12, 14, 500])
z_scores = (s - s.mean()) / s.std()
print(z_scores)Что использовать на практике
- Практика. для сильно скошенных метрик (выручка, время на сайте) предпочтительнее IQR или перцентили, так как z-score на таких распределениях будет либо пропускать реальные выбросы, либо помечать нормальные большие значения как аномалии; выбор метода и порогов — это допущение, которое всегда стоит явно проговаривать, а не считать "объективным" стандартом.
- Проверка. значение 500 получит заметно больший |z|, чем остальные, но стоит также посчитать IQR-метод на тех же данных и сравнить, насколько по-разному два метода оценивают этот же выброс, особенно если добавить ещё одно умеренно большое значение.
Подводные камни
- Частая ошибка. применяют z-score к явно не нормальному распределению, полагая порог |z|>3 универсальным правилом; обрезают выбросы по фиксированному перцентилю без учёта контекста (например, топовые VIP-клиенты систематически попадают под отсечение, хотя их данные корректны и важны для анализа).