Perkembangan teknologi dan ketersediaan data yang semakin besar mendorong meningkatnya kebutuhan akan metode analisis yang mampu membentuk prediksi secara akurat sekaligus mudah dipahami. Machine learning menjadi salah satu pendekatan yang banyak digunakan untuk kebutuhan tersebut, khususnya supervised learning, yaitu metode yang mempelajari pola dari data berlabel untuk memprediksi kategori maupun nilai numerik. Di antara berbagai metode supervised learning, Decision Tree termasuk metode yang populer karena hasilnya dapat divisualisasikan dalam bentuk pohon keputusan dan diterjemahkan menjadi aturan prediksi yang mudah diinterpretasikan. Metode ini juga dapat menangani variabel prediktor numerik maupun kategorik.
Classification and Regression Tree (CART) merupakan salah satu algoritma Decision Tree yang termasuk metode nonparametrik berstruktur pohon, yaitu menggambarkan hubungan antara variabel respons dengan satu atau lebih variabel prediktor (Lisyhana, 2023). CART menghasilkan satu pohon keputusan tunggal dan dapat melibatkan data bertipe campuran (Widjanarko et al., 2022). Metode ini bekerja dengan membagi data secara bertahap melalui proses splitting sehingga terbentuk simpul-simpul yang semakin homogen. Apabila variabel respons berupa kategori, pohon yang terbentuk disebut pohon klasifikasi dengan kriteria seperti Gini Index atau Entropy, sedangkan apabila berupa numerik kontinu disebut pohon regresi dengan ukuran kesalahan seperti Mean Squared Error (MSE). Pohon yang dibiarkan tumbuh penuh cenderung kompleks dan rentan mengalami overfitting, sehingga diperlukan pruning untuk menyederhanakannya.
Berdasarkan hal tersebut, praktikum ini dilakukan untuk memahami konsep dasar Decision Tree dan menerapkan metode CART menggunakan perangkat lunak R, dengan paket rpart dan data Carseats dari paket ISLR. Pada kasus klasifikasi, penjualan kursi mobil anak dikelompokkan ke dalam kategori tinggi dan rendah, sedangkan pada kasus regresi, penjualan diprediksi sebagai nilai numerik. Kinerja model dievaluasi menggunakan confusion matrix, akurasi, precision, recall, dan AUC untuk pohon klasifikasi, serta MSE untuk pohon regresi, baik sebelum maupun sesudah dilakukan pruning.
Adapun batasan masalah pada penelitian ini yaitu 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 merupakan salah satu metode machine learning yang digunakan untuk menyelesaikan permasalahan klasifikasi maupun regresi. Metode ini membentuk struktur pohon yang terdiri atas node, cabang, dan leaf node untuk menggambarkan proses pengambilan keputusan berdasarkan karakteristik data. Decision Tree termasuk metode yang banyak digunakan dalam machine learning karena memiliki struktur yang relatif sederhana dan hasil prediksinya lebih mudah diinterpretasikan dibandingkan beberapa metode machine learning lainnya. Selain digunakan sebagai model prediksi, Decision Tree juga dapat menghasilkan aturan keputusan yang menggambarkan hubungan antara variabel prediktor dengan variabel respons (Blockeel et al., 2023).
Classification and Regression Tree (CART) merupakan salah satu metode dalam Decision Tree yang digunakan untuk membangun model prediksi melalui proses pemisahan data secara bertahap. CART dapat digunakan untuk dua jenis permasalahan, yaitu klasifikasi dan regresi. Pada klasifikasi, variabel respons berupa data kategorik sehingga hasil akhir model berupa kelas atau kategori. Sementara itu, pada regresi, variabel respons berupa data numerik kontinu sehingga model digunakan untuk memprediksi suatu nilai numerik (Chen et al., 2024). Decision Tree memiliki beberapa karakteristik, yaitu (Fransiska, 2026):
Sebuah Decision Tree tersusun atas beberapa komponen utama seperti pada Tabel berikut (Fransiska, 2026):
Tabel 1. Komponen Utama Decision Tree
| Komponen | Keterangan |
|---|---|
| Root node | Simpul awal atau simpul paling atas yang memuat seluruh data sebelum dilakukan pemisahan |
| Intermediate node | Simpul di antara root node dan leaf node yang masih dapat mengalami pemisahan |
| Leaf node | Simpul akhir yang menunjukkan hasil prediksi. Pada klasifikasi berupa kelas sedangkan pada regresi berupa nilai numerik |
| Branch | Cabang yang menghubungkan satu simpul dengan simpul lainnya berdasarkan aturan tertentu |
| Attribute | Variabel prediktor yang digunakan sebagai dasar untuk melakukan pemisahan data |
| Splitting criteria | Kriteria yang digunakan untuk menentukan pemisahan terbaik. Pada klasifikasi dapat menggunakan Gini Index atau Entropy sedangkan pada regresi dapat menggunakan ukuran kesalahan seperti MSE |
| Decision rules | Aturan keputusan yang terbentuk dari jalur percabangan dan digunakan untuk menghasilkan prediksi |
| Pruning | Proses pemangkasan cabang yang kurang penting untuk menyederhanakan pohon dan mengurangi risiko overfitting |
Classification Tree atau pohon klasifikasi adalah pohon keputusan yang digunakan ketika variabel respons berupa kategori. Pendekatan ini termasuk metode klasifikasi nonparametrik yang struktur pohonnya mudah dipahami dan diinterpretasikan. Pohon terdiri dari sejumlah simpul (node) yang dihubungkan oleh cabang, mulai dari simpul akar (root node) ke bawah hingga mencapai simpul akhir (leaf node) yang menunjukkan kelas prediksi (Pangestuti et al., 2025). CART menghasilkan satu pohon keputusan tunggal dan dapat melibatkan data bertipe campuran, yaitu numerik maupun kategorik (Widjanarko et al., 2022).
Pembentukan pohon klasifikasi dilakukan melalui proses pemisahan (splitting) secara berulang. Pada setiap simpul dicari variabel prediktor dan titik pemisah yang menghasilkan simpul anak yang paling homogen. Ukuran yang digunakan antara lain Entropy, Information Gain, dan Gini Index. Entropy mengukur ketidakmurnian kelas dalam simpul:
\[ \text{Entropy}(t) = -\sum_{k=1}^{K} p_k \log_2(p_k) \]
Information Gain mengukur penurunan Entropy setelah pemisahan:
\[ \text{IG} = E(D) - \sum_{j=1}^{J} \frac{|D_j|}{|D|} E(D_j) \] Gini Index mengukur ketidakmurnian (Gini impurity) simpul:
\[ \text{Gini}(t) = 1 - \sum_{k=1}^{K} p_k^2 \] Pada pemisahan biner, nilai Gini setelah pemisahan dihitung sebagai rata-rata terbobot:
\[ \text{Gini}_{split} = \frac{|D_1|}{|D|} \text{Gini}(D_1) + \frac{|D_2|}{|D|} \text{Gini}(D_2) \] dengan \(p_k\) adalah proporsi amatan kelas ke-\(k\) dalam simpul. Semakin kecil nilai Entropy atau Gini, semakin homogen simpul tersebut, dan pemisahan terbaik adalah yang menghasilkan Information Gain terbesar atau Gini split terkecil. Indeks Gini banyak dipilih dalam CART karena perhitungannya lebih sederhana dan cepat (Pangestuti et al., 2025).
Evaluasi model dilakukan untuk mengetahui seberapa baik pohon yang terbentuk memprediksi data testing. Pada Classification Tree, evaluasi dilakukan dengan membandingkan kelas aktual dan kelas prediksi dalam confusion matrix, kemudian dihitung akurasi, sensitivitas (recall), spesifisitas, dan presisi (Pangestuti et al., 2025). Selain itu, kinerja model juga dapat dilihat dari kurva Receiver Operating Characteristic (ROC) dan nilai Area Under the Curve (AUC). Nilai AUC berkisar antara 0 sampai 1, dan model semakin baik dalam membedakan kelas apabila nilainya mendekati 1. Pada Regression Tree, evaluasi dilakukan dengan membandingkan nilai aktual dan nilai prediksi menggunakan Mean Squared Error (MSE), Root Mean Squared Error (RMSE), dan koefisien determinasi (\(R^2\)). Model dengan nilai RMSE yang lebih rendah menunjukkan model yang lebih baik dan hasil yang lebih akurat (Qoiriah & Yamasari, 2021).
Tabel 2. Confusion Matrix
| Prediksi Positif | Prediksi Negatif | |
|---|---|---|
| Aktual Positif | True Positive (TP) | False Negative (FN) |
| Aktual Negatif | False Positive (FP) | True Negative (TN) |
Berdasarkan confusion matrix, kinerja Classification Tree dapat dievaluasi menggunakan beberapa ukuran, yaitu akurasi, precision, recall, specificity, dan F1-Score (Pangestuti et al., 2025). Akurasi menunjukkan proporsi seluruh amatan yang diprediksi dengan benar, sedangkan precision dan recall masing-masing menunjukkan ketepatan prediksi dan kemampuan model menangkap amatan kelas positif. Specificity menunjukkan kemampuan model menangkap amatan kelas negatif, dan F1-Score merupakan rata-rata harmonik dari precision dan recall. Rumus masing-masing ukuran disajikan pada Tabel 3.
Tabel 3. Ukuran Evaluasi Classification Tree
| Ukuran | Rumus | Keterangan |
|---|---|---|
| Akurasi | \(\frac{TP + TN}{TP + TN + FP + FN}\) | Proporsi seluruh amatan yang diprediksi dengan benar. |
| Precision | \(\frac{TP}{TP + FP}\) | Ketepatan prediksi pada kelas positif. |
| Recall | \(\frac{TP}{TP + FN}\) | Kemampuan model menangkap amatan kelas positif. |
| Specificity | \(\frac{TN}{TN + FP}\) | Kemampuan model menangkap amatan kelas negatif. |
| F1-Score | \(2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}\) | Rata-rata harmonik Precision dan Recall. |
Pada Regression Tree, evaluasi dilakukan dengan membandingkan nilai aktual dan nilai hasil prediksi. Ukuran yang digunakan adalah Mean Squared Error (MSE), Root Mean Squared Error (RMSE), dan koefisien determinasi (R²). Model dengan nilai RMSE yang lebih rendah menunjukkan model yang lebih baik dan hasil prediksi yang lebih akurat (Qoiriah & Yamasari, 2021), sedangkan nilai R² yang semakin mendekati 1 menunjukkan bahwa model semakin mampu menjelaskan keragaman respons. Rumus masing-masing ukuran disajikan pada Tabel 4.
Tabel 4. Ukuran Evaluasi Regression Tree
| Ukuran | Rumus | Keterangan |
|---|---|---|
| MSE | \(\frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2\) | Rata-rata kuadrat selisih nilai aktual dan prediksi. |
| RMSE | \(\sqrt{MSE}\) | Akar dari MSE, satuannya sama dengan variabel respons. |
| \(R^2\) | \(1 - \frac{\sum_{i=1}^{n}(y_i - \hat{y}_i)^2}{\sum_{i=1}^{n}(y_i - \bar{y})^2}\) | Proporsi keragaman respons yang dijelaskan model. |
Keterangan: \(y_i\) nilai aktual, \(\hat{y}_i\) nilai prediksi, \(\bar{y}\) rata-rata nilai aktual, dan \(n\) banyaknya amatan.
Missing value adalah kondisi ketika terdapat nilai yang tidak tersedia pada suatu observasi dalam dataset. Pada penelitian ini, penanganan missing value dilakukan menggunakan fungsi na.omit() yang tersedia dalam R. Fungsi ini menghapus seluruh observasi yang memiliki setidaknya satu nilai hilang pada salah satu variabel. Dengan demikian, data yang digunakan dalam pemodelan Regression Tree merupakan data yang tidak memiliki missing value. Pendekatan ini dilakukan agar proses pembentukan model, prediksi, dan evaluasi menggunakan data yang lengkap tanpa melakukan imputasi atau pengisian nilai yang hilang.
Jenis data yang digunakan dalam penelitian ini adalah data kuantitatif, yaitu data berbentuk angka yang dapat diolah dan dianalisis secara statistik. Sumber data yang digunakan merupakan data sekunder yang diperoleh dari dataset Hitters pada package ISLR dalam perangkat lunak R. Dataset ini memuat informasi mengenai pemain bisbol, termasuk variabel Salary yang digunakan sebagai variabel respons untuk membangun model prediksi menggunakan metode Decision Tree (Regression Tree).
| No | Variabel | Keterangan | Tipe Data | Peran |
|---|---|---|---|---|
| 1 | Salary | Gaji tahunan pemain pada tahun 1987 (dalam ribuan dolar) | Numerik | Respons |
| 2 | AtBat | Jumlah pukulan (at bat) pada musim 1986 | Numerik | Prediktor |
| 3 | Hits | Jumlah pukulan sukses (hits) pada musim 1986 | Numerik | Prediktor |
| 4 | HmRun | Jumlah home run pada musim 1986 | Numerik | Prediktor |
| 5 | Runs | Jumlah run yang dicetak pada musim 1986 | Numerik | Prediktor |
| 6 | RBI | Jumlah run batted in pada musim 1986 | Numerik | Prediktor |
| 7 | Walks | Jumlah walks pada musim 1986 | Numerik | Prediktor |
| 8 | Years | Lama bermain di liga utama (tahun) | Numerik | Prediktor |
| 9 | CAtBat | Jumlah at bat selama karier | Numerik | Prediktor |
| 10 | CHit | Jumlah hits selama karier | Numerik | Prediktor |
| 11 | CHmRun | Jumlah home run selama karier | Numerik | Prediktor |
| 12 | CRuns | Jumlah run yang dicetak selama karier | Numerik | Prediktor |
| 13 | CRBI | Jumlah run batted in selama karier | Numerik | Prediktor |
| 14 | CWalks | Jumlah walks selama karier | Numerik | Prediktor |
| 15 | League | Liga pemain pada akhir musim 1986 (A atau N) | Kategorik | Prediktor |
| 16 | Division | Divisi pemain pada akhir musim 1986 (E atau W) | Kategorik | Prediktor |
| 17 | PutOuts | Jumlah put out pada musim 1986 | Numerik | Prediktor |
| 18 | Assists | Jumlah assist pada musim 1986 | Numerik | Prediktor |
| 19 | Errors | Jumlah kesalahan (error) pada musim 1986 | Numerik | Prediktor |
| 20 | NewLeague | Liga pemain pada awal musim 1987 (A atau N) | Kategorik | Prediktor |
library(ISLR) # sumber dataset Hitters
library(dplyr) # manipulasi data
library(rpart) # membangun decision tree (CART)
library(rpart.plot) # visualisasi pohon
library(caret) # pembagian data training dan testing
library(ggplot2) # grafik
library(tibble) # rownames_to_column
data(Hitters)
dim(Hitters)## [1] 322 20
## '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
Interpretasi: Dataset Hitters terdiri atas 322
pemain (baris) dan 20 variabel (kolom). Variabel Salary adalah variabel
respons bertipe numerik, sedangkan 19 variabel lainnya menjadi
prediktor. Dari keluaran str() terlihat bahwa sebagian
besar variabel bertipe numerik (int atau num),
sedangkan League, Division, dan NewLeague bertipe factor (kategorik).
CART dapat langsung memproses kedua tipe tersebut tanpa transformasi
tambahan.
## 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
## [1] 59
## [1] 263 20
## [1] 0
Interpretasi: Terdapat total 59 data hilang, dan
seluruhnya berada pada variabel Salary (59 data), sedangkan variabel
lain lengkap. Karena Salary adalah variabel respons, baris yang tidak
memiliki nilai Salary tidak dapat digunakan untuk melatih maupun menguji
model. Setelah na.omit(), data berkurang dari 322 menjadi
263 baris, dan pengecekan ulang menunjukkan sisa data hilang sebanyak 0.
Dengan demikian, data siap digunakan untuk pemodelan.
set.seed(234)
idx <- createDataPartition(Hitters_clean$Salary, p = 0.7, list = FALSE)
data_train <- Hitters_clean[idx, ]
data_test <- Hitters_clean[-idx, ]
dim(data_train)## [1] 185 20
## [1] 78 20
Interpretasi: Data training terdiri atas 185 pemain (70.3%) dan data testing 78 pemain (29.7%). Data training digunakan untuk membentuk pohon, sedangkan data testing tidak ikut dilatih dan hanya digunakan untuk menilai kemampuan model memprediksi data baru. Hasil pembagian dapat berbeda bila nilai seed diganti.
set.seed(234)
fit_tree <- rpart(Salary ~ .,
data = data_train,
method = "anova",
cp = 0.001)
fit_tree## n= 185
##
## node), split, n, deviance, yval
## * denotes terminal node
##
## 1) root 185 37300170.00 529.3190
## 2) CRBI< 300.5 107 7781241.00 296.1480
## 4) CAtBat< 1447 71 4787307.00 205.7113
## 8) RBI>=16 64 451745.40 169.8464
## 16) CRuns< 101.5 37 43273.30 114.7297 *
## 17) CRuns>=101.5 27 142042.10 245.3766
## 34) Years< 3.5 10 6090.00 186.0000 *
## 35) Years>=3.5 17 79957.63 280.3039 *
## 9) RBI< 16 7 3500575.00 533.6190 *
## 5) CAtBat>=1447 36 1267980.00 474.5093
## 10) Walks< 60.5 27 759116.70 418.9753
## 20) Division=W 14 300819.20 361.2381 *
## 21) Division=E 13 361367.20 481.1538 *
## 11) Walks>=60.5 9 175788.90 641.1111 *
## 3) CRBI>=300.5 78 15721120.00 849.1817
## 6) Hits< 122.5 32 1830184.00 593.1771
## 12) HmRun< 7.5 16 724360.00 484.0104 *
## 13) HmRun>=7.5 16 724468.40 702.3438 *
## 7) Hits>=122.5 46 10334770.00 1027.2720
## 14) CHmRun< 256.5 39 5352320.00 917.2857
## 28) Years>=9.5 23 1423979.00 753.5352
## 56) CRuns< 751.5 13 361905.40 629.9725 *
## 57) CRuns>=751.5 10 605568.10 914.1667 *
## 29) Years< 9.5 16 2425068.00 1152.6770 *
## 15) CHmRun>=256.5 7 1882174.00 1640.0520 *
Interpretasi: Keluaran fit_tree
menampilkan setiap simpul beserta aturan pemisahnya, banyaknya amatan
(n), jumlah kuadrat galat (deviance), dan
rata-rata Salary (yval) pada simpul tersebut. Simpul akar
memuat 185 pemain dengan rata-rata Salary sebesar 529.32 (ribu dolar)
dan pemisah pertama menggunakan variabel CRBI. Pohon awal memiliki 13
simpul akhir, dan nilai Salary prediksi untuk pemain baru adalah
rata-rata Salary pada simpul akhir tempat pemain tersebut jatuh.
rpart.plot(fit_tree,
type = 4, extra = 101, fallen.leaves = TRUE,
box.palette = "GnBu", shadow.col = "gray",
main = "Regression Tree Awal (Salary)")Interpretasi: Pohon dibaca dari simpul akar di atas ke simpul akhir di bawah. Setiap kotak memuat rata-rata Salary dan banyaknya pemain, sedangkan cabang kiri berlaku bila syarat pada simpul terpenuhi (yes) dan cabang kanan bila tidak. Variabel yang berada dekat simpul akar (di sini CRBI) adalah pemisah paling kuat dalam membedakan gaji pemain. Simpul akhir dengan warna lebih pekat menunjukkan kelompok pemain dengan rata-rata gaji tertinggi, sehingga jalur dari akar ke simpul tersebut merupakan aturan keputusan (decision rules) untuk pemain bergaji tinggi.
vi_df <- data.frame(Importance = fit_tree$variable.importance) %>%
rownames_to_column("Variabel") %>%
mutate(Persen = round(100 * Importance / sum(Importance), 2),
Importance = round(Importance, 2)) %>%
arrange(desc(Importance))
knitr::kable(vi_df, caption = "Tingkat Kepentingan Variabel Prediktor")| Variabel | Importance | Persen |
|---|---|---|
| CRBI | 18006203.09 | 16.05 |
| CRuns | 16275302.12 | 14.51 |
| CHits | 15846822.12 | 14.13 |
| CAtBat | 15773269.72 | 14.06 |
| Years | 12575599.24 | 11.21 |
| CWalks | 11352010.78 | 10.12 |
| Hits | 3995824.17 | 3.56 |
| CHmRun | 3746799.11 | 3.34 |
| AtBat | 3626215.94 | 3.23 |
| Runs | 3249147.01 | 2.90 |
| RBI | 3101676.38 | 2.77 |
| Walks | 2436801.19 | 2.17 |
| HmRun | 1520655.45 | 1.36 |
| PutOuts | 553921.48 | 0.49 |
| Division | 96930.34 | 0.09 |
ggplot(vi_df, aes(x = reorder(Variabel, Importance), y = Importance)) +
geom_col(fill = "steelblue") +
coord_flip() +
labs(title = "Variable Importance Regression Tree",
x = "Variabel", y = "Importance") +
theme_minimal()Interpretasi: Tiga variabel dengan kepentingan tertinggi adalah CRBI, CRuns, CHits, dan variabel teratas (CRBI) menyumbang 16.05% dari total kepentingan. Artinya, variabel-variabel tersebut paling berperan dalam menjelaskan perbedaan Salary antarpemain. Variabel dengan skor kecil berkontribusi sedikit dalam menurunkan galat. Perlu dicatat bahwa variabel yang tidak muncul pada gambar pohon masih bisa memiliki skor, karena skor juga memperhitungkan pemisah pengganti.
pred_awal <- predict(fit_tree, newdata = data_test)
hasil_awal <- data.frame(Aktual = data_test$Salary,
Prediksi = round(pred_awal, 2),
Selisih = round(data_test$Salary - pred_awal, 2))
head(hasil_awal, 10)## Aktual Prediksi Selisih
## -Al Newman 70.0 533.62 -463.62
## -Argenis Salazar 100.0 114.73 -14.73
## -Andre Thornton 1100.0 702.34 397.66
## -Alan Wiggins 700.0 481.15 218.85
## -Buddy Biancalana 175.0 533.62 -358.62
## -Bill Doran 625.0 641.11 -16.11
## -Billy Hatcher 110.0 114.73 -4.73
## -BillyJo Robidoux 67.5 114.73 -47.23
## -Bill Schroeder 180.0 114.73 65.27
## -Chris Bando 305.0 280.30 24.70
mse_awal <- mean((data_test$Salary - pred_awal)^2)
rmse_awal <- sqrt(mse_awal)
c(MSE = round(mse_awal, 2), RMSE = round(rmse_awal, 2))## MSE RMSE
## 80020.62 282.88
Interpretasi: Model awal menghasilkan MSE sebesar 8.002062^{4} dan RMSE sebesar 282.88. Karena Salary dinyatakan dalam ribuan dolar, rata-rata galat prediksi model berkisar sekitar 282.88 ribu dolar. Semakin kecil nilai MSE, semakin dekat prediksi dengan nilai aktual. Nilai ini menjadi pembanding untuk menilai apakah pruning memperbaiki model.
##
## Regression tree:
## rpart(formula = Salary ~ ., data = data_train, method = "anova",
## cp = 0.001)
##
## Variables actually used in tree construction:
## [1] CAtBat CHmRun CRBI CRuns Division Hits HmRun RBI
## [9] Walks Years
##
## Root node error: 37300166/185 = 201623
##
## n= 185
##
## CP nsplit rel error xerror xstd
## 1 0.3699126 0 1.00000 1.01440 0.16933
## 2 0.0953392 1 0.63009 0.66573 0.13523
## 3 0.0831170 2 0.53475 0.73618 0.13772
## 4 0.0462720 3 0.45163 0.69985 0.12396
## 5 0.0403020 4 0.40536 0.69910 0.13299
## 6 0.0223856 5 0.36506 0.64196 0.13100
## 7 0.0122387 6 0.34267 0.66030 0.13128
## 8 0.0102240 7 0.33043 0.65698 0.12895
## 9 0.0089296 8 0.32021 0.65061 0.12904
## 10 0.0071429 9 0.31128 0.63971 0.12915
## 11 0.0025987 10 0.30414 0.63728 0.12981
## 12 0.0015012 11 0.30154 0.65142 0.13461
## 13 0.0010000 12 0.30004 0.65217 0.13460
## [1] 0.002598657
Interpretasi: Galat cross-validation terkecil
dicapai pada CP sebesar 0.0026, yaitu pada pohon dengan 10 pemisahan.
Berbeda dengan rel error yang selalu turun saat pohon
membesar, xerror turun lalu naik kembali, yang menandakan
pohon terlalu besar mulai menghafal data training
(overfitting). Karena itu CP dipilih berdasarkan
xerror terkecil, bukan rel error.
pruned_tree <- prune(fit_tree, cp = best_cp)
n_leaf_prune <- sum(pruned_tree$frame$var == "<leaf>")
rpart.plot(pruned_tree,
type = 4, extra = 101, fallen.leaves = TRUE,
box.palette = "GnBu", shadow.col = "gray",
main = "Regression Tree Setelah Pruning (Salary)")Interpretasi. Jumlah simpul akhir berubah dari 13 pada pohon awal menjadi 11 setelah pruning, sehingga pohon menjadi lebih sederhana dan lebih mudah diinterpretasikan. Cabang yang dibuang adalah cabang yang hanya memperbaiki galat pada data training tetapi tidak memperbaiki galat hasil cross-validation.
pred_prune <- predict(pruned_tree, newdata = data_test)
mse_prune <- mean((data_test$Salary - pred_prune)^2)
rmse_prune <- sqrt(mse_prune)
perbandingan <- data.frame(
Model = c("Sebelum Pruning", "Setelah Pruning"),
Simpul_Akhir = c(n_leaf_awal, n_leaf_prune),
MSE = round(c(mse_awal, mse_prune), 2),
RMSE = round(c(rmse_awal, rmse_prune), 2)
)
knitr::kable(perbandingan, caption = "Perbandingan Kinerja Model Sebelum dan Sesudah Pruning")| Model | Simpul_Akhir | MSE | RMSE |
|---|---|---|---|
| Sebelum Pruning | 13 | 80020.62 | 282.88 |
| Setelah Pruning | 11 | 77556.98 | 278.49 |
Interpretasi: MSE model setelah pruning sebesar 7.755698^{4}, dibandingkan 8.002062^{4} pada model awal. Nilai MSE menurun sebesar 3.08%, sehingga model hasil pruning lebih akurat sekaligus lebih sederhana. RMSE setelah pruning sebesar 278.49 ribu dolar. Kesimpulannya, model terbaik dipilih dengan mempertimbangkan MSE yang lebih kecil sekaligus kesederhanaan pohon.
Decision Tree merupakan metode supervised learning berbasis pohon yang membentuk aturan prediksi dengan membagi data secara bertahap berdasarkan variabel prediktor hingga terbentuk kelompok yang semakin homogen. Metode Classification and Regression Tree (CART) menghasilkan pohon klasifikasi apabila variabel respons berupa kategori dan pohon regresi apabila variabel respons berupa numerik kontinu. Pohon tersusun atas root node, intermediate node, leaf node, dan cabang, dengan leaf node sebagai hasil prediksi. Pemisahan terbaik ditentukan menggunakan ukuran kehomogenan simpul, yaitu Gini Index atau Entropy beserta Information Gain pada klasifikasi, serta ukuran galat seperti Mean Squared Error (MSE) pada regresi. Kelebihan metode ini adalah hasilnya mudah dipahami dan dapat menangani prediktor numerik maupun kategorik, sedangkan pohon yang terlalu besar dapat disederhanakan melalui pruning untuk mengurangi risiko overfitting.
Model Classification Tree dengan algoritma CART dibangun melalui tiga tahap yang diulang pada setiap simpul, yaitu mencari pemisahan terbaik dari setiap variabel prediktor, menentukan variabel dan pemisah terbaik, lalu melakukan pemisahan dan memeriksa apakah proses perlu dilanjutkan. Proses pemisahan berhenti apabila simpul sudah cukup homogen, tidak ada pemisahan yang mungkin dilakukan, jumlah amatan dalam simpul berada di bawah batas minimum, atau kedalaman pohon mencapai batas maksimum. Pada praktiknya di R, data dibagi menjadi data training dan testing, pohon dibentuk dengan fungsi rpart() menggunakan method = “class”, kemudian pentingnya variabel dianalisis. Selanjutnya, nilai complexity parameter (CP) terbaik dipilih berdasarkan galat cross-validation terkecil untuk melakukan pruning, dan kinerja model dievaluasi dengan confusion matrix, akurasi, precision, recall, specificity, serta kurva ROC dan AUC.
Berdasarkan hasil analisis pada dataset Hitters untuk memprediksi
Salary dengan Regression Tree, data yang semula berjumlah 322 pemain
menjadi 263 pemain setelah penanganan missing value dengan
na.omit(), kemudian dibagi menjadi 185 data training dan 78
data testing. Pohon awal memiliki 13 simpul akhir dengan variabel
pemisah pertama CRBI, dan tiga variabel dengan tingkat kepentingan
tertinggi adalah CRBI, CRuns, CHits. Nilai CP terbaik berdasarkan
cross-validation error terkecil adalah 0.0026, sehingga pohon hasil
pruning memiliki 11 simpul akhir. Model awal menghasilkan MSE sebesar
80020.62, sedangkan model setelah pruning menghasilkan MSE sebesar
77556.98 atau menurun sebesar 3.08%, sehingga model hasil pruning lebih
sederhana sekaligus lebih akurat dalam memprediksi Salary.
Pada praktikum Machine Learning berikutnya, disarankan agar praktikan lebih teliti dalam memasukkan dan mengolah data menggunakan RStudio, terutama dalam penggunaan sintaks serta interpretasi nilai CP, akurasi, sensitivity, specificity, dan AUC. Selain itu, pemilihan nilai cp perlu diperhatikan agar pohon yang dihasilkan tidak terlalu rumit dan tetap mampu mengklasifikasikan data dengan baik. Hasil evaluasi juga sebaiknya tidak hanya dilihat dari nilai akurasi, tetapi dikaitkan dengan sensitivity, specificity, dan AUC sehingga kesimpulan mengenai kemampuan model menjadi lebih tepat.
Blockeel, H., Devos, L., Frénay, B., Nanfack, G., & Nijssen, S. (2023). Decision trees: from efficient prediction to responsible AI. In Frontiers in Artificial Intelligence (Vol. 6). Frontiers Media SA.
Chen, Y., Cheung, K. C., Sun, R. Z., & Yam, S. C. P. (2024). A user guide of CART and random forests with applications in FinTech and InsurTech. Japanese Journal of Statistics and Data Science, 7(2), 999–1038.
Fransiska, H. (2026). Modul Praktikum Machine Learning. Universitas Bengkulu.
Lisyhana, E. (2023). Klasifikasi indeks prestasi mahasiswa Fakultas Sains dan Teknologi UIN Suska Riau berdasarkan biodata mahasiswa menggunakan metode CART [Skripsi, Universitas Islam Negeri Sultan Syarif Kasim Riau].
Pangestuti, A., Indawati, R., & Indriani, D. (2025). Penerapan metode Classification and Regression Tree (CART) dalam klasifikasi stroke di RS X. Jurnal Kesehatan Tambusai, 6(1), 2639–2647.
Widjanarko, E. W., Syafitri, U. D., & Alamudi, A. (2022). Klasifikasi sekolah dalam penerimaan mahasiswa baru Vokasi IPB jalur USMI menggunakan metode CART. Xplore: Journal of Statistics, 11(3)