← Назад к вопросам
EDA: Исследовательский анализ данных
1.0 Junior🔥 261 комментариев
#Pandas и обработка данных#Python
Условие
Вам дан датасет с данными о клиентах банка.
Проведите EDA:
- Описательная статистика
- Распределения признаков
- Корреляционный анализ
- Поиск выбросов и аномалий
- Визуализации
- Выводы и гипотезы
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение: EDA на датасете клиентов банка
1. Описательная статистика
Начинаем с базового анализа данных:
import pandas as pd
import numpy as np
# Загрузка данных
df = pd.read_csv("bank_clients.csv")
# Основная информация
print(df.info())
print(df.shape)
print(df.describe())
# Пропуски
print(df.isnull().sum())
print(df.isnull().sum() / len(df) * 100) # % пропусков
Ключевые метрики:
- Размер датасета (число записей, признаков)
- Типы данных
- Пропущенные значения
- Базовая статистика (mean, std, min, max, quartiles)
2. Распределения признаков
import matplotlib.pyplot as plt
import seaborn as sns
# Числовые признаки
numerical_cols = df.select_dtypes(include=[np.number]).columns
fig, axes = plt.subplots(3, 3, figsize=(15, 12))
for idx, col in enumerate(numerical_cols):
ax = axes[idx // 3, idx % 3]
df[col].hist(bins=30, ax=ax, edgecolor="black")
ax.set_title(f"Распределение {col}")
ax.set_ylabel("Частота")
plt.tight_layout()
plt.show()
# Проверка нормальности (Shapiro-Wilk тест)
from scipy import stats
for col in numerical_cols:
stat, p_value = stats.shapiro(df[col].dropna())
if p_value < 0.05:
print(f"{col}: распределение НЕ нормальное (p={p_value:.4f})")
3. Корреляционный анализ
# Корреляционная матрица
correlation_matrix = df[numerical_cols].corr()
# Визуализация
sns.heatmap(correlation_matrix, annot=True, cmap="coolwarm", center=0,
fmt=".2f", square=True, figsize=(10, 8))
plt.title("Матрица корреляций")
plt.show()
# Поиск сильных корреляций (>0.7)
strong_corr = []
for i in range(len(correlation_matrix.columns)):
for j in range(i+1, len(correlation_matrix.columns)):
if abs(correlation_matrix.iloc[i, j]) > 0.7:
strong_corr.append({
"var1": correlation_matrix.columns[i],
"var2": correlation_matrix.columns[j],
"correlation": correlation_matrix.iloc[i, j]
})
4. Поиск выбросов и аномалий
# Метод IQR (Interquartile Range)
def find_outliers_iqr(data, column):
Q1 = data[column].quantile(0.25)
Q3 = data[column].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
return data[(data[column] < lower_bound) | (data[column] > upper_bound)]
# Метод Z-score
from scipy.stats import zscore
z_scores = np.abs(zscore(df[numerical_cols].dropna()))
outliers_zscore = (z_scores > 3).any(axis=1)
# Изоляционный лес (Isolation Forest)
from sklearn.ensemble import IsolationForest
iso_forest = IsolationForest(contamination=0.05, random_state=42)
outlier_labels = iso_forest.fit_predict(df[numerical_cols])
outliers_count = (outlier_labels == -1).sum()
print(f"Найдено {outliers_count} выбросов ({outliers_count/len(df)*100:.2f}%)")
# Визуализация выбросов
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
for idx, col in enumerate(numerical_cols[:2]):
ax = axes[idx]
df.boxplot(column=col, ax=ax)
ax.set_title(f"Boxplot: {col}")
5. Категориальные признаки
# Распределение категориальных переменных
categorical_cols = df.select_dtypes(include=["object"]).columns
for col in categorical_cols:
print(f"\n{col}:")
print(df[col].value_counts())
# Визуализация
plt.figure(figsize=(10, 4))
df[col].value_counts().plot(kind="bar")
plt.title(f"Распределение {col}")
plt.xlabel(col)
plt.ylabel("Количество")
plt.show()
6. Выводы и гипотезы
Типичные выводы:
- Какие признаки имеют асимметричное распределение (skewness)
- Наличие мультимодальности в данных
- Выявленные сильные корреляции между признаками
- Процент пропущенных значений и стратегия их обработки
- Выявленные выбросы и их природа (ошибки или реальные аномалии)
- Рекомендации по предобработке (нормализация, логарифмирование, удаление признаков)
Гипотезы для дальнейшего анализа:
- Существует ли целевая переменная? (например, churn, default)
- Какие признаки наиболее предсказательны?
- Нужна ли балансировка классов (для классификации)?
- Какие признаки требуют трансформации?
Качественная EDA — основа успешного ML-проекта!