Exploratory Data Analysis: распределения и аномалии
Содержание курса
Exploratory Data Analysis: распределения и аномалии
После того как данные загружены и датафрейм собран, первый вопрос звучит просто: «А что вообще внутри?» Прежде чем строить графики или обучать модели, нужно получить числовое резюме по каждому признаку — это и есть описательная статистика.
1. Описательная статистика: первый взгляд на данные
Описательная статистика — это набор числовых характеристик, которые дают сжатое представление о признаке: где находится его центр, насколько сильно разброс значений, есть ли экстремальные точки. Без неё вы работаете вслепую. Для числового столбца ключевые метрики такие:
- Среднее (mean) — центр тяжести распределения. Чувствительно к выбросам.
- Медиана (50%) — середина отсортированного ряда. Устойчива к экстремальным значениям.
- Стандартное отклонение (std) — типичное отклонение от среднего.
- Квантили (25%, 75%) — границы, которые отсекают нижнюю и верхнюю четверть данных.
- Минимум и максимум — крайние точки; именно здесь чаще всего прячутся ошибки и выбросы. Посмотрим, как это выглядит на
rossmann_train.csv. Выводdf.describe()для ключевых признаков:
import pandas as pd
df = pd.read_csv('rossmann_train.csv')
df.describe()
По данным из сводки описательной статистики видно следующее:
Sales: среднее ≈ 5774, медиана ≈ 5744 — они близки, что говорит об относительной симметрии. Но максимум — 41 551, при среднем около 5774. Это почти в 7 раз выше среднего: явный сигнал о наличии правого хвоста и потенциальных выбросов.Customers: среднее ≈ 633, медиана ≈ 609, максимум — 7388. Похожая картина: основной массив компактный, но хвост тянется далеко вправо.Open: среднее ≈ 0.83 при min=0 и max=1 — это бинарный признак, где 17% строк приходится на закрытые магазины. Когда магазин закрыт,SalesиCustomersравны нулю — это важно учесть при анализе распределений. Отдельно стоит запуститьdf.info(): он показывает типы данных и количество непустых значений по каждому столбцу — быстрая проверка, что никакие столбцы не потерялись при загрузке.
df.info()
Ещё один быстрый шаг — df.isnull().sum() и df.nunique(). Первый считает пропуски по столбцам, второй — количество уникальных значений. Например, DayOfWeek имеет ровно 7 уникальных значений — это ожидаемо. Если бы там оказалось, скажем, 8 — это был бы сигнал об ошибке кодирования. Что важно понять: описательная статистика не заменяет визуализацию, но она задаёт вопросы, на которые визуализация потом отвечает. Заметили большой разрыв между медианой и максимумом у Sales? Следующий шаг — посмотреть на форму распределения.
