데이터 전처리의 개요
데이터를 분석하거나 머신러닝 모델에 사용하기 전에 비어 있는 값, 엉뚱한 값, 필요 없는 값들을 수정하고 정리하는 과정
- 데이터를 "사용하기 좋게" 만드는 청소 과정임
왜 필요한지?
- 잘못된 데이터를 그대로 사용 시, 분석 결과나 모델이 엉뚱한 답을 내놓을 수 있음
- 깨끗한 데이터로 분석해야 좋은 결과를 얻을 수 있음
1. 데이터 전처리의 중요성
- 데이터 품질, 모델 성능의 품질을 높이고 분석이나 모델링의 결과를 신뢰할 수 있음
- 데이터를 잘 정리하기 않으면 잘못된 결과를 초래하고 시간과 비용이 낭비됨
=> 단순한 작업이 아닌 성공적인 데이터 프로젝트의 필수 단계
2. 데이터의 유형
1) 정형 데이터(Structured Data)
- 행(row)과 열(column)로 구성된 데이터 -> DB, Excel
- 데이터가 표처럼 정렬되어 각 열에 이름(필드명)과 데이터 유형이 정해져 있음
2) 비정형 데이터(Unstructured Data)
- 고정된 구조가 없는, 정리되지 않은 데이터 -> 이미지, 동영상, 텍스트 파일
- 데이터 모양이나 구조가 일정하지 않고, 분석을 위해선 먼저 데이터를 가공해야 함
3) 반정형 데이터(Semi-Structured Data)
- 정형 데이터와 비정형 데이터의 중간 단계로 데이터에 구조는 있지만 엄격하지 않음 -> Json, XML, 웹 로그 데이터
- 구조는 있지만 형태가 유연함
- 사람이 읽을 수 있으며 컴퓨터도 처리 가능
3. 데이터 전처리 과정 개요
데이터 수집 -> 정제 -> 변환 -> 통합 순서로 진행
- 데이터의 품질과 활용도를 높이는데 초점이 맞춰짐
1) 데이터 수집
- 데이터를 가져올 출처를 정하고 필요한 데이터 수집
ㄴ> 데이터가 불완전하거나 잘못된 경우가 많으므로 데이터의 품질을 잘 확인해야 함
2) 데이터 정제
- 수집한 데이터의 불완전한 부분이나 오류를 해결하여 깨끗하게 만드는 단계
ㄴ> 정제하지 않으면 이후 단계에서 잘못된 결과를 얻을 수 있음
주요 과정
- 결측값 처리: 데이터에 비어 있는 값(NaN, Null 등)이 있을 경우 해결
- 오류 수정: 잘못된 데이터(오타, 잘못된 값 등)를 수정
- 중복 제거: 동일한 데이터가 여러 번 나타나는 경우 삭제
- 이상치 제거: 너무 크거나 작은 값 등 정상적이지 않은 값 처리
3) 데이터 변환
- 정데된 데이터를 분석과 모델링에 적합하도록 변환하는 단계
ㄴ> 데이터를 해석하기 쉽게 하고, 모델링 과정에서 성능을 향상시킴
주요 작업
- 형태 변환: 데이터를 사용 목적에 맞게 바꿈
- 정규화: 데이터의 범위를 일정하게 조정
- 집계: 데이터를 요약하거나 그룹화
- 차원 축소: 불필요한 데이터를 제거하여 데이터 크기를 줄임
4) 데이터 통합
- 다양한 데이터 자원에서 수집한 데이터를 하나로 합치는 과정
ㄴ> 데이터가 여러 개의 테이블, 파일, 시스템에 분산되어 있을 수 있으므로
- 주의할 점: 데이터의 의미와 관계를 잘 이해하지 않으면 잘못된 결합이 이뤄질 수 있음
주요 작업
- 데이터 병합: 두 개 이상의 데이터셋을 결합
- 일관성 유지: 서로 다른 데이터의 포맷과 구조를 맞춤
- 중복 제거: 통합된 데이터에서 중복된 항목을 삭제
데이터 정제
1. 결측치 처리
데이터에서 특정 값이 누락된 상태
결측치 처리 이유
- 분석 왜곡 방지: 결측값을 그대로 두면 평균, 합계 같은 계산이 왜곡될 수 있음
- 모델 학습 방해 방지: 머신러닝 모델을 결측값을 포함한 데이터를 처리하지 못하는 경우가 많이 발생함
- 데이터 품질 향상: 결측치를 처리하면 데이터를 더 신뢰할 수 있게 됨
1) 결측치 제거
- 결측치가 데이터셋에서 차지하는 비율이 적을 때
- 해당 열이나 행이 분석에 큰 영향을 주지 않을 때
import pandas as pd
data = {
'Name': ['Alice', 'Bob', None],
'Age': [25, None, 30],
'Score': [85, 90, None]
}
df = pd.DataFrame(data)
df_no_missing_rows = df.dropna()
df_no_missing_cols = df.dropna(axis=1)
2) 결측치 대체
- 데이터의 양이 적거나 결측치가 무작성 삭제되면 데이터 손실이 클 때
import pandas as pd
data = {
'Name': ['Alice', 'Bob', None],
'Age': [25, None, 30],
'Score': [85, 90, None]
}
df = pd.DataFrame(data)
df['Age'] = df['Age'].fillna(df['Age'].mean())
df['Score'] = df['Score'].fillna(df['Score'].median())
df['Name'] = df['Name'].fillna(df['Name'].mode()[0])
방법
- 고정 값으로 대체: 특정 값으로 결측치를 채움
- 통계 기반 대체: 평균값, 중간값, 최빈값
- 예측 기반 대체: 머신러닝 모델을 사용하여 결측치를 예측해 채움
2. 이상치 처리
데이터셋에서 다른 값들과 크게 동떨어져 있는 값
- 분석을 왜곡하거나 모델의 성능을 저하시킬 수 있음
이상치 처리 이유
- 데이터 왜곡 방지: 이상치는 평균, 분산, 상관관계 등의 통계값에 큰 영향을 미칠 수 있음
- 모델 성능 향상: 머신러닝 모델을 이상치로 인해 잘못된 패턴을 학습할 수 있음
- 데이터 신뢰성 확보: 이상치를 처리하면 데이터 품질이 높아짐
1) IQR 방법
데이터의 중간 50%를 포함하는 범위를 이용해 이상치를 탐지
- 비대칭 분포 데이터 적합함
- 극단값의 영향을 덜 받음
import numpy as np
import pandas as pd
data = {'Scores': [70, 75, 80, 85, 90, 150]}
df = pd.DataFrame(data)
Q1 = df['Scores'].quantile(0.25)
Q3 = df['Scores'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = df[(df['Scores'] < lower_bound) | (df['Scores'] > upper_bound)]
df = df[(df['Scores'] >= lower_bound) & (df['Scores'] <= upper_bound)]
df.loc[df['Scores'] < lower_bound, 'Scores'] = lower_bound
df.loc[df['Scores'] > upper_bound, 'Scores'] = upper_bound
이상치 기준
- 아래쪽: Q1 - 1.5 x IQR 보다 작은 값
- 아래쪽: Q3 + 1.5 x IQR 보다 큰 값
2) Z-Score 방법
데이터의 값이 평균에서 얼마나 떨어져있는지를 표준 편차 단위로 나타냄
- 정규분포를 따르는 데이터에 적합
- Z = (X − μ) / σ
ㄴ> μ: 평균
ㄴ> σ: 표준 편차
import scipy.stats import zscore
import pandas as pd
data = {'Scores': [70, 75, 80, 85, 90, 150]}
df = pd.DataFrame(data)
df['Z_Score'] = zscore(df['Scores'])
outliers = df[(df['Z_Score'] < -2) | (df['Z_Score'] > 2)]
df = df[(df['Z_Score'] > -2) & (df['Z_Score'] < 2)]
median = df['Scores'].median()
df.loc[(df['Z_Score'] < -2) | (df['Z_Score'] > 2), 'Scores'] = median
이상치 기준
3. 데이터 중복 확인 및 제거
데이터셋에서 동일한 행(row)이 반복적으로 나타나는 것
- 중복 데이터가 있으면 분석 결과가 왜곡될 수 있음
ㄴ> 특히 데이터의 크기가 큰 경우는 처리 속도와 메모리 사용량에도 영향
중복 데이터 종류
- 완전 중복: 모든 열의 값이 동일한 행
- 부분 중복: 특정 열의 값만 동일한 행
데이터 변환 및 스케일링
1. 데이터 변환
데이터의 분포를 변화시켜 분석이나 모델링에 유리한 형태로 만드는 과정
- 특히 데이터의 왜도를 줄이고 더 정규 분포에 가깝게 만들기 위해 활용
- 모델 학습 성능을 개선하는데 중요한 역할을 함
1) 로그 변환
- 데이터 값의 로그(log)를 취하는 방법 ->
y = log(x)
- 데이터의 값이 매우 크거나, 몇 개의 값이 지나치게 크고 나머지는 작은 경우 사용
ㄴ> 매우 큰 값을 다룰 때 효과적임
- 음수나 0에는 사용 불가
로그 변환을 하면
- 큰 값은 축소, 작은 값은 상대적으로 커짐
ㄴ> 데이터 분포를 평탄하게 만들어줌
2) 스퀘어 루트 변환
- 데이터의 제곱근을 구하는 방법 ->
y = √x
- 데이터의 크기를 축소하거나 오른쪽 치우침을 완화할 때 사용
ㄴ> 큰 값과 작은 값의 균형을 맞추는데 유용함
- 음수에는 사용 불가
2. 데이터 스케일링
데이터의 값 범위를 조정하는 과정
- 머신러닝 모델이 데이터의 크기 차이에 영향을 덜 받게 하기 위해 중요함
ㄴ> 특히 변수의 단위나 크기가 다를 때 필수적임
1) 표준화
- 데이터의 값을 평균이 0, 표준편차가 1이 되도록 변환하는 방법
- 데이터의 분포 모양을 바꾸지는 않고, 단위 차이를 없애줌
- Z = (x − μ) / σ
ㄴ> μ: 평균
ㄴ> σ: 표준 편차
장점 및 주의사항
- 데이터 간 범위와 단위가 달라도 동일한 기준으로 변환
- 특히 거리 기반 알고리즘에 효과적
- 데이터가 정규 분포를 따르지 않더라도 표준화를 적용할 수 있지만 분포의 왜도는 남아 있을 수 있음
2) 정규화
- 데이터를 0과 1 사이로 변환하는 방법
ㄴ> 값의 크기를 줄이고 데이터를 일정한 스케일로 맞춤
- x' = x - min(x) / max(x) - min(x)
장점 및 주의사항
- 데이터가 일정 범위 내에 있어 스케일에 민감한 알고리즘에 적합
- 이상치의 영향을 줄이는데 유용함
- 데이터에 이상치가 있을 경우, 최대값과 최소값에 왜곡이 생길 수 있음
3. 범주형 데이터 처리
수치가 아닌 텍스트 데이터처럼 특정 범주를 나타내는 데이터
- 머신러닝 알고리즘은 숫자 데이터를 처리 -> 범주형 데이터를 숫자로 변환해야 함
1) 레이블 인코딩
- 범주형 데이터를 정수로 매핑하여 각 범주를 고유한 숫자로 변환하는 방법
- 예제
데이터: ['사과', '배', '포도', '사과', '포도']
사과 -> 0, 배 -> 1, 포도 -> 2
결과: [0, 1, 2, 0, 2]
장단점
- 간단하고 직관적이며, 메모리를 적게 사용함
- 범주의 순서가 없는데도 숫자가 순서를 암시할 수 있음
ㄴ> a(0)이 b(1)보다 더 작거나 낮다고 의미를 부여할 위험이 있음
사용 시기
- 범주가 순서형 데이터인 경우 적합함
ㄴ> ex. ('낮음', '보통', '높음')
2) 원-핫 인코딩
- 범주형 데이터를 이진 벡터로 전환
- 각 범주마다 별도의 열(column)을 만들고 해당 범주에만 1을 표시, 나머지는 0으로 표시
- 예제
데이터: ['사과', '배', '포도', '사과', '포도']
사과 -> [1, 0, 0], 배 -> [0, 1, 0], 포도 -> [0, 0, 1]
장단점
- 숫자가 범주의 순서를 암시하지 않으므로 레이블 인코딩의 단점을 극복
- 범주의 수가 많을수록 많은 열이 생성되어 메모리 소모가 큼 -> 고차원 문제
사용 시기
- 범주가 순서가 없는 데이터인 경우 적합함 (=비순서형 데이터)
ㄴ> ex. ('사과', '배', '포도')