요인변수
- 대출 목적: '부채 정리', '결혼', '자동차' 등
- 지표변수(indicator variable): 예/아니오 등 두 가지 값을 갖는 이진변수
- 요인변수의 값은 '텍스트' 값이므로 숫자로 변환해야 데이터 분석에 활용할 수 있다
텍스트 값을 숫자로 바꾸는 방법
- 기준 부호화.(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 Family와 PropertyTypeTownhouse을 볼 수 있음
- 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
다양한 수준을 갖는 요인변수
- 이런 경우 데이터와 예측변수와 결과 간의 관계를 탐색하여 유용한 정보가 범주에 포함되는지 결정
- 모든 요소를 유지할 것인지 수준을 통합하여 처리할 것인지도 결정
- 주택 가격과 주택의 위치는 많은 관계가 있으므로 우편번호는 중요한 정보가 될 수 있음
- 처음에 만들었던 회귀모델식은 자유도가 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
순서가 있는 요인변수