logo

범주형 독립변수

범주형 독립변수의 처리

  • 범주형 변수는 그대로 기울기를 곱할 수 없음
  • 명목형 변수(Nominal)
    • 선박 종류, 색상처럼 카테고리 간의 순위나 우위 관계가 없는 변수
  • 순서형 변수(Ordinal)
    • 좌석 등급, 고객 등급(Gold, Silver)처럼 순위의 강도와 의미가 포함된 변수
  • 범주형 변수를 1, 2, 3 같은 일반 숫자로 단순 치환하면 모델이 잘못된 양적 의미를 부여할 수 있음
    • 예: 3이 1의 세 배라는 식의 엉뚱한 가중치로 해석
  • 따라서 범주형 변수를 연속 변수처럼 모형에 투입할 수 있도록 변환해야 함
  • 가장 많이 사용하는 방법은 더미 코딩(dummy coding)

더미 코딩

  • 더미 코딩(dummy coding): 범주형 변수의 범주가 개 있을 때 개의 더미 변수를 대신 투입하는 방법
  • 각 범주에 해당하면 1, 아니면 0으로 표기
  • 기준범주(reference)
    • 다른 범주가 모두 0이면 마지막 한 범주는 반드시 1이 되므로 모든 더미를 넣으면 다중공선성 문제가 생김
    • 범주 중 하나를 기준으로 지정해 제외
    • 기본적으로 ABC 순으로 먼저 나오는 범주가 기준이 됨
    • 기준범주는 변경할 수 있음
  • 해석
    • y절편: 기준범주의 예측값
    • 더미 변수의 기울기: 기준범주와의 차이

전체 원-핫 표현은 다음과 같습니다.

modelmodel[T.A]model[T.B]
A10
B01

기준범주가 A이면 model[T.A] 열을 제외하고 model[T.B]만 모형에 투입합니다.

modelmodel[T.B]
A0
B1

수식 문자열에서 범주형 변수 표시

  • statsmodels 수식 문자열 내부에 범주형 변수가 포함되면 자동으로 더미 코딩 적용
"weight ~ length + ship_type"
  • 명시적으로 표시하려면 대문자 C()로 감쌈
"weight ~ length + C(ship_type)"
  • 범주형이지만 데이터에 숫자로 표시된 경우에는 명시적인 표시가 필요
    • 예: 1, 2, 3, 4, ...

범주형 선박 데이터 회귀 실습

from statsmodels.formula.api import ols
import pandas as pd

df_ship = pd.read_excel("ship.xlsx")

m = ols("weight ~ ship_type", data=df_ship).fit()

m.summary()

범주가 3개 이상인 경우의 더미 변환

  • 범주가 3개인 경우
    • 예: engine_type: Diesel, Hybrid, LNG
  • ABC 순으로 Diesel이 기준범주로 지정됨
  • 범주의 수 보다 1개 적은 개의 더미 변수 생성
  • 표에 출력되는 회귀계수는 기준범주(Diesel) 대비 각 범주의 차이를 의미
engine_typeengine_type[T.Hybrid]engine_type[T.LNG]
Diesel00
Hybrid10
LNG01

범주가 3개인 변수의 회귀 실습

  • 3개 범주의 engine_type(Diesel, Hybrid, LNG) 변수를 투입하여 분석
  • statsmodels가 자동으로 2개의 더미 변수를 만들고 Diesel을 기준으로 계수를 산출
m2 = ols("weight ~ engine_type", data=df_ship).fit()

m2.summary()
  • 요약표에는 engine_type[T.Hybrid]engine_type[T.LNG] 두 항목이 출력됨
  • 각 계수(coef)는 기준범주인 Diesel 엔진 대비 HybridLNG 엔진의 평균 무게 차이를 의미

기준 범주 바꾸기

  • C(변수명, Treatment("기준범주")) 형식으로 기준범주를 직접 지정
'weight ~ C(engine_type, Treatment("LNG"))'
Previous
다중회귀분석