본문 바로가기
Python/Machine Learning

데이터 전처리 실습

by 좌우지간에 2024. 12. 15.

데이터 전처리 실습

안녕하세요! 오늘은 데이터 전처리에 대해 실습을 통해 배우고, 실무에서 자주 사용하는 몇 가지 중요한 기법들을 소개하려고 합니다.
데이터 전처리는 데이터를 깨끗하고 유용하게 만들어서, 이후 분석이나 머신러닝 모델 학습에 적합하게 만드는 과정입니다. 이 과정이 잘못되면 모델 성능이 떨어지거나, 잘못된 결론을 도출할 수 있기 때문에 매우 중요합니다.

 


1. 데이터 프레임 생성 및 결측값 처리

먼저, pandas에서 데이터를 어떻게 다루는지 알아봅니다. 데이터 전처리를 할 때는 데이터를 DataFrame 형식으로 다루는데, DataFrame은 pandas에서 데이터를 표 형태로 관리하는 구조입니다.

결측값 처리

데이터 분석에서 결측값은 자주 마주하는 문제입니다. 결측값은 누락된 데이터를 의미하는데, 이를 처리하는 방법을 배워봅시다.

import pandas as pd
import numpy as np

# 데이터 생성
data = {
    '이름': ['홍길동', '김철수', '이영희', None, '박민수'],
    '나이': [25, 30, 22, 28, np.nan],
    '직업': ['학생', '디자이너', None, '개발자', '선생님']
}

# DataFrame 생성
df = pd.DataFrame(data)

# 결측값 제거
df_cleaned = df.dropna()  # NaN이 있는 행을 모두 제거

print(df_cleaned)

결과:

    이름   나이      직업
1  김철수  30.0   디자이너
4  박민수   NaN   선생님

dropna() 함수는 결측값이 포함된 행을 삭제합니다. 하지만 모든 결측값을 제거하면 데이터 손실이 커질 수 있습니다. 그래서 적절한 대체 방법을 사용해야 합니다.


2. 결측값 대체

결측값을 단순히 제거하기보다는 적절한 값으로 대체하는 것이 더 나은 경우가 많습니다. 예를 들어, 숫자형 데이터는 평균값이나 중앙값으로, 범주형 데이터는 최빈값으로 대체할 수 있습니다.

# 결측값을 0으로 대체
df_filled = df.fillna(0)

print(df_filled)

결과:

    이름   나이      직업
0  홍길동  25.0    학생
1  김철수  30.0  디자이너
2  이영희  22.0     0
3   0     28.0   개발자
4  박민수  0.0   선생님

위 코드에서는 **fillna(0)**로 결측값을 0으로 대체했습니다. 이 방법은 숫자형 컬럼에만 적용 가능합니다. 문자형 데이터는 대체할 수 있는 적절한 값을 찾아야 합니다.


3. 이상치 처리 (Outlier Handling)

이상치란 데이터에서 매우 크거나 작은 값들로, 분석 결과에 왜곡을 줄 수 있습니다. 이상치를 확인하고 처리하는 방법을 알아보겠습니다. 이상치는 주로 IQR(Interquartile Range) 방법으로 처리합니다.

# 이상치 탐지: IQR 방법
q1 = df['나이'].quantile(0.25)  # 25% 지점
q3 = df['나이'].quantile(0.75)  # 75% 지점
iqr = q3 - q1  # IQR

lower_bound = q1 - 1.5 * iqr  # 하한
upper_bound = q3 + 1.5 * iqr  # 상한

print(f"하한: {lower_bound}, 상한: {upper_bound}")

위 코드에서는 quantile() 함수로 Q1Q3 값을 구하고, 이를 이용해 IQR을 계산한 뒤, 이상치의 상한과 하한을 구했습니다. 이 범위를 벗어나는 값은 이상치로 간주하여 제거하거나 대체할 수 있습니다.


4. 데이터 타입 변환 (Type Conversion)

때때로 데이터의 타입이 맞지 않아 오류가 발생할 수 있습니다. 이때는 astype() 함수로 타입을 변환할 수 있습니다.

# '나이' 컬럼을 정수형으로 변환
df['나이'] = df['나이'].astype('Int64')

print(df)

위 코드는 **astype()**을 사용하여 나이 컬럼의 데이터를 정수형으로 변환하는 예시입니다. 이처럼 데이터 타입을 적절히 변환하는 것도 데이터 전처리에서 중요한 부분입니다.


5. 범주형 데이터를 수치형으로 변환 (One-Hot Encoding)

머신러닝에서 범주형 데이터를 다룰 때는 수치형 데이터로 변환해야 합니다. 이를 원-핫 인코딩(One-Hot Encoding)이라고 합니다.

# '직업' 컬럼을 원-핫 인코딩으로 변환
df_encoded = pd.get_dummies(df, columns=['직업'])

print(df_encoded)

이 코드에서는 get_dummies()를 사용하여 직업 컬럼을 원-핫 인코딩으로 변환했습니다. 원-핫 인코딩을 통해 범주형 변수들이 각각의 열로 변환되어 0 또는 1로 표시됩니다.


6. 중복 데이터 제거

데이터셋에 중복된 데이터가 있을 경우 분석 결과에 영향을 미칠 수 있습니다. 이럴 때는 drop_duplicates() 함수를 사용하여 중복된 데이터를 제거합니다.

# 중복 데이터 제거
df_unique = df.drop_duplicates()

print(df_unique)

이 함수는 데이터프레임에서 중복된 행을 제거하고, 고유한 데이터만 남깁니다.


7. 새로운 특성 생성

데이터에서 추가적인 정보를 추출해 새로운 특성을 만들 수 있습니다. 예를 들어, 나이와 직업 정보를 바탕으로 새로운 특성을 생성할 수 있습니다.

# 새로운 특성 생성
df['나이_직업'] = df['나이'].astype(str) + '_' + df['직업']

print(df)

이 코드는 나이와 직업 컬럼을 결합하여 새로운 나이_직업 컬럼을 생성합니다. 새로운 특성 생성은 모델 성능 향상에 중요한 역할을 할 수 있습니다.


결론

데이터 전처리는 머신러닝의 성능을 결정짓는 중요한 단계입니다. 위에서 소개한 결측값 처리, 이상치 처리, 데이터 타입 변환, 원-핫 인코딩 등은 실제 분석 및 모델링 과정에서 자주 사용되는 기법들입니다. 이 기법들을 이해하고 잘 활용하면 데이터 분석 및 모델 성능을 크게 향상시킬 수 있습니다.

데이터 전처리를 제대로 하지 않으면 모델 성능이 크게 떨어질 수 있기 때문에, 데이터 전처리 단계에서 충분한 시간과 노력을 들여야 합니다.