Skip to main content

EDA 프로세스

EDA를 체계적으로 수행하면 중요한 패턴을 놓치지 않고, 분석 결과를 명확하게 전달할 수 있습니다. 이 문서에서는 데이터 로드부터 인사이트 보고까지의 전체 절차를 단계별로 안내합니다.

학습 목표

  • EDA의 전체 워크플로우를 설명할 수 있다
  • 각 단계에서 적절한 질문을 설계할 수 있다
  • 데이터 품질 점검 체크리스트를 실행할 수 있다
  • 분석 결과를 구조화된 보고서로 정리할 수 있다

왜 중요한가

“모델 성능의 80%는 데이터 품질이 결정한다”는 격언처럼, EDA는 ML 프로젝트의 성패를 좌우합니다. 체계적인 EDA 없이 모델링에 들어가면, 데이터 품질 문제가 모델 성능 저하로 이어집니다.

Step 1: 데이터 로드와 첫인상

import pandas as pd
import numpy as np

# 데이터 로드
df = pd.read_csv('employee_data.csv')

# 1-1. 기본 구조 파악
print(f"행 x 열: {df.shape}")
print(f"\n컬럼 목록:")
print(df.dtypes)

# 1-2. 처음 5행 확인
print(df.head())

# 1-3. 기본 정보
df.info()
info()는 컬럼별 non-null 개수, dtype, 메모리 사용량을 한 번에 보여줍니다. 결측치가 있는 컬럼을 빠르게 식별할 수 있습니다.

Step 2: 데이터 품질 점검

# 2-1. 결측치 현황
missing = df.isnull().sum()
missing_pct = (missing / len(df) * 100).round(1)
missing_report = pd.DataFrame({
    'missing_count': missing,
    'missing_pct': missing_pct
}).query('missing_count > 0').sort_values('missing_pct', ascending=False)
print("결측치 현황:")
print(missing_report)

# 2-2. 중복 행 확인
duplicates = df.duplicated().sum()
print(f"\n중복 행: {duplicates}개 ({duplicates/len(df)*100:.1f}%)")

# 2-3. 데이터 타입 확인
print(f"\n수치형 컬럼: {df.select_dtypes(include='number').columns.tolist()}")
print(f"범주형 컬럼: {df.select_dtypes(include='object').columns.tolist()}")

# 2-4. 고유값 개수 확인
for col in df.select_dtypes(include='object').columns:
    print(f"  {col}: {df[col].nunique()}개 고유값")

품질 점검 체크리스트

항목확인 방법주의 사항
결측치isnull().sum()비율 5% 미만이면 삭제 고려
중복 행duplicated().sum()의도적 중복인지 확인
데이터 타입dtypes숫자가 문자열로 저장된 경우
이상한 값describe(), value_counts()음수 나이, 미래 날짜 등
일관성nunique()”Male”/“male”/“M” 혼재

Step 3: 기술통계 요약

# 3-1. 수치형 변수 요약
print(df.describe())

# 3-2. 범주형 변수 요약
print(df.describe(include='object'))

# 3-3. 왜도와 첨도 확인
numeric_cols = df.select_dtypes(include='number').columns
skew_report = pd.DataFrame({
    'skewness': df[numeric_cols].skew(),
    'kurtosis': df[numeric_cols].kurtosis()
}).round(2)
print("\n왜도/첨도:")
print(skew_report)

Step 4: 질문 설계

EDA는 질문 중심의 과정입니다. 좋은 질문이 좋은 인사이트를 이끌어 냅니다.
# 질문 설계 프레임워크
questions = {
    '분포': [
        '각 변수의 분포는 어떤 형태인가?',
        '이상치는 있는가? 얼마나 극단적인가?',
    ],
    '관계': [
        '타겟 변수와 가장 상관이 높은 피처는?',
        '피처 간 다중공선성이 있는가?',
    ],
    '그룹 비교': [
        '범주별로 타겟 변수의 분포가 다른가?',
        '그룹 간 차이가 통계적으로 유의미한가?',
    ],
    '시간': [
        '시간에 따른 트렌드가 있는가?',
        '계절성(주기적 패턴)이 있는가?',
    ]
}

