logo

범주형 독립변수

범주형 독립변수의 처리

  • 범주형 변수는 연속형 변수와 같은 수치적 간격이 없으므로 더미 코딩이 필요
  • 명목형 변수(Nominal)
    • 선박 종류, 색상처럼 카테고리 간의 순위나 우위 관계가 없는 변수
  • 순서형 변수(Ordinal)
    • 좌석 등급, 고객 등급처럼 순서는 있지만 범주 간 간격은 일정하지 않은 변수
  • 범주형 변수를 1, 2, 3으로 치환하면 모형이 동일한 간격과 선형 관계를 가정
  • 따라서 범주형 변수를 연속 변수처럼 모형에 투입할 수 있도록 변환해야 함
  • 가장 많이 사용하는 방법은 더미 코딩(dummy coding)

더미 코딩

  • 더미 코딩(dummy coding): 범주형 변수의 범주가 k개 있을 때 k1개의 더미 변수를 대신 투입하는 방법
  • 각 범주에 해당하면 1, 아니면 0으로 표기
  • 기준범주(reference)
    • 절편과 k개 더미 변수를 모두 넣으면 더미 변수의 합이 항상 1이므로 완전한 다중공선성 발생
    • 범주 중 하나를 기준으로 지정해 제외
    • 기본 기준범주는 범주 순서의 첫 번째 값
    • 문자열 범주는 보통 알파벳순이며 범주형 자료형의 순서에 따라 달라질 수 있음
    • 기준범주는 변경할 수 있음
  • 해석
    • y절편: 다른 독립변수가 0일 때 기준범주의 예측값
    • 더미 변수의 기울기: 다른 독립변수가 같을 때 기준범주와의 차이

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

model model[T.A] model[T.B]
A 1 0
B 0 1

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

model model[T.B]
A 0
B 1

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

  • 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")

df_ship["ship_type"].value_counts()
  • Container: 78척
  • Tanker: 22척

길이를 통제하고 선박 종류에 따른 무게 차이를 추정.

ols("weight ~ length + C(ship_type)", data=df_ship).fit().summary()
  • R2: 0.857
  • 절편: 6112.0505
    • 길이가 0인 Container의 예측 무게이므로 물리적 해석에는 한계
  • length: 154.0133, p-value < 0.001
  • C(ship_type)[T.Tanker]: 약 18180, p-value < 0.001
    • 같은 길이에서 Tanker의 예측 무게가 Container보다 약 18180 큼
weight=6112.05+154.01×length+18180×I(ship_type=Tanker)

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

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

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

  • 3개 범주의 engine_type(Diesel, Hybrid, LNG) 변수를 투입하여 분석
  • statsmodels가 자동으로 2개의 더미 변수를 만들고 Diesel을 기준으로 계수를 산출
df_ship["engine_type"].value_counts()
  • Diesel: 47척
  • LNG: 28척
  • Hybrid: 25척
ols("weight ~ engine_type", data=df_ship).fit().summary()
  • R2: 0.029
  • 모형 전체 p-value: 0.241
  • 절편: 약 47360
    • 기준범주 Diesel의 평균 무게
  • engine_type[T.Hybrid]: 4610.2979, p-value 0.097
  • engine_type[T.LNG]: 2302.5836, p-value 0.387
  • 두 계수 모두 5% 유의수준에서 유의하지 않음
weight=47360+4610.30×I(engine_type=Hybrid)+2302.58×I(engine_type=LNG)

기준 범주 바꾸기

  • C(변수명, Treatment("기준범주")) 형식으로 기준범주를 직접 지정
ols(
    'weight ~ C(engine_type, Treatment("LNG"))',
    data=df_ship,
).fit().summary()
  • 절편: 약 49660
    • 기준범주 LNG의 평균 무게
  • Diesel: -2302.5836, p-value 0.387
  • Hybrid: 2307.7143, p-value 0.452
  • 기준범주를 바꿔도 범주별 예측값과 R2는 동일

퀴즈

문제 1 / 9맞음: 0힌트: 0틀림: 0채점중: 0남음: 9

회귀모형에서 범주형 독립변수를 그대로 일반 숫자 1, 2, 3으로 치환할 때의 문제는?

  • 범주 사이에 동일한 간격과 선형 관계가 있다고 가정한다
  • 범주의 순서 정보를 항상 제거한다
  • 각 범주의 표본 수가 같다고 가정한다
  • 마지막 범주가 항상 기준범주가 된다

퀴즈를 풀려면 대화형 기능을 불러와야 합니다.