EDA в pandas: как провести разведывательный анализ данных
Пошаговый EDA в pandas: проверить структуру, распределения, связи и сегменты до того, как строить метрики и делать выводы.

Разведывательный анализ нужен до красивого дашборда и до сложной модели. Он помогает понять, что именно лежит в таблице, где данные неполные, какие значения типичны и какие сегменты ведут себя иначе. EDA не даёт автоматического ответа, но заметно снижает риск считать не то.
Коротко
EDA — это короткое исследование формы данных: размер, типы, пропуски, уникальность, распределения, связи и сегменты. Его результатом должен быть список наблюдений и вопросов для следующего анализа, а не коллекция случайных графиков.
- Начни с зерна таблицы и периода данных.
- Смотри на распределение, а не только на среднее.
- Отделяй технические пропуски от реального отсутствия значения.
- Проверяй ключевые срезы до общего вывода.
Шаг 1. Профиль таблицы
Первый экран EDA должен отвечать на простые вопросы: сколько строк, какие поля, какой диапазон дат, где пропуски и сколько уникальных ключей. Если в таблице заказов 200 тысяч строк, но только 80 тысяч order_id, это уже влияет на любой последующий расчёт.
def profile(df: pd.DataFrame) -> pd.DataFrame:
return pd.DataFrame({
'dtype': df.dtypes.astype(str),
'missing': df.isna().sum(),
'missing_share': df.isna().mean().round(3),
'unique': df.nunique(dropna=False),
}).sort_values('missing_share', ascending=False)
print('rows, columns:', orders.shape)
display(profile(orders))
display(orders[['created_at', 'revenue']].describe())Шаг 2. Смотреть на распределения
Средний чек может быть 1 500 ₽, хотя половина заказов меньше 600 ₽, а несколько крупных клиентов тянут среднее вверх. Поэтому для денег и времени полезно смотреть медиану, квантили и хвост. Выброс — не всегда ошибка: иногда это отдельный тип пользователя или важный бизнес-сценарий.
| Показатель | Что показывает | Осторожность |
|---|---|---|
| median | типичное центральное значение | не показывает размер хвоста |
| quantile(0.9) | уровень, ниже которого 90% наблюдений | зависит от размера выборки |
| min / max | границы наблюдаемых значений | часто чувствительны к ошибкам |
| std | разброс вокруг среднего | плохо объясняет сильно асимметричные данные |
revenue_summary = orders['revenue'].describe(percentiles=[.5, .75, .9, .99])
print(revenue_summary)
p99 = orders['revenue'].quantile(.99)
large_orders = orders.loc[orders['revenue'] > p99]
print('share of orders above p99:', len(large_orders) / len(orders))Шаг 3. Сегменты важнее общей средней
Общий показатель может быть устойчивым, пока внутри него меняются сегменты. Средний заказ по всем каналам скрывает разницу между новым и возвращающимся покупателем. EDA помогает найти срезы, где меняется форма данных, а затем уже решать, нужен ли отдельный KPI или дополнительная гипотеза.
segment_summary = (
orders.groupby('channel')
.agg(
orders=('order_id', 'nunique'),
buyers=('user_id', 'nunique'),
median_revenue=('revenue', 'median'),
p90_revenue=('revenue', lambda s: s.quantile(.9)),
)
.sort_values('median_revenue', ascending=False)
)
display(segment_summary)EDA не доказывает причину
Если пользователи из referral-канала покупают чаще, это ещё не означает, что канал сам по себе создаёт лучший опыт. В него могли попадать более лояльные клиенты или другой тип продукта. Разведывательный анализ формирует вопрос: “почему сегмент отличается?”. Для причинности нужны эксперимент, квазиэксперимент или дополнительный дизайн исследования.
- Не удаляй выбросы только ради более красивого среднего.
- Не называй корреляцию влиянием.
- Запиши, какие фильтры применил к исследованию.
- Отделяй находки, которые увидел заранее, от найденных перебором срезов.
Материалы по теме
Как тестировать аналитические расчёты на Python и pandas
Практический гайд по тестам для аналитика: проверить метрики на маленьком датасете, поймать регрессию и защитить расчёт от тихих изменений.
Читать материал
Как ускорить pandas: память, типы и обработка больших файлов
Что делать, если pandas медленно работает или не помещает файл в память: категории, downcast, chunksize, Parquet и контроль размера данных.
Читать материал
Pandas apply и векторизация: как писать быстрее и понятнее
Когда использовать apply, почему векторные операции быстрее и как переписать медленный построчный расчёт в pandas.
Читать материал