Perkembangan teknologi membuat data yang tersimpan semakin banyak, dan data tersebut baru berguna jika bisa diolah menjadi informasi untuk mengambil keputusan. Salah satu cara mengolahnya adalah klasifikasi, yaitu membuat model dari data yang sudah ada untuk memprediksi kelas atau kategori dari data baru. Decision tree (pohon keputusan) adalah salah satu teknik klasifikasi yang caranya mirip alur pertanyaan bercabang. Data berbentuk tabel diubah menjadi model pohon yang dimulai dari simpul akar (root), bercabang melalui simpul keputusan, dan berakhir di simpul daun (leaf) yang berisi hasil klasifikasi. Model pohon ini kemudian bisa dibaca sebagai aturan keputusan yang sederhana (Putro & Setiadi, 2023).
Dalam membuat model decision tree, dataset biasanya dibagi menjadi dua bagian, yaitu data latih (training) yang dipakai untuk membangun model dan data uji (testing) yang dipakai untuk menguji seberapa baik model memprediksi data baru. Hasil prediksi pada data uji lalu dievaluasi, misalnya dengan confusion matrix untuk melihat nilai akurasi, presisi, recall, dan F1-score. Dengan begitu, kualitas model dapat diukur secara jelas, tidak hanya dilihat dari bentuk pohonnya (Indriyani et al., 2025).
Keunggulan decision tree adalah hasilnya mudah dipahami. Dalam penelitian prediksi prestasi siswa, model pohon keputusan mencapai akurasi 89,7% dan dapat membantu sekolah mengenali siswa yang berpotensi berprestasi rendah lebih awal sehingga penanganan bisa dilakukan lebih cepat (Halimatussa’diyah & Rohman, 2026). Karena itu, praktikum Machine Learning dengan topik Decision Tree penting dilakukan agar mahasiswa memahami cara kerja pohon keputusan, mulai dari membangun model dari data hingga menguji dan menilai hasil klasifikasinya.
Rumusan masalah yang dapat disimpulkan adalah sebagai berikut:
Bagaimana konsep dasar Decision Tree klasifikasi menggunakan metode CART (Classification and Regression Tree)
Bagaimana membangun model Classification Tree menggunakan algoritma CART?
Tujuan dari praktikum ini adalah sebagai berikut:
Menjelaskan konsep dasar Decision Tree untuk klasfikasi menggunakan metode CART (Classification and Regression Tree).
Membangun model Classification Tree menggunakan algoritma cart.
Adapun manfaat pada praktikum ini adalah:
Dapat memberi informasi serta menambah pengetahuan tentang Decision Tree.
Menerapkan pengetahuan yang diperoleh tentang Decision Tree.
Menambah pengetahuan tentang Decision Tree.
Menjadi rujukan bagi praktikan selanjutnya.
Gunakan dataset Hitters dari package ISLR untuk memprediksi Salary menggunakan Decision Tree (Regression Tree). Lakukan pengecekan dan penanganan missing value menggunakan na.omit(), kemudian bagi data menjadi training dan testing. Selanjutnya, bangun dan visualisasikan tree, analisis variable importance, lakukan prediksi dan evaluasi menggunakan MSE, tentukan CP terbaik, lakukan pruning, dan evaluasi kembali model menggunakan MSE.
Decision tree (pohon keputusan) adalah teknik model prediksi untuk klasifikasi. Data berbentuk tabel diubah menjadi model pohon yang terdiri atas simpul-simpul keputusan yang dihubungkan oleh cabang. Alurnya bergerak ke bawah dari simpul akar (root) dan berakhir di simpul daun (leaf) yang berisi hasil klasifikasi. Atribut yang menjadi simpul dipilih lewat ukuran tertentu, misalnya entropy untuk mengukur ketidakmurnian kelas pada data dan gain untuk melihat seberapa besar sebuah atribut menurunkan entropy. Atribut dengan gain tertinggi dijadikan simpul (Putro & Setiadi, 2023).
\[Entropy(S) = -\sum_{i=1}^{n} p_i \log_2(p_i)\]
\[Gain(S,A) = Entropy(S) - \sum_{i=1}^{n} \frac{|S_i|}{|S|} \times Entropy(S_i)\]
Keterangan: \(S\) adalah himpunan kasus, \(A\) adalah atribut, \(p_i\) adalah proporsi data kelas ke-\(i\), \(|S_i|\) adalah jumlah kasus pada partisi ke-\(i\), dan \(|S|\) adalah jumlah seluruh kasus.
Tabel 2.1 Elemen pada pohon keputusan
| Elemen | Penjelasan |
|---|---|
| Simpul akar (root) | Titik awal pohon, berisi atribut dengan pengaruh terbesar |
| Simpul keputusan | Titik percabangan yang menguji nilai suatu atribut |
| Cabang | Hasil pengujian pada simpul keputusan |
| Simpul daun (leaf) | Titik akhir yang berisi kelas hasil klasifikasi |
CART adalah algoritma decision tree yang membangun model prediksi dengan membagi dataset menjadi subset yang lebih kecil, dan dapat dipakai untuk klasifikasi maupun regresi. Pada klasifikasi, hasilnya disebut classification tree, dan setiap pemisahan menghasilkan dua simpul, yaitu simpul kiri dan simpul kanan. Pemisahan dinilai dengan indeks Gini, yaitu ukuran ketepatan pemisahan data pada sebuah simpul. Semakin kecil nilainya, semakin murni simpul tersebut, dan nilai 0 berarti seluruh datanya berasal dari satu kelas. Dari semua calon pemisah dipilih yang memiliki goodness of split tertinggi, lalu setiap simpul diberi label kelas berdasarkan kelas yang paling banyak di simpul tersebut (Nurdila, 2023).
\[i(t) = Gini(t) = 1 - \sum_{j} p_j^2\]
\[\Phi(s,t) = i(t) - P_L \, i(t_L) - P_R \, i(t_R)\]
Keterangan: \(p_j\) adalah proporsi data kelas ke-\(j\) pada simpul \(t\), \(s\) adalah calon pemisah, \(t_L\) dan \(t_R\) adalah simpul kiri dan kanan, serta \(P_L\) dan \(P_R\) adalah proporsi data yang masuk ke simpul kiri dan kanan.
Tabel 2.2 Perbandingan ukuran pemilihan simpul
| Aspek | Entropy dan Gain | Indeks Gini (CART) |
|---|---|---|
| Fungsi | Mengukur ketidakmurnian kelas dan penurunannya | Mengukur ketepatan pemisahan data pada simpul |
| Rumus | \(-\sum p_i \log_2(p_i)\) | \(1 - \sum p_j^2\) |
| Simpul terpilih | Atribut dengan gain tertinggi | Pemisah dengan goodness of split tertinggi |
| Hasil pemisahan | Sesuai jumlah nilai atribut | Dua simpul (kiri dan kanan) |
Missing value merupakan kondisi ketika terdapat nilai yang tidak tersedia pada satu atau lebih variabel dalam suatu dataset. Keberadaan nilai yang hilang dapat mengurangi jumlah informasi yang tersedia dan memengaruhi proses analisis data. Handayany dkk. (2023) menjelaskan bahwa data hilang dapat terjadi karena pengumpulan informasi yang tidak lengkap, kesulitan memperoleh informasi, maupun kelalaian dalam proses pengumpulan data. Oleh karena itu, penanganan missing value menjadi salah satu tahapan penting dalam persiapan data sebelum dilakukan pemodelan statistik atau machine learning.
Salah satu cara menangani missing value dalam R adalah menggunakan fungsi na.omit(), yaitu fungsi yang menghapus observasi atau baris yang mengandung nilai hilang. Penghapusan tersebut dilakukan apabila terdapat setidaknya satu nilai NA pada suatu baris, sehingga hanya observasi yang lengkap yang dipertahankan untuk analisis selanjutnya. Dalam penelitian ini, fungsi na.omit() digunakan untuk menyiapkan data sebelum pembentukan model Regression Tree tanpa melakukan pengisian atau imputasi terhadap nilai yang hilang. Penghapusan observasi merupakan salah satu pendekatan penanganan data hilang yang perlu dipertimbangkan berdasarkan karakteristik dan jumlah data yang tersedia (Prasetya dkk., 2023).
Pohon maksimal yang terbentuk biasanya terlalu besar sehingga perlu dipangkas (pruning) agar lebih optimal. Pemangkasan dapat dilakukan dengan cost complexity yang dikombinasikan dengan cross validation untuk mencari parameter alpha yang optimal. Setelah itu, model diuji dengan confusion matrix untuk menghitung sensitivity (ketepatan prediksi pada kelas positif), specificity (ketepatan prediksi pada kelas negatif), dan akurasi (Nurdila, 2023).
\[R_\alpha(T) = R(T) + \alpha \, |\tilde{T}|\]
Keterangan: \(R(T)\) adalah kesalahan klasifikasi pohon \(T\), \(|\tilde{T}|\) adalah jumlah simpul terminal, dan \(\alpha\) adalah parameter kompleksitas. Semakin besar \(\alpha\), semakin banyak cabang yang dipangkas.
Tabel 2.4 Confusion matrix
| Prediksi Positif | Prediksi Negatif | |
|---|---|---|
| Aktual Positif | TP (True Positive) | FN (False Negative) |
| Aktual Negatif | FP (False Positive) | TN (True Negative) |
Sumber: Indriyani et al. (2025).
Dari confusion matrix tersebut dapat dihitung juga akurasi, presisi, recall, dan F1-score. Semakin tinggi nilai F1-score, semakin baik modelnya (Indriyani et al., 2025).
Tabel 2.5 Rumus evaluasi model
| Ukuran | Rumus |
|---|---|
| Akurasi | \(\dfrac{TP + TN}{TP + TN + FP + FN}\) |
| Presisi | \(\dfrac{TP}{TP + FP}\) |
| Recall / Sensitivity | \(\dfrac{TP}{TP + FN}\) |
| Specificity | \(\dfrac{TN}{TN + FP}\) |
| F1-score | \(2 \times \dfrac{Presisi \times Recall}{Presisi + Recall}\) |
Jenis data yang digunakan dalam penelitian kali ini merupakan jenis data numerik dan kategorik. Jenis data numerik adalah data yang berbentuk angka dan dapat diukur serta dianalisis secara kuantitatif, sedangkan data kategorik adalah data yang berbentuk kelompok atau kategori. Data yang digunakan dalam penelitian ini berupa dataset Hitters yang berisi informasi mengenai pemain bisbol, termasuk karakteristik pemain serta gaji (Salary) yang diperoleh.
Sumber data penelitian ini adalah sumber data sekunder. Sumber data sekunder adalah data yang diperoleh dari pihak lain dan tidak dikumpulkan secara langsung oleh peneliti. Data sekunder yang digunakan dalam penelitian ini merupakan dataset Hitters yang tersedia pada package ISLR di R. Data yang memiliki missing value dihapus menggunakan fungsi na.omit() sebelum dilakukan pemodelan.
Variabel penelitian adalah sesuatu yang menjadi fokus perhatian yang memberikan pengaruh dan mempunyai nilai. Variabel penelitian yang digunakan dalam penelitian ini terdiri atas variabel respons dan variabel prediktor. Variabel respons yaitu Salary, yang menunjukkan gaji pemain bisbol dalam ribuan dolar. Variabel prediktor yaitu karakteristik pemain, seperti pengalaman bermain (Years), jumlah pertandingan yang dimainkan (Games), jumlah pukulan (Hits), jumlah home run (HmRun), dan karakteristik statistik permainan lainnya. Variabel League, Division, dan NewLeague merupakan variabel kategorik, sedangkan variabel lainnya berupa numerik. Variabel Salary diprediksi menggunakan metode Decision Tree (Regression Tree) untuk mengetahui pola hubungan antara karakteristik pemain dan gaji yang diperoleh.
Berikut adalah langkah-langkah yang dilakukan dalam analisis:
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.1 ✔ readr 2.2.0
## ✔ ggplot2 4.0.3 ✔ stringr 1.6.0
## ✔ lubridate 1.9.5 ✔ tibble 3.3.1
## ✔ purrr 1.2.2 ✔ tidyr 1.3.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
## Loading required package: lattice
##
## Attaching package: 'caret'
##
## The following object is masked from 'package:purrr':
##
## lift
library(rpart.plot)
library(ISLR)
data(Hitters) # Memanggil dataset Hitters
str(Hitters) # Melihat struktur data## 'data.frame': 322 obs. of 20 variables:
## $ AtBat : int 293 315 479 496 321 594 185 298 323 401 ...
## $ Hits : int 66 81 130 141 87 169 37 73 81 92 ...
## $ HmRun : int 1 7 18 20 10 4 1 0 6 17 ...
## $ Runs : int 30 24 66 65 39 74 23 24 26 49 ...
## $ RBI : int 29 38 72 78 42 51 8 24 32 66 ...
## $ Walks : int 14 39 76 37 30 35 21 7 8 65 ...
## $ Years : int 1 14 3 11 2 11 2 3 2 13 ...
## $ CAtBat : int 293 3449 1624 5628 396 4408 214 509 341 5206 ...
## $ CHits : int 66 835 457 1575 101 1133 42 108 86 1332 ...
## $ CHmRun : int 1 69 63 225 12 19 1 0 6 253 ...
## $ CRuns : int 30 321 224 828 48 501 30 41 32 784 ...
## $ CRBI : int 29 414 266 838 46 336 9 37 34 890 ...
## $ CWalks : int 14 375 263 354 33 194 24 12 8 866 ...
## $ League : Factor w/ 2 levels "A","N": 1 2 1 2 2 1 2 1 2 1 ...
## $ Division : Factor w/ 2 levels "E","W": 1 2 2 1 1 2 1 2 2 1 ...
## $ PutOuts : int 446 632 880 200 805 282 76 121 143 0 ...
## $ Assists : int 33 43 82 11 40 421 127 283 290 0 ...
## $ Errors : int 20 10 14 3 4 25 7 9 19 0 ...
## $ Salary : num NA 475 480 500 91.5 750 70 100 75 1100 ...
## $ NewLeague: Factor w/ 2 levels "A","N": 1 2 1 2 2 1 1 1 2 1 ...
## AtBat Hits HmRun Runs RBI Walks Years CAtBat CHits CHmRun
## -Andy Allanson 293 66 1 30 29 14 1 293 66 1
## -Alan Ashby 315 81 7 24 38 39 14 3449 835 69
## -Alvin Davis 479 130 18 66 72 76 3 1624 457 63
## -Andre Dawson 496 141 20 65 78 37 11 5628 1575 225
## -Andres Galarraga 321 87 10 39 42 30 2 396 101 12
## -Alfredo Griffin 594 169 4 74 51 35 11 4408 1133 19
## CRuns CRBI CWalks League Division PutOuts Assists Errors
## -Andy Allanson 30 29 14 A E 446 33 20
## -Alan Ashby 321 414 375 N W 632 43 10
## -Alvin Davis 224 266 263 A W 880 82 14
## -Andre Dawson 828 838 354 N E 200 11 3
## -Andres Galarraga 48 46 33 N E 805 40 4
## -Alfredo Griffin 501 336 194 A W 282 421 25
## Salary NewLeague
## -Andy Allanson NA A
## -Alan Ashby 475.0 N
## -Alvin Davis 480.0 A
## -Andre Dawson 500.0 N
## -Andres Galarraga 91.5 N
## -Alfredo Griffin 750.0 A
## AtBat Hits HmRun Runs
## Min. : 16.0 Min. : 1 Min. : 0.00 Min. : 0.00
## 1st Qu.:255.2 1st Qu.: 64 1st Qu.: 4.00 1st Qu.: 30.25
## Median :379.5 Median : 96 Median : 8.00 Median : 48.00
## Mean :380.9 Mean :101 Mean :10.77 Mean : 50.91
## 3rd Qu.:512.0 3rd Qu.:137 3rd Qu.:16.00 3rd Qu.: 69.00
## Max. :687.0 Max. :238 Max. :40.00 Max. :130.00
##
## RBI Walks Years CAtBat
## Min. : 0.00 Min. : 0.00 Min. : 1.000 Min. : 19.0
## 1st Qu.: 28.00 1st Qu.: 22.00 1st Qu.: 4.000 1st Qu.: 816.8
## Median : 44.00 Median : 35.00 Median : 6.000 Median : 1928.0
## Mean : 48.03 Mean : 38.74 Mean : 7.444 Mean : 2648.7
## 3rd Qu.: 64.75 3rd Qu.: 53.00 3rd Qu.:11.000 3rd Qu.: 3924.2
## Max. :121.00 Max. :105.00 Max. :24.000 Max. :14053.0
##
## CHits CHmRun CRuns CRBI
## Min. : 4.0 Min. : 0.00 Min. : 1.0 Min. : 0.00
## 1st Qu.: 209.0 1st Qu.: 14.00 1st Qu.: 100.2 1st Qu.: 88.75
## Median : 508.0 Median : 37.50 Median : 247.0 Median : 220.50
## Mean : 717.6 Mean : 69.49 Mean : 358.8 Mean : 330.12
## 3rd Qu.:1059.2 3rd Qu.: 90.00 3rd Qu.: 526.2 3rd Qu.: 426.25
## Max. :4256.0 Max. :548.00 Max. :2165.0 Max. :1659.00
##
## CWalks League Division PutOuts Assists
## Min. : 0.00 A:175 E:157 Min. : 0.0 Min. : 0.0
## 1st Qu.: 67.25 N:147 W:165 1st Qu.: 109.2 1st Qu.: 7.0
## Median : 170.50 Median : 212.0 Median : 39.5
## Mean : 260.24 Mean : 288.9 Mean :106.9
## 3rd Qu.: 339.25 3rd Qu.: 325.0 3rd Qu.:166.0
## Max. :1566.00 Max. :1378.0 Max. :492.0
##
## Errors Salary NewLeague
## Min. : 0.00 Min. : 67.5 A:176
## 1st Qu.: 3.00 1st Qu.: 190.0 N:146
## Median : 6.00 Median : 425.0
## Mean : 8.04 Mean : 535.9
## 3rd Qu.:11.00 3rd Qu.: 750.0
## Max. :32.00 Max. :2460.0
## NAs :59
## [1] 322 20
## AtBat Hits HmRun Runs RBI Walks Years CAtBat
## 0 0 0 0 0 0 0 0
## CHits CHmRun CRuns CRBI CWalks League Division PutOuts
## 0 0 0 0 0 0 0 0
## Assists Errors Salary NewLeague
## 0 0 59 0
Hitters.bersih <- na.omit(Hitters)# Menghapus missing value
colSums(is.na(Hitters.bersih)) # Memeriksa missing value## AtBat Hits HmRun Runs RBI Walks Years CAtBat
## 0 0 0 0 0 0 0 0
## CHits CHmRun CRuns CRBI CWalks League Division PutOuts
## 0 0 0 0 0 0 0 0
## Assists Errors Salary NewLeague
## 0 0 0 0
## [1] 263 20
Pemeriksaan awal menunjukkan bahwa dataset Hitters memuat 322 observasi dan 20 variabel. Nilai yang hilang hanya ditemukan pada variabel Salary, yakni sebanyak 59 observasi (sekitar 18,3% dari seluruh data), sementara 19 variabel lainnya terisi lengkap. Penanganan dilakukan dengan na.omit(), yaitu membuang setiap observasi yang memiliki nilai hilang. Setelah proses ini tersisa 263 observasi dengan 20 variabel, dan pengecekan ulang memastikan tidak ada lagi missing value. Data tersebut selanjutnya menjadi data lengkap yang dipakai pada seluruh tahap analisis berikutnya.
Data dipisahkan menjadi dua bagian: satu untuk membentuk model dan satu lagi untuk menguji kemampuan prediksinya. Komposisi yang dipakai adalah 80% data training dan 20% data testing. Fungsi createDataPartition() dipilih agar pembagian tetap memperhatikan sebaran variabel respons Salary, sedangkan set.seed(234) menjamin hasil pembagian bisa direproduksi.
set.seed(234)
train <- createDataPartition( Hitters.bersih$Salary,
p = 0.8,list = FALSE)
Hitters.train <- Hitters.bersih[train, ]
Hitters.test <- Hitters.bersih[-train, ]
# Melihat jumlah data training dan testing
dim(Hitters.train)## [1] 212 20
## [1] 51 20
Pembagian data menghasilkan 212 observasi untuk training dan 51 observasi untuk testing. Data training dipakai untuk membangun model Regression Tree, sedangkan data testing menjadi bahan uji untuk melihat seberapa baik model menebak Salary pada data yang tidak ikut dilibatkan saat pelatihan. Dengan pemisahan ini, penilaian kinerja model tidak tercampur dengan proses pembentukannya.
Model dibangun dengan fungsi rpart(), dengan Salary sebagai variabel respons dan semua variabel lain sebagai prediktor. Argumen method = “anova” dipilih karena respons berupa data numerik. Nilai cp = 0.001 sengaja dibuat kecil supaya pohon awal tumbuh cukup besar dan kompleks sebelum nantinya dipangkas (pruning).
Berikut merupakan hasil pembentukan dan visualisasi model Regression Tree.
fit.tree <- rpart(
Salary ~ .,
data = Hitters.train, method = "anova", cp = 0.001)
fit.tree # Melihat hasil model## n= 212
##
## node), split, n, deviance, yval
## * denotes terminal node
##
## 1) root 212 46453330.00 544.9977
## 2) CRBI< 307.5 124 9065008.00 309.6062
## 4) CAtBat< 1428 79 4910701.00 201.3143
## 8) RBI>=16.5 72 561989.70 169.0069
## 16) CRuns< 101.5 43 66050.42 114.8837 *
## 17) CRuns>=101.5 29 183208.80 249.2586
## 34) CWalks< 117.5 20 45028.44 213.3750 *
## 35) CWalks>=117.5 9 55199.50 329.0000 *
## 9) RBI< 16.5 7 3500575.00 533.6190 *
## 5) CAtBat>=1428 45 1601443.00 499.7185
## 10) Hits< 118 24 540337.00 417.7014
## 20) NewLeague=A 14 132261.00 358.0239 *
## 21) NewLeague=N 10 288412.60 501.2500 *
## 11) Hits>=118 21 715156.00 593.4524
## 22) CHmRun< 23 7 267142.90 457.8571 *
## 23) CHmRun>=23 14 254959.40 661.2500 *
## 3) CRBI>=307.5 88 20836090.00 876.6857
## 6) AtBat< 424 32 2174114.00 543.1250
## 12) CHmRun< 122.5 21 777955.40 453.5318
## 24) Years>=10.5 13 95525.68 360.8975 *
## 25) Years< 10.5 8 389599.20 604.0625 *
## 13) CHmRun>=122.5 11 905784.70 714.1666 *
## 7) AtBat>=424 56 13067050.00 1067.2920
## 14) CHmRun< 256.5 47 6300814.00 964.6910
## 28) Walks< 68.5 37 3302243.00 863.0534
## 56) Assists>=236.5 11 324834.50 645.1948 *
## 57) Assists< 236.5 26 2234440.00 955.2243
## 114) Runs< 78.5 19 760675.30 860.8772 *
## 115) Runs>=78.5 7 845580.20 1211.3100 *
## 29) Walks>=68.5 10 1202151.00 1340.7500 *
## 15) CHmRun>=256.5 9 3687698.00 1603.0960 *
## CRBI CAtBat CRuns CHits CWalks CHmRun
## 21370107.10 18625493.78 18296949.70 17732855.43 15734994.14 15724153.17
## Hits AtBat Runs Walks RBI HmRun
## 6379536.90 6254013.74 5973517.41 5245870.75 4944750.92 2667878.66
## Years Assists Errors PutOuts NewLeague League
## 1597627.90 1126033.19 607859.11 179642.11 119663.41 95730.73
Pohon regresi membagi data secara bertahap berdasarkan nilai variabel prediktor untuk memperkirakan Salary. Setiap percabangan adalah aturan pemisahan, dan setiap simpul terminal memuat nilai prediksi Salary bagi pemain yang memenuhi seluruh aturan di jalur menuju simpul itu. Pada pohon awal, pemisahan pertama dilakukan pada variabel CRBI dengan batas 307,5: sebanyak 124 pemain dengan CRBI kurang dari 307,5 memiliki rata-rata Salary sekitar 309,6, sedangkan 88 pemain dengan CRBI yang lebih besar rata-ratanya sekitar 876,7 (dalam ribuan dolar). Pohon akhirnya memiliki 16 simpul terminal (15 pemisahan) yang melibatkan 13 variabel, sehingga model awal terbilang rumit dan berpotensi terlalu menyesuaikan diri dengan data training.
Selanjutnya, analisis variable importance dilakukan untuk mengetahui prediktor mana yang memberi kontribusi relatif besar dalam pembentukan model.
Berikut merupakan visualisasi tingkat kepentingan variabel pada model Regression Tree.
# Visualisasi Variabel *Importance*
fit.tree$variable.importance %>%
data.frame() %>%
rownames_to_column(var = "Feature") %>%
rename(Importance = ".") %>%
ggplot(
aes(
x = fct_reorder(Feature, Importance),
y = Importance
)
) + geom_pointrange(aes(ymin = 0, ymax = Importance),
color = "cadetblue", size = 0.3
) +
theme_minimal() +
coord_flip() +
labs( x = "", y = "",
title = "Variable Importance pada Regression Tree"
)
Variabel dengan nilai importance paling tinggi adalah yang paling besar
sumbangannya dalam membentuk pembagian simpul pada pohon; makin tinggi
nilainya, makin besar peran variabel tersebut, dan sebaliknya. Dari
grafik terlihat bahwa variabel CRBI menempati urutan teratas (sekitar
21,37 juta), disusul CAtBat (18,63 juta), CRuns (18,30 juta), CHits
(17,73 juta), CWalks (15,73 juta), dan CHmRun (15,72 juta). Keenam
variabel ini seluruhnya merupakan statistik karier (kumulatif) pemain.
Variabel seperti PutOuts, NewLeague, dan League memiliki nilai
importance paling rendah sehingga kontribusinya terhadap prediksi Salary
relatif kecil. Hasil ini menunjukkan bahwa gaji pemain lebih banyak
dijelaskan oleh rekam jejak sepanjang karier dibandingkan oleh performa
satu musim atau kategori liga dan divisi.
Setelah model terbentuk, dilakukan prediksi terhadap data testing dengan predict(), lalu hasilnya dibandingkan dengan Salary aktual. Kinerja dinilai dengan Mean Squared Error (MSE), yaitu rata-rata kuadrat selisih antara nilai aktual dan nilai prediksi. Semakin kecil MSE, semakin rendah rata-rata kesalahan prediksi model.
# Melakukan prediksi pada data testing
pred.tree <- predict( fit.tree, newdata = Hitters.test)
# Membandingkan nilai aktual dan prediksi
hasil.prediksi <- data.frame(
Aktual = Hitters.test$Salary, Prediksi = pred.tree)
head(hasil.prediksi)## Aktual Prediksi
## -Al Newman 70 533.6190
## -Argenis Salazar 100 114.8837
## -Andre Thornton 1100 714.1666
## -Andy VanSlyke 550 501.2500
## -Alan Wiggins 700 358.0239
## -Buddy Biancalana 175 533.6190
# Menghitung Mean Squared Error (MSE)
mse.awal <- mean((Hitters.test$Salary - pred.tree)^2)
mse.awal## [1] 76127.9
Hasil prediksi model Regression Tree awal pada enam observasi pertama data testing menunjukkan selisih yang bervariasi antara Salary aktual dan prediksi (dalam ribuan dolar). Prediksi cukup dekat pada Argenis Salazar (aktual 100, prediksi 114,88) dan Andy VanSlyke (aktual 550, prediksi 501,25). Prediksi terlalu tinggi terjadi pada Al Newman (aktual 70, prediksi 533,62) dan Buddy Biancalana (aktual 175, prediksi 533,62), sedangkan prediksi terlalu rendah terjadi pada Andre Thornton (aktual 1.100, prediksi 714,17) dan Alan Wiggins (aktual 700, prediksi 358,02). Al Newman dan Buddy Biancalana mendapat prediksi yang sama karena keduanya jatuh pada simpul terminal yang sama, sehingga perbedaan gaji antarpemain dalam satu simpul tidak tertangkap oleh model. Secara keseluruhan, model awal menghasilkan MSE sebesar 76.127,9 pada data testing, atau RMSE sekitar 275,9 ribu dolar, yang berarti prediksi rata-rata menyimpang sekitar 275.900 dolar dari gaji sebenarnya. Simpangan ini cukup besar jika dibandingkan dengan rata-rata Salary pada data (sekitar 535,9 ribu dolar), sehingga kinerja model awal belum optimal. Hal ini diduga karena pohon awal terlalu kompleks (cp = 0.001) dan menyesuaikan diri terlalu rinci dengan data training (overfitting). Nilai MSE ini selanjutnya digunakan sebagai pembanding untuk model setelah pruning.
Selanjutnya, Complexity Parameter (CP) digunakan untuk mengendalikan kompleksitas pohon. Nilai CP yang sesuai dapat dipilih berdasarkan nilai cross-validation error terkecil pada tabel CP model.
##
## Regression tree:
## rpart(formula = Salary ~ ., data = Hitters.train, method = "anova",
## cp = 0.001)
##
## Variables actually used in tree construction:
## [1] Assists AtBat CAtBat CHmRun CRBI CRuns CWalks
## [8] Hits NewLeague RBI Runs Walks Years
##
## Root node error: 46453326/212 = 219119
##
## n= 212
##
## CP nsplit rel error xerror xstd
## 1 0.3563195 0 1.00000 1.00816 0.15341
## 2 0.1204419 1 0.64368 0.68692 0.11946
## 3 0.0662717 2 0.52324 0.72977 0.12157
## 4 0.0549555 3 0.45697 0.71152 0.12765
## 5 0.0386715 4 0.40201 0.64994 0.12969
## 6 0.0182578 5 0.36334 0.65490 0.12969
## 7 0.0159939 6 0.34508 0.69478 0.13070
## 8 0.0135229 7 0.32909 0.69799 0.13038
## 9 0.0105563 8 0.31557 0.72500 0.13524
## 10 0.0074473 9 0.30501 0.72502 0.13537
## 11 0.0067321 10 0.29756 0.72499 0.13647
## 12 0.0063038 11 0.29083 0.72336 0.13656
## 13 0.0041559 12 0.28453 0.72223 0.13582
## 14 0.0025760 13 0.28037 0.72288 0.13581
## 15 0.0017863 14 0.27779 0.72296 0.13581
## 16 0.0010000 15 0.27601 0.72057 0.13581
# Menentukan CP terbaik berdasarkan xerror terkecil
bestcp <- fit.tree$cptable[which.min(fit.tree$cptable[, "xerror"]),
"CP"
]
bestcp## [1] 0.03867153
Plot CP menunjukkan hubungan antara kompleksitas pohon (jumlah pemisahan pada sumbu atas dan nilai CP pada sumbu bawah) dengan cross-validation error relatif (X-val Relative Error) pada sumbu vertikal. Pada pohon tanpa pemisahan (0 split), error relatif berada di titik tertinggi, sekitar 1,0. Error turun tajam pada 1 pemisahan menjadi sekitar 0,69, naik sedikit pada 2 dan 3 pemisahan, kemudian mencapai titik terendah pada 4 pemisahan dengan nilai sekitar 0,65. Setelah itu error cenderung naik lagi dan mendatar di kisaran 0,72 mulai 8 hingga 15 pemisahan, sehingga penambahan cabang tidak memperbaiki prediksi pada data baru dan hanya membuat pohon lebih kompleks (overfitting). Garis putus-putus horizontal pada sekitar 0,78 adalah batas satu standar error di atas error minimum, sedangkan garis vertikal pada tiap titik menunjukkan rentang standar error cross-validation. Pohon dengan 4 pemisahan memiliki error terkecil, yang sesuai dengan nilai CP terbaik pada tabel CP (0,0387), sehingga ukuran inilah yang dipilih untuk pruning. Namun, pohon dengan 1 pemisahan juga berada di bawah garis batas tersebut, artinya pohon yang jauh lebih sederhana sebenarnya masih layak jika menggunakan aturan satu standar error. Dalam praktikum ini digunakan kriteria error terkecil sehingga dipilih pohon dengan 4 pemisahan.
# Melakukan pruning menggunakan CP terbaik
pruned.tree <- prune(fit.tree, cp = bestcp)
# Menampilkan hasil model setelah pruning
print(pruned.tree)## n= 212
##
## node), split, n, deviance, yval
## * denotes terminal node
##
## 1) root 212 46453330 544.9977
## 2) CRBI< 307.5 124 9065008 309.6062
## 4) CAtBat< 1428 79 4910701 201.3143 *
## 5) CAtBat>=1428 45 1601443 499.7185 *
## 3) CRBI>=307.5 88 20836090 876.6857
## 6) AtBat< 424 32 2174114 543.1250 *
## 7) AtBat>=424 56 13067050 1067.2920
## 14) CHmRun< 256.5 47 6300814 964.6910 *
## 15) CHmRun>=256.5 9 3687698 1603.0960 *
## CRBI CRuns CAtBat CHits CHmRun CWalks AtBat Hits
## 20077896 17544847 17343995 16603144 14740336 14650933 5594926 5245243
## Runs RBI Walks HmRun Years
## 4545877 3671670 3314364 2098097 1304797
Pohon regresi hasil pruning memiliki 4 pemisahan dan 5 simpul terminal. Setiap simpul menampilkan rata-rata Salary (dalam ribuan dolar) dan persentase observasi data training yang masuk ke simpul tersebut, sedangkan warna biru yang makin pekat menunjukkan nilai prediksi Salary yang makin tinggi. Simpul akar berisi seluruh data (100%) dengan rata-rata Salary 545 dan dipisahkan oleh variabel CRBI dengan batas 308. Pemain dengan CRBI kurang dari 308 (58% data) memiliki rata-rata Salary 310 dan dibagi lagi berdasarkan CAtBat dengan batas 1428: pemain dengan CAtBat kurang dari 1428 (37% data) diprediksi bergaji 201, yang merupakan kelompok gaji terendah, sedangkan pemain dengan CAtBat 1428 atau lebih (21% data) diprediksi bergaji 500. Pemain dengan CRBI 308 atau lebih (42% data) memiliki rata-rata Salary 877 dan dibagi berdasarkan AtBat dengan batas 424: pemain dengan AtBat kurang dari 424 (15% data) diprediksi bergaji 543, sedangkan pemain dengan AtBat 424 atau lebih (26% data, rata-rata 1067) dibagi lagi berdasarkan CHmRun dengan batas 257. Pemain dengan CHmRun kurang dari 257 (22% data) diprediksi bergaji 965, dan pemain dengan CHmRun 257 atau lebih (4% data) diprediksi bergaji 1603, yang merupakan kelompok gaji tertinggi. Secara keseluruhan, pola pohon menunjukkan bahwa pemain dengan akumulasi RBI karier, jumlah kesempatan memukul, dan jumlah home run karier yang lebih besar cenderung memiliki gaji lebih tinggi. Variabel CRBI menjadi penentu utama karena berada pada simpul akar, sehingga pohon ini jauh lebih sederhana dan mudah ditafsirkan dibandingkan pohon awal yang memiliki 16 simpul terminal.
# Prediksi pada data testing
pred.prune <- predict(
pruned.tree,
newdata = Hitters.test
)
# Membandingkan nilai aktual dan prediksi
hasil.pruning <- data.frame(
Aktual = Hitters.test$Salary,
Prediksi = pred.prune
)
head(hasil.pruning)## Aktual Prediksi
## -Al Newman 70 201.3143
## -Argenis Salazar 100 201.3143
## -Andre Thornton 1100 543.1250
## -Andy VanSlyke 550 499.7185
## -Alan Wiggins 700 499.7185
## -Buddy Biancalana 175 201.3143
# Menghitung MSE setelah pruning
mse.pruned <- mean(
(Hitters.test$Salary - pred.prune)^2
)
mse.pruned## [1] 61881.45
Tabel berikut membandingkan nilai MSE model sebelum dan setelah pruning pada data testing untuk mengetahui apakah pemangkasan pohon meningkatkan akurasi prediksi.
# Membuat tabel perbandingan MSE
perbandingan.mse <- data.frame(
Model = c(
"Sebelum Pruning",
"Setelah Pruning"
),
MSE = c(
mse.awal,
mse.pruned
)
)
perbandingan.mse## Model MSE
## 1 Sebelum Pruning 76127.90
## 2 Setelah Pruning 61881.45
Perbedaan nilai MSE kedua model tersebut kemudian divisualisasikan dalam diagram batang berikut agar selisih kesalahan prediksi sebelum dan setelah pruning lebih mudah dibandingkan.
ggplot(
perbandingan.mse,
aes(x = Model, y = MSE)
) +
geom_col(fill = "cadetblue") +
geom_text(
aes(label = round(MSE, 2)),
vjust = -0.5
) +
theme_minimal() +
labs(
title = "Perbandingan MSE Sebelum dan Setelah Pruning",
x = "",
y = "Mean Squared Error (MSE)"
)Diagram batang menunjukkan bahwa model sebelum pruning memiliki MSE sebesar 76.127,9, sedangkan model setelah pruning memiliki MSE sebesar 61.881,45, sehingga batang model setelah pruning tampak lebih pendek. Selisihnya sebesar 14.246,45, atau penurunan kesalahan prediksi sekitar 18,7%. Hal ini menunjukkan bahwa pruning berhasil meningkatkan kemampuan prediksi model pada data testing, karena pohon awal yang terlalu kompleks cenderung menyesuaikan diri terlalu rinci dengan data training (overfitting), sedangkan pohon hasil pruning yang lebih sederhana mampu memprediksi data baru dengan lebih baik. Dengan demikian, model Regression Tree setelah pruning dengan CP terbaik lebih baik digunakan untuk memprediksi Salary karena lebih akurat sekaligus lebih mudah ditafsirkan.
konsep dasar decision tree untuk klasifikasi dengan metode CART (Classification and Regression Tree) adalah membangun model prediksi dengan membagi data secara berulang menjadi subset yang lebih kecil. Data berbentuk tabel diubah menjadi pohon yang terdiri atas simpul akar, simpul keputusan, dan simpul daun yang berisi hasil klasifikasi. Pada CART, setiap pemisahan menghasilkan dua simpul (kiri dan kanan), dan pemisah terbaik dipilih menggunakan indeks Gini dan kriteria goodness of split. Semakin kecil nilai indeks Gini, semakin murni simpul tersebut karena datanya didominasi satu kelas.
Cara membangun model classification tree dengan algoritma CART dimulai dari persiapan data, yaitu menangani missing value, misalnya dengan imputasi MICE atau dengan menghapus data yang hilang. Data kemudian dibagi menjadi data latih dan data uji. Pohon maksimal dibentuk dari data latih dengan memilih pemisah terbaik pada setiap simpul, lalu setiap simpul diberi label kelas berdasarkan kelas yang paling banyak. Pohon tersebut dipangkas (pruning) dengan cost complexity dan cross validation agar lebih optimal, kemudian diuji pada data uji menggunakan confusion matrix untuk menghitung akurasi, presisi, recall, dan F1-score.
Berdasarkan hasil analisis dataset Hitters, data awal sebanyak 322
observasi dengan 59 missing value pada variabel Salary dibersihkan
menggunakan na.omit() sehingga tersisa 263 observasi, yang
kemudian dibagi menjadi 212 data training dan 51 data testing. Model
Regression Tree awal dengan cp = 0.001 menghasilkan pohon
yang kompleks dengan 16 simpul terminal dan MSE sebesar 76.127,9 pada
data testing, dengan CRBI, CAtBat, dan CRuns sebagai variabel yang
paling berkontribusi dalam pembentukan pohon. Berdasarkan tabel dan plot
CP, cross-validation error terkecil (0,650) dicapai pada 4 pemisahan
dengan CP terbaik sebesar 0,0387, sehingga pohon dipangkas menjadi 5
simpul terminal dengan variabel pemisah CRBI, CAtBat, AtBat, dan CHmRun.
Pohon hasil pruning memprediksi bahwa pemain dengan akumulasi RBI
karier, jumlah kesempatan memukul, dan jumlah home run karier yang lebih
besar cenderung bergaji lebih tinggi, dengan prediksi Salary berkisar
dari 201 hingga 1.603 ribu dolar. Model setelah pruning menghasilkan MSE
sebesar 61.881,45, lebih rendah sekitar 18,7% dibandingkan model sebelum
pruning, sehingga dapat disimpulkan bahwa pruning dengan CP terbaik
mampu mengurangi overfitting dan menghasilkan model Regression Tree yang
lebih akurat sekaligus lebih sederhana dan mudah diinterpretasikan.
Program R sangatlah bermanfaat bagi semua orang khususnya pada mahasiswa statistika, hal ini sangat memudahkan dalam mengolah suatu data di komputer. Tetapi pengguna harus lebih hati-hati dalam memasukan sintaks dan data karena apabila terjadi kesalahan dalam memasukan maupun mengolah data tersebut hasilnya akan sangat berpengaruh.
Eldiyana, I., Nurlaelah, E., & Herrhyanto, N. (2021). Estimasi missing data dengan metode Multivariate Imputation by Chained Equations (MICE) untuk membentuk persamaan regresi linear berganda. EurekaMatika, 9(1), 95–106.
Halimatussa’diyah, U., & Rohman, A. (2026). A Prediksi Prestasi Siswa Menggunakan Algoritma Decision Tree C4. 5. Jurnal Algoritma, 23(1), 51-58.
Handayany, I., Kusnandar, D., & Andani, W. (2023). Pendugaan data hilang menggunakan perbandingan imputasi Hot-Deck dan K-Nearest Neighbor. BIMASTER: Buletin Ilmiah Matematika, Statistika dan Terapannya, 12(4).
Indriyani, T., Suprapto, C., Mahendra, I. I., Pratama, R., & Wahyudi, M. N. (2025, June). Metode Decision Tree C4. 5 untuk Klasifikasi Berat Badan Obesitas. In Prosiding Seminar Nasional Teknik Elektro, Sistem Informasi, dan Teknik Informatika (SNESTIK) (Vol. 5, No. 1, pp. 361-370).
Nurdila, F. A. (2023). Penggunaan metode Classification and Regression Tree (CART) dalam mengklasifikasikan faktor yang mempengaruhi penyakit diabetes. Jurnal Ilmiah Matematika (Konvergensi), 10(2), 83–92.
Prasetya, M. R. A., Priyatno, A. M., & Nurhaeni. (2023). Penanganan imputasi Missing Values pada data Time Series dengan menggunakan metode Data Mining. Jurnal Informasi dan Teknologi, 5(2), 52–62.
Putro, A. W. G. P., & Setiadi, T. (2023). Penerapan Klasifikasi Decision Tree (C4. 5) untuk memprediksi kelulusan siswa sekolah dasar di Kecamatan Juai. Jurnal Format, 12(2), 151-157.