15장: 데이터 전처리
데이터 전처리는 머신러닝 모델을 구축하기 전에 데이터를 정리하고 변환하는 과정입니다. 이는 데이터의 품질을 높이고, 모델의 성능을 향상시키는 데 중요한 역할을 합니다. 이 장에서는 `pandas`와 `scikit-learn`을 사용하여 데이터를 전처리하는 방법에 대해 알아보겠습니다.
#### 15.1 결측값 처리
결측값은 데이터 분석과 모델링에 문제를 일으킬 수 있습니다. 결측값을 처리하는 방법에는 결측값을 대체하거나 제거하는 방법이 있습니다.
```python
import pandas as pd
import numpy as np
# 데이터프레임 생성
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'age': [25, np.nan, 35, 40],
'city': ['New York', 'Los Angeles', 'Chicago', None]
}
df = pd.DataFrame(data)
# 결측값 확인
print(df.isnull().sum())
# 결측값 대체 (평균값으로 대체)
df['age'].fillna(df['age'].mean(), inplace=True)
print(df)
# 결측값 제거
df.dropna(inplace=True)
print(df)
```
#### 15.2 이상값 처리
이상값(Outlier)은 데이터의 일반적인 패턴에서 벗어난 값을 의미합니다. 이상값을 처리하는 방법에는 이상값을 제거하거나 대체하는 방법이 있습니다.
```python
# 이상값 확인 (상자 그림)
import matplotlib.pyplot as plt
plt.boxplot(df['age'])
plt.show()
# 이상값 제거
df = df[(df['age'] >= df['age'].quantile(0.05)) & (df['age'] <= df['age'].quantile(0.95))]
print(df)
```
#### 15.3 데이터 스케일링
데이터 스케일링은 데이터의 크기를 조정하여 모델의 성능을 향상시키는 데 도움을 줍니다. `scikit-learn`의 `StandardScaler`를 사용하여 데이터를 표준화할 수 있습니다.
```python
from sklearn.preprocessing import StandardScaler
# 데이터프레임 생성
data = {
'age': [25, 30, 35, 40],
'salary': [50000, 60000, 70000, 80000]
}
df = pd.DataFrame(data)
# 스케일러 초기화 및 데이터 변환
scaler = StandardScaler()
scaled_data = scaler.fit_transform(df)
scaled_df = pd.DataFrame(scaled_data, columns=df.columns)
print(scaled_df)
```
#### 15.4 범주형 데이터 인코딩
범주형 데이터는 숫자로 변환해야 모델에 사용할 수 있습니다. `pandas`의 `get_dummies` 함수를 사용하여 원-핫 인코딩을 수행할 수 있습니다.
```python
# 데이터프레임 생성
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'city': ['New York', 'Los Angeles', 'Chicago', 'New York']
}
df = pd.DataFrame(data)
# 원-핫 인코딩
encoded_df = pd.get_dummies(df, columns=['city'])
print(encoded_df)
```
#### 15.5 특성 선택
특성 선택은 모델의 성능을 향상시키기 위해 중요한 특성을 선택하는 과정입니다. `scikit-learn`의 `SelectKBest`를 사용하여 특성을 선택할 수 있습니다.
```python
from sklearn.feature_selection import SelectKBest, f_classif
# 데이터프레임 생성
data = {
'age': [25, 30, 35, 40],
'salary': [50000, 60000, 70000, 80000],
'score': [0.8, 0.9, 0.7, 0.6]
}
df = pd.DataFrame(data)
X = df.drop(columns=['score'])
y = df['score']
# 특성 선택
selector = SelectKBest(score_func=f_classif, k=1)
X_new = selector.fit_transform(X, y)
print(X_new)
```
#### 15.6 데이터 분할
데이터를 훈련 데이터와 테스트 데이터로 분할하는 것은 모델의 성능을 평가하는 데 중요합니다. `train_test_split` 함수를 사용하여 데이터를 분할할 수 있습니다.
```python
from sklearn.model_selection import train_test_split
# 데이터프레임 생성
data = {
'age': [25, 30, 35, 40],
'salary': [50000, 60000, 70000, 80000],
'score': [0.8, 0.9, 0.7, 0.6]
}
df = pd.DataFrame(data)
X = df.drop(columns=['score'])
y = df['score']
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print(X_train)
print(X_test)
print(y_train)
print(y_test)
```
#### 15.7 파이프라인 사용
파이프라인(Pipeline)은 데이터 전처리와 모델 훈련 단계를 결합하여 처리하는 방법입니다. `scikit-learn`의 `Pipeline`을 사용하여 파이프라인을 구성할 수 있습니다.
```python
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
# 파이프라인 구성
pipeline = Pipeline([
('scaler', StandardScaler()),
('classifier', LogisticRegression())
])
# 파이프라인 훈련
pipeline.fit(X_train, y_train)
# 예측 및 평가
y_pred = pipeline.predict(X_test)
print(y_pred)
```
이상으로, 파이썬에서 데이터를 전처리하는 방법에 대해 알아보았습니다. 다음 장에서는 고급 데이터 시각화에 대해 더 자세히 알아보겠습니다. 질문이나 요청사항이 있으시면 댓글로 남겨주세요!
---
이 글의 내용은 GoalKicker.com의 Python Notes for Professionals 책을 참조하였습니다.
댓글
댓글 쓰기