데이터 전처리

2star_·2024년 10월 17일
0

ML/DL

목록 보기
4/18

데이터 전처리 요약

데이터 전처리설명
결측값 처리데이터셋에서 누락된 값을 처리하는 작업
이상값 처리데이터셋에서 비정상적으로 큰 값이나 작은 값을 처리하는 작업
중복 데이터 제거동일한 데이터가 여러 번 나타나는 경우 이를 제거
데이터 타입 변환데이터의 타입을 적절하게 변환하는 작업
데이터 정규화데이터의 범위를 일정하게 맞추는 작업
인코딩범주형 데이터를 수치형 데이터로 변환
샘플링데이터셋의 크기를 줄이거나 늘리는 작업
특성 선택 및 추출모델 성능을 높이기 위해 중요한 특징을 선택하거나 새로운 특징을 추출

<출처 : 스파르타코딩클럽>


01. 결측값 처리

설명: 데이터셋에 누락된 값이 있는 경우 해당 값을 처리해야 분석이 가능해진다. 결측값은 평균값이나 중앙값으로 대체하거나, 해당 행을 삭제할 수 있다.

예시

import pandas as pd
# 결측값이 포함된 데이터프레임
df = pd.DataFrame({'A': [1, 2, None, 4], 'B': [5, None, 7, 8]})
# 결측값을 열의 평균값으로 대체
df.fillna(df.mean(), inplace=True)
print(df)

결과값

A    B
1.0  5.0
2.0  6.666667
2.333333  7.0
4.0  8.0

02. 이상값 처리

설명: 데이터셋에 비정상적으로 큰 값이나 작은 값이 존재할 경우, 분석 결과에 악영향을 미칠 수 있다. 이상값을 처리해야 한다.

예시

import numpy as np
# 이상값이 포함된 데이터 리스트
data = [10, 12, 13, 120, 14, 15, 130]  # 이상값 120, 130 포함
# 1사분위수(Q1) 계산
q1 = np.percentile(data, 25)
# 3사분위수(Q3) 계산
q3 = np.percentile(data, 75)
# 사분위 범위(IQR) 계산
iqr = q3 - q1
# 이상값을 감지하는 하한선과 상한선 설정
lower_bound = q1 - (1.5 * iqr)
upper_bound = q3 + (1.5 * iqr)
# 하한선과 상한선을 벗어난 값을 필터링하여 이상값 제거
filtered_data = [x for x in data if x >= lower_bound and x <= upper_bound]
# 이상값이 제거된 데이터 출력
print(filtered_data)

결과값

[10, 12, 13, 14, 15]

03. 중복 데이터 제거

설명 : 동일한 데이터가 여러 번 등장하는 경우 이를 제거해야 한다.

예시

import pandas as pd
# 중복된 데이터가 포함된 데이터프레임 생성
df = pd.DataFrame({'A': [1, 2, 2, 4], 'B': [5, 6, 6, 8]})
# 중복된 행 제거
df.drop_duplicates(inplace=True)
print(df)

결과값

A  B
1  5
2  6
4  8

04. 데이터 타입 변환

설명 : 데이터의 타입이 적절하지 않을 경우, 올바르게 변환해야 머신러닝 모델에서 제대로 처리할 수 있다.

예시

import pandas as pd
# 데이터프레임의 열을 실수형으로 변환
df['A'] = df['A'].astype(float)
print(df.dtypes)

05. 데이터 정규화

설명: 데이터의 범위가 제각각이면 모델 학습에 어려움을 줄 수 있다. 정규화를 통해 데이터를 일정한 범위로 맞춘다.

예시

from sklearn.preprocessing import MinMaxScaler
# MinMaxScaler를 사용하여 데이터의 범위를 0과 1 사이로 변환
scaler = MinMaxScaler()
# 정규화할 데이터 (각 요소는 [특징1, 특징2] 형태)
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
# 데이터를 정규화
scaled_data = scaler.fit_transform(data)
print(scaled_data)

결과값

[[0.   0.   ]
 [0.25 0.25]
 [0.5  0.5 ]
 [1.   1.   ]]

06.1 인코딩

설명: 범주형 데이터를 수치형 데이터로 변환하는 작업입니다. 원-핫 인코딩이 자주 사용된다.

예시

