범주형 데이터처리 기초개념

2019-04-22

.

그림, 실습코드 등 학습자료 출처 :

1) https://datascienceschool.net

2) https://kkokkilkon.tistory.com/37

1. 연속형 변수와 범주형 변수

1) 연속형 변수

통상 실수값으로 이루어져 있으며, 끊키는 부분 없이 연속적으로 값을 가진다.

EX) 키, 몸무게, 온도, 나이 등

2) 범주형 변수

문자 또는 숫자로 이루어져 있으며, 범주(카테고리)가 있다.

EX) 학년, 혈액형, 성별 등

여기서 주의해야 할 점은 범주형 값은 아닌경우도 있지만 통상 여러개의 다른 상태를 나타내는 값이지 각각의 범주간에 의미가 있는 것은 아니다. 예를들어서 “2학년”이라는 값이 “1학년”이라는 값보다 2배 더 크다는 뜻이 아니다.

다만 이런것은 케이스마다 다르므로 의미를 잘 해석해야한다. 예를들어 A등급 B등급 C등급 같이 등급이 있고 등급의 기준이 숫자로 정의할 수 있다면 이는 또 다른문제가 되는 것이다.

2. 범주형 독립변수의 처리방안

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

더미변수는 범주형 변수를 연속형 변수로 변환한 것인데, 정확히 따지자면 연속형 변수처럼 만든 것이다.

3. 더미변수

더미변수는 0 또는 1만으로 표현되는 값으로 어떤 특징(feature)이 존재하는가 존재하지 않는가를 표시하는 독립 변수이다.

더미변수로 범주형 변수를 실수형 범주로 변환하면 분석기법을 사용할 수 있다.

예를 들어 선형회귀분석, 로지스틱 회귀분석 등은 설명변수가 연속형 변수여야지 사용할 수 있는 분석 기법이다. 하지만 만약 설명변수 중에 범주형 변수가 섞여 있다면, 그 변수를 더미변수로 변환 즉, 연속형 변수스럽게 만들어서 회귀분석을 사용할 수 있다.

4. 더미변수의 특징

1) 더미변수는 0 또는 1의 값을 가진다.

해당 더미변수에 속하면 1 아니면 0의 값을 가진다.

기준이 되는 범주는 값이 0이 된다.

2) 더미변수는 원래 범주형 변수의 범주 개수보다 1개 적게 만들어진다.

예를 들어 원래 변수가 성별이라면 남성여부 또는 여성여부 둘 중에 하나만 만든다.

(범주의 개수 2개, 더미변수 1개)

예를들어 범주가 위관장교의 계급이라면 ‘소위’ 여부와 ‘중위’여부 또는 ‘중위’여부와 ‘대위’여부 또는 ‘소위’ 여부와 ‘대위’여부 이렇게 만든다.

(범주의 개수 3개, 더미변수 2개)

더미변수로 만들어지지 않고 생략되는 범주는 기준이 되는 값이다.

5. reduced rank 더미변수 방식과 full rank 방식

1) reduced rank 방식

범주형 변수 x1 을 (1,0) 또는 (0,1) 값을 가지는 d 라는 더미 변수로 바꾸는 것이다.

\[\ \begin{eqnarray} x="male" & \rightarrow & d=(1, 0) \\ x="female" & \rightarrow & d=(0, 1) \\ \end{eqnarray}\]

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

\[\ \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\]

즉, 남자인 경우와 여자인 경우는 상수항만 달라지고 다른 독립 변수에 의한 영향은 같다.

더미변수의 가중치인 wd1, wd2가 의미하는 바는 각각 남자인 경우의 상수항과 여자인 경우의 상수항이 된다. 이러한 방법을 reduced rank 더미변수 모형이라고 한다.

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

2) full rank 방식

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

\[\ \begin{eqnarray} x="male" & \rightarrow & d=(1, 0) \\ x="female" & \rightarrow & d=(1, 1) \\ \end{eqnarray}\]

이때 모형은 reduced rank 방식과 같지만,

\[\ \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 방식과 같다. 하지만 더미 변수의 가중치인 wd1,wd2가 의미하는 바는 달라진다.

wd1 는 기준이 되는 남자의 상수항이고 wd2는 여자인 경우가 남자인 경우보다 상수항이 얼마나 더 증가하는지를 나타내는 숫자가 된다. 이러한 방식을 full rank 더미 변수 모형이라고 한다.

6. full rank 방식을 이용한 더미변수 생성예시

1

예를 들어 위와 같은 데이터가 있고 시즌득점수를 예측하는 선형회귀분석 모델을 위의 데이터로 만들어본다고 가정하자.

STEP1) 범주형 변수의 범주 중 기준이 되는 값을 정한다.

기준이 되는 값은 통상 일반적이거나 빈도수가 많은 범주로 선택한다.

(반드시 그래야하는 법은 아니다)

포지션 변수의 범주는 공격수,수비수,미드필더 이렇게 3개인데 여기서는 수비수를 기준으로 한다.

발롱도르 수상여부의 범주는 Yes,No 이렇게 2개인데 여기서는 No를 기준으로 한다.

STEP2) 기준이 되는 변수를 제외하고 더미변수를 만든다.

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

from patsy import *

position = pd.DataFrame(["공격수", "수비수", "수비수", "공격수", "미드필더"], columns=["포지션"])
position
포지션
0 공격수
1 수비수
2 수비수
3 공격수
4 미드필더
dmatrix("포지션", position)
DesignMatrix with shape (5, 3)
  Intercept  포지션[T.미드필더]  포지션[T.수비수]
          1            0           0
          1            0           1
          1            0           1
          1            0           0
          1            1           0
  Terms:
    'Intercept' (column 0)
    '포지션' (columns 1:3)
