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)]
    
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.