범주형 독립변수
범주형 독립변수의 처리
- 범주형 변수는 연속형 변수와 같은 수치적 간격이 없으므로 더미 코딩이 필요
- 명목형 변수(Nominal)
- 선박 종류, 색상처럼 카테고리 간의 순위나 우위 관계가 없는 변수
- 순서형 변수(Ordinal)
- 좌석 등급, 고객 등급처럼 순서는 있지만 범주 간 간격은 일정하지 않은 변수
- 범주형 변수를
1,2,3으로 치환하면 모형이 동일한 간격과 선형 관계를 가정 - 따라서 범주형 변수를 연속 변수처럼 모형에 투입할 수 있도록 변환해야 함
- 가장 많이 사용하는 방법은 더미 코딩(dummy coding)
더미 코딩
- 더미 코딩(dummy coding): 범주형 변수의 범주가 k개 있을 때 k−1개의 더미 변수를 대신 투입하는 방법
- 각 범주에 해당하면 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의 예측 무게이므로 물리적 해석에는 한계
- 길이가 0인
length:154.0133, p-value< 0.001C(ship_type)[T.Tanker]: 약18180, p-value< 0.001- 같은 길이에서
Tanker의 예측 무게가Container보다 약 18180 큼
- 같은 길이에서
범주가 3개 이상인 경우의 더미 변환
- 범주가 3개인 경우
- 예:
engine_type:Diesel,Hybrid,LNG
- 예:
- 문자열 범주의 기본 순서에서
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을 기준으로 계수를 산출
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-value0.097engine_type[T.LNG]:2302.5836, p-value0.387- 두 계수 모두 5% 유의수준에서 유의하지 않음
기준 범주 바꾸기
C(변수명, Treatment("기준범주"))형식으로 기준범주를 직접 지정
ols(
'weight ~ C(engine_type, Treatment("LNG"))',
data=df_ship,
).fit().summary()
- 절편: 약
49660- 기준범주
LNG의 평균 무게
- 기준범주
Diesel:-2302.5836, p-value0.387Hybrid:2307.7143, p-value0.452- 기준범주를 바꿔도 범주별 예측값과 R2는 동일
퀴즈
회귀모형에서 범주형 독립변수를 그대로 일반 숫자 1, 2, 3으로 치환할 때의 문제는?
퀴즈를 풀려면 대화형 기능을 불러와야 합니다.