1 Pendahuluan

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.

2 Dataset

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.

3 Distribusi Kelas Target

table(data$Bermain)
## 
## Tidak    Ya 
##     2     6

Dari data tersebut dapat diketahui bahwa:

  • Jumlah kelas Ya = 6
  • Jumlah kelas Tidak = 2
  • Jumlah seluruh data = 8

4 Perhitungan Entropy dan Information Gain

4.1 Fungsi Entropy

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))
}

5 Entropy Total

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.

6 Entropy Atribut Cuaca

Atribut Cuaca memiliki tiga nilai, yaitu:

  • Cerah
  • Mendung
  • Hujan
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

6.1 Entropy Gabungan Atribut Cuaca

entropy_cuaca <- sum(
  (entropy_cuaca_detail$Jumlah_Data / nrow(data)) * entropy_cuaca_detail$Entropy
)

entropy_cuaca
## [1] 0.6887219

6.2 Information Gain Atribut Cuaca

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.

7 Entropy Atribut Angin

Atribut Angin memiliki dua nilai, yaitu:

  • Lemah
  • Kuat
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

7.1 Entropy Gabungan Atribut Angin

entropy_angin <- sum(
  (entropy_angin_detail$Jumlah_Data / nrow(data)) * entropy_angin_detail$Entropy
)

entropy_angin
## [1] 0.3443609

7.2 Information Gain Atribut Angin

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.

8 Perbandingan Information Gain

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.

9 Pembangunan dan Visualisasi Decision Tree Menggunakan R

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.

9.1 Visualisasi Decision Tree dari Software

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.

9.2 Visualisasi Decision Tree Lengkap

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:

  1. Jika Angin = Lemah, maka Bermain = Ya.
  2. Jika Angin = Kuat dan Cuaca = Cerah, maka Bermain = Tidak.
  3. Jika Angin = Kuat dan Cuaca = Mendung, maka Bermain = Ya.
  4. Jika Angin = Kuat dan Cuaca = Hujan, maka Bermain = Tidak.

10 Prediksi Data Baru

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

10.1 Hasil Prediksi dan Probabilitas

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.

10.2 Peluang Hasil Prediksi

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 \]

11 Proses Pengambilan Keputusan

Proses pengambilan keputusan berdasarkan pohon adalah sebagai berikut:

  1. Mulai dari root node, yaitu Angin.
  2. Data baru memiliki nilai Angin = Kuat.
  3. Karena Angin bernilai Kuat, keputusan dilanjutkan ke atribut Cuaca.
  4. Data baru memiliki nilai Cuaca = Hujan.
  5. Berdasarkan pohon keputusan, jika Angin = Kuat dan Cuaca = Hujan, maka hasilnya adalah Tidak.

Jadi, model memprediksi bahwa keputusan akhirnya adalah:

\[ Bermain = Tidak \]

12 Perbandingan Perhitungan Manual dan Software

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.

13 Pembahasan Perbandingan Manual dan Software

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.

14 Kesimpulan

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.