for category, q_list in questions.items():
    print(f"\n[{category}]")
    for q in q_list:
        print(f"  - {q}")

Step 5: 분석 실행

import matplotlib.pyplot as plt
import seaborn as sns

# 예시 데이터
np.random.seed(42)
df = pd.DataFrame({
    'salary': np.random.normal(4500, 800, 200),
    'experience': np.random.uniform(1, 20, 200),
    'performance': np.random.normal(75, 10, 200),
    'department': np.random.choice(['개발', '영업', '마케팅'], 200),
    'turnover': np.random.choice([0, 1], 200, p=[0.8, 0.2])
})

# 5-1. 단변량 분석 (분포 확인)
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
for ax, col in zip(axes, ['salary', 'experience', 'performance']):
    sns.histplot(df[col], kde=True, ax=ax, color='#4a9eca')
    ax.set_title(f'{col} 분포')
plt.tight_layout()
plt.show()

# 5-2. 이변량 분석 (상관관계)
fig, ax = plt.subplots(figsize=(8, 6))
sns.heatmap(df[['salary', 'experience', 'performance']].corr(),
            annot=True, fmt='.2f', cmap='RdBu_r', center=0, ax=ax)
ax.set_title('상관 행렬')
plt.tight_layout()
plt.show()

# 5-3. 그룹 비교
fig, ax = plt.subplots(figsize=(8, 5))
sns.boxplot(data=df, x='department', y='salary', ax=ax, palette='Set2')
ax.set_title('부서별 연봉 분포')
plt.tight_layout()
plt.show()

Step 6: 인사이트 정리

# 분석 결과를 구조화된 형태로 정리
insights = """
## EDA 인사이트 요약

### 1. 데이터 개요
- 200명의 직원 데이터, 5개 변수
- 결측치 없음, 중복 행 없음

### 2. 주요 발견
- 연봉 분포: 정규분포에 가까움 (왜도 0.1)
- 경력-연봉: 양의 상관관계 (r=0.67)
- 부서별 연봉 차이: 통계적으로 유의미하지 않음

### 3. 전처리 제안
- performance 컬럼: 일부 이상치 처리 필요
- department: One-Hot Encoding 적용

### 4. 추가 분석 필요
- 이직 여부와 각 변수의 관계 심층 분석
- 시간대별 데이터 수집 여부 확인
"""
print(insights)
인사이트는 “무엇을 발견했는가”와 “어떤 액션이 필요한가”를 분리하여 정리하세요. 비즈니스 맥락에서의 의미를 함께 설명하면 더 효과적입니다.

AI/ML에서의 활용

  • 피처 선택 근거: EDA에서 발견한 상관관계와 분포 특성이 피처 선택의 근거가 됩니다
  • 전처리 전략: 분포의 형태, 결측 패턴, 이상치 특성에 따라 전처리 방법을 결정합니다
  • 모델 선택 힌트: 비선형 관계가 발견되면 트리 기반 모델을, 선형 관계면 선형 모델을 우선 고려합니다
  • 데이터 수집 개선: EDA 과정에서 발견한 데이터 품질 문제를 데이터 수집 단계에 피드백합니다
전체 프로젝트 시간의 30~50%를 EDA와 전처리에 투자하는 것이 일반적입니다. “데이터 이해”에 투자한 시간만큼 모델링 단계에서 시행착오가 줄어듭니다.

체크리스트

  • 데이터 로드 후 shape, dtypes, info()를 확인할 수 있다
  • 결측치, 중복, 데이터 타입 문제를 점검할 수 있다
  • 분석 질문을 체계적으로 설계할 수 있다
  • 분석 결과를 구조화된 보고서로 정리할 수 있다

다음 문서