BAB I PENDAHULUAN

1.1 Latar Belakang

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

1.2Rumusan Masalah

Berdasarkan latar belakang di atas, adapun rumusan masalah yang dapat disimpulkan sebagai berikut:

  1. Bagaimana konsep dasar Decision Tree untuk klasifikasi dengan menggunakan metode CART (Classification and Regression Tree)?
  2. Bagaimana membangun model Classification Tree dengan menggunakan algoritma CART?

1.3Tujuan

Berdasarkan rumusan masalah dapat disimpulkan tujuan penelitian sebagai berikut:

  1. Praktikan dapat menjelaskan konsep dasar Decision Tree untuk klasifikasi menggunakan metode CART (Classification and Regression Tree).
  2. Praktikan dapat membangun model Classification Tree menggunakan algoritma CART.

BAB II TINJAUAN PUSTAKA

2.1 Decision Tree

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

2.2 Classification and Regression Tree (CART)

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

2.3 Regression Tree

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

2.4 Evaluasi Model Klasifikasi

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

BAB III METODE PENELITIAN

3.1 Jenis dan Sumber Data

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.

3.2 Variabel Penelitian

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.

3.3 Analisis Data

Berikut merupakan algoritma penelitian pada batasan masalah:

  1. Input data.
  2. Pemeriksaan dan penanganan missing value.
  3. Pembagian data training dan testing.
  4. Pembentukan dan visualisasi pohon regresi CART.
  5. Analisis variable importance.
  6. Prediksi dan evaluasi model awal menggunakan MSE dan RMSE.
  7. Penentuan nilai CP terbaik berdasarkan nilai cross-validation error (xerror) terkecil.
  8. Pruning pohon regresi menggunakan nilai CP terbaik.
  9. Prediksi dan evaluasi model setelah pruning menggunakan MSE dan RMSE.
  10. Perbandingan model sebelum dan sesudah pruning.
  11. Output dan interpretasi hasil analisis.

BAB IV HASIL DAN PEMBAHASAN

4.1 Library

library(ISLR)
library(rpart)
library(rpart.plot)

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.

4.2 Data

data(Hitters)

str(Hitters)
## '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 ...
head(Hitters)
##                   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
dim(Hitters)
## [1] 322  20
names(Hitters)
##  [1] "AtBat"     "Hits"      "HmRun"     "Runs"      "RBI"       "Walks"    
##  [7] "Years"     "CAtBat"    "CHits"     "CHmRun"    "CRuns"     "CRBI"     
## [13] "CWalks"    "League"    "Division"  "PutOuts"   "Assists"   "Errors"   
## [19] "Salary"    "NewLeague"
summary(Hitters)
##      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
# Memeriksa missing value
colSums(is.na(Hitters))
##     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
sum(is.na(Hitters))
## [1] 59
# Ringkasan variabel Salary
summary(Hitters$Salary)
##    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.

4.3 Pengecekan dan Penanganan Missing Value

# Menghapus observasi yang memiliki missing value
Hitters.clean <- na.omit(Hitters)

# Memeriksa data setelah penanganan missing value
dim(Hitters.clean)
## [1] 263  20
colSums(is.na(Hitters.clean))
##     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
sum(is.na(Hitters.clean))
## [1] 0
str(Hitters.clean)
## '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" ...
summary(Hitters.clean$Salary)
##    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.

4.4 Pembagian Data Training dan Testing

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
dim(Hitters.test)
## [1] 79 20
# Ringkasan Salary pada data training dan testing
summary(Hitters.train$Salary)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    70.0   198.8   400.0   508.9   737.5  2127.3
summary(Hitters.test$Salary)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    67.5   187.5   500.0   598.8   832.5  2460.0
cat("Jumlah data training:", nrow(Hitters.train), "\n")
## Jumlah data training: 184
cat("Jumlah data testing:", nrow(Hitters.test), "\n")
## 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.

4.5 Pembentukan dan Visualisasi Regression Tree

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 *
summary(fit.tree)
## 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
printcp(fit.tree)
## 
## 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
# Menghitung jumlah simpul terminal
sum(fit.tree$frame$var == "<leaf>")
## [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.

4.6 Variable Importance

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.

4.7 Prediksi dan Evaluasi Model Awal Menggunakan MSE

# 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
cat("RMSE model awal:", RMSE.awal, "\n")
## 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.

4.8 Penentuan CP Terbaik

# Menampilkan tabel kompleksitas pohon
printcp(fit.tree)
## 
## 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
# Mengambil tabel CP
tabel.cp <- fit.tree$cptable

print(tabel.cp)
##             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
cat(
  "Cross-validation error minimum:",
  tabel.cp[indeks.bestcp, "xerror"],
  "\n"
)
## Cross-validation error minimum: 0.5443959
# Visualisasi pemilihan CP
plotcp(
  fit.tree,
  main = "Pemilihan CP Terbaik Regression Tree"
)

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.

4.9 Pruning Regression Tree

# 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 *
summary(pruned.tree)
## 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
printcp(pruned.tree)
## 
## 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
# Menghitung jumlah simpul terminal setelah pruning
sum(pruned.tree$frame$var == "<leaf>")
## [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.

4.10 Prediksi dan Evaluasi Model Setelah Pruning

# 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
cat("RMSE setelah pruning:", RMSE.pruning, "\n")
## 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.

4.11 Perbandingan Model Sebelum dan Sesudah Pruning

# 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.

BAB V PENUTUP

5.1 Kesimpulan

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.

5.2 Saran

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.

DAFTAR PUSTAKA

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