데이터를 다루는 과정에서 데이터 전처리는 매우 중요한 단계입니다. 이 글에서는 Pandas를 사용하여 데이터를 효과적으로 정제하고 변환하는 핵심 기법들을 살펴보겠습니다.
1. 결측치 처리 전략
결측치는 데이터 분석에 심각한 영향을 미칠 수 있습니다. Pandas에서는 다양한 방법으로 결측치를 처리할 수 있습니다.
1.1 결측치 확인 및 개수 파악
import pandas as pd
import numpy as np
# 결측치 확인
print(df.isnull().sum())
# 결측치 비율 계산
print(df.isnull().mean() * 100)
1.2 결측치 처리 방법
# 1. 결측치 제거
df_cleaned = df.dropna()
# 2. 평균값으로 대체
df['column'] = df['column'].fillna(df['column'].mean())
# 3. 중앙값으로 대체
df['column'] = df['column'].fillna(df['column'].median())
# 4. 특정 값으로 대체
df['column'] = df['column'].fillna(0)
# 5. 앞/뒤 값으로 대체
df['column'] = df['column'].fillna(method='ffill') # 앞쪽 값
df['column'] = df['column'].fillna(method='bfill') # 뒤쪽 값
주의사항
- 도메인 지식을 고려하여 결측치 처리 방법 선택
- 결측치 제거 시 데이터 손실 가능성 고려
- 머신러닝 모델에 따라 결측치 처리 전략 조정
2. 중복 데이터 제거
# 전체 중복 행 제거
df_unique = df.drop_duplicates()
# 특정 열 기준 중복 제거
df_unique = df.drop_duplicates(subset=['name', 'age'])
# 첫 번째 또는 마지막 중복 항목 유지
df_unique = df.drop_duplicates(keep='first') # 첫 번째 항목 유지
df_unique = df.drop_duplicates(keep='last') # 마지막 항목 유지
3. 이상치 탐지 및 처리
3.1 통계적 방법을 활용한 이상치 탐지
# IQR 방법을 사용한 이상치 탐지
Q1 = df['column'].quantile(0.25)
Q3 = df['column'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 이상치 필터링
outliers = df[(df['column'] < lower_bound) | (df['column'] > upper_bound)]
3.2 이상치 처리 방법
# 1. 이상치 제거
df_clean = df[(df['column'] >= lower_bound) & (df['column'] <= upper_bound)]
# 2. 이상치 대체
def cap_outliers(value):
if value < lower_bound:
return lower_bound
elif value > upper_bound:
return upper_bound
return value
df['column'] = df['column'].apply(cap_outliers)
4. 데이터 변환: apply, map 활용
4.1 apply 메서드
# 사용자 정의 함수 적용
def convert_age_group(age):
if age < 20:
return '청소년'
elif age < 40:
return '청년'
elif age < 60:
return '중년'
else:
return '노년'
df['age_group'] = df['age'].apply(convert_age_group)
# 람다 함수 사용
df['log_salary'] = df['salary'].apply(lambda x: np.log(x))
4.2 map 메서드
# 값 매핑
gender_map = {'M': '남성', 'F': '여성'}
df['gender_kr'] = df['gender'].map(gender_map)
# 딕셔너리를 사용한 변환
city_population = {'Seoul': 9776000, 'Busan': 3448000}
df['city_population'] = df['city'].map(city_population)
주의사항 및 모범 사례
- 데이터 전처리 전 항상 데이터의 복사본 생성
- 도메인 지식을 활용한 결측치 및 이상치 처리
- 전처리 과정 문서화 및 재현 가능성 확보
- 전처리 함수 모듈화 및 재사용성 고려
결론
Pandas의 강력한 데이터 조작 기능을 활용하면 효과적이고 정확한 데이터 전처리가 가능합니다. 각 데이터셋의 특성과 분석 목적에 맞는 적절한 전처리 기법을 선택하는 것이 중요합니다.
답글 남기기