[SK쉴더스 루키즈 24기] 데이터 전처리

아굥·2024년 12월 21일
1

SK Shieldus Rookies

목록 보기
7/32

데이터 전처리의 개요

데이터를 분석하거나 머신러닝 모델에 사용하기 전에 비어 있는 값, 엉뚱한 값, 필요 없는 값들을 수정하고 정리하는 과정

  • 데이터를 "사용하기 좋게" 만드는 청소 과정임

왜 필요한지?

  • 잘못된 데이터를 그대로 사용 시, 분석 결과나 모델이 엉뚱한 답을 내놓을 수 있음
  • 깨끗한 데이터로 분석해야 좋은 결과를 얻을 수 있음

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) 		# 1사분위수
Q3 = df['Scores'].quantile(0.75) 		# 3사분위수
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이면 이상치로 간주

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. ('사과', '배', '포도')
profile
열심히 살아보아요

0개의 댓글