효과적인 분석을 위한 데이터 전처리 기법과 파이썬 코드
결측치 처리부터 PCA를 이용한 특성 추출까지, 데이터 분석의 성공을 좌우하는 전처리 기법을 상세히 알아봅니다. 실제 코드 예시와 함께 각 방법의 장단점을 비교하여 최적의 전처리 전략을 수립하세요.
Mar 03, 2025

데이터 전처리는 분석의 정확성과 효율성을 높이는 중요한 단계입니다. 주요 데이터 전처리 방법과 그에 해당하는 파이썬 코드를 소개해드리겠습니다.
1. 결측값 처리
결측값은 데이터의 품질을 저하시키므로 적절히 처리해야 합니다.
제거 방법
- 행 제거: 결측치가 포함된 행을 모두 제거합니다. 간단하지만 많은 데이터를 잃을 수 있습니다.
- 열 제거: 결측치가 많은 열을 제거합니다. 모델을 단순화할 수 있지만 중요한 정보를 잃을 수 있습니다.
대체 방법
- 평균값 대체: 결측치를 해당 열의 평균값으로 대체합니다.
pythonimport pandas as pd
import numpy as np
df = pd.DataFrame({'A': [1, 2, np.nan, 4, 5]})
df['A'].fillna(df['A'].mean(), inplace=True)
pythonfrom sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='mean')
df_imputed = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)
- 중앙값 대체: 결측치를 해당 열의 중앙값으로 대체합니다.
pythondf['A'].fillna(df['A'].median(), inplace=True)
- 최빈값 대체: 결측치를 해당 열의 최빈값으로 대체합니다.
pythondf['A'].fillna(df['A'].mode()[0], inplace=True)
- 예측 모델 대체: 머신러닝 모델을 사용해 결측치를 예측합니다. 높은 정확도를 얻을 수 있지만 복잡하고 계산 비용이 높습니다.
- 원리:
- 결측이 없는 다른 변수들을 사용하여 결측치가 있는 변수를 예측하는 모델을 만듭니다.
- 예를 들어, 회귀 모델이나 분류 모델을 사용하여 결측값을 예측합니다.
- 장점:
- 높은 정확도의 대체값을 얻을 수 있습니다.
- 데이터의 패턴과 관계를 유지하면서 결측치를 채울 수 있습니다.
- 단점:
- 복잡성과 계산 비용이 높습니다.
- 모델을 만들어야 하기 때문에 다른 결측치 처리 방법에 비해 시간이 오래 소요됩니다.
- 사용 조건:
- 결측이 소수 컬럼에 쏠리면 안 됩니다. 예를 들어, 결측 비율이 60% 이상인 경우 사용하기 어렵습니다.
- 특징 간에 상관관계가 존재해야 합니다.
- 구현 방법:
- KNN(K-Nearest Neighbors) 알고리즘을 사용한 KNNImputer
- 이 방법은 결측이 아닌 값만 사용하여 이웃을 구한 뒤, 이웃들의 값의 대표값으로 결측을 대체합니다.
- 이웃 : 결측이 아닌 값이 유사한 데이터들을 뜻함.
- 대표값 : 평균이나 중앙값 등
from sklearn.impute import KNNImputer
imputer = KNNImputer(n_neighbors=5)
X_imputed = imputer.fit_transform(X)
fit_transform()
메서드
fit_transform()
메서드는 Scikit-learn에서 제공하는 데이터 전처리 메서드로, fit()
과 transform()
을 한 번에 수행하는 역할을 합니다. 이를 통해 데이터를 학습하고 변환 과정을 간소화할 수 있습니다.fit_transform()
의 동작 원리
fit()
:- 데이터를 학습하여 변환을 위한 설정값(예: 평균, 표준편차, 최소값/최대값 등)을 계산합니다.
- 예를 들어,
SimpleImputer
에서는 결측치를 대체하기 위한 값을 계산하거나,StandardScaler
에서는 평균과 표준편차를 계산합니다.
transform()
:fit()
에서 계산된 설정값을 사용하여 데이터를 변환합니다.- 예를 들어, 결측치를 계산된 값으로 대체하거나, 데이터를 표준화(평균 0, 표준편차 1)합니다.
fit_transform()
:- 위 두 과정을 한 번에 수행합니다.
- 즉, 데이터를 학습(
fit()
)하고 변환(transform()
)하여 결과를 반환합니다.
2. 데이터 정규화
데이터 정규화 목적
- 데이터를 일정한 범위로 변환하여 머신러닝 모델의 성능을 향상
- Min-Max 정규화 : 회귀분석시 독립변수들의 단위를 통일하여 회귀계수의 영향력 정확히 비교 가능
- Z-score 정규화(표준화) : 각 데이터가 평균에서 얼마나 떨어져 있는지 비교
Min-Max 정규화
pythonfrom sklearn.preprocessing import MinMaxScaler
# MinMaxScaler() 클래스로 scaler 인스턴스(객체) 생성
scaler = MinMaxScaler()
# scaler에서 fit_transform 메소드 호출하여 새로운 데이터프레임에 정규화된 데이터 저장
df_normalized = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)
Z-score 정규화(표준화)
pythonfrom sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df_standardized = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)
3. 이상치 제거
이상치는 분석 결과를 왜곡시킬 수 있으므로 제거해야 합니다. 하지만 분석 분야에 따라 이상치 처리 범위는 달라질 수 있습니다. 이상치가 분석에 중요한 역할을 할 수도 있습니다.
IQR 방법을 이용한 이상치 제거
pythonQ1 = df['A'].quantile(0.25)
Q3 = df['A'].quantile(0.75)
IQR = Q3 - Q1
df_no_outliers = df[(df['A'] >= Q1 - 1.5*IQR) & (df['A'] <= Q3 + 1.5*IQR)]
4. 범주형 변수의 인코딩
머신러닝 알고리즘은 주로 숫자 데이터를 다루므로 범주형 변수를 숫자로 변환해야 합니다.
One-Hot 인코딩
각 범주를 이진 벡터로 변환합니다. 순서가 없는 범주형 변수에 적합합니다.
pythondf_encoded = pd.get_dummies(df, columns=['category_column'])

