다운로드
작성자: admin 작성일시: 2016-06-03 22:15:55 조회수: 4821 다운로드: 337
카테고리: 머신 러닝 태그목록:

범주형 독립 변수

더미 변수

범주형 값은 여러개의 다른 상태를 나타내는 값이다. 범주형 값을 "A", "B", "C"라는 문자로 표현하는 경우도 있고 "1", "2", "3"과 같이 숫자로 표현하는 경우도 있지만 이 경우 단지 "A"라는 글자대신 "1"라는 글자를 이용한 것 뿐이지 숫자로서의 의미는 없다. 즉, "2"라는 값이 "1"이라는 값보다 2배 더 크다는 뜻이 아니다.

회귀분석을 할 때는 숫자가 아닌 독립 변수 값은 쓸 수 없기 때문에 어떤 방식으로든 범주형 독립 변수의 값을 사용할 수 있는 방법을 찾아야 한다. 이 방법 중의 하나가 더미 변수(dummy variable)이다.

더미 변수는 0 또는 1만으로 표현되는 값으로 어떤 특징(feature)이 존재하는가 존재하지 않는가를 표시하는 독립 변수이다. 다음과 같은 명칭으로도 불린다.

  • treatment
  • indicator variable
  • design variable
  • Boolean indicator
  • binary variable

patsy 패키지의 dmatrix 명령은 범주형 변수의 값을 더미 변수로 인코딩하는 기능도 있다.

In [1]:
from patsy import *

두 가지의 범주 값이 있는 경우

$x_1, x_2, \ldots, x_D$라는 $D$개의 독립변수를 가지는 선형 회귀모형을 생각하자. 포뮬러 문자열로 다음처럼 표현할 수 있다.

$$ \text{모형}:\;\; \hat{y} \sim 1 + x_1 + x_2 + \cdots + x_D \;\; (\text{모든 데이터에 대해}) $$

여기에서 $x_1$이라는 독립 변수만 범주형 변수이고 "남자"과 "여자"라는 두 가지의 범주 값을 가질 수 있다고 하자. 이러한 경우를 다루는 방법 중의 하나는 $x_1$="남자"인 경우와 $x_2$="여자"인 경우 두가지 경우로 나누어 선형 회귀모형을 만드는 것이다.

$$ \text{모형 A}:\;\; \hat{y} = w_0 + w_2x_2 + \cdots + w_Dx_D \;\; (x_1 = \text{남자인 데이터에 대해}) $$$$ \text{모형 B}:\;\; \hat{y} = w_0 + w_2x_2 + \cdots + w_Dx_D \;\; (x_1 = \text{여자인 데이터에 대해}) $$

이 두 가지 모형을 따로 따로 선형회귀를 할 수도 있을 것이다. 그런데 만약 $x_2, x_3, \cdots, x_D$에 대한 $y$값의 반응 즉, 가중치가 남자와 여자를 가리지 않고 같아야 한다면 이 방법은 $w_2, \dots, w_D$라는 가중치에 대해 남자 모형과 여자 모형이 각각 다른 값을 주므로 적절한 모형이 아니다.

더 좋은 방법은 범주형 변수 $x_1$을 $(1, 0)$ 또는 $(0, 1)$ 값을 가지는 $d$라는 더미 변수로 바꾸는 것이다.

$$ \begin{eqnarray} x="남자" & \rightarrow & d=(1, 0) \\ x="여자" & \rightarrow & d=(0, 1) \\ \end{eqnarray} $$

이 때 모형은 다음과 같아진다.

$$ \text{모형}:\;\; \hat{y} = w_{d1}d_1 + w_{d2}d_2 + w_2x_2 + \cdots + w_Dx_D $$

그러면 남자인 경우에는

$$ \hat{y} = w_{d1} + w_2x_2 + \cdots + w_Dx_D $$

여자인 경우에는

$$ \hat{y} = w_{d2} + w_2x_2 + \cdots + w_Dx_D $$

