범주형 독립변수
범주형 독립변수의 처리
- 범주형 변수는 연속형 변수와 같은 수치적 간격이 없으므로 더미 코딩이 필요
- 명목형 변수(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, ...
- 예:
범주형 선박 데이터 회귀 실습
🤖 AI 프롬프트
ship.xlsx를 판다스로 읽어 df을 만들고, ship_type의 범주별 선박 수를 확인해줘.
from statsmodels.formula.api import ols
import pandas as pd
df = pd.read_excel("ship.xlsx")
df["ship_type"].value_counts()
실행 결과
ship_type
Container 78
Tanker 22
Name: count, dtype: int64
Container: 78척Tanker: 22척
Container를 기준범주로 두면 Tanker 여부를 나타내는 더미 변수 하나 생성.
| ship_type | C(ship_type)[T.Tanker] |
|---|---|
| Container | 0 |
| Tanker | 1 |
길이를 통제하고 선박 종류에 따른 무게 차이를 추정.
🤖 AI 프롬프트
df에서 weight를 종속변수, length와 범주형 변수 ship_type을 독립변수로 하는 회귀모형을 statsmodels로 적합하고 요약표를 출력해줘. Container를 기준으로 길이를 통제한 Tanker의 무게 차이를 해석해줘.
print(ols("weight ~ length + C(ship_type)", data=df).fit().summary())
실행 결과
OLS Regression Results
==============================================================================
Dep. Variable: weight R-squared: 0.857
Model: OLS Adj. R-squared: 0.854
Method: Least Squares F-statistic: 290.8
Date: Sun, 18 Oct 2026 Prob (F-statistic): 1.06e-41
Time: 14:47:34 Log-Likelihood: -976.14
No. Observations: 100 AIC: 1958.
Df Residuals: 97 BIC: 1966.
Df Model: 2
Covariance Type: nonrobust
==========================================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------------------
Intercept 6112.0505 2372.618 2.576 0.012 1403.061 1.08e+04
C(ship_type)[T.Tanker] 1.818e+04 1029.349 17.664 0.000 1.61e+04 2.02e+04
length 154.0133 9.141 16.849 0.000 135.871 172.155
==============================================================================
Omnibus: 0.094 Durbin-Watson: 2.395
Prob(Omnibus): 0.954 Jarque-Bera (JB): 0.040
Skew: 0.045 Prob(JB): 0.980
Kurtosis: 2.962 Cond. No. 1.44e+03
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 1.44e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
- 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 큼
- 같은 길이에서
퀴즈
회귀모형에서 범주형 독립변수를 그대로 일반 숫자 1, 2, 3으로 치환할 때의 문제는?
퀴즈를 풀려면 대화형 기능을 불러와야 합니다.