← Назад к вопросам

EDA: Исследовательский анализ данных

1.0 Junior🔥 261 комментариев
#Pandas и обработка данных#Python

Условие

Вам дан датасет с данными о клиентах банка.

Проведите EDA:

  1. Описательная статистика
  2. Распределения признаков
  3. Корреляционный анализ
  4. Поиск выбросов и аномалий
  5. Визуализации
  6. Выводы и гипотезы

Комментарии (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-проекта!