범주형 독립변수의 처리
- 범주형 변수는 그대로 기울기를 곱할 수 없음
- 명목형 변수(Nominal)
- 선박 종류, 색상처럼 카테고리 간의 순위나 우위 관계가 없는 변수
- 순서형 변수(Ordinal)
- 좌석 등급, 고객 등급(
Gold, Silver)처럼 순위의 강도와 의미가 포함된 변수
- 범주형 변수를
1, 2, 3 같은 일반 숫자로 단순 치환하면 모델이 잘못된 양적 의미를 부여할 수 있음
- 예: 3이 1의 세 배라는 식의 엉뚱한 가중치로 해석
- 따라서 범주형 변수를 연속 변수처럼 모형에 투입할 수 있도록 변환해야 함
- 가장 많이 사용하는 방법은 더미 코딩(dummy coding)
더미 코딩
- 더미 코딩(dummy coding): 범주형 변수의 범주가 k개 있을 때 k−1개의 더미 변수를 대신 투입하는 방법
- 각 범주에 해당하면 1, 아니면 0으로 표기
- 기준범주(reference)
- 다른 범주가 모두 0이면 마지막 한 범주는 반드시 1이 되므로 모든 더미를 넣으면 다중공선성 문제가 생김
- 범주 중 하나를 기준으로 지정해 제외
- 기본적으로 ABC 순으로 먼저 나오는 범주가 기준이 됨
- 기준범주는 변경할 수 있음
- 해석
- y절편: 기준범주의 예측값
- 더미 변수의 기울기: 기준범주와의 차이
전체 원-핫 표현은 다음과 같습니다.
| model | model[T.A] | model[T.B] |
|---|
| A | 1 | 0 |
| B | 0 | 1 |
기준범주가 A이면 model[T.A] 열을 제외하고 model[T.B]만 모형에 투입합니다.
수식 문자열에서 범주형 변수 표시
statsmodels 수식 문자열 내부에 범주형 변수가 포함되면 자동으로 더미 코딩 적용
"weight ~ length + ship_type"
"weight ~ length + C(ship_type)"
- 범주형이지만 데이터에 숫자로 표시된 경우에는 명시적인 표시가 필요
범주형 선박 데이터 회귀 실습
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이 기준범주로 지정됨
- 범주의 수 K보다 1개 적은 K−1개의 더미 변수 생성
- 표에 출력되는 회귀계수는 기준범주(
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을 기준으로 계수를 산출
m2 = ols("weight ~ engine_type", data=df_ship).fit()
m2.summary()
- 요약표에는
engine_type[T.Hybrid]와 engine_type[T.LNG] 두 항목이 출력됨
- 각 계수(
coef)는 기준범주인 Diesel 엔진 대비 Hybrid와 LNG 엔진의 평균 무게 차이를 의미
기준 범주 바꾸기
C(변수명, Treatment("기준범주")) 형식으로 기준범주를 직접 지정
'weight ~ C(engine_type, Treatment("LNG"))'