요인변수

  • 요인변수(factor variable) 또는 범주형 변수(categorical data): 데이터 값의 종류가 제한되어 있는 이산값을 갖는 변수
  • 요인변수의 예
    • 대출 목적: '부채 정리', '결혼', '자동차' 등
    • 지표변수(indicator variable): 예/아니오 등 두 가지 값을 갖는 이진변수
  • 요인변수의 값은 '텍스트' 값이므로 숫자로 변환해야 데이터 분석에 활용할 수 있다


텍스트 값을 숫자로 바꾸는 방법

  • 가변수(dummy variable): 회귀모델이나 다른 모델에서 요인 데이터를 사용하기 위해 \(0\)과 \(1\)의 이진값으로 부호화한 변수
  • 기준 부호화.(reference coding) 또는 처리 부호화(tretment coding): 통계학자들이 많이 사용히는 부호화 형태로, 여기서 한 요인을 기준으로 하고 다른 요인들이 이 기준에 따라 비교할 수 있도록 부호화하는 것
  • 원-핫 인코딩(one-hot encoding): 머신러닝 분야에서 많이 사용되는 부호화. 모든 요인 수준이 계속 유지된다. 어떤 머신러닝 알고리즘에서는 유용한 반면, 다중선형회귀에는 적합하지 않다
  • 편차 부호회(deviation coding) 또는 총합 대비(sum contrast): 기준 수준과는 반대로 전체 평균에 대해 각수준을 비교하는 부호화 방법


가변수 표현 Dummy Variables Representation

  • 킹 카운티 주택 가격 데이터 중 주거 형태에 관한 요인변수는 3종류
    • Multiplex, Single Family, Townhouse

> house <- read.csv('house_sales.csv', sep='\t')
> head(house[, 'PropertyType'])
[1] Multiplex     
[2] Single Family
[3] Single Family
[4] Single Family
[5] Single Family
[6]Townhouse
Levels: Multiplex Single Family Townhouse


  • 주거 형태의 요인변수를 원-핫 인코딩을 통해 이진변수로 만들기
> prop_type_dummies <- model.matrix(~PropertyType -1, data=house)
> head(prop_type_dummies)
  PropertyTypeMultiplex PropertyTypeSingle Family PropertyTypeTownhouse
1                     1                         0                     0
2                     0                         1                     0
3                     0                         1                     0
4                     0                         1                     0
5                     0                         1                     0
6                     0                         0                     1

  • 회귀분석에서 \(P\)개의 개별 수준을 갖는 요인변수는 보통 \(P-1\)개의 열을 갖는 행렬로 표시
    • 회귀모델식에 일반적으로 절편이 포함
    • 절편이 있기 때문에 \(P-1\) 개의 이진변수의 값을 정의하고 나면, \(P\)번째 값을 알 수 있음
    • \(P\)번째 값까지 넣게 되면 이러한 중복성이 문제가 다중공선성(multicollinearity error) 오류가 발생할 수 있음
  • R에서는 첫 번째 요인 수준을 기준으로 하고 나머지 수준을 이 기준에 상대적인 것으로 해석
> prop_type_dummies <- model.matrix(~PropertyType, data=house)
> head(prop_type_dummies)
  (Intercept) PropertyTypeSingle Family PropertyTypeTownhouse
1           1                         0                     0
2           1                         1                     0
3           1                         1                     0
4           1                         1                     0
5           1                         1                     0
6           1                         0                     1


  • 회귀분석을 해보면 PropertyType에 해당하는 두 계수 PropertyTypeSingle FamilyPropertyTypeTownhouse을 볼 수 있음
    • PropertyType에는 3개의 종류가 있지만 PropertyTypeSingle Family == 0이면서  PropertyTypeTownhouse == 0인 것은 상대적으로 PropertyTypeMutiplex가 되므로 따로 계수를 설정하지 않음
    • PropertyTypeSingle Family의 계수가 -98190이므로  PropertyTypeMutiplex에 비해 약 $98,190정도 낮음
    • PropertyTypeTownhouse의 계수는 -119000이므로 PropertyTypeMutiplex에 비해 약 $119,000정도 낮음
> lm(AdjSalePrice ~ SqFtTotLiving + SqFtLot + Bathrooms + Bedrooms +  BldgGrade + PropertyType, data=house)