라는 수식에 데이터를 맞추는 모형이 된다. 즉, 남자인 경우와 여자인 경우는 상수항만 달라지고 다른 독립 변수에 의한 영향은 같다. 더미 변수의 가중치인 $w_{d1}$, $w_{d1}$가 의미하는 바는 각각 남자인 경우의 상수항과 여자인 경우의 상수항이 된다. 이러한 방법을 reduced rank 더미 변수 모형이라고 한다.

선형 회귀모형에 범주형 독립 변수가 포함되면 더미 변수 이외에 별도의 상수항이 있으면 안된다. 만약 위의 모형에서 별도의 상수항 $w_0$이 존재한다면 모형 수식은 각각 다음처럼 될 것이다.

$$ \hat{y} = w_0 + w_{d1} + w_2x_2 + \cdots + w_Dx_D $$$$ \hat{y} = w_0 + w_{d2} + w_2x_2 + \cdots + w_Dx_D $$

이 경우에는 $w_0 + w_{d1}$ 값은 구할 수 있어도 $w_0$ 값과 $w_{d1}$ 값을 분리할 수가 없다.

In [2]:
df1 = pd.DataFrame(["남", "남", "여", "여"], columns=["x1"])
df1
Out:
x1
0
1
2
3
In [3]:
dmatrix("x1", df1)
Out:
DesignMatrix with shape (4, 2)
  Intercept  x1[T.여]
          1        0
          1        0
          1        1
          1        1
  Terms:
    'Intercept' (column 0)
    'x1' (column 1)

더미 변수의 값을 다음처럼 정할 수도 있다.

$$ \begin{eqnarray} x="남자" & \rightarrow & d=(1, 0) \\ x="여자" & \rightarrow & d=(1, 1) \\ \end{eqnarray} $$

이 때 모형은 앞의 경우와 같지만,

$$ \text{모형}:\;\; \hat{y} = w_{d1}d_1 + w_{d2}d_2 + w_2x_2 + \cdots + w_Dx_D $$

남자인 경우에는

$$ \hat{y} = w_{d1} + w_2x_2 + \cdots + w_Dx_D $$

여자인 경우에는

$$ \hat{y} = (w_{d1} + w_{d2}) + w_2x_2 + \cdots + w_Dx_D $$

가 된다.

남자인 경우와 여자인 경우가 상수항만 달라지고 다른 독립 변수에 의한 영향은 같다라는 점에서는 reduce rank 방식과 같다. 하지만 더미 변수의 가중치인 $w_{d1}$, $w_{d1}$가 의미하는 바는 달라진다. $w_{d1}$는 기준이 되는 남자의 상수항이고 $w_{d2}$는 여자인 경우가 남자인 경우보다 상수항이 얼마나 더 증가하는지를 나타내는 숫자가 된다. 이러한 방식을 full rank 더미 변수 모형이라고 한다.

patsy의 dmatrix 명령은 문자열 값을 가지는 변수에 대해 자동으로 full rank 더미 변수 모형을 적용한다. 만약 모형에서 " - 1" 또는 " + 0"을 붙여 상수항을 없애면 reduced rank 더미 변수 모형을 적용한다.

In [4]:
dmatrix("x1 + 0", df1)
Out:
DesignMatrix with shape (4, 2)
  x1[남]  x1[여]
      1      0
      1      0
      0      1
      0      1
  Terms:
    'x1' (columns 0:2)

세 가지 이상의 범주 값이 있는 경우

"A", "B", "AB", "O" 종류가 있는 혈액형과 같이 범주형 변수가 가질 수 있는 범주 값이 세 가지 이상인 경우에는 더미 변수의 차원이 해당하는 개수로 증가한다.

full rank 더미 변수 모형에서는 다음처럼 인코딩한다.

$$ \begin{eqnarray} x&=&"A형" & \rightarrow & d=(1, 0, 0, 0) \\ x&=&"AB형" & \rightarrow & d=(1, 1, 0, 0) \\ x&=&"B형" & \rightarrow & d=(1, 0, 1, 0) \\ x&=&"O형" & \rightarrow & d=(1, 0, 0, 1) \\ \end{eqnarray} $$

