더북(TheBook)

0에 가까운 분산(Near Zero Variance)

변수를 선택하는 기법 중 가장 단순한 방법은 변숫값의 분산을 보는 것이다. 예를 들어, 데이터 1,000개가 있는데 이 중 990개에서 변수 A의 값이 0, 10개에서 변수 A의 값이 1이라고 하자. 그러면 변수 A는 서로 다른 관찰을 구분하는 데 별 소용이 없다. 따라서 데이터 모델링에서도 그리 유용하지 않다. 이런 변수는 분산이 0에 가까우며, caret 패키지에서는 nearZeroVar( ) 함수를 사용해 이런 변수들을 쉽게 제거할 수 있게 해주고 있다.

표 9-7 분산을 사용한 변수 선택

caret::nearZeroVar : 데이터에서 분산이 0에 가까운 변수를 찾는다.

caret::nearZeroVar(
  x,  # 숫자를 저장한 행렬 또는 메트릭스(Metrics). 또는 숫자만 저장된 데이터 프레임
  # 변수에서 가장 많이 관찰되는 값의 개수와 두 번째로 많이 관찰되는 값의 개수의 비에 대한 컷오프
  freqCut=95/5,
  uniqueCut=10,  # 전체 데이터의 개수와 서로 다른 값의 개수의 비에 대한 컷오프
  # FALSE면 분산이 거의 0인 변수의 위치가 반환되고,
  # TRUE면 변수에 대한 정보가 저장된 데이터 프레임이 반환된다.
  saveMetrics=FALSE
)

분산이 거의 0인 경우로는 변수에 저장된 서로 다른 값의 개수가 1인 경우를 들 수 있다. 또, freqCut과 uniqueCut이 만족되지 않을 경우에도 분산이 거의 0인 경우로 본다.

반환 값은 saveMetrics 인자에 대한 설명을 참고하기 바란다.

mlbench 패키지의 콩Soybean 질병 데이터에 nearZeroVar( )를 적용해보자. 콩 질병 데이터에는 질병 분류를 저장한 Class 변수와 콩에 대해 조사한 35개 변수가 저장되어 있다.

> library(caret)
> library(mlbench)
> data(Soybean)
> nearZeroVar(Soybean, saveMetrics=TRUE)
                freqRatio percentUnique zeroVar   nzv
Class            1.010989     2.7818448   FALSE FALSE
date             1.137405     1.0248902   FALSE FALSE
plant.stand      1.208191     0.2928258   FALSE FALSE
precip           4.098214     0.4392387   FALSE FALSE
temp             1.879397     0.4392387   FALSE FALSE
hail             3.425197     0.2928258   FALSE FALSE
crop.hist        1.004587     0.5856515   FALSE FALSE
area.dam         1.213904     0.5856515   FALSE FALSE
sever            1.651282     0.4392387   FALSE FALSE
seed.tmt         1.373874     0.4392387   FALSE FALSE
germ             1.103627     0.4392387   FALSE FALSE
plant.growth     1.951327     0.2928258   FALSE FALSE
leaves           7.870130     0.2928258   FALSE FALSE
leaf.halo        1.547511     0.4392387   FALSE FALSE
leaf.marg        1.615385     0.4392387   FALSE FALSE
leaf.size        1.479638     0.4392387   FALSE FALSE
leaf.shread      5.072917     0.2928258   FALSE FALSE
leaf.malf       12.311111     0.2928258   FALSE FALSE
leaf.mild       26.750000     0.4392387   FALSE  TRUE
stem             1.253378     0.2928258   FALSE FALSE
lodging         12.380952     0.2928258   FALSE FALSE
stem.cankers     1.984293     0.5856515   FALSE FALSE
canker.lesion    1.807910     0.5856515   FALSE FALSE
fruiting.bodies  4.548077     0.2928258   FALSE FALSE
ext.decay        3.681481     0.4392387   FALSE FALSE
mycelium       106.500000     0.2928258   FALSE  TRUE
int.discolor    13.204545     0.4392387   FALSE FALSE
sclerotia       31.250000     0.2928258   FALSE  TRUE
fruit.pods       3.130769     0.5856515   FALSE FALSE
fruit.spots      3.450000     0.5856515   FALSE FALSE
seed             4.139130     0.2928258   FALSE FALSE
mold.growth      7.820896     0.2928258   FALSE FALSE
seed.discolor    8.015625     0.2928258   FALSE FALSE
seed.size        9.016949     0.2928258   FALSE FALSE
shriveling      14.184211     0.2928258   FALSE FALSE
roots            6.406977     0.4392387   FALSE FALSE

위 표에서 nzv 컬럼은 Near Zero Variance를 뜻하므로, nzv 컬럼에 TRUE로 표시된 변수들을 제거하면 된다.

nearZeroVar( ) 호출 시 saveMetrics를 지정하지 않으면 분산이 0에 가까운 변수에 해당하는 컬럼 번호를 곧바로 출력해준다. 따라서 이를 사용해 손쉽게 분산이 0에 가까운 컬럼들을 제거할 수 있다.

> nearZeroVar(Soybean)
[1] 19 26 28
> mySoybean <- Soybean[, -nearZeroVar(Soybean)]
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.