본문으로 건너뛰기

03-090. 데이터 인코딩

04-080. 데이터 인코딩 (범주형 데이터 처리)

데이터 인코딩은 범주형 데이터를 수치형 데이터로 변환하는 과정이다. 통계 분석을 할 때 범주형 변수를 다른 열로 분리하면 비교하거나 모델링을 할 때 매우 편하다. 또 범주형 데이터는 수치형 데이터가 아니어서 여러 계산을 위해서는 수치로 변환해야 한다.

범주형 데이터의 종류

범주형 데이터(Categorical data)는 “순서가 있는 것”, “순서가 없는 것” 두 가지가 있다.

명목형 데이터 (Nominal Data)

  • 순서가 없는 범주형 데이터
  • 예: 성별(남/여), 혈액형(A/B/O/AB), 직업(회사원/학생/주부)

순서형 데이터 (Ordinal Data)

  • 순서가 있는 범주형 데이터
  • 예: 학년(1/2/3/4), 등급(상/중/하), 만족도(매우만족/만족/보통/불만족)

범주형 데이터 인코딩 방법

레이블 인코딩 (Label Encoding)

  • 범주형 데이터를 0부터 시작하는 정수로 변환
  • 순서형 데이터에 적합
  • 명목형 데이터에는 부적합 (순서가 없는 데이터에 순서가 생김)
from sklearn.preprocessing import LabelEncoder
import pandas as pd

# 더 복잡한 예시 데이터 - 학생 성적 데이터
data = pd.DataFrame({
'학생ID': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'이름': ['강민준', '이서연', '박도윤', '최하은', '정시우', '한예은', '임준서', '송지우', '조서준', '윤하린'],
'학년': ['1학년', '2학년', '3학년', '1학년', '2학년', '3학년', '1학년', '2학년', '3학년', '1학년'],
'성적등급': ['우수', '보통', '미흡', '우수', '보통', '우수', '미흡', '보통', '우수', '보통'],
'만족도': ['매우만족', '만족', '보통', '불만족', '만족', '매우만족', '보통', '만족', '매우만족', '불만족']
})

print("원본 데이터:")
print(data)
print()

# 학년 레이블 인코딩 (순서가 있는 데이터)
grade_encoder = LabelEncoder()
data['학년_인코딩'] = grade_encoder.fit_transform(data['학년'])

# 성적등급 레이블 인코딩 (순서가 있는 데이터: 미흡 < 보통 < 우수)
performance_encoder = LabelEncoder()
data['성적등급_인코딩'] = performance_encoder.fit_transform(data['성적등급'])

# 만족도 레이블 인코딩 (순서가 있는 데이터: 불만족 < 보통 < 만족 < 매우만족)
satisfaction_encoder = LabelEncoder()
data['만족도_인코딩'] = satisfaction_encoder.fit_transform(data['만족도'])

print("레이블 인코딩 결과:")
print(data[['학년', '학년_인코딩', '성적등급', '성적등급_인코딩', '만족도', '만족도_인코딩']])
print()

print("인코딩 매핑 정보:")
print("학년 클래스:", grade_encoder.classes_)
print("성적등급 클래스:", performance_encoder.classes_)
print("만족도 클래스:", satisfaction_encoder.classes_)

원-핫 인코딩 (One-Hot Encoding)

  • 각 범주를 새로운 이진 변수로 변환
  • 명목형 데이터에 적합
  • 범주의 수가 많으면 차원이 커짐
import pandas as pd

# 예시 데이터
data = pd.DataFrame({
'성별': ['남', '여', '남', '여', '남'],
'혈액형': ['A', 'B', 'O', 'AB', 'A']
})

# 원-핫 인코딩
encoded_data = pd.get_dummies(data)

print("원본 데이터:")
print(data)
print("\n인코딩된 데이터:")
print(encoded_data)

3. 이진 인코딩 (Binary Encoding)

  • 범주를 이진수로 변환
  • 원-핫 인코딩보다 차원이 적음
  • 명목형 데이터에 적합