Label 인코딩
각 범주에 고유한 정수를 할당합니다. 순서가 있는 범주형 변수에 적합합니다.
pythonfrom sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['category_column_encoded'] = le.fit_transform(df['category_column'])


5. 특성 선택 및 추출
모델의 성능을 높이기 위해 중요한 특성을 선택하거나 새로운 특성을 만듭니다.
상관관계를 이용한 특성 선택
# 상관관계가 0.7 초과인 특성만 마스킹
pythoncorrelation_matrix = df.corr()
high_corr_features = correlation_matrix[correlation_matrix > 0.7].index
# 예시 출력 결과
상관관계 행렬:
A B C D
A 1.000000 0.803686 0.901910 0.074764
B 0.803686 1.000000 0.724050 -0.057347
C 0.901910 0.724050 1.000000 0.065203
D 0.074764 -0.057347 0.065203 1.000000
0.7 이상의 높은 상관관계를 가진 특성:
Index(['A', 'B', 'C'], dtype='object')
PCA를 이용한 특성 추출
데이터의 차원을 줄이면서 중요한 정보를 유지합니다. 차원을 줄이는 과정에서 데이터의 분포인 분산을 최대한 보존하는 축을 찾고 이 축을 기준으로 새로운 변수를 추출하는 방식. PCA만으로 하나의 글을 쓸 수 있기 때문에 이번 글에서는 이런 방식이 있구나 정도로 기록합니다.
pythonfrom sklearn.decomposition import PCA
pca = PCA(n_components=2)
df_pca = pd.DataFrame(pca.fit_transform(df), columns=['PC1', 'PC2'])
# PC1, PC2 2개의 컴포넌트만 있어도 설명력이 95% 가량 된다고 함.
이러한 데이터 전처리 기법들을 적절히 조합하여 사용하면, 더 정확하고 효과적인 데이터 분석이 가능해집니다. 데이터의 특성과 분석 목적에 따라 적합한 전처리 방법을 선택하는 것이 중요합니다.
Share article