Klasifikasi merupakan salah satu teknik utama dalam analisis data yang bertujuan mengelompokkan objek ke dalam kelas tertentu berdasarkan karakteristik yang dimilikinya. Teknik ini berperan penting dalam berbagai bidang, seperti kesehatan, ekonomi, dan sosial, karena memungkinkan data yang beragam dikelompokkan secara terstruktur (Gorunescu, 2011 dalam Nursyahfitri dkk., 2021). Metode klasifikasi bekerja dengan mempelajari pola dari data yang kelasnya telah diketahui untuk membentuk sebuah model. Model tersebut kemudian digunakan untuk memprediksi kelas dari objek baru yang belum diketahui kelasnya.
Decision Tree atau pohon keputusan merupakan salah satu metode klasifikasi yang merepresentasikan proses pengambilan keputusan dalam bentuk struktur menyerupai pohon. Struktur tersebut terdiri atas simpul akar, simpul internal, cabang, dan simpul daun yang masing-masing memiliki peran dalam proses penentuan kelas. Pohon keputusan dibentuk dengan memisahkan data secara bertahap berdasarkan atribut atau variabel prediktor hingga diperoleh kelompok data yang relatif homogen. Karakteristiknya yang mudah diinterpretasi menjadikan Decision Tree banyak digunakan untuk menyelesaikan permasalahan klasifikasi (Nursyahfitri dkk., 2021).
Classification and Regression Tree (CART) merupakan salah satu metode pembentukan pohon keputusan yang dapat diterapkan pada data dengan variabel respons kategorik maupun numerik. Metode ini membentuk pohon melalui pemisahan data secara biner, sehingga setiap simpul induk selalu menghasilkan dua simpul anak. Apabila variabel respons bersifat kategorik, CART menghasilkan model Classification Tree yang digunakan untuk mengklasifikasikan objek ke dalam kelas tertentu (Agwil dkk., 2022). Pemahaman terhadap konsep dasar CART serta proses pembentukan model klasifikasinya menjadi penting agar pohon keputusan yang dihasilkan dapat dibangun dan diinterpretasikan dengan tepat.
Berdasarkan latar belakang di atas, adapun rumusan masalah yang dapat disimpulkan sebagai berikut:
Adapun tujuan penelitian ini yaitu:
Klasifikasi merupakan salah satu teknik dalam data mining dan machine learning yang digunakan untuk memprediksi nilai label atau variabel target. Menurut Supriyanti dkk. (2016) dalam Nursyahfitri dkk. (2021), klasifikasi adalah suatu teknik untuk menemukan kumpulan pola atau fungsi yang mendeskripsikan serta memisahkan kelas data yang satu dengan yang lainnya. Tujuan utamanya adalah untuk menyatakan objek tersebut masuk pada kategori tertentu dengan melihat pada kelakuan dan atribut dari kelompok yang telah didefinisikan. Proses klasifikasi didasarkan pada empat komponen utama, yaitu class, predictor, training dataset, dan testing dataset (Gorunescu, 2011 dalam Nursyahfitri dkk., 2021).
Class merupakan variabel tidak bebas yang berupa kategorial dan mempresentasikan label yang terdapat pada objek. Predictor merupakan variabel bebas suatu model berdasarkan karakteristik atribut data kategorial. Training dataset atau data latih merupakan dataset yang berisi nilai dari class dan predictor untuk dilatih agar model dapat dikelompokkan ke kelas yang benar. Testing dataset atau data uji merupakan data baru yang digunakan untuk mengklasifikasikan model yang dibuat dan mengevaluasi akurasi klasifikasi (Gorunescu, 2011 dalam Nursyahfitri dkk., 2021).
Decision tree merupakan algoritma supervised machine learning yang digunakan untuk memecahkan masalah klasifikasi. Tujuan utama dari algoritma decision tree adalah karena kemampuannya menghasilkan model prediksi secara spesifik dalam bentuk aturan yang mudah untuk diimplementasikan (Noviandi, 2018 dalam Nursyahfitri dkk., 2021). Decision tree menggunakan representasi struktur pohon, di mana setiap node merepresentasikan atribut, cabang merepresentasikan nilai atribut, dan node merepresentasikan kelas. Node di bagian atas decision tree disebut root (Kusrini & Luthfi, 2009 dalam Nursyahfitri dkk., 2021).
Berdasarkan struktur flowchart yang menyerupai pohon, setiap simpul internal menandakan suatu pengujian pada atribut, setiap cabang merepresentasikan output dan simpul daun merepresentasikan kelas atau distribusi kelas. Simpul yang paling atas disebut sebagai root node yang memiliki beberapa output tetapi tidak memiliki input. Internal node memiliki satu input dan beberapa output, sedangkan leaf node hanya memiliki satu input tanpa memiliki output. Leaf node merupakan hasil akhir yang mewakili label kelas dari kombinasi atribut yang terbentuk menjadi rule (Kasih, 2019 dalam Nursyahfitri dkk., 2021).
Decision Tree memiliki beberapa karakteristik utama yang membuatnya banyak digunakan. Karakteristik tersebut meliputi kemudahan untuk dipahami dan diinterpretasikan karena model dapat divisualisasikan dalam bentuk pohon, kemampuan menggunakan variabel prediktor numerik maupun kategorik, serta pembagian data secara bertahap melalui proses splitting sehingga kelompok yang terbentuk semakin homogen. Pohon keputusan juga dapat digunakan untuk memprediksi kelas pada kasus klasifikasi maupun nilai numerik pada kasus regresi. Selain itu, pohon dapat disederhanakan melalui pruning untuk mengurangi kompleksitas pohon dan risiko overfitting (Fransiska, 2026).
Kelebihan decision tree terletak pada kemampuannya menghasilkan prediksi yang sangat kuat dan mudah dipahami. Akan tetapi, decision tree juga memiliki kekurangan, terutama terkait dengan kecenderungan overfitting ketika pohon tumbuh tanpa batas. Overfitting terjadi ketika model belajar terlalu baik pada data training dan menjadi terlalu spesifik terhadap data tersebut, sehingga menyebabkan generalisasi yang buruk pada data baru. Pohon keputusan juga dapat menjadi sangat kompleks ketika berhadapan dengan data yang memiliki banyak fitur atau noise (Halabaku & Bytyçi, 2024).
Classification and Regression Tree (CART) merupakan salah satu metode pohon keputusan populer yang dapat digunakan pada variabel respon numerik maupun kategorik. Jika variabel respon berupa data kategorik, maka pohon yang terbentuk dinamakan pohon klasifikasi (classification tree). Sebaliknya, jika variabel respon berupa data numerik, maka pohon yang terbentuk dinamakan pohon regresi (regression tree). Pembentukan pohon klasifikasi maupun pohon regresi dilakukan dengan proses rekursif biner pada gugus data sehingga pada pemilahan terakhir diperoleh nilai variabel respon pada setiap simpul yang terbentuk lebih homogen (Breiman dkk., 1984 dalam Agwil dkk., 2022).
Metode CART dikenal sebagai klasifikasi binary recursive partitioning karena setiap simpul yang dihasilkan disekat atau dipisahkan menjadi dua simpul anak (Lewis, 2000 dalam Agwil dkk., 2022). Tahapan penyekatan tersebut dilakukan sampai terpenuhi kriteria pemberhentian yang ditetapkan. Algoritma CART secara umum dimulai dengan menemukan pemisah terbaik pada setiap variabel prediktor yang digunakan dalam model. Setiap variabel dengan nilai \(K\) yang berbeda memiliki \(k - 1\) kemungkinan pemisah, dan pemisah terbaik dipilih berdasarkan kriteria splitting yaitu Gini impurity (Breiman dkk., 1984 dalam Agwil dkk., 2022).
Indeks Gini digunakan untuk mengukur tingkat ketidakmurnian kelas (Gini impurity) dalam suatu simpul. Semakin kecil nilai Gini Index, semakin homogen data dalam simpul tersebut. Gini index dirumuskan sebagai berikut (Fransiska, 2026):
\[ Gini(t) = 1 - \sum_{k=1}^{K} p_k^2 \]
dengan \(t\) adalah node, \(k\) adalah indeks kelas ke-\(k\), \(K\) adalah jumlah kelas, dan \(p_k\) merupakan proporsi observasi dari kelas ke-\(k\) dalam node. Jika dataset \(D\) dipartisi menjadi dua bagian \(D_1\) dan \(D_2\), maka nilai Gini setelah pemisahan dihitung menggunakan rata-rata terbobot:
\[ Gini_{split} = \frac{|D_1|}{|D|} Gini(D_1) + \frac{|D_2|}{|D|} Gini(D_2) \]
Evaluasi pemisah \(s\) pada simpul \(t\) dapat dilakukan dengan melihat nilai Goodness of split. Penurunan tingkat impurity yang diperoleh terhadap atribut \(A\) dapat dihitung dengan \(\Delta Gini(A) = Gini(D) - Gini_A(D)\). Proses pemilihan variabel prediktor terbaik juga dilakukan dengan menggunakan indeks Gini dan penyekatan dilakukan hingga memenuhi kriteria pemberhentian (Agwil dkk., 2022).
Pada Classification Tree, proses pemisahan data dilakukan dengan memilih aturan yang mampu menghasilkan simpul-simpul yang semakin homogen. Beberapa ukuran yang digunakan dalam proses pemisahan tersebut antara lain Entropy, Information Gain, dan Gini Index. Entropy digunakan untuk mengukur tingkat ketidakpastian atau ketidakmurnian kelas dalam suatu simpul. Semakin kecil nilai Entropy, semakin homogen simpul tersebut. Entropy dirumuskan sebagai berikut (Fransiska, 2026):
\[ Entropy(t) = -\sum_{k=1}^{K} p_k \log_2(p_k) \]
Information Gain digunakan untuk mengukur seberapa besar tingkat ketidakpastian (Entropy) berkurang setelah dilakukan suatu split. Semakin besar nilai Information Gain, semakin baik pemisahan yang dilakukan karena kelompok data yang terbentuk menjadi semakin homogen. Jika suatu dataset \(D\) dipartisi menjadi beberapa bagian \(D_1, D_2, \ldots, D_j\), maka Information Gain dirumuskan sebagai berikut (Fransiska, 2026):
\[ IG = E(D) - \sum_{j=1}^{J} \frac{|D_j|}{|D|} E(D_j) \]
Pada Regression Tree, pemisahan dilakukan agar nilai respon dalam setiap simpul menjadi semakin seragam atau homogen. Salah satu ukuran yang dapat digunakan untuk menilai hasil pemisahan adalah Mean Square Error (MSE), yaitu rata-rata kuadrat selisih antara nilai respons dengan rata-rata respons dalam suatu simpul. Pemisahan dipilih apabila mampu menghasilkan simpul-simpul dengan nilai MSE yang lebih kecil. MSE dirumuskan sebagai berikut (Fransiska, 2026):
\[ MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y})^2 \]
Pemangkasan pohon atau pruning merupakan proses pemangkasan cabang yang kurang penting untuk menyederhanakan pohon dan mengurangi risiko overfitting. Pohon keputusan yang tumbuh tanpa batas cenderung mengalami overfitting, di mana model belajar terlalu baik pada data training dan menjadi terlalu spesifik terhadap data tersebut. Overfitting menyebabkan generalisasi yang buruk pada data baru, sehingga model kehilangan kemampuan prediktifnya pada data yang belum pernah dilihat (Halabaku & Bytyçi, 2024).
Salah satu teknik pruning yang umum digunakan adalah cost-complexity pruning. Metode ini bertujuan untuk menemukan subtree dari pohon \(T\) dengan error approximation terkecil, yaitu error pada data training ditambah \(\alpha\) kali jumlah leaf node. Parameter \(\alpha\) mengontrol trade-off antara kompleksitas pohon dan akurasi pada data training (Breiman dkk., 1984 dalam Halabaku & Bytyçi, 2024). Pemilihan pohon optimal dilakukan melalui validasi silang (cross-validation) dengan memilih nilai \(\alpha\) yang menghasilkan performa terbaik pada data validasi (Halabaku & Bytyçi, 2024).
Cost-complexity pruning dimulai dengan pohon penuh dan \(\alpha = 0\), kemudian secara bertahap meningkatkan nilai \(\alpha\) untuk menghasilkan urutan subtree yang semakin sederhana. Pohon yang dipilih sebagai pohon yang dipangkas adalah pohon dengan error approximation terkecil pada set validasi terpisah (Breiman dkk., 1984 dalam Halabaku & Bytyçi, 2024). Proses ini memungkinkan penyeimbangan antara kompleksitas model dan kemampuan generalisasi, sehingga pohon yang dihasilkan lebih robust terhadap data baru (Halabaku & Bytyçi, 2024).
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 penelitian selanjutnya membangun pohon awal dengan nilai CP yang lebih kecil sehingga proses pruning dapat dibandingkan pada pohon yang lebih besar. Evaluasi model juga sebaiknya dilakukan dengan validasi silang atau beberapa kali pembagian data agar hasil tidak bergantung pada satu pembagian saja. Perbandingan dengan metode lain, seperti random forest atau boosting, dapat dilakukan untuk menilai peningkatan kinerja klasifikasi. Penanganan false positive perlu mendapat perhatian lebih karena kesalahan tersebut masih menjadi kekeliruan terbanyak pada model.
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.
Cabot, J. H., & Ross, E. G. (2023). Evaluating Prediction Model Performance. Surgery (United States), 174(3), 723–726. https://doi.org/10.1016/j.surg.2023.05.023
Fransiska, H. (2026). Modul Praktikum Machine Learning and Modern Prediction. Bengkulu: 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 and Soft Computing, 39(6), 987–1006. https://doi.org/10.32604/iasc.2024.059429
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.