import category_encoders as ce

# 예시 데이터
data = pd.DataFrame({
'카테고리': ['A', 'B', 'C', 'D', 'E']
})

# 이진 인코딩
encoder = ce.BinaryEncoder(cols=['카테고리'])
encoded_data = encoder.fit_transform(data)

print("원본 데이터:")
print(data)
print("\n인코딩된 데이터:")
print(encoded_data)

4. 타겟 인코딩 (Target Encoding)

  • 범주의 평균 타겟 값을 사용
  • 과적합 위험이 있음
  • 교차 검증과 함께 사용 권장
from category_encoders import TargetEncoder

# 예시 데이터
X = pd.DataFrame({
'카테고리': ['A', 'B', 'A', 'C', 'B', 'C']
})
y = pd.Series([1, 0, 1, 0, 1, 0])

# 타겟 인코딩
encoder = TargetEncoder(cols=['카테고리'])
encoded_data = encoder.fit_transform(X, y)

print("원본 데이터:")
print(X)
print("\n인코딩된 데이터:")
print(encoded_data)

인코딩 방법 선택 기준

레이블 인코딩 사용 시기

  • 순서형 데이터
  • 트리 기반 모델
  • 범주의 수가 적을 때

원-핫 인코딩 사용 시기

  • 명목형 데이터
  • 범주의 수가 적을 때
  • 선형 모델

이진 인코딩 사용 시기

  • 명목형 데이터
  • 범주의 수가 많을 때
  • 차원 축소가 필요할 때

타겟 인코딩 사용 시기

  • 범주의 수가 많을 때
  • 과적합을 방지할 수 있을 때
  • 교차 검증이 가능할 때

실습 예제

import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
from category_encoders import BinaryEncoder, TargetEncoder

# 예시 데이터 생성
data = pd.DataFrame({
'성별': ['남', '여', '남', '여', '남'],
'혈액형': ['A', 'B', 'O', 'AB', 'A'],
'등급': ['상', '중', '하', '상', '중'],
'타겟': [1, 0, 1, 0, 1]
})

# 1. 레이블 인코딩 (순서형 데이터)
le = LabelEncoder()
data['등급_인코딩'] = le.fit_transform(data['등급'])

# 2. 원-핫 인코딩 (명목형 데이터)
data_encoded = pd.get_dummies(data, columns=['성별', '혈액형'])

# 3. 이진 인코딩
be = BinaryEncoder(cols=['혈액형'])
data_binary = be.fit_transform(data)

# 4. 타겟 인코딩
te = TargetEncoder(cols=['혈액형'])
data_target = te.fit_transform(data, data['타겟'])

print("원본 데이터:")
print(data)
print("\n레이블 인코딩 결과:")
print(data['등급_인코딩'])
print("\n원-핫 인코딩 결과:")
print(data_encoded)
print("\n이진 인코딩 결과:")
print(data_binary)
print("\n타겟 인코딩 결과:")
print(data_target)

주의사항

  1. 데이터 누수 방지

    • 타겟 인코딩 시 학습/테스트 데이터 분리 후 인코딩
    • 교차 검증 사용
  2. 차원 증가 관리

    • 원-핫 인코딩 시 차원이 크게 증가할 수 있음
    • 차원 축소 기법 고려
  3. 인코딩 방법 선택

    • 데이터의 특성과 모델에 맞는 인코딩 방법 선택
    • 여러 방법을 시도하고 성능 비교
  4. 인코딩 정보 저장

    • 학습 데이터의 인코딩 정보를 저장하여 테스트 데이터에 동일하게 적용
    • 새로운 데이터 처리 시 일관성 유지

데이터 인코딩은 머신러닝 모델의 성능에 큰 영향을 미치는 중요한 전처리 단계다. 데이터의 특성과 분석 목적에 맞는 적절한 인코딩 방법을 선택하여 사용해야 한다.