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와 전처리에 투자하는 것이 일반적입니다. “데이터 이해”에 투자한 시간만큼 모델링 단계에서 시행착오가 줄어듭니다.
체크리스트
다음 문서