from sklearn.preprocessing import OneHotEncoder
# OneHotEncoder 객체 생성 (sparse=False로 희소 행렬이 아닌 일반 배열 반환)
encoder = OneHotEncoder(sparse=False)
# 인코딩할 범주형 데이터
data = [['red'], ['green'], ['blue']]
# 범주형 데이터를 원-핫 인코딩으로 변환
encoded_data = encoder.fit_transform(data)
print(encoded_data)

결과값

[[0. 0. 1.]
 [0. 1. 0.]
 [1. 0. 0.]]

06.2 원-핫 인코딩의 다중공선성 피하기

다중공선성이란?

다중공선성(multicollinearity)은 변수들 사이에 강한 상관관계가 있을 때 발생하는 문제다. 모델이 독립 변수(피처)들 간의 관계를 제대로 학습하지 못하게 되어 정확한 해석이나 예측이 어려워진다.

원-핫 인코딩을 할 때, 모든 범주를 변수로 추가하면 이 변수들은 서로 완벽하게 상관관계를 가지게 됩니다. 예를 들어, 위의 '빨강', '파랑', '초록'을 모두 변수로 사용할 경우, 만약 두 개의 값이 0이라면 자동으로 나머지 하나는 1이 됩니다. 이는 완전한 선형 종속성을 나타내기 때문에 다중공선성 문제가 발생할 수 있다.

마지막 변수를 제거함으로써 모델이 다중공선성 문제를 피할 수 있다. 남은 변수를 기준으로 제거된 범주에 대해 자동으로 계산하게 된다. 즉 마지막 범주를 제거해도 정보 손실 없이 나머지 두 변수만으로 세 가지 범주를 모두 설명할 수 있다.

예시

from sklearn.preprocessing import OneHotEncoder

# OneHotEncoder 객체 생성 (sparse=False, drop='first'로 첫 번째 범주 제거)
encoder = OneHotEncoder(sparse=False, drop='first')

# 인코딩할 범주형 데이터 (색깔)
data = [['red'], ['green'], ['blue']]

# 범주형 데이터를 원-핫 인코딩으로 변환 (첫 번째 범주 제거)
encoded_data = encoder.fit_transform(data)

# 인코딩된 데이터 출력
print("첫 번째 범주를 제거한 원-핫 인코딩 데이터:")
print(encoded_data)

결과값

첫 번째 범주를 제거한 원-핫 인코딩 데이터:
[[0. 0.]
 [1. 0.]
 [0. 1.]]

07. 샘플링

설명: 데이터셋의 크기를 줄이거나 늘리는 작업. 샘플링은 데이터의 크기를 조정할 때 유용.

예시

import pandas as pd
# 샘플링할 데이터프레임 생성
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [5, 6, 7, 8, 9]})
# 임의로 2개의 샘플을 추출
sampled_df = df.sample(n=2)
# 샘플링된 데이터 출력
print(sampled_df)

08. 특성 선택 및 추출

설명: 모델의 성능을 높이기 위해 중요한 특징을 선택. 새로운 특징을 추출하는 작업.

예시

from sklearn.feature_selection import SelectKBest, f_classif
import pandas as pd

# 데이터 생성 (X는 특징, y는 결과 레이블)
# X: 학생들의 시험 점수 (국어, 수학, 과학)
X = [[80, 85, 78], 
     [90, 88, 85], 
     [70, 92, 88], 
     [85, 80, 91]]

# y: 학생이 대학에 합격(1) 또는 불합격(0) 여부
y = [1, 1, 0, 1]

# 가장 중요한 2개의 특징을 선택하는 SelectKBest 객체 생성
# f_classif: 분류 문제에 적합한 통계 방법을 사용, 서로 다른 그룹 간에 평균 차이가 있는지를 검정하는 통계적 방법
selector = SelectKBest(score_func=f_classif, k=2)

# 특징 선택 수행
X_new = selector.fit_transform(X, y)

# 선택된 두 개의 중요한 특징 출력
print("선택된 특징:")
print(X_new)

# 선택된 각 특징의 중요도(ANOVA F-값) 확인
scores = selector.scores_
print("각 특징의 중요도(F-값):", scores)

결과값

선택된 특징:
[[85 78]
 [88 85]
 [92 88]
 [80 91]]

각 특징의 중요도(F-값): [0.52941176 0.70588235 1.76470588]

#F-값이 크면: 해당 특징이 결과(레이블)에 중요한 영향을 준다.
#F-값이 작으면: 해당 특징이 결과에 미치는 영향이 적다.

profile
안녕하세요.

0개의 댓글