ballon = pd.DataFrame(["Yes", "No", "No", "Yes", "No"], columns=["발롱도르_수상여부"])
ballon
발롱도르_수상여부
0 Yes
1 No
2 No
3 Yes
4 No
dmatrix("발롱도르_수상여부", ballon)
DesignMatrix with shape (5, 2)
  Intercept  발롱도르_수상여부[T.Yes]
          1                 1
          1                 0
          1                 0
          1                 1
          1                 0
  Terms:
    'Intercept' (column 0)
    '발롱도르_수상여부' (column 1)

아래 그림처럼 기준인 ‘No’ 범주와 ‘공격수’ 범주를 제외하고 더미변수를 만든다.

공격수인 경우는 ‘포지션 미드필더’, ‘포지션 수비수’ 컬림의 데이터값이 (0,0)인 것이다.

2

이렇게 생성한 더미변수를 연속형 변수로 설명변수를 꾸려서 회귀분석을 실시하면 된다.

7. 더미변수의 의미

더미변수는 회귀식에서 해당 변수의 효과를 0 또는 상수값으로 만들어준다.

다시말해 상수항만 달라지게되고 다른 독립변수에 의한 영향은 같다.

선형회귀모형에 범주형 독립변수가 포함되면 더미변수외에 별도의 상수항이 있으면 안된다.

8. 범주형 변수 처리 예시 2

“맨유”, “첼시”, “아스날”, “토튼햄” 종류가 있는 프리미어리그 팀종류와 같이 범주형 변수가 가질 수 있는 범주 값이 세 가지 이상인 경우에는 더미 변수의 차원이 해당하는 개수로 증가한다.

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

\[\ \begin{eqnarray} x&=&"ManUnited" & \rightarrow & d=(1, 0, 0, 0) \\ x&=&"Arsenal" & \rightarrow & d=(1, 1, 0, 0) \\ x&=&"Chelsea" & \rightarrow & d=(1, 0, 1, 0) \\ x&=&"Tottenham" & \rightarrow & d=(1, 0, 0, 1) \\ \end{eqnarray}\]

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

\[\ \begin{eqnarray} x&=&"ManUnited" & \rightarrow & d=(1, 0, 0, 0) \\ x&=&"Arsenal" & \rightarrow & d=(0, 1, 0, 0) \\ x&=&"Chelsea" & \rightarrow & d=(0, 0, 1, 0) \\ x&=&"Tottenham" & \rightarrow & d=(0, 0, 0, 1) \\ \end{eqnarray}\]
df = pd.DataFrame(["맨유", "맨유", "첼시", "아스날", "토튼햄", "토튼햄", "첼시"], columns=["team"])
df
team
0 맨유
1 맨유
2 첼시
3 아스날
4 토튼햄
5 토튼햄
6 첼시
# full rank방식
dmatrix("team", df)
DesignMatrix with shape (7, 4)
  Intercept  team[T.아스날]  team[T.첼시]  team[T.토튼햄]
          1            0           0            0
          1            0           0            0
          1            0           1            0
          1            1           0            0
          1            0           0            1
          1            0           0            1
          1            0           1            0
  Terms:
    'Intercept' (column 0)
    'team' (columns 1:4)
# reduced rank (원-핫-인코딩방식)
dmatrix("team + 0", df)
DesignMatrix with shape (7, 4)
  team[맨유]  team[아스날]  team[첼시]  team[토튼햄]
         1          0         0          0
         1          0         0          0
         0          0         1          0
         0          1         0          0
         0          0         0          1
         0          0         0          1
         0          0         1          0
  Terms:
    'team' (columns 0:4)

9. ContrastMatrix

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

예시) “독일” 하나와 “미국”,”영국” 카테고리의 나머지 하나의 카테고리로 묶어서 인코딩하고 싶다면 다음처럼 코딩한다.

df = pd.DataFrame(["독일", "미국", "영국", "독일", "미국", "영국"], columns=["nation"])
df
nation
0 독일
1 미국
2 영국
3 독일
4 미국
5 영국
encoding_vectors = [[1, 0], [0, 1], [0, 1]]
label_postfix = ["독일", "영/미"]
contrast = ContrastMatrix(encoding_vectors, label_postfix)
dmatrix("C(nation, contrast) + 0", df)
DesignMatrix with shape (6, 2)
  C(nation, contrast)독일  C(nation, contrast)영/미
                      1                       0
                      0                       1
                      0                       1
                      1                       0
                      0                       1
                      0                       1
  Terms:
    'C(nation, contrast)' (columns 0:2)

10. 범주형 변수 간 상호작용이 있는 경우

만약 범주형 변수의 값이 달라질 때 상수항만 달라지는 것이 아니라 다른 독립 변수들이 미치는 영향도 달라지는 모형을 원한다면 interaction(상호작용)을 쓰면 된다.

예를 들어 범주형 입력 변수 x1 과 연속값 입력 변수 x2를 가지는 회귀모형에서 연속값 입력 변수 x1이 미치는 영향 즉 가중치가 범주형 입력 변수 x1의 값에 따라 달라진다면 범주형 입력 변수를 더미 변수 d1으로 인코딩하고 연속값 입력 변수 x2는 d1과의 상호작용 항 d1:x2 를 추가하여 사용한다.

reduced rank 모형의 경우 이때 모형은 아래와같다.

\[\ \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\) 가 된다.

df5 = pd.DataFrame(demo_data("a", "x"))
df5
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
dmatrix("0 + C(a) + x + C(a):x", df5)
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)