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 책을 참조하였습니다.

댓글