탐색적 데이터분석 (EDA — Exploratory Data Analysis)

데이터셋의 주요 특성(패턴, 이상치, 분포)을 통계량과 시각화로 이해하는 분석 단계. 머신러닝 모델 적용 전 필수.

설명

EDA는 데이터와의 “첫 만남”으로, 모델 구축을 서두르지 않고 데이터를 깊이 이해하는 단계이다.

핵심 질문:

  • 데이터 크기는 얼마나 되나? (행·열 개수)
  • 자료형이 맞나? (정수 vs 실수 vs 범주형)
  • 결측치가 얼마나 있나?
  • 이상치가 있나?
  • 변수 간 관계는?
  • 분포의 특징은?

8-9단계 프로세스

단계 1-3: 데이터 로드 & 검사

import pandas as pd
 
df = pd.read_csv('data.csv')
df.shape           # (11914, 14) — 11,914행, 14개 컬럼
df.info()          # 자료형, 결측치 개수
df.describe().T    # 통계 요약 (평균, 표준편차, 사분위수)

단계 4-5: 데이터 정리

컬럼 정리:

  • 불필요한 컬럼 제거 (예: 인덱스, ID)
  • 컬럼명 표준화 (띄어쓰기 제거, 소문자 변환)
df = df.drop(['id', 'index'], axis=1)
df.columns = df.columns.str.lower().str.replace(' ', '_')

단계 6-7: 데이터 정제 (중복 & 결측치)

중복 제거:

df.duplicated().sum()        # 중복 행 개수 (예: 989개)
df = df.drop_duplicates()    # 제거

결측치 처리:

df.isnull().sum()            # 컬럼별 결측치 개수
# 선택 1: 삭제
df = df.dropna()
# 선택 2: 대체
df['age'].fillna(df['age'].mean(), inplace=True)

실제 사례: 11,914행 → 중복 제거(989) → 결측치 제거(99) → 11,825행

단계 8: 이상치 탐지 (Outlier Detection)

IQR 기법 (사분위간 거리):

Q1 = df[col].quantile(0.25)
Q3 = df[col].quantile(0.75)
IQR = Q3 - Q1
 
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
 
outliers = df[(df[col] < lower_bound) | (df[col] > upper_bound)]
# 또는 제거
df = df[(df[col] >= lower_bound) & (df[col] <= upper_bound)]

실제 사례: 약 1,600개 이상치 행 식별 및 제거 최종: 11,914 → 9,191행 (22% 정제)

단계 9: 시각화 및 관계 탐색

3계층 시각화 전략

1단계: 단변량 분석 (Univariate) — 개별 변수 분포

히스토그램 (범주형):

plt.hist(df[col], bins=20)
sns.histplot(df[col])

질문: 가장 흔한 카테고리는?

커널밀도플롯 (연속변수):

sns.kdeplot(df[col])

질문: 데이터가 어떤 분포 형태인가? (정규분포? 편향?)

박스플롯 (이상치):

sns.boxplot(y=df[col])

질문: 이상치가 시각적으로 보이나?

2단계: 이변량 분석 (Bivariate) — 두 변수 관계

산점도 (두 연속변수):

sns.scatterplot(data=df, x=col1, y=col2)

패턴: 우상향(양의 상관), 우하향(음의 상관), 분산(관계 없음)

바이올린플롯 (범주 vs 연속):

sns.violinplot(data=df, x=category, y=value)

질문: 카테고리 A vs B의 값 분포가 다른가?

쌍 플롯 (모든 변수 쌍):

sns.pairplot(df)

대각선: 히스토그램, 비대각선: 산점도

3단계: 다변량 분석 (Multivariate) — 모든 변수 간 관계

상관 히트맵:

sns.heatmap(df.corr(), annot=True, cmap='coolwarm')

색상:

  • 빨강: +1 (강한 양의 상관)
  • 파랑: -1 (강한 음의 상관)
  • 흰색: 0 (상관 없음)

배경 / 역사

EDA 개념은 John Tukey가 1970년대에 제안한 “탐색적 데이터분석(Exploratory Data Analysis)“에서 비롯되었다. 당시에는 시각화 도구가 없었지만, 현대에는 Python의 pandas, matplotlib, seaborn으로 쉽게 수행 가능하다.

역할 변화:

  • 1970s: 통계 분석의 첫 단계 (수작업)
  • 2010s: 빅데이터 시대 데이터 품질 검증
  • 2020s: AI/ML 전 필수 단계 (데이터 누수 방지, 편향 탐지)

실전 적용

pandas-dataframe 의 적용 사례

  • df.shape, df.info(): 데이터 검사
  • isnull().sum(), duplicated().sum(): 정제 대상 식별
  • corr(): 변수 간 상관 계산

matplotlib-seaborn 의 적용 사례

  • 히스토그램, 박스플롯: 단변량 시각화
  • 산점도, 바이올린플롯: 이변량 관계
  • 히트맵: 다변량 상관

ml-pipeline 과의 연관

  • EDA 후 필요한 전처리 결정 (스케일링, 인코딩)
  • 결측치 전략 선택 (삭제 vs 대체)
  • 이상치 처리 방식 결정

관련 개념

  • ml-pipeline — EDA 후 전처리·모델 단계
  • data-quality — 데이터 품질 검증 기준 (중복, 결측치 등)

소스