caret의 findCorrelation( )의 동작 방식은 다음과 같다.[9] (1) 상관 계수 행렬을 입력으로 받아 상관 계수가 cutoff를 넘는 변수 쌍 A, B를 찾는다. (2) A와 B 중 둘을 제외한 다른 변수와의 상관 계수가 큰 변수 하나를 삭제한다. (3) 1 ~ 2를 계속 반복하면서 상관 계수가 높은 변수들을 제거해나간다.

    4가지 종류의 자동차에 대한 속성을 나열한 데이터인 mlbench의 Vehicle에 대해 findCorrelation( )을 적용해보자. 다음 코드에서 subset( )은 분류에 해당하는 Class 컬럼을 제거하는 목적으로 사용되었고, cor( )은 상관 계수 행렬을 계산하는 함수다.

    > library(mlbench)
    > library(caret)
    > data(Vehicle)
    > findCorrelation(cor(subset(Vehicle, select=-c(Class))))
    [1] 3 8 11 7 9 2
    

    실행 결과 3, 8, 11, 7, 9, 2번째 컬럼의 상관 계수가 높은 것으로 나타났다. 상관 계수 값들이 어떤지 직접 살펴보면 대부분 0.7을 넘는 상당히 큰 값임을 알 수 있다.

    > cor(subset(Vehicle, select=-c(Class)))[c(3, 8, 11, 7, 9, 2), c(3, 8, 11, 7, 9, 2)]
                     D.Circ      Elong Sc.Var.Maxis    Scat.Ra Pr.Axis.Rect       Circ
    D.Circ        1.0000000 -0.9123072    0.8644323  0.9072801    0.8953261  0.7984920
    Elong        -0.9123072  1.0000000   -0.9383919 -0.9733853   -0.9505124 -0.8287548
    Sc.Var.Maxis  0.8644323 -0.9383919    1.0000000  0.9518621    0.9382664  0.8084963
    Scat.Ra       0.9072801 -0.9733853    0.9518621  1.0000000    0.9920883  0.8603671
    Pr.Axis.Rect  0.8953261 -0.9505124    0.9382664  0.9920883    1.0000000  0.8579253
    Circ          0.7984920 -0.8287548    0.8084963  0.8603671    0.8579253  1.0000000
    

    따라서 이들 변수를 제거하여 상관 계수가 낮은 변수들만 사용하도록 할 수 있다.

    > myVehicle <- Vehicle[, -c(3, 8, 11, 7, 9, 2)]
    

    caret::findCorrelation( )이 제거해야 할 변수들을 알려준다면, FSelector 패키지에는 선택해야 할 변수들을 알려주는 함수들이 있다. linear.correlation( )과 rank.correlation( )은 상관 계수로부터 변수의 중요도를 구하는 함수로, 각각 피어슨 상관 계수Pearson Correlation와 스피어만 상관 계수Spearman’s Correlation를 사용한다. 이들 함수는 예측 대상이 되는 분류와 예측 변수 간의 상관 계수를 계산하고 상관 계수가 높은 변수들을 사용하도록 추천한다.

    다음은 mlbench의 Ozone 데이터에서 예측 대상이 되는 변수인 V4와 나머지 변수들 간의 피어슨 상관 계수를 구하고, 피어슨 상관 계수의 절댓값으로 변수의 중요도를 평가한 예다. V1, V2, V3은 팩터형 변수므로 계산에서 제외되었다.

    > install.packages("FSelector")
    > library(FSelector)
    > library(mlbench)
    > data(Ozone)
    > (v <- linear.correlation(V4 ~ .,
    +           data=subset(Ozone, select=-c(V1, V2, V3))))
        attr_importance
    V5       0.58414447
    V6       0.00468138
    V7       0.44356639
    V8       0.76986408
    V9       0.72317299
    V10      0.58026757
    V11      0.22990285
    V12      0.73194978
    V13      0.41471463
    

    실행 결과 V8, V12, V9 등이 V4와 상관 계수가 큰 것으로 보인다. cutoff.k( )를 사용하면 V4와 상관 계수 값이 큰 변수들을 손쉽게 찾을 수 있다. 다음은 상관 계수가 큰 변수 3개를 찾은 예다.

    > cutoff.k(v, 3)
    [1] "V8" "V12" "V9"
    
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.