스타의 도서관/통계학

R을 이용한 통계 분석 - 나무모형

스타(star) 2012. 11. 24. 23:52


나무모형은 규칙의 형태로 자료를 나눌 수 있는 노드를 구성하고, 그 노드 내에 속하는 훈련자료의 구성비 등을 이용해 예측 모형을 구성하는 것입니다. 나무모형은 다른 모형에 비해 설명력이 높으나 불안정성으로 가지치기 등의 작업을 통해 최적의 모형을 도출해 내야합니다.

R을 이용해 나무모형을 구하기 위해서는 먼저 R 패키지의 tree를 설치해야 합니다.
그리고 분석할 데이터는 R에 자체적으로 기록되어 있는 피셔의 붓꽃자료를 이용하겠습니다.

R의 Data Manager에 검색해 보면 iris 라는 데이터가 존재합니다.


#tree라는 패키지를 설치 합니다.

> install.packages("tree")

> library(tree)

# iris를 바로 입력하면 데이터가 출력됩니다.


붓꽃 자료를 나무모형으로 만듭니다. formula는 Species~.가 됩니다. 여기서 .은 나머지 변수들을 말합니다. 주로 Species을 나누기 위한 것이고 그외에 나머지 변수들로 분류를 하겠다는 뜻입니다. 

> iris.tr = tree(Species~., iris)

 1) root 150 329.600 setosa ( 0.33333 0.33333 0.33333 )  

   2) Petal.Length < 2.45 50   0.000 setosa ( 1.00000 0.00000 0.00000 ) *

   3) Petal.Length > 2.45 100 138.600 versicolor ( 0.00000 0.50000 0.50000 )  

     6) Petal.Width < 1.75 54  33.320 versicolor ( 0.00000 0.90741 0.09259 )  

      12) Petal.Length < 4.95 48   9.721 versicolor ( 0.00000 0.97917 0.02083 )  

        24) Sepal.Length < 5.15 5   5.004 versicolor ( 0.00000 0.80000 0.20000 ) *

        25) Sepal.Length > 5.15 43   0.000 versicolor ( 0.00000 1.00000 0.00000 ) *

      13) Petal.Length > 4.95 6   7.638 virginica ( 0.00000 0.33333 0.66667 ) *

     7) Petal.Width > 1.75 46   9.635 virginica ( 0.00000 0.02174 0.97826 )  

      14) Petal.Length < 4.95 6   5.407 virginica ( 0.00000 0.16667 0.83333 ) *

      15) Petal.Length > 4.95 40   0.000 virginica ( 0.00000 0.00000 1.00000 ) *


이 자료들의 요약입니다. 위의 결과를 해보면 다음과 같습니다.

> summary(iris.tr)

Classification tree:

tree(formula = Species ~ ., data = iris)

Variables actually used in tree construction:

[1] "Petal.Length" "Petal.Width"  "Sepal.Length"

Number of terminal nodes:  6 

Residual mean deviance:  0.1253 = 18.05 / 144 

Misclassification error rate: 0.02667 = 4 / 150 


나무모형은 그래프가 생명입니다. 

이 모든 작업은 다음과 같은 plot을 그리기 위함이었습니다. 

다음과 같은 그래프를 가지게 되었습니다. 수직선의 길이는 불순도 감소의 정도를 말합니다. 

> plot(iris.tr)

> text(iris.tr)


아직 끝난 것이 아닙니다. 가지치기 작업을 통해서 최적의 나무모형 그래프를 그려보도록 합시다. 적당한 크기의 나무모형을 가지는 것이 좋습니다. 너무 많은 노드를 가지게 되면 노드의 분할을 정지하지 못하고, 너무 적은 노드를 가지게 되면 분류성능 향상에 큰 도움이 되지 않기 때문입니다. 

최적 나무 크기를 위한 C.V(cross-validation) 기법을 통해 알아보도록 하겠습니다.

> iris.cv=cv.tree(iris.tr, FUN=prune.tree)

> plot(iris.cv)

이 결과를 토대로 보자면 크기 변화에 따른 deviance의 변화를 그래프로 보여주고 있습니다. 노드의 수가 4~5일 때 최적의 모형이라고 할 수 있네요. C.V 기법은 자료를 임의로 등분해서 분석하므로 분석을 할 때마다 결과가 다를 수 있습니다. 

이제 가지치기를 완료한 크기가 4인 나무 모형을 그리도록 하겠습니다. 나무 모형을 요약한 결과들은 다음과 같습니다. 

> iris.best.4

 1) root 150 329.600 setosa ( 0.33333 0.33333 0.33333 )  

   2) Petal.Length < 2.45 50   0.000 setosa ( 1.00000 0.00000 0.00000 ) *

   3) Petal.Length > 2.45 100 138.600 versicolor ( 0.00000 0.50000 0.50000 )  

     6) Petal.Width < 1.75 54  33.320 versicolor ( 0.00000 0.90741 0.09259 )  

      12) Petal.Length < 4.95 48   9.721 versicolor ( 0.00000 0.97917 0.02083 ) *

      13) Petal.Length > 4.95 6   7.638 virginica ( 0.00000 0.33333 0.66667 ) *

     7) Petal.Width > 1.75 46   9.635 virginica ( 0.00000 0.02174 0.97826 ) *


> summary(iris.best.4)

Classification tree:

snip.tree(tree = iris.tr, nodes = c(7L, 12L))

Variables actually used in tree construction:

[1] "Petal.Length" "Petal.Width" 

Number of terminal nodes:  4 

Residual mean deviance:  0.1849 = 26.99 / 146 

Misclassification error rate: 0.02667 = 4 / 150 


위의 모형을 분석해 보면 아까보다 분할에 사용한 변수도 3개에서 2개로 줄어들었습니다. 하지만, 오분류 비율도 0.2667로 동일하네요.


우리가 구하고자 했던 setosa의 비율이 가장 높은 노드는 2번 노드입니다. 분할 규칙은 Petal.Length < 2.45 가 되겠네요.


가지 치기 이후의 결가를 보세요. 아까와 확연히 다른 모습을 알 수 있습니다. 

> plot(iris.best.4)

> text(iris.best.4)