Skip to main content

탐색적 데이터 분석 (EDA)

탐색적 데이터 분석(Exploratory Data Analysis)은 모델링에 앞서 데이터의 특성을 파악하고, 가설을 수립하며, 잠재적 문제를 발견하는 과정입니다.

학습 목표

  • pandas와 seaborn을 사용하여 체계적인 EDA를 수행할 수 있습니다.
  • 수치형/범주형 변수의 분포를 시각화하고 해석할 수 있습니다.
  • 변수 간 상관관계를 분석하고 다중공선성을 식별할 수 있습니다.

EDA 실습

1
데이터 기본 정보 확인
2
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# 데이터 로드
df = pd.read_csv("data/housing.csv")

# 기본 정보
print(f"데이터 크기: {df.shape}")          # (행, 열)
print(f"\n데이터 타입:\n{df.dtypes}")
print(f"\n결측치:\n{df.isnull().sum()}")
print(f"\n기술통계:\n{df.describe()}")

# 처음 5행 확인
df.head()
3
타겟 변수 분포 확인
4
# 회귀 문제: 타겟 변수의 분포
fig, axes = plt.subplots(1, 2, figsize=(12, 4))

# 히스토그램
sns.histplot(df["price"], bins=50, kde=True, ax=axes[0])
axes[0].set_title("주택 가격 분포")

# 박스플롯 (이상치 확인)
sns.boxplot(y=df["price"], ax=axes[1])
axes[1].set_title("주택 가격 박스플롯")
plt.tight_layout()
plt.show()

# 왜도(Skewness)와 첨도(Kurtosis)
print(f"왜도: {df['price'].skew():.2f}")  # 양수 = 오른쪽 꼬리
print(f"첨도: {df['price'].kurtosis():.2f}")
5
수치형 변수 분석
6
# 수치형 변수 분포 한번에 확인
numeric_cols = df.select_dtypes(include=[np.number]).columns
df[numeric_cols].hist(bins=30, figsize=(15, 10), layout=(3, 4))
plt.suptitle("수치형 변수 분포", y=1.02)
plt.tight_layout()
plt.show()
7
범주형 변수 분석
8
# 범주형 변수 빈도 확인
cat_cols = df.select_dtypes(include=["object", "category"]).columns

for col in cat_cols:
    print(f"\n{col} 고유값 수: {df[col].nunique()}")
    print(df[col].value_counts().head(10))

# 범주형 변수와 타겟의 관계
fig, axes = plt.subplots(1, len(cat_cols), figsize=(5*len(cat_cols), 4))
for i, col in enumerate(cat_cols):
    ax = axes[i] if len(cat_cols) > 1 else axes
    sns.boxplot(x=col, y="price", data=df, ax=ax)
    ax.set_title(f"{col} vs 가격")
    ax.tick_params(axis="x", rotation=45)
plt.tight_layout()
plt.show()
9
상관관계 분석
10
# 상관관계 히트맵
corr_matrix = df[numeric_cols].corr()

plt.figure(figsize=(10, 8))
sns.heatmap(
    corr_matrix,
    annot=True,
    cmap="coolwarm",
    center=0,
    fmt=".2f",
    square=True
)
plt.title("변수 간 상관관계")
plt.tight_layout()
plt.show()

# 타겟과의 상관관계 (절대값 기준 정렬)
target_corr = corr_matrix["price"].abs().sort_values(ascending=False)
print("타겟(price)과의 상관관계:")
print(target_corr)
11
산점도 매트릭스
12
# 주요 변수들의 산점도
top_features = target_corr.index[1:5]  # 상관관계 상위 4개
sns.pairplot(df[list(top_features) + ["price"]], diag_kind="kde")
plt.suptitle("주요 변수 산점도 매트릭스", y=1.02)
plt.show()

EDA 체크리스트 템플릿

def eda_summary(df, target_col=None):
    """EDA 요약 리포트를 생성합니다."""
    print("=" * 50)
    print("EDA 요약 리포트")
    print("=" * 50)

    # 기본 정보
    print(f"\n1. 데이터 크기: {df.shape[0]}행 x {df.shape[1]}열")

    # 결측치
    missing = df.isnull().sum()
    missing_pct = (missing / len(df) * 100).round(1)
    if missing.sum() > 0:
        print(f"\n2. 결측치 현황:")
        for col in missing[missing > 0].index:
            print(f"   - {col}: {missing[col]}건 ({missing_pct[col]}%)")
    else:
        print("\n2. 결측치: 없음")

    # 중복 행
    dup = df.duplicated().sum()
    print(f"\n3. 중복 행: {dup}건 ({dup/len(df)*100:.1f}%)")

    # 타겟 변수
    if target_col:
        print(f"\n4. 타겟 변수 ({target_col}):")
        print(f"   - 평균: {df[target_col].mean():.2f}")
        print(f"   - 표준편차: {df[target_col].std():.2f}")
        print(f"   - 왜도: {df[target_col].skew():.2f}")

# 사용 예시
# eda_summary(df, target_col="price")
프로젝트 초기에 전체 시간의 10-20%를 EDA에 투자하는 것이 적절합니다. 너무 적으면 데이터 문제를 놓치고, 너무 많으면 모델링에 시간이 부족합니다. 핵심은 데이터의 구조와 문제점을 빠르게 파악하는 것입니다.
EDA에서 발견한 패턴은 특성 공학의 아이디어로, 이상치와 결측치 정보는 데이터 정제 전략으로, 상관관계 분석은 특성 선택의 근거로 활용됩니다. 각각 특성 공학, 데이터 정제, 특성 선택 문서를 참고하세요.

체크리스트

  • pandas로 데이터 기본 정보를 확인할 수 있다
  • seaborn으로 분포와 상관관계를 시각화할 수 있다
  • 결측치와 이상치를 식별할 수 있다
  • 타겟 변수와 특성 변수의 관계를 분석할 수 있다

다음 문서