Decision Tree merupakan salah satu algoritma klasifikasi yang
membentuk model dalam bentuk struktur pohon.
Model ini bekerja dengan cara membagi data berdasarkan atribut tertentu
hingga menghasilkan keputusan akhir berupa kelas.
Pada kasus ini, dataset digunakan untuk memprediksi apakah seseorang akan bermain atau tidak bermain berdasarkan dua atribut, yaitu Cuaca dan Angin.
Metode yang digunakan dalam pembentukan pohon keputusan adalah Entropy dan Information Gain.
Dataset yang digunakan adalah sebagai berikut.
data <- data.frame(
No = 1:8,
Cuaca = c("Cerah", "Cerah", "Mendung", "Hujan", "Hujan", "Mendung", "Cerah", "Hujan"),
Angin = c("Lemah", "Kuat", "Lemah", "Lemah", "Kuat", "Kuat", "Lemah", "Lemah"),
Bermain = c("Ya", "Tidak", "Ya", "Ya", "Tidak", "Ya", "Ya", "Ya")
)
data
## No Cuaca Angin Bermain
## 1 1 Cerah Lemah Ya
## 2 2 Cerah Kuat Tidak
## 3 3 Mendung Lemah Ya
## 4 4 Hujan Lemah Ya
## 5 5 Hujan Kuat Tidak
## 6 6 Mendung Kuat Ya
## 7 7 Cerah Lemah Ya
## 8 8 Hujan Lemah Ya
Dataset terdiri dari 8 data.
Atribut input yang digunakan adalah Cuaca dan
Angin, sedangkan target atau kelas yang ingin
diprediksi adalah Bermain.
table(data$Bermain)
##
## Tidak Ya
## 2 6
Dari data tersebut dapat diketahui bahwa:
Rumus entropy adalah:
\[ Entropy(S) = -p_1 \log_2(p_1) - p_2 \log_2(p_2) \]
Entropy digunakan untuk mengukur tingkat ketidakpastian atau
ketidakteraturan data.
Jika entropy bernilai 0, maka data sudah murni karena hanya memiliki
satu kelas.
Jika entropy semakin besar, maka data semakin tidak murni.
entropy <- function(x) {
prop <- table(x) / length(x)
prop <- prop[prop > 0]
-sum(prop * log2(prop))
}
entropy_total <- entropy(data$Bermain)
entropy_total
## [1] 0.8112781
Hasil entropy total adalah:
\[ Entropy(S) = 0.811 \]
Nilai ini menunjukkan bahwa data awal masih belum sepenuhnya murni karena terdapat dua kelas, yaitu Ya dan Tidak.
Atribut Cuaca memiliki tiga nilai, yaitu:
library(dplyr)
entropy_cuaca_detail <- data %>%
group_by(Cuaca) %>%
summarise(
Jumlah_Data = n(),
Jumlah_Ya = sum(Bermain == "Ya"),
Jumlah_Tidak = sum(Bermain == "Tidak"),
Entropy = entropy(Bermain)
)
entropy_cuaca_detail
## # A tibble: 3 × 5
## Cuaca Jumlah_Data Jumlah_Ya Jumlah_Tidak Entropy
## <chr> <int> <int> <int> <dbl>
## 1 Cerah 3 2 1 0.918
## 2 Hujan 3 2 1 0.918
## 3 Mendung 2 2 0 0
entropy_cuaca <- sum(
(entropy_cuaca_detail$Jumlah_Data / nrow(data)) * entropy_cuaca_detail$Entropy
)
entropy_cuaca
## [1] 0.6887219
gain_cuaca <- entropy_total - entropy_cuaca
gain_cuaca
## [1] 0.1225562
Berdasarkan hasil perhitungan:
\[ Entropy(Cuaca) = 0.689 \]
\[ Gain(Cuaca) = 0.122 \]
Artinya, atribut Cuaca mampu mengurangi ketidakpastian data sebesar 0.122.
Atribut Angin memiliki dua nilai, yaitu:
entropy_angin_detail <- data %>%
group_by(Angin) %>%
summarise(
Jumlah_Data = n(),
Jumlah_Ya = sum(Bermain == "Ya"),
Jumlah_Tidak = sum(Bermain == "Tidak"),
Entropy = entropy(Bermain)
)
entropy_angin_detail
## # A tibble: 2 × 5
## Angin Jumlah_Data Jumlah_Ya Jumlah_Tidak Entropy
## <chr> <int> <int> <int> <dbl>
## 1 Kuat 3 1 2 0.918
## 2 Lemah 5 5 0 0
entropy_angin <- sum(
(entropy_angin_detail$Jumlah_Data / nrow(data)) * entropy_angin_detail$Entropy
)
entropy_angin
## [1] 0.3443609
gain_angin <- entropy_total - entropy_angin
gain_angin
## [1] 0.4669172
Berdasarkan hasil perhitungan:
\[ Entropy(Angin) = 0.344 \]
\[ Gain(Angin) = 0.467 \]
Artinya, atribut Angin mampu mengurangi ketidakpastian data sebesar 0.467.
hasil_gain <- data.frame(
Atribut = c("Cuaca", "Angin"),
Entropy_Atribut = c(entropy_cuaca, entropy_angin),
Information_Gain = c(gain_cuaca, gain_angin)
)
hasil_gain
## Atribut Entropy_Atribut Information_Gain
## 1 Cuaca 0.6887219 0.1225562
## 2 Angin 0.3443609 0.4669172
Berdasarkan hasil perhitungan, atribut Angin memiliki nilai Information Gain terbesar.
\[ Gain(Angin) = 0.467 \]
\[ Gain(Cuaca) = 0.122 \]
Karena nilai Gain Angin lebih besar daripada Gain Cuaca, maka atribut Angin dipilih sebagai root node atau akar pohon keputusan.
Pada bagian ini, model Decision Tree dibangun menggunakan software
R.
Model dibuat dengan package rpart, sedangkan visualisasi
pohon dibuat dengan tampilan yang lebih lengkap agar proses keputusan
lebih mudah dipahami.
Kriteria split yang digunakan adalah information, karena sesuai dengan perhitungan manual yang menggunakan konsep entropy dan information gain.
library(rpart)
library(rpart.plot)
library(DiagrammeR)
data_model <- data
data_model$Cuaca <- as.factor(data_model$Cuaca)
data_model$Angin <- as.factor(data_model$Angin)
data_model$Bermain <- as.factor(data_model$Bermain)
model_tree <- rpart(
Bermain ~ Cuaca + Angin,
data = data_model,
method = "class",
parms = list(split = "information"),
control = rpart.control(
minsplit = 1,
minbucket = 1,
cp = 0
)
)
model_tree
## n= 8
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 8 2 Ya (0.2500000 0.7500000)
## 2) Angin=Kuat 3 1 Tidak (0.6666667 0.3333333)
## 4) Cuaca=Cerah,Hujan 2 0 Tidak (1.0000000 0.0000000) *
## 5) Cuaca=Mendung 1 0 Ya (0.0000000 1.0000000) *
## 3) Angin=Lemah 5 0 Ya (0.0000000 1.0000000) *
Model Decision Tree dibangun dengan dua atribut input, yaitu
Cuaca dan Angin.
Target yang diprediksi adalah Bermain.
Berdasarkan hasil perhitungan manual sebelumnya, atribut Angin memiliki nilai Information Gain terbesar, sehingga atribut ini menjadi root node atau akar pohon keputusan.
rpart.plot(
model_tree,
type = 4,
extra = 104,
fallen.leaves = TRUE,
under = TRUE,
faclen = 0,
varlen = 0,
branch = 0.8,
branch.col = "#d85c9f",
box.palette = c("#FCE4EC", "#F8BBD0", "#F48FB1", "#F06292"),
shadow.col = "#f8bbd0",
roundint = FALSE,
main = "Decision Tree Prediksi Bermain"
)
Visualisasi di atas menunjukkan pohon keputusan yang dibentuk oleh
software R.
Informasi pada node menunjukkan hasil klasifikasi, jumlah data, serta
proporsi kelas pada node tersebut.
Secara umum, model menunjukkan bahwa atribut Angin
menjadi pemisah utama.
Jika Angin = Lemah, maka hasilnya langsung mengarah ke
kelas Ya.
Namun, jika Angin = Kuat, maka keputusan dilanjutkan
dengan melihat atribut Cuaca.
grViz("
digraph decision_tree {
graph [
layout = dot,
rankdir = TB,
bgcolor = '#fff7fb',
labelloc = 't',
label = 'Visualisasi Lengkap Decision Tree',
fontsize = 22,
fontname = 'Segoe UI',
fontcolor = '#c94f93'
]
node [
shape = box,
style = 'filled, rounded',
fontname = 'Segoe UI',
fontsize = 14,
color = '#d85c9f',
penwidth = 2,
margin = 0.18
]
edge [
fontname = 'Segoe UI',
fontsize = 12,
color = '#c94f93',
fontcolor = '#8a3d68',
penwidth = 2
]
A [
label = 'ROOT NODE\\nAngin\\nData = 8\\nYa = 6, Tidak = 2\\nEntropy Total = 0.811\\nGain Angin = 0.467',
fillcolor = '#f8bbd0'
]
B [
label = 'Angin = Lemah\\nData = 5\\nYa = 5, Tidak = 0\\nEntropy = 0\\nKeputusan: Bermain = Ya',
fillcolor = '#ffeaf4'
]
C [
label = 'Angin = Kuat\\nData = 3\\nYa = 1, Tidak = 2\\nEntropy = 0.918\\nLanjut cek atribut Cuaca',
fillcolor = '#f8bbd0'
]
D [
label = 'Cuaca = Cerah\\nData = 1\\nYa = 0, Tidak = 1\\nEntropy = 0\\nKeputusan: Bermain = Tidak',
fillcolor = '#ffd6e8'
]
E [
label = 'Cuaca = Mendung\\nData = 1\\nYa = 1, Tidak = 0\\nEntropy = 0\\nKeputusan: Bermain = Ya',
fillcolor = '#ffeaf4'
]
F [
label = 'Cuaca = Hujan\\nData = 1\\nYa = 0, Tidak = 1\\nEntropy = 0\\nKeputusan: Bermain = Tidak',
fillcolor = '#ffd6e8'
]
A -> B [label = 'Lemah']
A -> C [label = 'Kuat']
C -> D [label = 'Cerah']
C -> E [label = 'Mendung']
C -> F [label = 'Hujan']
}
")
Visualisasi lengkap di atas memperlihatkan proses keputusan secara
lebih jelas.
Atribut Angin menjadi root node karena memiliki
Information Gain terbesar.
Aturan keputusan yang diperoleh adalah:
Data baru yang akan diprediksi adalah:
| Cuaca | Angin |
|---|---|
| Hujan | Kuat |
data_baru <- data.frame(
Cuaca = factor("Hujan", levels = levels(data_model$Cuaca)),
Angin = factor("Kuat", levels = levels(data_model$Angin))
)
data_baru
## Cuaca Angin
## 1 Hujan Kuat
prediksi <- predict(model_tree, data_baru, type = "class")
probabilitas <- predict(model_tree, data_baru, type = "prob")
hasil_prediksi <- data.frame(
Cuaca = data_baru$Cuaca,
Angin = data_baru$Angin,
Hasil_Prediksi = as.character(prediksi)
)
hasil_prediksi
## Cuaca Angin Hasil_Prediksi
## 1 Hujan Kuat Tidak
Berdasarkan hasil prediksi menggunakan software R, data dengan:
\[ Cuaca = Hujan \]
\[ Angin = Kuat \]
diklasifikasikan ke dalam kelas:
\[ Bermain = Tidak \]
Artinya, menurut model Decision Tree, jika cuaca Hujan dan angin Kuat, maka keputusan akhirnya adalah Tidak bermain.
probabilitas_tabel <- data.frame(
Kelas = colnames(probabilitas),
Probabilitas = as.numeric(probabilitas[1, ])
)
probabilitas_tabel
## Kelas Probabilitas
## 1 Tidak 1
## 2 Ya 0
Tabel probabilitas menunjukkan seberapa besar kemungkinan data baru
masuk ke masing-masing kelas.
Kelas dengan nilai probabilitas paling besar akan dipilih sebagai hasil
prediksi akhir.
Pada kasus ini, model memilih kelas Tidak, karena data baru mengikuti pola pada pohon keputusan:
\[ Angin = Kuat \]
lalu dilanjutkan ke:
\[ Cuaca = Hujan \]
dan hasil akhirnya adalah:
\[ Bermain = Tidak \]
Proses pengambilan keputusan berdasarkan pohon adalah sebagai berikut:
Jadi, model memprediksi bahwa keputusan akhirnya adalah:
\[ Bermain = Tidak \]
perbandingan <- data.frame(
Aspek = c(
"Metode",
"Entropy Total",
"Information Gain Cuaca",
"Information Gain Angin",
"Root Node",
"Prediksi Data Hujan dan Kuat"
),
Perhitungan_Manual = c(
"Entropy dan Information Gain",
"0.811",
"0.122",
"0.467",
"Angin",
"Tidak"
),
Hasil_Software_R = c(
"Decision Tree dengan criterion information",
round(entropy_total, 3),
round(gain_cuaca, 3),
round(gain_angin, 3),
"Angin",
as.character(prediksi)
)
)
perbandingan
## Aspek Perhitungan_Manual
## 1 Metode Entropy dan Information Gain
## 2 Entropy Total 0.811
## 3 Information Gain Cuaca 0.122
## 4 Information Gain Angin 0.467
## 5 Root Node Angin
## 6 Prediksi Data Hujan dan Kuat Tidak
## Hasil_Software_R
## 1 Decision Tree dengan criterion information
## 2 0.811
## 3 0.123
## 4 0.467
## 5 Angin
## 6 Tidak
Berdasarkan tabel perbandingan, hasil perhitungan manual dan hasil dari software R menunjukkan hasil yang sama.
Atribut yang menjadi root node adalah Angin karena
memiliki nilai Information Gain paling besar.
Hasil prediksi untuk data dengan Cuaca = Hujan dan
Angin = Kuat juga sama, yaitu
Tidak.
Hasil yang diperoleh dari perhitungan manual dan software adalah
sama.
Pada perhitungan manual, atribut Angin memiliki
Information Gain terbesar, sehingga dipilih sebagai root node.
Hal yang sama juga terlihat pada model Decision Tree yang dibangun
menggunakan software R.
Namun, bentuk visualisasi pohon dari software bisa sedikit berbeda
dengan pohon manual.
Hal ini dapat terjadi karena software biasanya membentuk percabangan
berdasarkan aturan internal tertentu, seperti pembagian biner pada
kategori.
Sementara itu, pada perhitungan manual, percabangan biasanya digambarkan
langsung berdasarkan setiap nilai kategori.
Meskipun bentuk tampilannya bisa berbeda, makna keputusan yang
dihasilkan tetap sama.
Baik perhitungan manual maupun software sama-sama menghasilkan prediksi
bahwa data dengan Cuaca = Hujan dan Angin =
Kuat diklasifikasikan sebagai Tidak.
Berdasarkan hasil perhitungan manual, nilai entropy total adalah
0.811.
Information Gain untuk atribut Cuaca adalah
0.122, sedangkan Information Gain untuk atribut
Angin adalah 0.467.
Karena atribut Angin memiliki nilai Information Gain terbesar, maka atribut tersebut menjadi root node pada Decision Tree.
Hasil prediksi terhadap data baru dengan Cuaca =
Hujan dan Angin = Kuat adalah
Tidak.
Hasil ini sama antara perhitungan manual dan hasil menggunakan software
R.
Dengan demikian, model Decision Tree yang dibangun sudah sesuai dengan hasil perhitungan manual.