Call:
lm(formula = AdjSalePrice ~ SqFtTotLiving + SqFtLot + Bathrooms + 
    Bedrooms + BldgGrade + PropertyType, data = house)

Coefficients:
              (Intercept)              SqFtTotLiving                    SqFtLot                  Bathrooms  
               -4.409e+05                  2.072e+02                 -2.314e-02                 -1.500e+04  
                 Bedrooms                  BldgGrade  PropertyTypeSingle Family      PropertyTypeTownhouse  
               -4.957e+04                  1.122e+05                 -9.819e+04                 -1.189e+05  



다양한 수준을 갖는 요인변수

  • 우편번호(zip code): 미국에는 43,00개의 우편번호가 있음
  • 이런 경우 데이터와 예측변수와 결과 간의 관계를 탐색하여 유용한 정보가 범주에 포함되는지 결정
  • 모든 요소를 유지할 것인지 수준을 통합하여 처리할 것인지도 결정
  • 킹스카운티에는 82개의 우편번호가 있음
    • 주택 가격과 주택의 위치는 많은 관계가 있으므로 우편번호는 중요한 정보가 될 수 있음
    • 모든 요소를 포함하려면 81개의 계수가 필요
    • 처음에 만들었던 회귀모델식은 자유도가 5개(SqFtTotLiving, SqFtLot, Bathrooms, Bedrooms, BldgGrade)
    • 매매 가격과 같은 다른 변수에 따라 우편번호를 그룹으로 묶어서 분석
  • 초기 모델의 잔차를 사용하여 우편번호 그룹을 만드는 방법도 좋음
> house_lm <- lm(AdjSalePrice ~ SqFtTotLiving + SqFtLot + Bathrooms + Bedrooms + BldgGrade, data=house, na.action=na.omit)
> zip_groups <- house %>%
+     mutate(resid = residuals(house_lm)) %>%
+     group_by(ZipCode) %>%
+     summarize(med_resid = median(resid),
+               cnt = n()) %>%
+     # sort the zip codes by the median residual
+     arrange(med_resid) %>%
+     mutate(cum_cnt = cumsum(cnt),
+            ZipGroup = factor(ntile(cum_cnt, 5)))
> house <- house %>%
+     left_join(select(zip_groups, ZipCode, ZipGroup), by='ZipCode')
> table(house$ZipCode)

   -1  9800 89118 98001 98002 98003 98004 98005 98006 98007 98008 98010 98011 98014 98019 98022 98023 98024 
 4374     1     1   358   180   241   293   133   460   112   291    56   163    85   242   188   455    31 
98027 98028 98029 98030 98031 98032 98033 98034 98038 98039 98040 98042 98043 98045 98047 98050 98051 98052 
  366   252   475   263   308   121   517   575   788    47   244   641     1   222    48     7    32   614 
98053 98055 98056 98057 98058 98059 98065 98068 98070 98072 98074 98075 98077 98092 98102 98103 98105 98106 
  499   332   402     4   420   513   430     1    89   245   502   388   204   289   106   671   313   361 
98107 98108 98109 98112 98113 98115 98116 98117 98118 98119 98122 98125 98126 98133 98136 98144 98146 98148 
  296   155   149   357     1   620   364   619   492   260   380   409   473   465   310   332   287    40 
98155 98166 98168 98177 98178 98188 98198 98199 98224 98288 98354 
  358   193   332   216   266   101   225   393     3     4     9 
> table(house$ZipGroup)

   1    2    3    4    5 
4822 7905 3990 5259 5087 


순서가 있는 요인변수

  • 순서 요인변수(ordered factor variable) 또는 순서 범주형 변수(ordered categorical variable): 요인의 수준이 순서를 갖는 요인변수
  • 순서 요인변수의 예
    • 대출 등급: A, B, C 등으로 각 등급은 이전 등급보다 위험이 크다
  • 순서 요인변수도 숫자로 변환하여 그대로 사용
  • 킹 카운티 주택 가격 데이터 중 BldgGrade 변수가 순서 요인변수


'Predictive Analytics' 카테고리의 다른 글

회귀 진단: 가설 검정  (0) 2019.09.27
회귀식 해석  (0) 2019.09.27
회귀를 이용한 예측  (0) 2019.09.26
가중회귀  (0) 2019.09.26
모델 선택 및 단계적 회귀  (0) 2019.09.24

+ Recent posts