#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)
'스타의 도서관 > 통계학' 카테고리의 다른 글
통계상담의뢰서 (0) | 2012.11.27 |
---|---|
통계상담결과보고서 (0) | 2012.11.27 |
R을 이용한 통계 분석 - 연관규칙 (1) | 2012.11.24 |
R을 이용한 통계 분석 - 히스토그램, 밀도그림 (0) | 2012.11.20 |
R을 이용한 통계 분석 - 상자그림, 이상치(Outlier) 의 파악 (0) | 2012.11.19 |