Decision Tree merupakan metode machine learning terawasi yang digunakan untuk mengklasifikasikan data berdasarkan karakteristik tertentu. Hasil klasifikasi disajikan dalam bentuk pohon keputusan yang terdiri atas simpul akar (root node), simpul internal (internal node), cabang (branch), dan simpul daun (leaf node). Struktur tersebut memungkinkan aturan klasifikasi ditampilkan secara sistematis sehingga hasil prediksi lebih mudah dipahami dan diinterpretasikan (Bodine & Hochbaum, 2022).
Metode Classification and Regression Tree (CART) digunakan untuk membangun pohon keputusan melalui proses pemisahan data secara biner atau menjadi dua kelompok pada setiap percabangan. Proses pemilihan pemisahan terbaik dilakukan menggunakan indeks Gini untuk mengukur tingkat ketidakmurnian kelas pada setiap kelompok data. Pemisahan dilanjutkan secara rekursif hingga kriteria penghentian terpenuhi. Struktur pohon yang dihasilkan dapat digunakan untuk menentukan kelas berdasarkan pola karakteristik yang terdapat dalam data (Sharma & Iqbal, 2023).
Pembangunan model Classification Tree menggunakan algoritma CART dilakukan melalui penyiapan data, penentuan variabel prediktor dan variabel target, pembentukan pohon keputusan, serta evaluasi hasil klasifikasi. Kinerja model dapat dinilai menggunakan metrik seperti akurasi, presisi, recall, dan F1-score untuk mengetahui kemampuan model dalam mengklasifikasikan data. Penerapan tahapan tersebut diharapkan dapat menghasilkan model klasifikasi yang sistematis, mudah diinterpretasikan, dan sesuai dengan karakteristik data yang dianalisis (Abedinia & Seydi, 2024).
Berdasarkan latar belakang di atas, adapun rumusan masalah yang dapat disimpulkan sebagai berikut:
Berdasarkan rumusan masalah dapat disimpulkan tujuan penelitian sebagai berikut:
Decision Tree merupakan metode pembelajaran terawasi (supervised learning) yang digunakan untuk memprediksi kelas berdasarkan hubungan antara variabel prediktor dan variabel target. Proses klasifikasi dilakukan melalui serangkaian aturan pemisahan yang disusun dalam struktur pohon. Setiap simpul menunjukkan kondisi tertentu, sedangkan simpul daun menunjukkan kelas hasil prediksi. Struktur tersebut memungkinkan proses pengambilan keputusan dipahami melalui aturan yang terbentuk dari data (Bodine & Hochbaum, 2022).
Struktur Decision Tree tersusun atas tiga komponen utama, yaitu simpul akar (root node), simpul internal (internal node), dan simpul daun (leaf node). Simpul akar digunakan sebagai titik awal pemrosesan seluruh data, sedangkan simpul internal digunakan untuk menentukan pemisahan berdasarkan atribut tertentu. Simpul daun menunjukkan hasil akhir klasifikasi yang diperoleh dari rangkaian aturan pada setiap cabang pohon (Xu dkk., 2022).
Pembentukan pohon keputusan dilakukan melalui pemilihan variabel dan aturan pemisahan yang mampu membagi data ke dalam kelompok dengan karakteristik kelas yang lebih homogen. Proses pemisahan dilakukan secara berulang pada setiap simpul hingga kriteria penghentian tertentu terpenuhi. Kualitas pemisahan dapat dinilai menggunakan ukuran ketidakmurnian kelas, seperti indeks Gini atau entropi. Pemilihan aturan pemisahan yang tepat diperlukan untuk menghasilkan model klasifikasi yang mampu mengenali pola dalam data (Abedinia & Seydi, 2024).
Penerapan Decision Tree memiliki kelebihan berupa kemudahan interpretasi dan kemampuan dalam menghasilkan aturan klasifikasi yang sistematis. Model ini dapat digunakan untuk mengidentifikasi pola hubungan antara variabel prediktor dan kelas target. Kompleksitas pohon yang berlebihan dapat menyebabkan overfitting, yaitu kondisi ketika model terlalu menyesuaikan diri dengan data pelatihan sehingga kemampuan klasifikasi pada data baru menjadi kurang optimal. Pengendalian kompleksitas pohon diperlukan untuk meningkatkan kemampuan generalisasi model (Costa & Pedreira, 2023).
Classification and Regression Tree (CART) merupakan algoritma pembelajaran terawasi (supervised learning) yang digunakan untuk membangun pohon keputusan dalam menyelesaikan permasalahan klasifikasi maupun regresi. Pada klasifikasi, variabel target berbentuk kategori, sedangkan pada regresi, variabel target berbentuk numerik. Pembentukan pohon dilakukan melalui pemisahan data secara biner pada setiap simpul sehingga diperoleh kelompok pengamatan dengan karakteristik yang lebih homogen. Proses tersebut dilakukan secara berulang hingga kriteria penghentian terpenuhi atau kompleksitas pohon dikendalikan melalui pemangkasan (pruning) (Costa & Pedreira, 2023).
Pembentukan pohon keputusan memerlukan kriteria pemisahan untuk menentukan pembagian data yang paling baik. Salah satu kriteria yang digunakan dalam CART untuk klasifikasi adalah Gini Index, yaitu ukuran ketidakmurnian kelas pada suatu simpul. Nilai Gini yang semakin kecil menunjukkan bahwa pengamatan dalam simpul semakin didominasi oleh kelas tertentu (Liu & Yang, 2022).. Rumus Gini Index dinyatakan sebagai berikut (Fransiska, 2026):
\[ Gini(t)=1-\sum_{i=1}^{K}p_k^2 \]Kualitas pemisahan ditentukan berdasarkan nilai Gini tertimbang dari simpul anak yang terbentuk. Pada CART, data dibagi menjadi dua kelompok berdasarkan kondisi tertentu pada variabel prediktor. Rumus Gini setelah pemisahan dinyatakan sebagai berikut.
\[ Gini_{\text{split}}= \frac{n_L}{n_t}Gini(t_L)+ \frac{n_R}{n_t}Gini(t_R) \]
Pemisahan terbaik dipilih berdasarkan nilai ketidakmurnian yang lebih rendah setelah pembagian data. Proses tersebut dilakukan secara berulang hingga kriteria penghentian terpenuhi atau pohon dipangkas (pruning) untuk mengurangi kompleksitas model. Pemangkasan dilakukan agar pohon tidak terlalu menyesuaikan diri dengan data pelatihan sehingga kemampuan prediksi terhadap data baru dapat dipertahankan (Costa & Pedreira, 2023).
Regression Tree merupakan bagian dari CART yang digunakan untuk memprediksi variabel target numerik. Pembentukan pohon dilakukan dengan membagi data berdasarkan variabel prediktor sehingga variasi nilai target dalam setiap kelompok menjadi lebih kecil. Nilai prediksi pada simpul daun umumnya ditentukan berdasarkan rata-rata nilai target dari seluruh pengamatan yang berada dalam simpul tersebut (Costa & Pedreira, 2023).
Salah satu ukuran yang digunakan untuk menilai kesalahan prediksi pada regresi adalah Mean Squared Error (MSE). MSE dihitung berdasarkan rata-rata kuadrat selisih antara nilai aktual dan nilai prediksi. Nilai MSE yang lebih rendah menunjukkan kesalahan prediksi yang lebih kecil, sedangkan pengkuadratan menyebabkan kesalahan yang besar memberikan pengaruh lebih besar terhadap nilai MSE (Chicco dkk., 2021). Rumus MSE dinyatakan sebagai berikut.
\[ MSE=\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y}_i)^2 \]
Pemisahan dipilih apabila mampu menghasilkan simpul-simpul dengan nilai MSE yang lebih kecil. Dengan demikian, amatan yang berada dalam satu simpul memiliki nilai respons yang semakin mirip (Fransiska, 2026).
Evaluasi model klasifikasi merupakan tahapan penting untuk mengukur seberapa baik model yang dibangun dapat memprediksi kelas dengan benar. Confusion matrix merupakan salah satu alat ukur pada pembelajaran supervised learning berbentuk matriks yang digunakan untuk mendapatkan jumlah ketepatan klasifikasi dataset terhadap kelas tepat dan tidak tepat pada algoritma yang digunakan (Santosa dkk., 2018 dalam Nursyahfitri dkk., 2021). Confusion matrix terdiri dari dua jenis, yaitu confusion matrix binary untuk klasifikasi dengan dua output, dan confusion matrix multiclass untuk klasifikasi dengan lebih dari dua kelas (Nursyahfitri dkk., 2021).
Confusion matrix merepresentasikan absolute truths sebagai baris dan predicted classifications sebagai kolom, yang delineasi jumlah true positives, false positives (type-I error), true negatives, dan false negatives (type-II error). Nilai-nilai tersebut kemudian digunakan untuk menurunkan sensitivity (recall), specificity, positive predictive value (precision), negative predictive value, dan accuracy. Accuracy dapat menjadi metrik yang menyesatkan untuk dataset yang tidak seimbang, karena model yang selalu memprediksi kelas negatif pada dataset dengan hanya 1% kasus positif akan memiliki akurasi 99% (Cabot & Ross, 2023).
Akurasi merupakan proporsi kasus yang diidentifikasi benar terhadap jumlah semua kasus. Rumus akurasi adalah sebagai berikut (Han, Kamber, & Pei, 2012 dalam Agwil dkk., 2022):
\[ Accuracy = \frac{TP + TN}{TP + TN + FP + FN} \]
Sensitivity atau recall merupakan proporsi kasus positif yang diidentifikasi dengan benar. Rumus sensitivity adalah sebagai berikut:
\[ Sensitivity = \frac{TP}{TP + FN} \]
Specificity merupakan proporsi kasus negatif yang diidentifikasi dengan benar. Rumus specificity adalah sebagai berikut:
\[ Specificity = \frac{TN}{TN + FP} \]
Precision merupakan proporsi kasus dengan hasil positif yang benar. Rumus precision adalah sebagai berikut:
\[ Precision = \frac{TP}{TP + FP} \]
F1-Score merupakan harmonic mean dari precision dan recall yang mencerminkan tidak hanya kuantitas error yang dibuat model, tetapi juga tipe error tersebut (Cabot & Ross, 2023). F1-Score menjadi metrik yang robust terhadap ketidakseimbangan kelas. Rumus F1-Score adalah sebagai berikut:
\[ F1\text{-}Score = \frac{2 \times (Precision \times Recall)}{Precision + Recall} \]
Evaluasi kebaikan model klasifikasi juga dapat dilihat dari nilai AUC (Area Under Curve), yaitu nilai yang menggambarkan luas area di bawah kurva ROC (Receiver Operating Characteristic) dengan nilai antara 0 hingga 1. Kurva ROC adalah kurva yang menggambarkan kebaikan model klasifikasi yang disajikan dalam dua dimensi, memuat nilai persentase False Positive dengan persentase True Positive (Fawcett, 2006 dalam Agwil dkk., 2022). AUC memberikan ukuran diskriminasi model secara keseluruhan, di mana nilai 0,5 menunjukkan model yang tidak lebih baik dari tebakan acak, sedangkan nilai 1 menunjukkan diskriminasi sempurna (Cabot & Ross, 2023).
Jenis data yang digunakan dalam penelitian ini adalah data
kuantitatif, yaitu data yang dinyatakan dalam bentuk angka dan dapat
dianalisis menggunakan metode statistika. Data yang digunakan merupakan
data sekunder yang berasal dari dataset Hitters
yang tersedia dalam package ISLR pada perangkat
lunak R. Dataset tersebut memuat informasi mengenai pemain
bisbol, termasuk nilai gaji (Salary) dan sejumlah karakteristik
pemain yang dapat digunakan sebagai variabel prediktor. Penelitian ini
menggunakan data yang telah melalui proses pemeriksaan dan penanganan
missing value dengan menghapus observasi yang memiliki nilai
hilang.
Variabel penelitian merupakan karakteristik atau atribut yang diamati
untuk memperoleh informasi sesuai dengan tujuan penelitian. Penelitian
ini menggunakan variabel Salary sebagai variabel respons, yaitu
variabel yang akan diprediksi menggunakan metode Classification and
Regression Trees (CART) untuk regresi. Variabel Salary
bertipe numerik dan menunjukkan gaji pemain bisbol. Variabel prediktor
terdiri atas variabel-variabel lain dalam dataset
Hitters, seperti AtBat, Hits,
HmRun, Runs, RBI,
Walks, Years, CAtBat,
CHits, CHmRun, CRuns,
CRBI, CWalks, League,
Division, PutOuts, Assists,
Errors, dan NewLeague. Variabel prediktor
tersebut digunakan secara bersama-sama untuk membentuk model pohon
regresi dalam memprediksi nilai Salary.
Berikut merupakan algoritma penelitian pada batasan masalah:
xerror) terkecil.Pada tahap 4.1, dilakukan pemanggilan library yang
diperlukan untuk analisis Regression Tree menggunakan bahasa
pemrograman R. Paket ISLR digunakan untuk mengakses
dataset Hitters yang memuat informasi mengenai
pemain bisbol, termasuk variabel Salary sebagai variabel
respons yang akan diprediksi. Paket rpart digunakan untuk
membentuk model pohon regresi, sedangkan paket rpart.plot
digunakan untuk memvisualisasikan struktur pohon regresi yang
dihasilkan. Pemanggilan ketiga paket tersebut bertujuan agar seluruh
fungsi yang diperlukan dalam proses analisis dapat digunakan.
## '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
## [1] 322 20
## [1] "AtBat" "Hits" "HmRun" "Runs" "RBI" "Walks"
## [7] "Years" "CAtBat" "CHits" "CHmRun" "CRuns" "CRBI"
## [13] "CWalks" "League" "Division" "PutOuts" "Assists" "Errors"
## [19] "Salary" "NewLeague"
## 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
## 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
## Min. 1st Qu. Median Mean 3rd Qu. Max. NAs
## 67.5 190.0 425.0 535.9 750.0 2460.0 59
Berdasarkan hasil pemanggilan dataset Hitters,
diketahui bahwa data tersebut terdiri atas 322 observasi dan 20 variabel
yang menggambarkan karakteristik pemain bisbol. Variabel yang tersedia
mencakup jumlah kesempatan memukul (AtBat), jumlah pukulan berhasil
(Hits), jumlah home run (HmRun), jumlah runs, runs
batted in (RBI), jumlah walks, lama bermain
(Years), serta berbagai statistik kumulatif selama karier
pemain. Dataset ini juga memiliki variabel kategorik, yaitu
League, Division, dan NewLeague,
yang masing-masing menunjukkan kategori liga, divisi, dan liga baru
pemain. Variabel Salary merupakan variabel numerik yang
menunjukkan gaji pemain bisbol dan digunakan sebagai variabel respons
yang akan diprediksi dalam pemodelan Regression Tree, sedangkan
variabel lainnya digunakan sebagai prediktor.
Hasil statistik deskriptif menunjukkan bahwa variabel
Salary memiliki nilai minimum sebesar 67,5, median 425,0,
rata-rata 535,9, dan maksimum 2.460,0. Nilai rata-rata yang lebih besar
daripada median mengindikasikan bahwa distribusi gaji cenderung menceng
ke kanan, meskipun bentuk distribusi tersebut perlu dikonfirmasi melalui
visualisasi. Pemeriksaan missing value menunjukkan bahwa
terdapat 59 nilai hilang pada variabel Salary, sedangkan 19
variabel lainnya tidak memiliki nilai hilang. Dengan demikian, seluruh
dataset memiliki 59 nilai hilang yang perlu ditangani sebelum
pemodelan dilakukan. Penanganan tersebut dilakukan menggunakan fungsi
na.omit() untuk menghapus observasi yang memiliki nilai
hilang, sehingga data yang digunakan pada tahap analisis berikutnya
menjadi lengkap dan dapat diproses dalam pembentukan model Regression
Tree.
# Menghapus observasi yang memiliki missing value
Hitters.clean <- na.omit(Hitters)
# Memeriksa data setelah penanganan missing value
dim(Hitters.clean)## [1] 263 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 0 0
## [1] 0
## 'data.frame': 263 obs. of 20 variables:
## $ AtBat : int 315 479 496 321 594 185 298 323 401 574 ...
## $ Hits : int 81 130 141 87 169 37 73 81 92 159 ...
## $ HmRun : int 7 18 20 10 4 1 0 6 17 21 ...
## $ Runs : int 24 66 65 39 74 23 24 26 49 107 ...
## $ RBI : int 38 72 78 42 51 8 24 32 66 75 ...
## $ Walks : int 39 76 37 30 35 21 7 8 65 59 ...
## $ Years : int 14 3 11 2 11 2 3 2 13 10 ...
## $ CAtBat : int 3449 1624 5628 396 4408 214 509 341 5206 4631 ...
## $ CHits : int 835 457 1575 101 1133 42 108 86 1332 1300 ...
## $ CHmRun : int 69 63 225 12 19 1 0 6 253 90 ...
## $ CRuns : int 321 224 828 48 501 30 41 32 784 702 ...
## $ CRBI : int 414 266 838 46 336 9 37 34 890 504 ...
## $ CWalks : int 375 263 354 33 194 24 12 8 866 488 ...
## $ League : Factor w/ 2 levels "A","N": 2 1 2 2 1 2 1 2 1 1 ...
## $ Division : Factor w/ 2 levels "E","W": 2 2 1 1 2 1 2 2 1 1 ...
## $ PutOuts : int 632 880 200 805 282 76 121 143 0 238 ...
## $ Assists : int 43 82 11 40 421 127 283 290 0 445 ...
## $ Errors : int 10 14 3 4 25 7 9 19 0 22 ...
## $ Salary : num 475 480 500 91.5 750 ...
## $ NewLeague: Factor w/ 2 levels "A","N": 2 1 2 2 1 1 1 2 1 1 ...
## - attr(*, "na.action")= 'omit' Named int [1:59] 1 16 19 23 31 33 37 39 40 42 ...
## ..- attr(*, "names")= chr [1:59] "-Andy Allanson" "-Billy Beane" "-Bruce Bochte" "-Bob Boone" ...
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 67.5 190.0 425.0 535.9 750.0 2460.0
Berdasarkan hasil pemeriksaan missing value, diketahui bahwa
dataset Hitters memiliki 59 nilai hilang yang
seluruhnya terdapat pada variabel Salary, sedangkan 19
variabel lainnya tidak memiliki nilai hilang. Nilai gaji pemain bisbol
memiliki nilai minimum sebesar 67,5, kuartil pertama 190,0, median
425,0, rata-rata 535,9, kuartil ketiga 750,0, dan nilai maksimum
2.460,0. Penanganan data hilang dilakukan menggunakan fungsi
na.omit() untuk menghapus observasi yang mengandung nilai
hilang. Hasilnya, jumlah observasi berkurang dari 322 menjadi 263 dengan
tetap mempertahankan 20 variabel, sehingga terdapat 263 observasi yang
dapat digunakan untuk analisis selanjutnya. Pemeriksaan ulang
menunjukkan bahwa seluruh variabel pada dataset
Hitters.clean sudah tidak memiliki nilai hilang, dengan
jumlah missing value sebesar 0. Statistik deskriptif variabel
Salary setelah penanganan data juga menunjukkan nilai yang
tetap sama, yaitu minimum 67,5, kuartil pertama 190,0, median 425,0,
rata-rata 535,9, kuartil ketiga 750,0, dan maksimum 2.460,0. Dengan
demikian, dataset Hitters.clean telah siap
digunakan pada tahap pembagian data training dan
testing serta pembentukan model Regression Tree.
set.seed(46)
# Membagi data menjadi 70% training dan 30% testing
indeks.train <- sample(
seq_len(nrow(Hitters.clean)),
size = floor(0.7 * nrow(Hitters.clean))
)
Hitters.train <- Hitters.clean[indeks.train, ]
Hitters.test <- Hitters.clean[-indeks.train, ]
# Memeriksa dimensi data
dim(Hitters.train)## [1] 184 20
## [1] 79 20
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 70.0 198.8 400.0 508.9 737.5 2127.3
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 67.5 187.5 500.0 598.8 832.5 2460.0
## Jumlah data training: 184
## Jumlah data testing: 79
Pembagian data dilakukan menggunakan fungsi sample()
dengan proporsi 70% untuk data training dan 30% untuk data
testing. Penggunaan set.seed(46) bertujuan agar
pembagian data dapat direproduksi sehingga menghasilkan pembagian yang
sama ketika kode dijalankan kembali dengan kondisi data yang sama.
Berdasarkan hasil pembagian terhadap 263 observasi yang telah
dibersihkan, diperoleh 184 observasi data training (69,96%) dan
79 observasi data testing (30,04%), dengan masing-masing data
memiliki 20 variabel. Data training digunakan untuk membentuk
model Regression Tree, sedangkan data testing
digunakan untuk mengevaluasi kemampuan model dalam memprediksi data yang
tidak digunakan selama proses pelatihan.
Hasil statistik deskriptif variabel Salary pada data
training menunjukkan nilai minimum sebesar 70,0, kuartil
pertama 198,8, median 400,0, rata-rata 508,9, kuartil ketiga 737,5, dan
maksimum 2.127,3. Sementara itu, pada data testing, variabel
Salary memiliki nilai minimum 67,5, kuartil pertama 187,5,
median 500,0, rata-rata 598,8, kuartil ketiga 832,5, dan maksimum
2.460,0. Rata-rata gaji pada data testing sebesar 598,8 lebih
tinggi dibandingkan data training sebesar 508,9, begitu pula
nilai mediannya, yaitu 500,0 dibandingkan 400,0. Perbedaan ringkasan
statistik tersebut menunjukkan bahwa karakteristik gaji pada kedua
kelompok data tidak sepenuhnya sama, tetapi hal ini tidak serta-merta
menunjukkan adanya kesalahan pembagian data. Kedua kelompok data
selanjutnya digunakan sesuai fungsinya, yaitu data training
untuk membangun model dan data testing untuk mengukur kinerja
prediksi model.
fit.tree <- rpart(
Salary ~ .,
data = Hitters.train,
method = "anova",
cp = 0.001
)
# Menampilkan hasil model
print(fit.tree)## n= 184
##
## node), split, n, deviance, yval
## * denotes terminal node
##
## 1) root 184 31527960.00 508.9163
## 2) CHits< 450 83 5270083.00 238.6446
## 4) Walks>=12 76 1123504.00 209.6404
## 8) CAtBat< 842.5 40 99174.24 123.6125
## 16) CRBI< 55.5 25 16079.84 96.9200 *
## 17) CRBI>=55.5 15 35595.10 168.1000 *
## 9) CAtBat>=842.5 36 399374.00 305.2269
## 18) Years< 3.5 8 4187.50 188.7500 *
## 19) Years>=3.5 28 255641.70 338.5060
## 38) Runs< 58 18 125501.20 298.2315 *
## 39) Runs>=58 10 48390.00 411.0000 *
## 5) Walks< 12 7 3388498.00 553.5476 *
## 3) CHits>=450 101 15212620.00 731.0208
## 6) Walks< 66.5 82 5885531.00 628.1705
## 12) AtBat< 369 34 1510997.00 476.2255
## 24) CWalks< 245 11 314424.10 360.3789 *
## 25) CWalks>=245 23 978345.10 531.6304
## 50) Years>=11.5 16 670785.90 478.4375 *
## 51) Years< 11.5 7 158808.90 653.2143 *
## 13) AtBat>=369 48 3033549.00 735.7981
## 26) CHmRun< 104.5 35 1755135.00 661.2850
## 52) CHits< 876 20 703628.40 574.1250
## 104) CWalks>=170 10 457575.60 499.2500 *
## 105) CWalks< 170 10 133927.50 649.0000 *
## 53) CHits>=876 15 696985.70 777.4984 *
## 27) CHmRun>=104.5 13 560899.30 936.4102 *
## 7) Walks>=66.5 19 4716112.00 1174.9010 *
## Call:
## rpart(formula = Salary ~ ., data = Hitters.train, method = "anova",
## cp = 0.001)
## n= 184
##
## CP nsplit rel error xerror xstd
## 1 0.350332065 0 1.0000000 1.0089157 0.1563983
## 2 0.146250517 1 0.6496679 0.7366974 0.1483758
## 3 0.042533192 2 0.5034174 0.6333650 0.1324173
## 4 0.024044745 3 0.4608842 0.5443959 0.1273213
## 5 0.022758046 4 0.4368395 0.5584606 0.1273455
## 6 0.019822268 5 0.4140814 0.5577855 0.1272654
## 7 0.011244640 6 0.3942592 0.5505908 0.1338411
## 8 0.006921729 7 0.3830145 0.5608694 0.1338977
## 9 0.004718041 8 0.3760928 0.5672141 0.1340362
## 10 0.004426066 9 0.3713748 0.5771880 0.1341747
## 11 0.003556376 10 0.3669487 0.5753234 0.1341899
## 12 0.002592950 11 0.3633923 0.5611030 0.1229898
## 13 0.001506577 12 0.3607994 0.5615160 0.1231221
## 14 0.001000000 13 0.3592928 0.5624155 0.1231078
##
## Variable importance
## CHits CAtBat CRuns CRBI CWalks Years Walks HmRun RBI AtBat
## 15 14 14 13 12 10 7 2 2 2
## CHmRun Hits Runs PutOuts
## 2 2 2 1
##
## Node number 1: 184 observations, complexity param=0.3503321
## mean=508.9163, MSE=171347.6
## left son=2 (83 obs) right son=3 (101 obs)
## Primary splits:
## CHits < 450 to the left, improve=0.3503321, (0 missing)
## CRBI < 300.5 to the left, improve=0.3437421, (0 missing)
## CRuns < 288.5 to the left, improve=0.3401420, (0 missing)
## CAtBat < 1762.5 to the left, improve=0.3399308, (0 missing)
## CWalks < 222.5 to the left, improve=0.3264909, (0 missing)
## Surrogate splits:
## CAtBat < 1621.5 to the left, agree=0.984, adj=0.964, (0 split)
## CRuns < 213.5 to the left, agree=0.962, adj=0.916, (0 split)
## CRBI < 173.5 to the left, agree=0.951, adj=0.892, (0 split)
## CWalks < 164 to the left, agree=0.913, adj=0.807, (0 split)
## Years < 5.5 to the left, agree=0.848, adj=0.663, (0 split)
##
## Node number 2: 83 observations, complexity param=0.02404475
## mean=238.6446, MSE=63494.98
## left son=4 (76 obs) right son=5 (7 obs)
## Primary splits:
## Walks < 12 to the right, improve=0.1438463, (0 missing)
## RBI < 16 to the right, improve=0.1370759, (0 missing)
## AtBat < 183 to the right, improve=0.1117990, (0 missing)
## Hits < 42 to the right, improve=0.1099086, (0 missing)
## Runs < 20.5 to the right, improve=0.1093389, (0 missing)
## Surrogate splits:
## CWalks < 13.5 to the right, agree=0.964, adj=0.571, (0 split)
## AtBat < 73.5 to the right, agree=0.940, adj=0.286, (0 split)
## Hits < 18 to the right, agree=0.940, adj=0.286, (0 split)
## Runs < 7.5 to the right, agree=0.940, adj=0.286, (0 split)
## RBI < 5.5 to the right, agree=0.940, adj=0.286, (0 split)
##
## Node number 3: 101 observations, complexity param=0.1462505
## mean=731.0208, MSE=150620
## left son=6 (82 obs) right son=7 (19 obs)
## Primary splits:
## Walks < 66.5 to the left, improve=0.3031023, (0 missing)
## AtBat < 426.5 to the left, improve=0.2282812, (0 missing)
## Hits < 111.5 to the left, improve=0.2166547, (0 missing)
## RBI < 52.5 to the left, improve=0.2115759, (0 missing)
## Runs < 55.5 to the left, improve=0.1870110, (0 missing)
## Surrogate splits:
## HmRun < 23.5 to the left, agree=0.871, adj=0.316, (0 split)
## PutOuts < 1171 to the left, agree=0.851, adj=0.211, (0 split)
## RBI < 89.5 to the left, agree=0.842, adj=0.158, (0 split)
## CHmRun < 262.5 to the left, agree=0.842, adj=0.158, (0 split)
## CRuns < 1076 to the left, agree=0.832, adj=0.105, (0 split)
##
## Node number 4: 76 observations, complexity param=0.01982227
## mean=209.6404, MSE=14782.95
## left son=8 (40 obs) right son=9 (36 obs)
## Primary splits:
## CAtBat < 842.5 to the left, improve=0.5562559, (0 missing)
## CHits < 212 to the left, improve=0.5514170, (0 missing)
## CRBI < 113.5 to the left, improve=0.5321873, (0 missing)
## CRuns < 91.5 to the left, improve=0.5083211, (0 missing)
## CWalks < 62.5 to the left, improve=0.4756521, (0 missing)
## Surrogate splits:
## CHits < 207.5 to the left, agree=0.974, adj=0.944, (0 split)
## CRuns < 82.5 to the left, agree=0.895, adj=0.778, (0 split)
## CWalks < 62.5 to the left, agree=0.895, adj=0.778, (0 split)
## CRBI < 109.5 to the left, agree=0.868, adj=0.722, (0 split)
## Years < 3.5 to the left, agree=0.750, adj=0.472, (0 split)
##
## Node number 5: 7 observations
## mean=553.5476, MSE=484071.1
##
## Node number 6: 82 observations, complexity param=0.04253319
## mean=628.1705, MSE=71774.77
## left son=12 (34 obs) right son=13 (48 obs)
## Primary splits:
## AtBat < 369 to the left, improve=0.2278443, (0 missing)
## Runs < 33.5 to the left, improve=0.1693509, (0 missing)
## Hits < 104.5 to the left, improve=0.1662718, (0 missing)
## HmRun < 8.5 to the left, improve=0.1605404, (0 missing)
## CHmRun < 105.5 to the left, improve=0.1514983, (0 missing)
## Surrogate splits:
## Hits < 88 to the left, agree=0.939, adj=0.853, (0 split)
## Runs < 48.5 to the left, agree=0.890, adj=0.735, (0 split)
## RBI < 41.5 to the left, agree=0.854, adj=0.647, (0 split)
## Walks < 30.5 to the left, agree=0.793, adj=0.500, (0 split)
## HmRun < 8.5 to the left, agree=0.732, adj=0.353, (0 split)
##
## Node number 7: 19 observations
## mean=1174.901, MSE=248216.4
##
## Node number 8: 40 observations, complexity param=0.001506577
## mean=123.6125, MSE=2479.356
## left son=16 (25 obs) right son=17 (15 obs)
## Primary splits:
## CRBI < 55.5 to the left, improve=0.4789480, (0 missing)
## CHits < 132 to the left, improve=0.4494562, (0 missing)
## Runs < 69.5 to the left, improve=0.4351310, (0 missing)
## CRuns < 61.5 to the left, improve=0.3988390, (0 missing)
## CAtBat < 527 to the left, improve=0.3965521, (0 missing)
## Surrogate splits:
## CAtBat < 592 to the left, agree=0.90, adj=0.733, (0 split)
## CHits < 132 to the left, agree=0.90, adj=0.733, (0 split)
## CHmRun < 13 to the left, agree=0.90, adj=0.733, (0 split)
## Hits < 111 to the left, agree=0.85, adj=0.600, (0 split)
## HmRun < 7.5 to the left, agree=0.85, adj=0.600, (0 split)
##
## Node number 9: 36 observations, complexity param=0.004426066
## mean=305.2269, MSE=11093.72
## left son=18 (8 obs) right son=19 (28 obs)
## Primary splits:
## Years < 3.5 to the left, improve=0.3494089, (0 missing)
## CRuns < 207 to the left, improve=0.3196246, (0 missing)
## CWalks < 120 to the left, improve=0.2899503, (0 missing)
## CAtBat < 1296.5 to the left, improve=0.2816982, (0 missing)
## CHits < 285.5 to the left, improve=0.2326863, (0 missing)
## Surrogate splits:
## AtBat < 555.5 to the right, agree=0.861, adj=0.375, (0 split)
## Hits < 131.5 to the right, agree=0.833, adj=0.250, (0 split)
## HmRun < 25.5 to the right, agree=0.833, adj=0.250, (0 split)
## RBI < 94.5 to the right, agree=0.833, adj=0.250, (0 split)
## Errors < 18.5 to the right, agree=0.833, adj=0.250, (0 split)
##
## Node number 12: 34 observations, complexity param=0.006921729
## mean=476.2255, MSE=44441.1
## left son=24 (11 obs) right son=25 (23 obs)
## Primary splits:
## CWalks < 245 to the left, improve=0.1444265, (0 missing)
## CRuns < 566 to the left, improve=0.1431722, (0 missing)
## Walks < 21 to the left, improve=0.1378920, (0 missing)
## CHmRun < 124.5 to the left, improve=0.1320232, (0 missing)
## CRBI < 680.5 to the left, improve=0.1137013, (0 missing)
## Surrogate splits:
## CAtBat < 3279 to the left, agree=0.882, adj=0.636, (0 split)
## CHits < 830 to the left, agree=0.882, adj=0.636, (0 split)
## CHmRun < 49 to the left, agree=0.882, adj=0.636, (0 split)
## CRuns < 414 to the left, agree=0.882, adj=0.636, (0 split)
## CRBI < 321.5 to the left, agree=0.882, adj=0.636, (0 split)
##
## Node number 13: 48 observations, complexity param=0.02275805
## mean=735.7981, MSE=63198.94
## left son=26 (35 obs) right son=27 (13 obs)
## Primary splits:
## CHmRun < 104.5 to the left, improve=0.2365266, (0 missing)
## CHits < 876 to the left, improve=0.2270707, (0 missing)
## CRBI < 354 to the left, improve=0.2241231, (0 missing)
## CRuns < 455.5 to the left, improve=0.2235858, (0 missing)
## CAtBat < 4053 to the left, improve=0.2121736, (0 missing)
## Surrogate splits:
## Years < 12 to the left, agree=0.917, adj=0.692, (0 split)
## CRBI < 542.5 to the left, agree=0.917, adj=0.692, (0 split)
## CAtBat < 5845 to the left, agree=0.896, adj=0.615, (0 split)
## CHits < 1580.5 to the left, agree=0.896, adj=0.615, (0 split)
## CRuns < 733.5 to the left, agree=0.896, adj=0.615, (0 split)
##
## Node number 16: 25 observations
## mean=96.92, MSE=643.1936
##
## Node number 17: 15 observations
## mean=168.1, MSE=2373.007
##
## Node number 18: 8 observations
## mean=188.75, MSE=523.4375
##
## Node number 19: 28 observations, complexity param=0.00259295
## mean=338.506, MSE=9130.059
## left son=38 (18 obs) right son=39 (10 obs)
## Primary splits:
## Runs < 58 to the left, improve=0.3197853, (0 missing)
## CRuns < 207 to the left, improve=0.2822320, (0 missing)
## CAtBat < 1296.5 to the left, improve=0.2783720, (0 missing)
## CRBI < 119.5 to the left, improve=0.2043606, (0 missing)
## RBI < 41 to the left, improve=0.2027982, (0 missing)
## Surrogate splits:
## Walks < 45 to the left, agree=0.929, adj=0.8, (0 split)
## AtBat < 423 to the left, agree=0.893, adj=0.7, (0 split)
## Hits < 107.5 to the left, agree=0.893, adj=0.7, (0 split)
## CRuns < 207 to the left, agree=0.893, adj=0.7, (0 split)
## CHits < 362 to the left, agree=0.857, adj=0.6, (0 split)
##
## Node number 24: 11 observations
## mean=360.3789, MSE=28584.01
##
## Node number 25: 23 observations, complexity param=0.004718041
## mean=531.6304, MSE=42536.74
## left son=50 (16 obs) right son=51 (7 obs)
## Primary splits:
## Years < 11.5 to the right, improve=0.1520427, (0 missing)
## Runs < 33.5 to the left, improve=0.1517064, (0 missing)
## Errors < 3.5 to the left, improve=0.1517064, (0 missing)
## HmRun < 5.5 to the right, improve=0.1152806, (0 missing)
## League splits as LR, improve=0.1091724, (0 missing)
## Surrogate splits:
## CAtBat < 3934 to the right, agree=0.870, adj=0.571, (0 split)
## CHits < 1126.5 to the right, agree=0.870, adj=0.571, (0 split)
## CWalks < 305.5 to the right, agree=0.870, adj=0.571, (0 split)
## CRuns < 580 to the right, agree=0.826, adj=0.429, (0 split)
## CRBI < 371.5 to the right, agree=0.826, adj=0.429, (0 split)
##
## Node number 26: 35 observations, complexity param=0.01124464
## mean=661.285, MSE=50146.71
## left son=52 (20 obs) right son=53 (15 obs)
## Primary splits:
## CHits < 876 to the left, improve=0.2019905, (0 missing)
## HmRun < 14.5 to the right, improve=0.1695887, (0 missing)
## Runs < 89.5 to the right, improve=0.1671773, (0 missing)
## CAtBat < 3076 to the left, improve=0.1456154, (0 missing)
## Assists < 397.5 to the right, improve=0.1326077, (0 missing)
## Surrogate splits:
## CAtBat < 2898.5 to the left, agree=0.914, adj=0.800, (0 split)
## CRuns < 357.5 to the left, agree=0.886, adj=0.733, (0 split)
## CRBI < 332 to the left, agree=0.857, adj=0.667, (0 split)
## CWalks < 206 to the left, agree=0.800, adj=0.533, (0 split)
## Years < 7.5 to the left, agree=0.771, adj=0.467, (0 split)
##
## Node number 27: 13 observations
## mean=936.4102, MSE=43146.1
##
## Node number 38: 18 observations
## mean=298.2315, MSE=6972.29
##
## Node number 39: 10 observations
## mean=411, MSE=4839
##
## Node number 50: 16 observations
## mean=478.4375, MSE=41924.12
##
## Node number 51: 7 observations
## mean=653.2143, MSE=22686.99
##
## Node number 52: 20 observations, complexity param=0.003556376
## mean=574.125, MSE=35181.42
## left son=104 (10 obs) right son=105 (10 obs)
## Primary splits:
## CWalks < 170 to the right, improve=0.15935300, (0 missing)
## Errors < 15.5 to the right, improve=0.10063580, (0 missing)
## Assists < 170.5 to the right, improve=0.09729352, (0 missing)
## CHits < 552 to the right, improve=0.09268630, (0 missing)
## Years < 5.5 to the right, improve=0.08152712, (0 missing)
## Surrogate splits:
## Years < 5.5 to the right, agree=0.85, adj=0.7, (0 split)
## AtBat < 473.5 to the left, agree=0.80, adj=0.6, (0 split)
## Hits < 125.5 to the left, agree=0.75, adj=0.5, (0 split)
## RBI < 47.5 to the left, agree=0.75, adj=0.5, (0 split)
## HmRun < 6.5 to the left, agree=0.70, adj=0.4, (0 split)
##
## Node number 53: 15 observations
## mean=777.4984, MSE=46465.71
##
## Node number 104: 10 observations
## mean=499.25, MSE=45757.56
##
## Node number 105: 10 observations
## mean=649, MSE=13392.75
##
## Regression tree:
## rpart(formula = Salary ~ ., data = Hitters.train, method = "anova",
## cp = 0.001)
##
## Variables actually used in tree construction:
## [1] AtBat CAtBat CHits CHmRun CRBI CWalks Runs Walks Years
##
## Root node error: 31527965/184 = 171348
##
## n= 184
##
## CP nsplit rel error xerror xstd
## 1 0.3503321 0 1.00000 1.00892 0.15640
## 2 0.1462505 1 0.64967 0.73670 0.14838
## 3 0.0425332 2 0.50342 0.63337 0.13242
## 4 0.0240447 3 0.46088 0.54440 0.12732
## 5 0.0227580 4 0.43684 0.55846 0.12735
## 6 0.0198223 5 0.41408 0.55779 0.12727
## 7 0.0112446 6 0.39426 0.55059 0.13384
## 8 0.0069217 7 0.38301 0.56087 0.13390
## 9 0.0047180 8 0.37609 0.56721 0.13404
## 10 0.0044261 9 0.37137 0.57719 0.13417
## 11 0.0035564 10 0.36695 0.57532 0.13419
## 12 0.0025930 11 0.36339 0.56110 0.12299
## 13 0.0015066 12 0.36080 0.56152 0.12312
## 14 0.0010000 13 0.35929 0.56242 0.12311
## [1] 14
# Visualisasi Regression Tree
rpart.plot(
fit.tree,
type = 2,
extra = 101,
fallen.leaves = TRUE,
main = "Regression Tree untuk Prediksi Salary"
)Pembentukan model Regression Tree dilakukan menggunakan
fungsi rpart() dengan Salary sebagai variabel
respons dan seluruh variabel lainnya sebagai prediktor. Metode
anova digunakan karena variabel respons berupa data
numerik, sedangkan nilai complexity parameter (cp)
ditetapkan sebesar 0,001 untuk memungkinkan pembentukan pohon dengan
percabangan yang lebih terperinci sebelum dilakukan pemangkasan
(pruning). Berdasarkan hasil pemodelan terhadap 184 observasi
data training, diperoleh pohon regresi awal dengan 14 simpul terminal.
Variabel yang digunakan dalam pembentukan percabangan pohon meliputi
AtBat, CAtBat, CHits,
CHmRun, CRBI, CWalks,
Runs, Walks, dan Years. Variabel
CHits, yang menunjukkan jumlah pukulan berhasil secara
kumulatif selama karier pemain, menjadi variabel pemisah pertama pada
akar pohon dengan titik pemisah 450. Sebanyak 83 observasi dengan
CHits kurang dari 450 masuk ke cabang kiri, dengan
rata-rata gaji sebesar 238,64, sedangkan 101 observasi dengan
CHits lebih besar atau sama dengan 450 masuk ke cabang
kanan, dengan rata-rata gaji sebesar 731,02. Hasil tersebut menunjukkan
bahwa CHits menjadi pemisah awal yang penting dalam
membedakan kelompok pemain berdasarkan rata-rata gajinya pada model yang
terbentuk.
Hasil variable importance menunjukkan bahwa
CHits memiliki nilai kepentingan tertinggi sebesar 15,
diikuti oleh CAtBat dan CRuns, masing-masing
sebesar 14, serta CRBI sebesar 13. Variabel
CWalks memiliki nilai kepentingan sebesar 12, sedangkan
Years sebesar 10. Hasil ini menunjukkan bahwa statistik
kumulatif karier pemain, terutama jumlah pukulan berhasil, jumlah
kesempatan memukul, jumlah runs, dan jumlah runs batted in
selama karier, berperan penting dalam pembentukan pohon regresi.
Meskipun demikian, nilai variable importance menunjukkan
kontribusi variabel dalam proses pemodelan, bukan bukti bahwa variabel
tersebut secara langsung menyebabkan kenaikan gaji pemain. Berdasarkan
tabel complexity parameter, nilai cross-validation
error (xerror) terkecil adalah sekitar 0,54440 pada
CP sebesar 0,024044745 dengan tiga percabangan (nsplit =
3). Nilai ini menjadi informasi penting untuk menentukan kompleksitas
pohon yang sesuai pada tahap pruning berikutnya. Model awal
memiliki root node error sebesar 31.527.965 dan galat kuadrat
rata-rata pada akar (root node MSE) sebesar 171.347,6, yang
menggambarkan variasi gaji dalam data training sebelum
dilakukan pembagian berdasarkan variabel prediktor. Oleh karena itu,
pohon regresi awal selanjutnya perlu dievaluasi dan dipangkas untuk
memperoleh struktur yang lebih sederhana serta menilai apakah
penyederhanaan model dapat meningkatkan kemampuan prediksinya pada data
testing.
importance <- sort(
fit.tree$variable.importance,
decreasing = TRUE
)
# Menampilkan variable importance
print(importance)## CHits CAtBat CRuns CRBI CWalks Years
## 12739316.81 12254856.03 12046549.61 11282145.38 10439748.29 8643231.01
## Walks HmRun RBI AtBat CHmRun Hits
## 6104955.87 2037624.04 1903289.50 1734409.61 1619269.73 1537049.88
## Runs PutOuts Errors
## 1284363.62 970732.87 34886.21
# Membentuk tabel variable importance
tabel.importance <- data.frame(
Variabel = names(importance),
Importance = as.numeric(importance)
)
print(tabel.importance)## Variabel Importance
## 1 CHits 12739316.81
## 2 CAtBat 12254856.03
## 3 CRuns 12046549.61
## 4 CRBI 11282145.38
## 5 CWalks 10439748.29
## 6 Years 8643231.01
## 7 Walks 6104955.87
## 8 HmRun 2037624.04
## 9 RBI 1903289.50
## 10 AtBat 1734409.61
## 11 CHmRun 1619269.73
## 12 Hits 1537049.88
## 13 Runs 1284363.62
## 14 PutOuts 970732.87
## 15 Errors 34886.21
# Visualisasi variable importance
if (length(importance) > 0) {
barplot(
importance,
horiz = TRUE,
las = 1,
main = "Variable Importance Regression Tree",
xlab = "Nilai Importance"
)
} else {
cat("Variable importance tidak tersedia.\n")
}Berdasarkan hasil analisis variable importance, variabel yang memiliki tingkat kepentingan tertinggi dalam membentuk model regression tree adalah CHits sebesar 12.739.316,81, diikuti oleh CAtBat sebesar 12.254.856,03, CRuns sebesar 12.046.549,61, CRBI sebesar 11.282.145,38, dan CWalks sebesar 10.439.748,29. Hasil tersebut menunjukkan bahwa statistik kumulatif jumlah hits (CHits) memiliki kontribusi paling besar dalam pembentukan pohon regresi untuk memprediksi nilai Salary pemain bisbol. Variabel Years juga memiliki tingkat kepentingan yang cukup tinggi, yaitu sebesar 8.643.231,01, disusul oleh Walks sebesar 6.104.955,87. Sementara itu, variabel HmRun, RBI, AtBat, CHmRun, Hits, Runs, dan PutOuts memiliki nilai kepentingan yang lebih rendah dibandingkan variabel-variabel sebelumnya.
Variabel dengan tingkat kepentingan paling rendah adalah Errors, dengan nilai sebesar 34.886,21. Perbedaan nilai importance tersebut menunjukkan bahwa setiap variabel memberikan kontribusi yang berbeda dalam membantu model membentuk pemisahan data untuk memprediksi gaji pemain bisbol. Secara keseluruhan, variabel yang berkaitan dengan statistik kumulatif karier, seperti CHits, CAtBat, CRuns, CRBI, dan CWalks, cenderung memiliki tingkat kepentingan lebih tinggi dibandingkan variabel lainnya. Namun, nilai variable importance tidak secara langsung menunjukkan hubungan sebab-akibat antara variabel prediktor dan gaji pemain, melainkan menggambarkan kontribusi relatif variabel dalam pembentukan model regression tree.
# Prediksi Salary pada data testing
pred.tree <- predict(
fit.tree,
newdata = Hitters.test
)
# Membandingkan nilai aktual dan prediksi
hasil.prediksi <- data.frame(
Salary_Aktual = Hitters.test$Salary,
Salary_Prediksi = as.numeric(pred.tree)
)
head(hasil.prediksi)## Salary_Aktual Salary_Prediksi
## 1 500.0 936.4102
## 2 750.0 777.4984
## 3 75.0 553.5476
## 4 512.5 360.3789
## 5 550.0 298.2315
## 6 600.0 1174.9014
# Menghitung MSE
MSE.awal <- mean(
(Hitters.test$Salary - pred.tree)^2
)
# Menghitung RMSE
RMSE.awal <- sqrt(MSE.awal)
cat("MSE model awal:", MSE.awal, "\n")## MSE model awal: 148549
## RMSE model awal: 385.4205
Berdasarkan hasil prediksi menggunakan model regression tree, diperoleh nilai prediksi Salary untuk setiap observasi pada data testing yang terdiri atas 79 pemain bisbol. Nilai prediksi tersebut kemudian dibandingkan dengan nilai Salary aktual untuk mengetahui kemampuan model dalam memprediksi gaji pemain yang belum digunakan pada proses pembentukan model. Evaluasi kinerja model dilakukan menggunakan dua ukuran kesalahan, yaitu Mean Squared Error (MSE) dan Root Mean Squared Error (RMSE). Hasil perhitungan menunjukkan bahwa model awal menghasilkan nilai MSE sebesar 148.549 dan RMSE sebesar 385,4205.
Nilai MSE sebesar 148.549 menunjukkan besarnya rata-rata kuadrat selisih antara nilai Salary aktual dan nilai prediksi model pada data testing. Sementara itu, nilai RMSE sebesar 385,4205 menunjukkan bahwa besarnya kesalahan prediksi model berada pada skala yang sama dengan variabel Salary, yaitu sekitar 385,42 satuan gaji sesuai skala data yang digunakan. Semakin kecil nilai MSE dan RMSE, semakin dekat hasil prediksi terhadap nilai aktual. Hasil ini menjadi dasar untuk mengevaluasi apakah model regression tree dapat ditingkatkan melalui proses pemangkasan (pruning) agar menghasilkan prediksi yang lebih baik. Namun, penilaian bahwa model awal sudah baik atau belum perlu dilakukan dengan membandingkan nilai MSE dan RMSE dengan model setelah pruning atau model alternatif lainnya.
##
## Regression tree:
## rpart(formula = Salary ~ ., data = Hitters.train, method = "anova",
## cp = 0.001)
##
## Variables actually used in tree construction:
## [1] AtBat CAtBat CHits CHmRun CRBI CWalks Runs Walks Years
##
## Root node error: 31527965/184 = 171348
##
## n= 184
##
## CP nsplit rel error xerror xstd
## 1 0.3503321 0 1.00000 1.00892 0.15640
## 2 0.1462505 1 0.64967 0.73670 0.14838
## 3 0.0425332 2 0.50342 0.63337 0.13242
## 4 0.0240447 3 0.46088 0.54440 0.12732
## 5 0.0227580 4 0.43684 0.55846 0.12735
## 6 0.0198223 5 0.41408 0.55779 0.12727
## 7 0.0112446 6 0.39426 0.55059 0.13384
## 8 0.0069217 7 0.38301 0.56087 0.13390
## 9 0.0047180 8 0.37609 0.56721 0.13404
## 10 0.0044261 9 0.37137 0.57719 0.13417
## 11 0.0035564 10 0.36695 0.57532 0.13419
## 12 0.0025930 11 0.36339 0.56110 0.12299
## 13 0.0015066 12 0.36080 0.56152 0.12312
## 14 0.0010000 13 0.35929 0.56242 0.12311
## CP nsplit rel error xerror xstd
## 1 0.350332065 0 1.0000000 1.0089157 0.1563983
## 2 0.146250517 1 0.6496679 0.7366974 0.1483758
## 3 0.042533192 2 0.5034174 0.6333650 0.1324173
## 4 0.024044745 3 0.4608842 0.5443959 0.1273213
## 5 0.022758046 4 0.4368395 0.5584606 0.1273455
## 6 0.019822268 5 0.4140814 0.5577855 0.1272654
## 7 0.011244640 6 0.3942592 0.5505908 0.1338411
## 8 0.006921729 7 0.3830145 0.5608694 0.1338977
## 9 0.004718041 8 0.3760928 0.5672141 0.1340362
## 10 0.004426066 9 0.3713748 0.5771880 0.1341747
## 11 0.003556376 10 0.3669487 0.5753234 0.1341899
## 12 0.002592950 11 0.3633923 0.5611030 0.1229898
## 13 0.001506577 12 0.3607994 0.5615160 0.1231221
## 14 0.001000000 13 0.3592928 0.5624155 0.1231078
# Menentukan CP dengan xerror terkecil
indeks.bestcp <- which.min(tabel.cp[, "xerror"])
bestcp <- tabel.cp[indeks.bestcp, "CP"]
cat("CP terbaik:", bestcp, "\n")## CP terbaik: 0.02404475
## Cross-validation error minimum: 0.5443959
Berdasarkan hasil tabel kompleksitas pohon (complexity parameter atau CP), model regression tree yang dibentuk menggunakan 184 observasi data training memiliki 14 tingkat konfigurasi pohon, mulai dari pohon tanpa percabangan hingga pohon dengan 13 percabangan (nsplit). Nilai relative error menunjukkan penurunan dari 1,00000 pada pohon awal menjadi 0,35929 pada pohon dengan 13 percabangan. Hal ini menunjukkan bahwa penambahan percabangan dapat mengurangi kesalahan model terhadap data training. Namun, penurunan kesalahan pada data training tidak selalu diikuti oleh peningkatan kemampuan prediksi terhadap data baru, sehingga pemilihan kompleksitas pohon perlu mempertimbangkan nilai cross-validation error atau xerror.
Berdasarkan hasil perhitungan, nilai xerror terkecil adalah 0,5443959, yang diperoleh pada nilai CP sebesar 0,024044745 dengan jumlah percabangan (nsplit) sebanyak 3. Nilai CP tersebut dipilih sebagai CP terbaik karena menghasilkan kesalahan validasi silang paling rendah di antara konfigurasi pohon yang ditampilkan. Setelah jumlah percabangan ditambah menjadi 4, nilai xerror meningkat menjadi 0,5584606, sehingga penambahan kompleksitas pohon tidak memberikan hasil validasi yang lebih baik. Oleh karena itu, nilai CP sebesar 0,024044745 akan digunakan sebagai dasar untuk melakukan pemangkasan (pruning) terhadap pohon regresi awal. Proses ini bertujuan memperoleh model yang lebih sederhana dengan tetap mempertahankan kemampuan prediksi yang baik.
# Memangkas pohon menggunakan CP terbaik
pruned.tree <- prune(
fit.tree,
cp = bestcp
)
# Menampilkan model setelah pruning
print(pruned.tree)## n= 184
##
## node), split, n, deviance, yval
## * denotes terminal node
##
## 1) root 184 31527960 508.9163
## 2) CHits< 450 83 5270083 238.6446 *
## 3) CHits>=450 101 15212620 731.0208
## 6) Walks< 66.5 82 5885531 628.1705
## 12) AtBat< 369 34 1510997 476.2255 *
## 13) AtBat>=369 48 3033549 735.7981 *
## 7) Walks>=66.5 19 4716112 1174.9010 *
## Call:
## rpart(formula = Salary ~ ., data = Hitters.train, method = "anova",
## cp = 0.001)
## n= 184
##
## CP nsplit rel error xerror xstd
## 1 0.35033206 0 1.0000000 1.0089157 0.1563983
## 2 0.14625052 1 0.6496679 0.7366974 0.1483758
## 3 0.04253319 2 0.5034174 0.6333650 0.1324173
## 4 0.02404475 3 0.4608842 0.5443959 0.1273213
##
## Variable importance
## CHits CAtBat CRuns CRBI CWalks Years Walks HmRun RBI AtBat
## 15 15 15 14 12 10 7 3 2 2
## Hits Runs PutOuts CHmRun
## 2 1 1 1
##
## Node number 1: 184 observations, complexity param=0.3503321
## mean=508.9163, MSE=171347.6
## left son=2 (83 obs) right son=3 (101 obs)
## Primary splits:
## CHits < 450 to the left, improve=0.3503321, (0 missing)
## CRBI < 300.5 to the left, improve=0.3437421, (0 missing)
## CRuns < 288.5 to the left, improve=0.3401420, (0 missing)
## CAtBat < 1762.5 to the left, improve=0.3399308, (0 missing)
## CWalks < 222.5 to the left, improve=0.3264909, (0 missing)
## Surrogate splits:
## CAtBat < 1621.5 to the left, agree=0.984, adj=0.964, (0 split)
## CRuns < 213.5 to the left, agree=0.962, adj=0.916, (0 split)
## CRBI < 173.5 to the left, agree=0.951, adj=0.892, (0 split)
## CWalks < 164 to the left, agree=0.913, adj=0.807, (0 split)
## Years < 5.5 to the left, agree=0.848, adj=0.663, (0 split)
##
## Node number 2: 83 observations
## mean=238.6446, MSE=63494.98
##
## Node number 3: 101 observations, complexity param=0.1462505
## mean=731.0208, MSE=150620
## left son=6 (82 obs) right son=7 (19 obs)
## Primary splits:
## Walks < 66.5 to the left, improve=0.3031023, (0 missing)
## AtBat < 426.5 to the left, improve=0.2282812, (0 missing)
## Hits < 111.5 to the left, improve=0.2166547, (0 missing)
## RBI < 52.5 to the left, improve=0.2115759, (0 missing)
## Runs < 55.5 to the left, improve=0.1870110, (0 missing)
## Surrogate splits:
## HmRun < 23.5 to the left, agree=0.871, adj=0.316, (0 split)
## PutOuts < 1171 to the left, agree=0.851, adj=0.211, (0 split)
## RBI < 89.5 to the left, agree=0.842, adj=0.158, (0 split)
## CHmRun < 262.5 to the left, agree=0.842, adj=0.158, (0 split)
## CRuns < 1076 to the left, agree=0.832, adj=0.105, (0 split)
##
## Node number 6: 82 observations, complexity param=0.04253319
## mean=628.1705, MSE=71774.77
## left son=12 (34 obs) right son=13 (48 obs)
## Primary splits:
## AtBat < 369 to the left, improve=0.2278443, (0 missing)
## Runs < 33.5 to the left, improve=0.1693509, (0 missing)
## Hits < 104.5 to the left, improve=0.1662718, (0 missing)
## HmRun < 8.5 to the left, improve=0.1605404, (0 missing)
## CHmRun < 105.5 to the left, improve=0.1514983, (0 missing)
## Surrogate splits:
## Hits < 88 to the left, agree=0.939, adj=0.853, (0 split)
## Runs < 48.5 to the left, agree=0.890, adj=0.735, (0 split)
## RBI < 41.5 to the left, agree=0.854, adj=0.647, (0 split)
## Walks < 30.5 to the left, agree=0.793, adj=0.500, (0 split)
## HmRun < 8.5 to the left, agree=0.732, adj=0.353, (0 split)
##
## Node number 7: 19 observations
## mean=1174.901, MSE=248216.4
##
## Node number 12: 34 observations
## mean=476.2255, MSE=44441.1
##
## Node number 13: 48 observations
## mean=735.7981, MSE=63198.94
##
## Regression tree:
## rpart(formula = Salary ~ ., data = Hitters.train, method = "anova",
## cp = 0.001)
##
## Variables actually used in tree construction:
## [1] AtBat CHits Walks
##
## Root node error: 31527965/184 = 171348
##
## n= 184
##
## CP nsplit rel error xerror xstd
## 1 0.350332 0 1.00000 1.00892 0.15640
## 2 0.146251 1 0.64967 0.73670 0.14838
## 3 0.042533 2 0.50342 0.63337 0.13242
## 4 0.024045 3 0.46088 0.54440 0.12732
## [1] 4
# Visualisasi pohon setelah pruning
rpart.plot(
pruned.tree,
type = 2,
extra = 101,
fallen.leaves = TRUE,
main = "Regression Tree Setelah Pruning"
)Berdasarkan hasil pemangkasan (pruning) menggunakan nilai complexity parameter (CP) terbaik sebesar 0,024044745, pohon regresi yang semula memiliki 14 simpul terminal berhasil disederhanakan menjadi 4 simpul terminal dengan 3 percabangan. Hasil ini menunjukkan bahwa model yang telah dipangkas memiliki struktur yang lebih sederhana dibandingkan model awal. Pada simpul akar (root node), variabel CHits menjadi variabel pemisah pertama dengan batas 450, yang membagi 184 observasi menjadi dua kelompok, yaitu 83 observasi dengan rata-rata Salary sebesar 238,6446 dan 101 observasi dengan rata-rata Salary sebesar 731,0208. Kelompok dengan nilai CHits kurang dari 450 menjadi simpul terminal, sedangkan kelompok dengan nilai CHits lebih besar atau sama dengan 450 dibagi kembali berdasarkan variabel Walks dengan batas 66,5. Selanjutnya, kelompok dengan Walks kurang dari 66,5 dibagi berdasarkan variabel AtBat dengan batas 369. Pembagian tersebut menghasilkan tiga kelompok tambahan dengan rata-rata Salary masing-masing sebesar 476,2255, 735,7981, dan 1.174,9010.
Hasil printcp(pruned.tree) menunjukkan bahwa model
setelah pemangkasan menggunakan tiga variabel dalam pembentukan pohon,
yaitu CHits, Walks, dan AtBat. Nilai relative error pada model
dengan tiga percabangan adalah 0,4608842, sedangkan nilai
cross-validation error (xerror) sebesar 0,5443959 merupakan
yang terkecil pada tabel CP. Hal ini menunjukkan bahwa konfigurasi pohon
dengan tiga percabangan dipilih berdasarkan hasil validasi silang.
Selain itu, penyederhanaan pohon dapat membantu mengurangi kompleksitas
model dan risiko overfitting. Meskipun demikian, untuk
mengetahui apakah pemangkasan meningkatkan kemampuan prediksi, model
yang telah dipangkas tetap perlu diuji pada data testing dan
dibandingkan dengan model awal menggunakan nilai MSE dan RMSE.
# Prediksi menggunakan model setelah pruning
pred.pruned <- predict(
pruned.tree,
newdata = Hitters.test
)
# Membandingkan hasil prediksi
hasil.pruning <- data.frame(
Salary_Aktual = Hitters.test$Salary,
Prediksi_Awal = as.numeric(pred.tree),
Prediksi_Pruning = as.numeric(pred.pruned)
)
head(hasil.pruning)## Salary_Aktual Prediksi_Awal Prediksi_Pruning
## 1 500.0 936.4102 735.7981
## 2 750.0 777.4984 735.7981
## 3 75.0 553.5476 238.6446
## 4 512.5 360.3789 476.2255
## 5 550.0 298.2315 238.6446
## 6 600.0 1174.9014 1174.9014
# Menghitung MSE setelah pruning
MSE.pruning <- mean(
(Hitters.test$Salary - pred.pruned)^2
)
# Menghitung RMSE setelah pruning
RMSE.pruning <- sqrt(MSE.pruning)
cat("MSE setelah pruning:", MSE.pruning, "\n")## MSE setelah pruning: 141557
## RMSE setelah pruning: 376.2407
Berdasarkan hasil prediksi menggunakan model regression tree setelah dilakukan pemangkasan (pruning), diperoleh nilai prediksi Salary pada data testing yang kemudian dibandingkan dengan nilai aktual dan hasil prediksi dari model awal. Evaluasi dilakukan menggunakan ukuran kesalahan Mean Squared Error (MSE) dan Root Mean Squared Error (RMSE). Hasil perhitungan menunjukkan bahwa model setelah pruning menghasilkan nilai MSE sebesar 141.557 dan RMSE sebesar 376,2407. Nilai tersebut lebih rendah dibandingkan model awal yang memiliki MSE sebesar 148.549 dan RMSE sebesar 385,4205.
Penurunan nilai MSE dan RMSE menunjukkan bahwa model setelah pruning memiliki kesalahan prediksi yang lebih kecil dibandingkan model awal pada data testing. Nilai MSE mengalami penurunan sebesar 6.992, sedangkan RMSE menurun sebesar 9,1798. Dengan demikian, proses pruning memberikan perbaikan terhadap kemampuan prediksi model dalam memperkirakan gaji pemain bisbol pada data testing. Selain itu, model yang telah dipangkas memiliki struktur yang lebih sederhana, yaitu 4 simpul terminal dengan 3 percabangan. Berdasarkan hasil tersebut, model regression tree setelah pruning dapat dipilih sebagai model yang lebih baik dibandingkan model awal karena menghasilkan nilai kesalahan prediksi yang lebih rendah sekaligus memiliki struktur pohon yang lebih sederhana.
# Menghitung jumlah simpul terminal sebelum pruning
jumlah.node.awal <- sum(
fit.tree$frame$var == "<leaf>"
)
# Menghitung jumlah simpul terminal setelah pruning
jumlah.node.pruning <- sum(
pruned.tree$frame$var == "<leaf>"
)
# Membuat tabel perbandingan
perbandingan <- data.frame(
Model = c(
"Sebelum Pruning",
"Setelah Pruning"
),
MSE = c(
MSE.awal,
MSE.pruning
),
RMSE = c(
RMSE.awal,
RMSE.pruning
),
Jumlah_Simpul_Terminal = c(
jumlah.node.awal,
jumlah.node.pruning
)
)
print(perbandingan)## Model MSE RMSE Jumlah_Simpul_Terminal
## 1 Sebelum Pruning 148549 385.4205 14
## 2 Setelah Pruning 141557 376.2407 4
# Menghitung selisih MSE
selisih.MSE <- MSE.awal - MSE.pruning
cat("Selisih MSE:", selisih.MSE, "\n")## Selisih MSE: 6991.953
# Menghitung persentase penurunan MSE
persentase.perubahan <- if (MSE.awal != 0) {
(MSE.awal - MSE.pruning) / MSE.awal * 100
} else {
NA
}
cat(
"Persentase penurunan MSE (%):",
persentase.perubahan,
"\n"
)## Persentase penurunan MSE (%): 4.706833
Berdasarkan tabel perbandingan, model regression tree sebelum dan setelah pemangkasan (pruning) menunjukkan perbedaan dalam tingkat kesalahan prediksi dan kompleksitas pohon. Model sebelum pruning memiliki nilai MSE sebesar 148.549 dan RMSE sebesar 385,4205 dengan 14 simpul terminal. Setelah dilakukan pruning, nilai MSE menurun menjadi 141.557 dan RMSE menjadi 376,2407, sedangkan jumlah simpul terminal berkurang menjadi 4. Hasil tersebut menunjukkan bahwa proses pruning berhasil menyederhanakan struktur pohon dengan mengurangi 10 simpul terminal tanpa meningkatkan kesalahan prediksi pada data testing.
Selisih nilai MSE sebelum dan setelah pruning adalah sebesar 6.991,953, dengan persentase penurunan MSE sebesar 4,71%. Penurunan nilai MSE dan RMSE menunjukkan bahwa model setelah pruning menghasilkan prediksi yang lebih dekat dengan nilai Salary aktual pada data testing. Selain itu, pengurangan jumlah simpul terminal dari 14 menjadi 4 membuat model lebih sederhana dan lebih mudah diinterpretasikan. Dengan demikian, berdasarkan perbandingan nilai MSE, RMSE, dan jumlah simpul terminal, model regression tree setelah pruning lebih baik dibandingkan model awal pada data testing yang digunakan.
Konsep dasar Decision Tree untuk klasifikasi menggunakan metode CART berkaitan dengan pembentukan model berstruktur pohon yang terdiri atas simpul akar, simpul internal, cabang, dan simpul daun. Metode CART membentuk pohon melalui pemisahan data secara biner secara rekursif, sehingga setiap simpul menghasilkan dua simpul anak yang semakin homogen. Jika variabel respons bersifat kategorik, pohon yang terbentuk disebut Classification Tree. Pemilihan pemisah terbaik pada CART didasarkan pada indeks Gini, yaitu ukuran ketidakmurnian kelas dalam suatu simpul.
Pembangunan model Classification Tree menggunakan algoritma CART dilakukan melalui beberapa tahapan, yaitu penentuan pemisah terbaik berdasarkan penurunan impurity, pembentukan simpul hingga kriteria pemberhentian terpenuhi, dan pemberian label kelas pada setiap simpul terminal. Pohon yang terbentuk kemudian dapat disederhanakan melalui pruning untuk mengurangi kompleksitas dan risiko overfitting. Pemilihan pohon optimal dilakukan dengan cost-complexity pruning yang dipandu oleh validasi silang. Kinerja model selanjutnya dievaluasi menggunakan confusion matrix, ROC, dan AUC.
Berdasarkan hasil batasan masalah, dapat disimpulkan bahwa metode regression tree dapat digunakan untuk memprediksi gaji (Salary) pemain bisbol berdasarkan sejumlah variabel prediktor. Model awal yang dibentuk memiliki 14 simpul terminal dengan nilai MSE sebesar 148.549 dan RMSE sebesar 385,4205. Setelah dilakukan pemangkasan (pruning) menggunakan nilai complexity parameter (CP) terbaik sebesar 0,024044745, jumlah simpul terminal berkurang menjadi 4, dengan nilai MSE sebesar 141.557 dan RMSE sebesar 376,2407. Hasil tersebut menunjukkan bahwa pemangkasan mampu menyederhanakan struktur pohon sekaligus menurunkan nilai MSE sebesar 4,71% dibandingkan model awal. Dengan demikian, model regression tree setelah pruning dipilih sebagai model yang lebih baik karena menghasilkan kesalahan prediksi yang lebih rendah dan struktur model yang lebih sederhana pada data testing.
Penulis menyarankan agar ketepatan sintaks program R selalu diperhatikan untuk menghindari kesalahan dalam proses analisis. Penggunaan bahasa perlu disesuaikan dengan kaidah KBBI. Aturan penulisan huruf tebal juga perlu diperhatikan agar laporan tersusun secara sistematis, rapi, dan sesuai dengan kaidah penulisan ilmiah.
Abedinia, A., & Seydi, V. (2024). Building semi-supervised decision trees with semi-cart algorithm. International Journal of Machine Learning and Cybernetics, 15, 4493–4510. https://doi.org/10.1007/s13042-024-02161-z
Agwil, W., Agustina, D., Fransiska, H., & Hidayati, N. (2022). Klasifikasi karakteristik kemiskinan di Provinsi Bengkulu tahun 2020 menggunakan metode pohon klasifikasi gabungan. Jurnal Aplikasi Statistika & Komputasi Statistik, 14(2), 23–32.
Bodine, J., & Hochbaum, D. S. (2022). A better decision tree: The Max-Cut decision tree with modified PCA improves accuracy and running time. SN Computer Science, 3, Article 313. https://doi.org/10.1007/s42979-022-01147-4
Cabot, J. H., & Ross, E. G. (2023). Evaluating prediction model performance. Surgery, 174(3), 723–726. https://doi.org/10.1016/j.surg.2023.05.023
Costa, V. G., & Pedreira, C. E. (2023). Recent advances in decision trees: An updated survey. Artificial Intelligence Review, 56, 4765–4800. https://doi.org/10.1007/s10462-022-10275-5
Fransiska, H. (2026). Modul praktikum machine learning and modern prediction. Laboratorium Matematika, Fakultas Matematika dan Ilmu Pengetahuan Alam, Universitas Bengkulu.
Halabaku, E., & Bytyçi, E. (2024). Overfitting in machine learning: A comparative analysis of decision trees and random forests. Intelligent Automation & Soft Computing, 39(6), 987–1006. https://doi.org/10.32604/iasc.2024.059429
Liu, Y., & Yang, S. (2022). Application of decision tree-based classification algorithm on content marketing. Journal of Mathematics, 2022, Article 6469054. https://doi.org/10.1155/2022/6469054
Nursyahfitri, R., Maharadja, A. N., Farissa, R. A., & Umaidah, Y. (2021). Klasifikasi penentuan jenis obat menggunakan algoritma decision tree. JIP (Jurnal Informatika Polinema), 7(3), 53–60.
Sharma, N., & Iqbal, S. I. M. I. (2023). Applying decision tree algorithm classification and regression tree (CART) algorithm to Gini techniques binary splits. International Journal of Engineering and Advanced Technology, 12(5), 77–81. https://doi.org/10.35940/ijeat.E4195.0612523
Xu, Z., Zhu, G., Yuan, C., et al. (2022). One-stage tree: End-to-end tree builder and pruner. Machine Learning, 111, 1959–1985. https://doi.org/10.1007/s10994-021-06094-4