reduced rank 더미 변수 모형에서는 원-핫-인코딩(one-hot-encoding) 방식을 사용한다.

$$ \begin{eqnarray} x&=&"A형" & \rightarrow & d=(1, 0, 0, 0) \\ x&=&"AB형" & \rightarrow & d=(0, 1, 0, 0) \\ x&=&"B형" & \rightarrow & d=(0, 0, 1, 0) \\ x&=&"O형" & \rightarrow & d=(0, 0, 0, 1) \\ \end{eqnarray} $$
In [5]:
df2 = pd.DataFrame(["A", "A", "B", "AB", "O", "B", "AB"], columns=["x2"])
df2
Out:
x2
0 A
1 A
2 B
3 AB
4 O
5 B
6 AB
In [6]:
dmatrix("x2", df2)
Out:
DesignMatrix with shape (7, 4)
  Intercept  x2[T.AB]  x2[T.B]  x2[T.O]
          1         0        0        0
          1         0        0        0
          1         0        1        0
          1         1        0        0
          1         0        0        1
          1         0        1        0
          1         1        0        0
  Terms:
    'Intercept' (column 0)
    'x2' (columns 1:4)
In [7]:
dmatrix("x2 + 0", df2)
Out:
DesignMatrix with shape (7, 4)
  x2[A]  x2[AB]  x2[B]  x2[O]
      1       0      0      0
      1       0      0      0
      0       0      1      0
      0       1      0      0
      0       0      0      1
      0       0      1      0
      0       1      0      0
  Terms:
    'x2' (columns 0:4)

C() 연산자

범주형 값이지만 정수 등으로 표시된 경우에는 C() 연산자를 이용하여 범주형 값임을 명시적으로 지정할 수 있다.

In [8]:
df3 = pd.DataFrame([1, 2, 3, 4], columns=["x3"])
df3
Out:
x3
0 1
1 2
2 3
3 4
In [9]:
dmatrix("C(x3) + 0", df3)
Out:
DesignMatrix with shape (4, 4)
  C(x3)[1]  C(x3)[2]  C(x3)[3]  C(x3)[4]
         1         0         0         0
         0         1         0         0
         0         0         1         0
         0         0         0         1
  Terms:
    'C(x3)' (columns 0:4)

범주형 독립 변수를 가진 회귀분석의 예

월(month)을 독립 변수로 하여 해당 월의 기온을 예측하는 회귀분석을 해보자. 데이터는 다음과 같다.

In [10]:
df_nottem = sm.datasets.get_rdataset("nottem").data

일단 다음 코드를 사용하여 연단위(year fraction) 데이터에서 월을 추출해낸다.

In [11]:
import datetime
from calendar import isleap

def convert_partial_year(number):
    year = int(number)
    d = datetime.timedelta(days=(number - year) * (365 + isleap(year)))
    day_one = datetime.datetime(year, 1, 1)
    date = d + day_one
    return date


df_nottem["date0"] = df_nottem[["time"]].applymap(convert_partial_year)
df_nottem["date"] = pd.DatetimeIndex(df_nottem["date0"]).round('60min') + datetime.timedelta(seconds=3600*24)
df_nottem["month"] = df_nottem["date"].dt.strftime("%m").astype('category')
del df_nottem["date0"], df_nottem["date"]
df_nottem.tail()
Out:
time value month
235 1939.583333 61.8 08
236 1939.666667 58.2 09
237 1939.750000 46.7 10
238 1939.833333 46.6 11
239 1939.916667 37.8 12
In [12]:
df_nottem.boxplot("value", "month")
plt.show()
In [13]:
sns.stripplot(x="month", y="value", data=df_nottem, jitter=True, alpha=.3)
sns.pointplot(x="month", y="value", data=df_nottem, dodge=True, color='r')
plt.show()

reduced rank 방식으로 더미 변수를 만들어 회귀분석을 하면 각 월의 평균 기온을 구할 수 있다. 월 데이터가 숫자이므로 연속값으로 인식하지 않도록 C() 연산자를 사용하였다.

