pandasОчистка данныхMediumБесплатно~8 мин

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-тренажёре

// Решение

Подсказка

Квантили через 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 выбросов и пойми что это (корпоративные заказы? фрод? ошибка ввода?).

// Похожие задачи