Salah satu kriteria yang dapat digunakan untuk menentukan titik pemecah terbaik (optimal splitting point) adalah GINI index, yang biasanya digunakan dalam algoritma CART (C&RT) dan SPRINT (Gorunescu, 2011:165).
Dalam penerapan GINI index untuk data berskala continuous, terdapat beberapa metode yang dapat digunakan untuk menentukan titik pemecah terbaik, yakni metode brute-force dan metode midpoints (Gorunescu, 2011:166-167).
Berikut diberikan contoh data sederhana dan akan dibentuk pohon keputusan berdasarkan kriteria pemecahan GINI, dengan metode brute-force dan metode midpoints. Data disajikan sebagai berikut.
## Y X1
## 1 A 3
## 2 A 1
## 3 A 5
## 4 B 9
## 5 B 12
## 6 B 7
Berdasarkan data tersebut, terdapat satu variabel tak bebas (Y) dan satu variabel bebas (X1). Diketahui terdapat dua kategori pada variabel tak bebas, yakni A dan B. Berikut akan dihitung nilai GINI index dan GINI splitting index dengan metode brute-force.
Berdasarkan perhitungan di atas, dapat diringkas sebagai berikut.
Diketahui nilai GINI split index terkecil berada pada nilai \(X_1=5\), yang mana merupakan titik pemecah optimal. Perhatikan gambar pohon keputusan berikut.
Berikut akan dihitung nilai GINI index dan GINI splitting index dengan metode midpoints.
Berdasarkan perhitungan di atas, dapat diringkas sebagai berikut.
Diketahui nilai GINI split index terkecil berada pada nilai \(X_1=6\), yang mana merupakan titik pemecah optimal. Perhatikan gambar pohon keputusan berikut.
Berikut akan digunakan R untuk membuat pohon keputusan dengan package Rpart.
data=read.csv("data 1.csv")
data
## Y X1
## 1 A 3
## 2 A 1
## 3 A 5
## 4 B 9
## 5 B 12
## 6 B 7
#Perform classification trees
library(rpart)
tree <- rpart(Y ~ X1, data, minsplit=1)
summary(tree)
## Call:
## rpart(formula = Y ~ X1, data = data, minsplit = 1)
## n= 6
##
## CP nsplit rel error xerror xstd
## 1 1.00 0 1 2.0000000 0.0000000
## 2 0.01 1 0 0.3333333 0.3042903
##
## Variable importance
## X1
## 100
##
## Node number 1: 6 observations, complexity param=1
## predicted class=A expected loss=0.5 P(node) =1
## class counts: 3 3
## probabilities: 0.500 0.500
## left son=2 (3 obs) right son=3 (3 obs)
## Primary splits:
## X1 < 6 to the left, improve=3, (0 missing)
##
## Node number 2: 3 observations
## predicted class=A expected loss=0 P(node) =0.5
## class counts: 3 0
## probabilities: 1.000 0.000
##
## Node number 3: 3 observations
## predicted class=B expected loss=0 P(node) =0.5
## class counts: 0 3
## probabilities: 0.000 1.000
print(tree)
## n= 6
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 6 3 A (0.5000000 0.5000000)
## 2) X1< 6 3 0 A (1.0000000 0.0000000) *
## 3) X1>=6 3 0 B (0.0000000 1.0000000) *
library(rpart.plot)
prp(tree, faclen = 0, cex = 0.8, extra = 1)
#Prediction
treePrediction <- predict(tree, data, type = "class")
treePrediction
## 1 2 3 4 5 6
## A A A B B B
## Levels: A B
#load package caret
library(caret)
## Loading required package: lattice
## Warning: package 'lattice' was built under R version 3.2.2
## Loading required package: ggplot2
confusionMatrix(treePrediction, data$Y)
## Confusion Matrix and Statistics
##
## Reference
## Prediction A B
## A 3 0
## B 0 3
##
## Accuracy : 1
## 95% CI : (0.5407, 1)
## No Information Rate : 0.5
## P-Value [Acc > NIR] : 0.01563
##
## Kappa : 1
## Mcnemar's Test P-Value : NA
##
## Sensitivity : 1.0
## Specificity : 1.0
## Pos Pred Value : 1.0
## Neg Pred Value : 1.0
## Prevalence : 0.5
## Detection Rate : 0.5
## Detection Prevalence : 0.5
## Balanced Accuracy : 1.0
##
## 'Positive' Class : A
##
Berikut akan digunakan R untuk membuat pohon keputusan dengan package Tree.
#Perform classification trees
library(tree)
tree1 <- tree(Y ~ X1,data, split = c("gini"), control=tree.control(nobs=6, mincut = 1, minsize = 2))
summary(tree1)
##
## Classification tree:
## tree(formula = Y ~ X1, data = data, control = tree.control(nobs = 6,
## mincut = 1, minsize = 2), split = c("gini"))
## Number of terminal nodes: 2
## Residual mean deviance: 0 = 0 / 4
## Misclassification error rate: 0 = 0 / 6
print(tree1)
## node), split, n, deviance, yval, (yprob)
## * denotes terminal node
##
## 1) root 6 8.318 A ( 0.5 0.5 )
## 2) X1 < 6 3 0.000 A ( 1.0 0.0 ) *
## 3) X1 > 6 3 0.000 B ( 0.0 1.0 ) *
plot(tree1)
text(tree1)
Berikut diberikan contoh data sederhana dan akan dibentuk pohon keputusan berdasarkan kriteria pemecahan GINI, dengan metode midpoints. Data disajikan sebagai berikut.
## Y X1
## 1 A 3
## 2 A 1
## 3 A 5
## 4 B 9
## 5 A 12
## 6 B 7
Berdasarkan data tersebut, terdapat satu variabel tak bebas (Y) dan satu variabel bebas (X1). Diketahui terdapat dua kategori pada variabel tak bebas, yakni A dan B. Berikut akan dihitung nilai GINI index dan GINI splitting index dengan metode midpoints.
Berdasarkan perhitungan di atas, dapat diringkas sebagai berikut.
Diketahui nilai GINI split index terkecil berada pada nilai \(X_1=6\), yang mana merupakan titik pemecah optimal. Perhatikan gambar pohon keputusan berikut.
Menghitung nilai GINI index dan GINI splitting index.
Berdasarkan perhitungan di atas, dapat diringkas sebagai berikut.
Berikut akan digunakan R untuk membuat pohon keputusan dengan package Rpart.
data=read.csv("data 2.csv")
data
## Y X1
## 1 A 3
## 2 A 1
## 3 A 5
## 4 B 9
## 5 A 12
## 6 B 7
#Perform classification trees
library(rpart)
tree <- rpart(Y ~ X1, data, minsplit=1)
summary(tree)
## Call:
## rpart(formula = Y ~ X1, data = data, minsplit = 1)
## n= 6
##
## CP nsplit rel error xerror xstd
## 1 0.50 0 1 1 0.5773503
## 2 0.01 2 0 1 0.5773503
##
## Variable importance
## X1
## 100
##
## Node number 1: 6 observations, complexity param=0.5
## predicted class=A expected loss=0.3333333 P(node) =1
## class counts: 4 2
## probabilities: 0.667 0.333
## left son=2 (3 obs) right son=3 (3 obs)
## Primary splits:
## X1 < 6 to the left, improve=1.333333, (0 missing)
##
## Node number 2: 3 observations
## predicted class=A expected loss=0 P(node) =0.5
## class counts: 3 0
## probabilities: 1.000 0.000
##
## Node number 3: 3 observations, complexity param=0.5
## predicted class=B expected loss=0.3333333 P(node) =0.5
## class counts: 1 2
## probabilities: 0.333 0.667
## left son=6 (1 obs) right son=7 (2 obs)
## Primary splits:
## X1 < 10.5 to the right, improve=1.333333, (0 missing)
##
## Node number 6: 1 observations
## predicted class=A expected loss=0 P(node) =0.1666667
## class counts: 1 0
## probabilities: 1.000 0.000
##
## Node number 7: 2 observations
## predicted class=B expected loss=0 P(node) =0.3333333
## class counts: 0 2
## probabilities: 0.000 1.000
print(tree)
## n= 6
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 6 2 A (0.6666667 0.3333333)
## 2) X1< 6 3 0 A (1.0000000 0.0000000) *
## 3) X1>=6 3 1 B (0.3333333 0.6666667)
## 6) X1>=10.5 1 0 A (1.0000000 0.0000000) *
## 7) X1< 10.5 2 0 B (0.0000000 1.0000000) *
library(rpart.plot)
prp(tree, faclen = 0, cex = 0.8, extra = 1, digits = 4)
#Prediction
treePrediction <- predict(tree, data, type = "class")
treePrediction
## 1 2 3 4 5 6
## A A A B A B
## Levels: A B
#load package caret
library(caret)
confusionMatrix(treePrediction, data$Y)
## Confusion Matrix and Statistics
##
## Reference
## Prediction A B
## A 4 0
## B 0 2
##
## Accuracy : 1
## 95% CI : (0.5407, 1)
## No Information Rate : 0.6667
## P-Value [Acc > NIR] : 0.08779
##
## Kappa : 1
## Mcnemar's Test P-Value : NA
##
## Sensitivity : 1.0000
## Specificity : 1.0000
## Pos Pred Value : 1.0000
## Neg Pred Value : 1.0000
## Prevalence : 0.6667
## Detection Rate : 0.6667
## Detection Prevalence : 0.6667
## Balanced Accuracy : 1.0000
##
## 'Positive' Class : A
##
Berikut akan digunakan R untuk membuat pohon keputusan dengan package Tree.
#Perform classification trees
library(tree)
tree1 <- tree(Y ~ X1,data, split = c("gini"), control=tree.control(nobs=6, mincut = 1, minsize = 2))
summary(tree1)
##
## Classification tree:
## tree(formula = Y ~ X1, data = data, control = tree.control(nobs = 6,
## mincut = 1, minsize = 2), split = c("gini"))
## Number of terminal nodes: 3
## Residual mean deviance: 0 = 0 / 3
## Misclassification error rate: 0 = 0 / 6
print(tree1)
## node), split, n, deviance, yval, (yprob)
## * denotes terminal node
##
## 1) root 6 7.638 A ( 0.6667 0.3333 )
## 2) X1 < 6 3 0.000 A ( 1.0000 0.0000 ) *
## 3) X1 > 6 3 3.819 B ( 0.3333 0.6667 )
## 6) X1 < 10.5 2 0.000 B ( 0.0000 1.0000 ) *
## 7) X1 > 10.5 1 0.000 A ( 1.0000 0.0000 ) *
plot(tree1)
text(tree1)
Berikut diberikan contoh data sederhana dan akan dibentuk pohon keputusan berdasarkan kriteria pemecahan GINI, dengan metode midpoints. Data disajikan sebagai berikut.
## Y X1 X2
## 1 A 3 25
## 2 A 1 27
## 3 A 2 4
## 4 A 3 1
## 5 B 9 20
## 6 B 8 24
## 7 B 10 23
## 8 B 14 21
## 9 A 13 3
## 10 A 12 13
Berdasarkan data tersebut, terdapat satu variabel tak bebas (Y) dan dua variabel bebas (X1 dan X2). Diketahui terdapat dua kategori pada variabel tak bebas, yakni A dan B. Karena terdapat dua variabel bebas, maka akan ditentukan variabel bebas mana yang akan menempati posisi node akar (root node).Berikut akan dihitung nilai GINI index dan GINI splitting index dengan metode midpoints.
Menghitung GINI index dan GINI splitting index dengan metode midpoints pada Variabel X1 di Node Akar.
Data diurutkan terlebih dahulu.
Berdasarkan perhitungan di atas, diketahui nilai GINI split index terkecil berada pada nilai \(X_1=5,5\), yakni dengan nilai GINI split index 0,1833.
Menghitung GINI index dan GINI splitting index dengan metode midpoints pada Variabel X2 di Node Akar.
Data diurutkan terlebih dahulu.
Berdasarkan perhitungan di atas, diketahui nilai GINI split index terkecil berada pada nilai \(X_2=16,5\), yakni dengan nilai GINI split index 0,2667.
Maka variabel \(X_1\) bertindak sebagai node akar. Perhatikan pohon keputusan berikut.
Menghitung GINI index dan GINI splitting index dengan metode midpoints pada Variabel X1 di Node Internal.
Data diurutkan terlebih dahulu.
Berdasarkan perhitungan di atas, diketahui nilai GINI split index terkecil berada pada nilai \(X_1=11\), yakni dengan nilai GINI split index 0,2222.
Menghitung GINI index dan GINI splitting index dengan metode midpoints pada Variabel X2 di Node Internal.
Data diurutkan terlebih dahulu.
Berikut akan digunakan R untuk membuat pohon keputusan dengan package Rpart.
data=read.csv("data 3.csv")
data
## Y X1 X2
## 1 A 3 25
## 2 A 1 27
## 3 A 2 4
## 4 A 3 1
## 5 B 9 20
## 6 B 8 24
## 7 B 10 23
## 8 B 14 21
## 9 A 13 3
## 10 A 12 13
#Perform classification trees
library(rpart)
tree <- rpart(Y ~ X1+X2, data, minsplit=1)
summary(tree)
## Call:
## rpart(formula = Y ~ X1 + X2, data = data, minsplit = 1)
## n= 10
##
## CP nsplit rel error xerror xstd
## 1 0.50 0 1 1.0 0.3872983
## 2 0.01 2 0 0.5 0.3162278
##
## Variable importance
## X2 X1
## 52 48
##
## Node number 1: 10 observations, complexity param=0.5
## predicted class=A expected loss=0.4 P(node) =1
## class counts: 6 4
## probabilities: 0.600 0.400
## left son=2 (4 obs) right son=3 (6 obs)
## Primary splits:
## X1 < 5.5 to the left, improve=2.133333, (0 missing)
## X2 < 16.5 to the left, improve=2.133333, (0 missing)
## Surrogate splits:
## X2 < 24.5 to the right, agree=0.8, adj=0.5, (0 split)
##
## Node number 2: 4 observations
## predicted class=A expected loss=0 P(node) =0.4
## class counts: 4 0
## probabilities: 1.000 0.000
##
## Node number 3: 6 observations, complexity param=0.5
## predicted class=B expected loss=0.3333333 P(node) =0.6
## class counts: 2 4
## probabilities: 0.333 0.667
## left son=6 (2 obs) right son=7 (4 obs)
## Primary splits:
## X2 < 16.5 to the left, improve=2.666667, (0 missing)
## X1 < 11 to the right, improve=1.333333, (0 missing)
## Surrogate splits:
## X1 < 11 to the right, agree=0.833, adj=0.5, (0 split)
##
## Node number 6: 2 observations
## predicted class=A expected loss=0 P(node) =0.2
## class counts: 2 0
## probabilities: 1.000 0.000
##
## Node number 7: 4 observations
## predicted class=B expected loss=0 P(node) =0.4
## class counts: 0 4
## probabilities: 0.000 1.000
print(tree)
## n= 10
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 10 4 A (0.6000000 0.4000000)
## 2) X1< 5.5 4 0 A (1.0000000 0.0000000) *
## 3) X1>=5.5 6 2 B (0.3333333 0.6666667)
## 6) X2< 16.5 2 0 A (1.0000000 0.0000000) *
## 7) X2>=16.5 4 0 B (0.0000000 1.0000000) *
library(rpart.plot)
prp(tree, faclen = 0, cex = 0.8, extra = 1, digits = 4)
#Prediction
treePrediction <- predict(tree, data, type = "class")
treePrediction
## 1 2 3 4 5 6 7 8 9 10
## A A A A B B B B A A
## Levels: A B
#load package caret
library(caret)
confusionMatrix(treePrediction, data$Y)
## Confusion Matrix and Statistics
##
## Reference
## Prediction A B
## A 6 0
## B 0 4
##
## Accuracy : 1
## 95% CI : (0.6915, 1)
## No Information Rate : 0.6
## P-Value [Acc > NIR] : 0.006047
##
## Kappa : 1
## Mcnemar's Test P-Value : NA
##
## Sensitivity : 1.0
## Specificity : 1.0
## Pos Pred Value : 1.0
## Neg Pred Value : 1.0
## Prevalence : 0.6
## Detection Rate : 0.6
## Detection Prevalence : 0.6
## Balanced Accuracy : 1.0
##
## 'Positive' Class : A
##
Berikut akan digunakan R untuk membuat pohon keputusan dengan package Tree.
#Perform classification trees
library(tree)
tree1 <- tree(Y ~ X1+X2,data, split = c("gini"), control=tree.control(nobs=10, mincut = 1, minsize = 2))
summary(tree1)
##
## Classification tree:
## tree(formula = Y ~ X1 + X2, data = data, control = tree.control(nobs = 10,
## mincut = 1, minsize = 2), split = c("gini"))
## Number of terminal nodes: 3
## Residual mean deviance: 0 = 0 / 7
## Misclassification error rate: 0 = 0 / 10
print(tree1)
## node), split, n, deviance, yval, (yprob)
## * denotes terminal node
##
## 1) root 10 13.460 A ( 0.6000 0.4000 )
## 2) X1 < 5.5 4 0.000 A ( 1.0000 0.0000 ) *
## 3) X1 > 5.5 6 7.638 B ( 0.3333 0.6667 )
## 6) X2 < 16.5 2 0.000 A ( 1.0000 0.0000 ) *
## 7) X2 > 16.5 4 0.000 B ( 0.0000 1.0000 ) *
plot(tree1)
text(tree1)
Salah Satu Perbedaan Rpart dan Tree adalah dalam hal pengelompokkan data berjenis continuous. Perhatikan output berdasarkan Tree berikut.
Perhatikan output berdasarkan Rpart berikut.
Perhatikan bahwa pengelompokan untuk X_1 pada Tree adalah
\[X_1<5,5 ;X_1>5,5,\]
sedangkan pada Rpart
\[X_1<5,5 ;X_1 \geq 5,5.\]