In [14]:
model = sm.OLS.from_formula("value ~ C(month) + 0", df_nottem)
result = model.fit()
print(result.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  value   R-squared:                       0.930
Model:                            OLS   Adj. R-squared:                  0.927
Method:                 Least Squares   F-statistic:                     277.3
Date:                Tue, 13 Nov 2018   Prob (F-statistic):          2.96e-125
Time:                        20:20:57   Log-Likelihood:                -535.82
No. Observations:                 240   AIC:                             1096.
Df Residuals:                     228   BIC:                             1137.
Df Model:                          11                                         
Covariance Type:            nonrobust                                         
================================================================================
                   coef    std err          t      P>|t|      [0.025      0.975]
--------------------------------------------------------------------------------
C(month)[01]    39.6950      0.518     76.691      0.000      38.675      40.715
C(month)[02]    39.1900      0.518     75.716      0.000      38.170      40.210
C(month)[03]    42.1950      0.518     81.521      0.000      41.175      43.215
C(month)[04]    46.2900      0.518     89.433      0.000      45.270      47.310
C(month)[05]    52.5600      0.518    101.547      0.000      51.540      53.580
C(month)[06]    58.0400      0.518    112.134      0.000      57.020      59.060
C(month)[07]    61.9000      0.518    119.592      0.000      60.880      62.920
C(month)[08]    60.5200      0.518    116.926      0.000      59.500      61.540
C(month)[09]    56.4800      0.518    109.120      0.000      55.460      57.500
C(month)[10]    49.4950      0.518     95.625      0.000      48.475      50.515
C(month)[11]    42.5800      0.518     82.265      0.000      41.560      43.600
C(month)[12]    39.5300      0.518     76.373      0.000      38.510      40.550
==============================================================================
Omnibus:                        5.430   Durbin-Watson:                   1.529
Prob(Omnibus):                  0.066   Jarque-Bera (JB):                5.299
Skew:                          -0.281   Prob(JB):                       0.0707
Kurtosis:                       3.463   Cond. No.                         1.00
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

포뮬러 문자열에서 +0을 제외하면 full rank 방식을 사용한다. 이 때는 1월의 평균 기온을 기준으로 각 월의 평균 기온이 얼마나 더 높은지를 나타내는 값이 회귀모형의 계수가 된다.

In [15]:
model = sm.OLS.from_formula("value ~ C(month)", df_nottem)
result = model.fit()
print(result.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  value   R-squared:                       0.930
Model:                            OLS   Adj. R-squared:                  0.927
Method:                 Least Squares   F-statistic:                     277.3
Date:                Tue, 13 Nov 2018   Prob (F-statistic):          2.96e-125
Time:                        20:20:57   Log-Likelihood:                -535.82
No. Observations:                 240   AIC:                             1096.
Df Residuals:                     228   BIC:                             1137.
Df Model:                          11                                         
Covariance Type:            nonrobust                                         
==================================================================================
                     coef    std err          t      P>|t|      [0.025      0.975]
----------------------------------------------------------------------------------
Intercept         39.6950      0.518     76.691      0.000      38.675      40.715
C(month)[T.02]    -0.5050      0.732     -0.690      0.491      -1.947       0.937
C(month)[T.03]     2.5000      0.732      3.415      0.001       1.058       3.942
C(month)[T.04]     6.5950      0.732      9.010      0.000       5.153       8.037
C(month)[T.05]    12.8650      0.732     17.575      0.000      11.423      14.307
C(month)[T.06]    18.3450      0.732     25.062      0.000      16.903      19.787
C(month)[T.07]    22.2050      0.732     30.335      0.000      20.763      23.647
C(month)[T.08]    20.8250      0.732     28.450      0.000      19.383      22.267
C(month)[T.09]    16.7850      0.732     22.931      0.000      15.343      18.227
C(month)[T.10]     9.8000      0.732     13.388      0.000       8.358      11.242
C(month)[T.11]     2.8850      0.732      3.941      0.000       1.443       4.327
C(month)[T.12]    -0.1650      0.732     -0.225      0.822      -1.607       1.277
==============================================================================
Omnibus:                        5.430   Durbin-Watson:                   1.529
Prob(Omnibus):                  0.066   Jarque-Bera (JB):                5.299
Skew:                          -0.281   Prob(JB):                       0.0707
Kurtosis:                       3.463   Cond. No.                         12.9
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

보스턴 집값 데이터의 범주형 변수

보스턴 집값 데이터는 CHAS라는 범주형 변수를 가지고 있다. 이 변수는 0과 1 두 개의 값(클래스)를 가지므로 이미 full rank 더미 변수로 변환되어 있는 것과 비슷하다. 즉 다음과 같은 두 개의 모형을 각각 회귀분석하는 경우라고 볼 수 있다.

  • CHAS = 1 인 경우, $$ y = (w_0 + w_{\text{CHAS}}) + w_{\text{CRIM}} \text{CRIM} + w_{\text{ZN}} \text{ZN} + \cdots $$

  • CHAS = 0 인 경우, $$ y = w_0 + w_{\text{CRIM}} \text{CRIM} + w_{\text{ZN}} \text{ZN} + \cdots $$

In [16]:
from sklearn.datasets import load_boston

boston = load_boston()
dfX0_boston = pd.DataFrame(boston.data, columns=boston.feature_names)
dfX_boston = sm.add_constant(dfX0_boston)
dfy_boston = pd.DataFrame(boston.target, columns=["MEDV"])
df_boston = pd.concat([dfX_boston, dfy_boston], axis=1)
In [17]:
model = sm.OLS(dfy_boston, dfX_boston)
result = model.fit()
print(result.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                   MEDV   R-squared:                       0.741
Model:                            OLS   Adj. R-squared:                  0.734
Method:                 Least Squares   F-statistic:                     108.1
Date:                Tue, 13 Nov 2018   Prob (F-statistic):          6.72e-135
Time:                        20:20:58   Log-Likelihood:                -1498.8
No. Observations:                 506   AIC:                             3026.
Df Residuals:                     492   BIC:                             3085.
Df Model:                          13                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const         36.4595      5.103      7.144      0.000      26.432      46.487
CRIM          -0.1080      0.033     -3.287      0.001      -0.173      -0.043
ZN             0.0464      0.014      3.382      0.001       0.019       0.073
INDUS          0.0206      0.061      0.334      0.738      -0.100       0.141
CHAS           2.6867      0.862      3.118      0.002       0.994       4.380
NOX          -17.7666      3.820     -4.651      0.000     -25.272     -10.262
RM             3.8099      0.418      9.116      0.000       2.989       4.631
AGE            0.0007      0.013      0.052      0.958      -0.025       0.027
DIS           -1.4756      0.199     -7.398      0.000      -1.867      -1.084
RAD            0.3060      0.066      4.613      0.000       0.176       0.436
TAX           -0.0123      0.004     -3.280      0.001      -0.020      -0.005
PTRATIO       -0.9527      0.131     -7.283      0.000      -1.210      -0.696
B              0.0093      0.003      3.467      0.001       0.004       0.015
LSTAT         -0.5248      0.051    -10.347      0.000      -0.624      -0.425
==============================================================================
Omnibus:                      178.041   Durbin-Watson:                   1.078
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              783.126
Skew:                           1.521   Prob(JB):                    8.84e-171
Kurtosis:                       8.281   Cond. No.                     1.51e+04
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 1.51e+04. This might indicate that there are
strong multicollinearity or other numerical problems.

위 분석에서 두 데이터 그룹은 찰스강에 인접하지 않은 집의 가격 모형은 상수항이 $36.4911$이지만 찰스강에 인접한 집의 가격 모형은 상수항이 $36.4911 + 2.6886 = 39.1797$이라는 것을 알 수 있다.

연습 문제 1

  1. from_formula 메서드를 사용하여 보스턴 집값 예측 문제를 다시 풀어라. C()를 사용하여 범주형값임을 명시적으로 지정하는 것을 잊으면 안된다.
  2. 모형 문자열에서 상수항을 없애지 말고 다시 푼다. 이때 CHAS 변수의 가중치는 무엇을 뜻하는가.

ContrastMatrix

만약 full rank 나 reduced rank 방식이 아니라 사용자가 원하는 특정한 값으로 인코딩을 하고 싶다면 ContrastMatrix 클래스를 사용한다. ContrastMatrix 행렬은 각 클래스가 인코딩 될 인코딩 벡터 목록을 미리 정의한 행렬이다.

In [18]:
df4 = pd.DataFrame(demo_data("a", nlevels=3))
df4
Out:
a
0 a1
1 a2
2 a3
3 a1
4 a2
5 a3

예를 들어 위 데이터에서 "a2"와 "a3" 카테고리를 하나의 카테고리로 묶어서 인코딩하고 싶다면 다음처럼 코딩한다.

In [19]:
encoding_vectors = [[1, 0], [0, 1], [0, 1]]
label_postfix = [":a1", ":a2a3"]
contrast = ContrastMatrix(encoding_vectors, label_postfix)
dmatrix("C(a, contrast) + 0", df4)
Out:
DesignMatrix with shape (6, 2)
  C(a, contrast):a1  C(a, contrast):a2a3
                  1                    0
                  0                    1
                  0                    1
                  1                    0
                  0                    1
                  0                    1
  Terms:
    'C(a, contrast)' (columns 0:2)

상호작용이 있는 경우

만약 범주형 변수의 값이 달라질 때 상수항만 달라지는 것이 아니라 다른 독립 변수들이 미치는 영향도 달라지는 모형을 원한다면 상호작용(interaction)을 쓰면 된다. 예를 들어 범주형 입력 변수 $x_1$과 연속값 입력 변수 $x_2$를 가지는 회귀모형에서 연속값 입력 변수 $x_2$가 미치는 영향 즉 가중치가 범주형 입력 변수 $x_1$의 값에 따라 달라진다면 범주형 입력 변수를 더미 변수 $d_1$으로 인코딩하고 연속값 입력 변수 $x_2$는 $d_1$과의 상호작용 항 d_1:x_2 를 추가하여 사용한다.

이 때 모형은 다음과 같아진다. (reduced rank 모형의 경우)

$$ \text{모형}:\;\; \hat{y} = w_{d1}d_1 + w_{d2}d_2 + w_{d1,2}x_2 + w_{d2,2}d_2x_2 $$

그러면 남자인 경우($d=(1,0)$)에는

$$ \hat{y} = w_{d1} + w_{d1,2}x_2 $$

여자인 경우($d=(0,1)$)에는

$$ \hat{y} = w_{d2} + (w_{d1,2} + w_{d2,2})x_2 $$

이 된다.

In [20]:
df5 = pd.DataFrame(demo_data("a", "x"))
df5
Out:
a x
0 a1 1.764052
1 a2 0.400157
2 a1 0.978738
3 a2 2.240893
4 a1 1.867558
5 a2 -0.977278
In [21]:
dmatrix("0 + C(a) + x + C(a):x", df5)
Out:
DesignMatrix with shape (6, 4)
  C(a)[a1]  C(a)[a2]         x  C(a)[T.a2]:x
         1         0   1.76405       0.00000
         0         1   0.40016       0.40016
         1         0   0.97874       0.00000
         0         1   2.24089       2.24089
         1         0   1.86756       0.00000
         0         1  -0.97728      -0.97728
  Terms:
    'C(a)' (columns 0:2)
    'x' (column 2)
    'C(a):x' (column 3)

두 개 이상의 범주형 변수가 있는 경우

In [22]:
df6 = pd.DataFrame(demo_data("a", "b", nlevels=3))
df6
Out:
a b
0 a1 b1
1 a1 b2
2 a1 b3
3 a2 b1
4 a2 b2
5 a2 b3
6 a3 b1
7 a3 b2
8 a3 b3
In [23]:
dmatrix("0 + a + b", df6)
Out:
DesignMatrix with shape (9, 5)
  a[a1]  a[a2]  a[a3]  b[T.b2]  b[T.b3]
      1      0      0        0        0
      1      0      0        1        0
      1      0      0        0        1
      0      1      0        0        0
      0      1      0        1        0
      0      1      0        0        1
      0      0      1        0        0
      0      0      1        1        0
      0      0      1        0        1
  Terms:
    'a' (columns 0:3)
    'b' (columns 3:5)
In [24]:
dmatrix("0 + a + b", df6)
Out:
DesignMatrix with shape (9, 5)
  a[a1]  a[a2]  a[a3]  b[T.b2]  b[T.b3]
      1      0      0        0        0
      1      0      0        1        0
      1      0      0        0        1
      0      1      0        0        0
      0      1      0        1        0
      0      1      0        0        1
      0      0      1        0        0
      0      0      1        1        0
      0      0      1        0        1
  Terms:
    'a' (columns 0:3)
    'b' (columns 3:5)
In [25]:
level_a = ["a3", "a2", "a1"]
level_b = ["b2", "b1", "b3"]

dmatrix("0 + C(a, levels=level_a) + C(b, levels=level_b)", df6, return_type="dataframe")
Out:
C(a, levels=level_a)[a3] C(a, levels=level_a)[a2] C(a, levels=level_a)[a1] C(b, levels=level_b)[T.b1] C(b, levels=level_b)[T.b3]
0 0.0 0.0 1.0 1.0 0.0
1 0.0 0.0 1.0 0.0 0.0
2 0.0 0.0 1.0 0.0 1.0
3 0.0 1.0 0.0 1.0 0.0
4 0.0 1.0 0.0 0.0 0.0
5 0.0 1.0 0.0 0.0 1.0
6 1.0 0.0 0.0 1.0 0.0
7 1.0 0.0 0.0 0.0 0.0
8 1.0 0.0 0.0 0.0 1.0

질문/덧글

더미 변수의 예3에 대해 질문드립니다. giwo*** 2016년 10월 10일 7:30 오후

더미 변수 예3의 Y 식을 보면 D2, D3 뿐만 아니라 D4, D5까지 있는데
설명에서는 D2, D3에만 값을 부여하고 설명하고 있는데요.
D4, D5의 값에 대한 언급이 없는데 따로 말하지 않아도 D2값과 D4값이 같고, D3와 D5값이 같은 것으로 하는 것인지 궁금합니다.

답변: 더미 변수의 예3에 대해 질문드립니다. 관리자 2016년 10월 12일 7:06 오후

네, 지적하신대로 D2값과 D4값이 같고, D3와 D5값이 같은 것으로 합니다. 본문을 수정하였습니다.

분산분석 표 ssr, df_diff, ss_diff의 의미 tada*** 2017년 6월 12일 3:27 오후

마지막 분산분석 표에서 ssr, df_diff, ss_diff의 의미는 무엇인가요?

상호 작용이 있는 경우 chan*** 2018년 11월 8일 3:23 오전

상호 작용이 있는 경우 full rank의 모형은
$$\hat{y} = w_{d1} + w_{d1,2}x_2$$
$$\hat{y} = (w_{d1} + w_{d2}) + (w_{d1,2} + w_{d2,2})x_2$$
형태가 되는 건가요? 상호작용 샘플로 제시해주신 코드의 결과를 보면 a는 reduced rank로 처리되고 a:x는 full rank 형태로 처리된 것처럼 보여서 헷갈립니다

답변: 상호 작용이 있는 경우 관리자 2018년 11월 8일 9:47 오전

본문을 수정하였습니다. 지적 감사합니다.

두 가지의 범주 값이 있는 경우 cowb*** 2018년 11월 9일 8:59 오후

만약 모형에서 " - 1" 또는 " + 0"을 붙여 상수항을 없애면 full rank 더미 변수 모형을 적용한다.
여기서 full rank 더미 변수모형이 아니고 reduced rank 아닌가요??

DesignMatrix with shape (4, 2)

x1[남] x1[여]
1 0
1 0
0 1
0 1

이거는 reduced rank 같습니다

답변: 두 가지의 범주 값이 있는 경우 관리자 2018년 11월 12일 7:12 오후

수정하였습니다. 지적 감사합니다.