Outliers через квантили (IQR)
// Условие
Таблица заказов df содержит суммы чеков с большим разбросом: основная масса — обычные покупки, ~2% — корпоративные заказы с аномально высокими суммами.
Что нужно
Найди выбросы по IQR-методу (только верхние):
- Q1 = 25-й перцентиль
amount; - Q3 = 75-й перцентиль
amount; - IQR = Q3 − Q1;
- Выброс =
amount > Q3 + 1.5 × IQR.
result DataFrame с только выброс-заказами (те же колонки что у df), отсортированный по amount по убыванию. Сброс индекса.
// Данные
df:
order_id, amount (float), user_id// Решение
Подсказка
Квантили через pandas: q1, q3 = df['amount'].quantile([0.25, 0.75]) — это распакует Series по двум значениям.
Граница выброса: upper_bound = q3 + 1.5 * (q3 - q1). Фильтрация: df[df['amount'] > upper_bound].
После фильтра — .sort_values('amount', ascending=False).reset_index(drop=True).
Сначала попробуй сам → Показать решение
df = load_data()
q1, q3 = df['amount'].quantile([0.25, 0.75])
iqr = q3 - q1
upper_bound = q3 + 1.5 * iqr
result = (df[df['amount'] > upper_bound]
.sort_values('amount', ascending=False)
.reset_index(drop=True))
print(f'Q1={q1:.2f}, Q3={q3:.2f}, IQR={iqr:.2f}, upper_bound={upper_bound:.2f}')
print(f'Outliers: {len(result)} из {len(df)} ({len(result)/len(df)*100:.1f}%)')
print(result.head())
IQR — robust к выбросам (в отличие от mean±std). Альтернатива: percentile-based (например,
amount > df['amount'].quantile(0.99) — отрезать топ-1%). На собесе важно различать: outliers по статистическим критериям ≠ outliers по бизнес-смыслу. Перед удалением — посмотри хотя бы на топ-10 выбросов и пойми что это (корпоративные заказы? фрод? ошибка ввода?).