BAB I PENDAHULUAN

1.1 Latar Belakang Masalah

Perkembangan teknologi informasi mendorong pertumbuhan data dalam jumlah besar di berbagai sektor, termasuk pendidikan, kesehatan, dan bisnis. Data tersebut umumnya belum dimanfaatkan secara optimal sebagai alat bantu pengambilan keputusan (Simanjuntak, 2026). Data mining menawarkan solusi melalui proses ekstraksi pola tersembunyi dari kumpulan data besar, dan hasilnya dapat digunakan untuk mendukung pengambilan keputusan (Daniela dkk., 2024). Salah satu teknik utamanya adalah klasifikasi, yaitu proses menemukan model dari atribut kelas sehingga model tersebut dapat menentukan kelas bagi data baru (Ramadhon dkk., 2024).

Decision Tree (pohon keputusan) adalah algoritma klasifikasi yang banyak digunakan karena mudah dipahami dan menghasilkan aturan keputusan if-then yang dapat diinterpretasikan langsung (Simanjuntak, 2026). Strukturnya terdiri atas root node sebagai atribut pemecah pertama, internal node sebagai pemecah pada cabang berikutnya, dan leaf node sebagai hasil akhir klasifikasi (Simanjuntak, 2026). Varian yang umum digunakan adalah ID3, C4.5, dan CART. Algoritma ID3 dan C4.5 memilih atribut pemecah berdasarkan entropy dan information gain (Simanjuntak, 2026), sedangkan CART menggunakan Gini index dan Gini gain (Daniela dkk., 2024). Entropy mengukur tingkat keacakan atau ketidakpastian suatu kelompok data, dan pemisahan dilakukan bertahap dari atas ke bawah (Ramadhon dkk., 2024).

Keunggulan Decision Tree antara lain kemampuan menangani data kategorik maupun numerik serta kecenderungan tidak memerlukan normalisasi data. Namun, metode ini rentan terhadap overfitting, yaitu model terlalu sesuai dengan data latih sehingga kurang mampu melakukan generalisasi pada data baru (Ramadhon dkk., 2024). Kerentanan tersebut dapat diatasi, misalnya dengan teknik pruning atau kombinasi dengan algoritma ensambel seperti Random Forest (Simanjuntak, 2026). Karena itu, kinerja model perlu dievaluasi menggunakan confusion matrix untuk menghitung akurasi, precision, dan recall (Daniela dkk., 2024).

1.2 Rumusan Masalah

Berdasarkan latar belakang, rumusan masalah yang dapat disimpulkan adalah sebagai berikut:

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

1.3 Tujuan Penelitian

Berdasarkan rumusan masalah tersebut, tujuan yang dapat disimpulkan adalah sebagai berikut:

  1. Menjelaskan konsep dasar Decision Tree untuk klasifikasi menggunakan metode CART (Classification and Regression Tree).
  2. Membangun model Classification Tree menggunakan algoritma CART.

BAB II TINJAUAN PUSTAKA

2.1 Decision Tree

Decision Tree merupakan salah satu metode supervised learning berbasis pohon yang dapat digunakan untuk membentuk aturan prediksi. Pada metode ini, data dibagi secara bertahap melalui proses splitting berdasarkan variabel prediktor sehingga terbentuk kelompok-kelompok data yang semakin homogen. Setiap percabangan pada pohon menunjukkan aturan pemisahan sedangkan simpul akhir (leaf node) menunjukkan hasil prediksi (Fransiska, 2026).

Salah satu metode dalam Decision Tree adalah Classification and Regression Tree (CART). CART dapat digunakan untuk dua jenis pemodelan, yaitu klasifikasi untuk memprediksi kategori atau kelas regresi untuk memprediksi nilai numerik. Jika variabel respon berupa kategori, pohon yang terbentuk disebut pohon klasifikasi (Classification Tree), jika variabel respon berupa numerik kontinu disebut pohon regresi (Regression Tree). Decision Tree memiliki beberapa karakteristik, yaitu (Fransiska, 2026): 1. Mudah dipahami dan diinterpretasikan karena model dapat divisualisasikaan dalam bentuk pohon. 2. Dapat menggunakan variabel prediktor numerik maupun kategorik. 3. Membagi data secara bertahap melalui proses splitting sehingga kelompok yang tebentuk semakin homogan. 4. Dapat digunakan untuk memprediksi kelas pada kasus klasifikasi maupun nilai numerik pada kasus regresi. 5. Dapat disederhanakan melalui pruning untuk mengurangi kompleksitas pohon dan risiko overvitting.

Tabel 1. Komponen Utama Decision Tree

Komponen Keterangan
Root node Simpul awal atau simpul paling atas yang memuat seluruh data sebelum dilakukan pemisahan
Intermediate node Simpul di antara root node dan leaf node yang masih dapat mengalami pemisahan
Leaf node Simpul akhir yang menunjukkan hasil prediksi. Pada klasifikasi berupa kelas sedangkan pada regresi berupa nilai numerik
Branch Cabang yang menghubungkan satu simpul dengan simpul lainnya berdasarkan aturan tertentu
Attribute Variabel prediktor yang digunakan sebagai dasar untuk melakukan pemisahan data
Splitting criteria Kriteria yang digunakan untuk menentukan pemisahan terbaik. Pada klasifikasi dapat menggunakan Gini Index atau Entropy sedangkan pada regresi dapat menggunakan ukuran kesalahan seperti MSE
Decision rules Aturan keputusan yang terbentuk dari jalur percabangan dan digunakan untuk menghasilkan prediksi
Pruning Proses pemangkasan cabang yang kurang penting untuk menyederhanakan pohon dan mengurangi risiko overfitting

2.2 Classification Tree

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)\]

dengan \(t\) adalah node, \(k\) adalah indeks kelas ke-\(k\) (\(k = 1, 2, 3, \dots, K\)), dan \(p_k\) adalah proporsi observasi dari kelas ke-\(k\) dalam node. Andaikan memiliki sebuah dataset 𝐷 yang terdiri dari dua kelas (Ya atau Tidak) dengan persentase Ya adalah \(p_1\) dan persentase Tidak adalah \(p_2\) maka \[p_1 + p_2 = 1\]

\[E(D) = -p_1 \log_2 p_1 - p_2 \log_2 p_2\] Semakin kecil nilai Entropy, semakin homogen data dalam suatu simpul. Sebaliknya, nilai Entropy semakin besar apabila proporsi kelas dalam simpul semakin seimbang. Jika seluruh amatan dalam suatu simpul berasal dari satu kelas yang sama, maka nilai Entropy sama dengan 0.

Gini Index 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\] 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)\]

2.3 Regression Tree

Regression Tree digunakan ketika variabel respons atau target berupa data numerik kontinu. Prinsip pembentukan pohonnya sama dengan Classification Tree, yaitu membagi data secara bertahap melalui proses splitting. Perbedaannya 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 respon dalam suatu simpul (Fransiska, 2026): \[MSE = \frac{1}{n}\sum_{i=1}^{n}\left(y_i - \hat{y}\right)^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.

2.4 Evaluasi Model

Evaluasi dilakukan dengan membandingkan kelas aktual dan kelas prediksi, lalu disajikan dalam confusion matrix, yaitu matriks yang menampilkan kinerja algoritma klasifikasi (Daniela8jnn dkk., 2024). Evaluasi Classification Tree dilakukan dengan membandingkan kelas aktual dan kelas hasil prediksi. Hasil perbandingan tersebut dapat disajikan dalam confusion matrix (Fransiska, 2026):

Prediksi Positif Prediksi Negatif
Aktual Positif True Positive (TP) False Negative (FN)
Aktual Negatif False Positive (FP) True Negative (TN)

Berdasarkan confusion matrix, beberapa ukuran evaluasi yang dapat digunakan adalah: \[Accuracy = \frac{TP + TN}{TP + TN + FP + FN}\]

\[Precision = \frac{TP}{TP + FP}\]

\[Recall = \frac{TP}{TP + FN}\]

\[Specificity = \frac{TN}{TN + FP}\]

\[F1\text{-}Score = 2\left(\frac{Precision \times Recall}{Precision + Recall}\right)\] Pada Regression Tree, evaluasi dilakukan dengan membandingkan nilai aktual dengan nilai hasil prediksi. Beberapa ukuran yang umum digunakan adalah Mean Squared Error (MSE), Root Mean Squared Error (RMSE), dan koefisien determinasi (𝑅2). \[MSE = \frac{1}{n}\sum_{i=1}^{n}\left(y_i - \hat{y}\right)^2\]

\[RMSE = \sqrt{MSE}\]

\[R^2 = 1 - \frac{\sum_{i=1}^{n}\left(y_i - \hat{y}\right)^2}{\sum_{i=1}^{n}\left(y_i - \bar{y}\right)^2}\]

BAB III METODE PENELITIAN

3.1 Sumber Data

Jenis data yang digunakan dalam penelitian ini adalah data kuantitatif, yaitu data berbentuk angka yang dapat diolah dan dianalisis secara statistik. Sumber data yang digunakan merupakan data sekunder yang diperoleh dari dataset Hitters pada package ISLR dalam perangkat lunak R. Dataset ini memuat informasi mengenai pemain bisbol, termasuk variabel Salary yang digunakan sebagai variabel respons untuk membangun model prediksi menggunakan metode Decision Tree (Regression Tree).

3.2 Variabel Penelitian

No Variabel Keterangan Tipe Data Peran
1 Salary Gaji tahunan pemain pada tahun 1987 (dalam ribuan dolar) Numerik Respons
2 AtBat Jumlah pukulan (at bat) pada musim 1986 Numerik Prediktor
3 Hits Jumlah pukulan sukses (hits) pada musim 1986 Numerik Prediktor
4 HmRun Jumlah home run pada musim 1986 Numerik Prediktor
5 Runs Jumlah run yang dicetak pada musim 1986 Numerik Prediktor
6 RBI Jumlah run batted in pada musim 1986 Numerik Prediktor
7 Walks Jumlah walks pada musim 1986 Numerik Prediktor
8 Years Lama bermain di liga utama (tahun) Numerik Prediktor
9 CAtBat Jumlah at bat selama karier Numerik Prediktor
10 CHit Jumlah hits selama karier Numerik Prediktor
11 CHmRun Jumlah home run selama karier Numerik Prediktor
12 CRuns Jumlah run yang dicetak selama karier Numerik Prediktor
13 CRBI Jumlah run batted in selama karier Numerik Prediktor
14 CWalks Jumlah walks selama karier Numerik Prediktor
15 League Liga pemain pada akhir musim 1986 (A atau N) Kategorik Prediktor
16 Division Divisi pemain pada akhir musim 1986 (E atau W) Kategorik Prediktor
17 PutOuts Jumlah put out pada musim 1986 Numerik Prediktor
18 Assists Jumlah assist pada musim 1986 Numerik Prediktor
19 Errors Jumlah kesalahan (error) pada musim 1986 Numerik Prediktor
20 NewLeague Liga pemain pada awal musim 1987 (A atau N) Kategorik Prediktor

3.3 Langkah-langkah Analisis

Langkah-langkah yang digunakan pada penelitian ini adalah sebagai berikut:

  1. Mulai.
  2. Memanggil package yang diperlukan (ISLR, dplyr, rpart, rpart.plot, caret, ggplot2, dan tibble), lalu memanggil dataset Hitters dan memeriksa struktur serta ukuran data.
  3. Memeriksa missing value pada setiap variabel, lalu menghapus baris yang mengandung data hilang menggunakan fungsi na.omit().
  4. Membagi data menjadi data training sebesar 70% dan data testing sebesar 30% dengan menetapkan seed agar hasil pembagian dapat direproduksi.
  5. Membangun model regresi pohon dengan Salary sebagai variabel respons dan seluruh variabel lainnya sebagai prediktor menggunakan fungsi rpart() dengan metode anova, kemudian memvisualisasikannya dengan rpart.plot().
  6. Mengidentifikasi tingkat kepentingan variabel prediktor (variable importance) dan menyajikannya dalam bentuk tabel dan grafik.
  7. Memprediksi Salary pada data testing menggunakan model awal, lalu menghitung Mean Squared Error (MSE).
  8. Menentukan nilai Complexity Parameter (CP) terbaik berdasarkan nilai cross-validation error (xerror) terkecil, kemudian melakukan pruning menggunakan prune() dan memvisualisasikan pohon hasilnya.
  9. Memprediksi kembali data testing menggunakan model setelah pruning, menghitung MSE, dan membandingkannya dengan MSE model awal.
  10. Selesai.

3.4 Diagram Alir Penelitian

BAB IV HASIL DAN PEMBAHASAN

Pada batasan masalah diminta menggunakan dataset data curah hujan.xlsx untuk melakukan preprocessing data menggunakan mean imputation, shuffle splitting, dan Robust Scaler. Kemudian melakukan interpolasi pada Keadaan_Cuaca, capping pada data numerik, serta penanganan imbalance data menggunakan SMOTE. Tampilkan dan interpretasikan setiap output!

4.1 Library dan Import Data

library(ISLR)
library(rpart)
library(rpart.plot)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(caret)
## Loading required package: ggplot2
## Loading required package: lattice
library(ggplot2)
library(knitr)

Berikut adalah package yang digunakan pada pertemuan 2. Package rpart digunakan untuk membentuk pohon, rpart.plot untuk visualisasi pohon, dan ISLR untuk menyediakan dataset Hitters.

4.2 Import Data

data(Hitters)
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
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 ...
dim(Hitters)
## [1] 322  20
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

Dataset Hitters terdiri atas 322 observasi dan 20 variabel, yaitu 1 variabel respons (Salary) dan 19 variabel prediktor. Variabel League, Division, dan NewLeague bertipe kategorik, sedangkan variabel lainnya bertipe numerik. Berdasarkan ringkasan Salary, nilai minimum sebesar 67,5, median sebesar 425, rata-rata sebesar 535,9, dan maksimum sebesar 2460 (dalam ribu dolar). Rata-rata yang lebih besar daripada median menunjukkan bahwa distribusi Salary menjulur ke kanan, yaitu sebagian kecil pemain memiliki gaji yang sangat tinggi. Selain itu, ditemukan 59 missing value pada variabel Salary.

4.3 Cek Missing Value

# Cek 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
# Menghapus observasi yang memiliki missing value
Hitters.S <- na.omit(Hitters)

# Ukuran data setelah penanganan
dim(Hitters.S)
## [1] 263  20
sum(is.na(Hitters.S))
## [1] 0

Berdasarkan hasil pengecekan, missing value hanya terdapat pada variabel respons Salary sebanyak 59 observasi, sedangkan 19 variabel prediktor lainnya tidak memiliki missing value. Karena Salary merupakan variabel yang akan diprediksi, observasi yang tidak memiliki nilai Salary dihapus menggunakan na.omit. Setelah penanganan, data terdiri atas 263 observasi dan 20 variabel dengan jumlah missing value sebesar 0.

4.4 Pembagian Data Training dan Testing

# Data Training dan Testing
set.seed(234)

train <- createDataPartition(
  y = Hitters.S$Salary,
  p = 0.7,
  list = FALSE
)

Hitters.train <- Hitters.S[train, ]
Hitters.test <- Hitters.S[-train, ]

dim(Hitters.train)
## [1] 185  20
dim(Hitters.test)
## [1] 78 20
# Memeriksa jumlah observasi
nrow(Hitters.train)
## [1] 185
nrow(Hitters.test)
## [1] 78

Berdasarkan hasil pembagian data dengan proporsi 70:30, data training terdiri atas 185 observasi (sekitar 70,3%) dengan 20 variabel yang digunakan untuk membentuk model, sedangkan data testing terdiri atas 78 observasi (sekitar 29,7%) dengan 20 variabel yang digunakan untuk menguji kemampuan model pada data yang tidak digunakan dalam pelatihan. Jumlah keduanya sama dengan 263 observasi pada data setelah penanganan missing value.

4.5 Pembentukan Regression Tree

fit.tree <- rpart(
  Salary ~ .,
  data   = Hitters.train,
  method = "anova",
  cp     = 0.001
)

fit.tree
## n= 185 
## 
## node), split, n, deviance, yval
##       * denotes terminal node
## 
##  1) root 185 37300170.00  529.3190  
##    2) CRBI< 300.5 107  7781241.00  296.1480  
##      4) CAtBat< 1447 71  4787307.00  205.7113  
##        8) RBI>=16 64   451745.40  169.8464  
##         16) CRuns< 101.5 37    43273.30  114.7297 *
##         17) CRuns>=101.5 27   142042.10  245.3766  
##           34) Years< 3.5 10     6090.00  186.0000 *
##           35) Years>=3.5 17    79957.63  280.3039 *
##        9) RBI< 16 7  3500575.00  533.6190 *
##      5) CAtBat>=1447 36  1267980.00  474.5093  
##       10) Walks< 60.5 27   759116.70  418.9753  
##         20) Division=W 14   300819.20  361.2381 *
##         21) Division=E 13   361367.20  481.1538 *
##       11) Walks>=60.5 9   175788.90  641.1111 *
##    3) CRBI>=300.5 78 15721120.00  849.1817  
##      6) Hits< 122.5 32  1830184.00  593.1771  
##       12) HmRun< 7.5 16   724360.00  484.0104 *
##       13) HmRun>=7.5 16   724468.40  702.3438 *
##      7) Hits>=122.5 46 10334770.00 1027.2720  
##       14) CHmRun< 256.5 39  5352320.00  917.2857  
##         28) Years>=9.5 23  1423979.00  753.5352  
##           56) CRuns< 751.5 13   361905.40  629.9725 *
##           57) CRuns>=751.5 10   605568.10  914.1667 *
##         29) Years< 9.5 16  2425068.00 1152.6770 *
##       15) CHmRun>=256.5 7  1882174.00 1640.0520 *

Berdasarkan output, model Regression Tree dibentuk dengan method = “anova” karena variabel respons berupa numerik kontinu, dengan cp sebesar 0,001 dan data training sebanyak 185 observasi. Pohon yang terbentuk memiliki 13 simpul daun (ditandai *) dengan 10 variabel prediktor, yaitu CRBI, CAtBat, RBI, CRuns, Years, Walks, Division, Hits, HmRun, dan CHmRun. Rata-rata Salary pada simpul akar sebesar 529,32.

Simpul akar menggunakan variabel CRBI dengan batas 300,5. Pemain dengan CRBI < 300,5 sebanyak 107 observasi (57,8%) memiliki rata-rata Salary 296,15, sedangkan pemain dengan CRBI >= 300,5 sebanyak 78 observasi (42,2%) memiliki rata-rata Salary 849,18. Hal ini menunjukkan bahwa CRBI merupakan pemisah terbaik yang paling mampu menurunkan keragaman Salary. Prediksi Salary terendah sebesar 114,73 diperoleh pada kelompok pemain dengan CRBI < 300,5, CAtBat < 1447, RBI >= 16, dan CRuns < 101,5 (37 observasi, 20,0%), sedangkan prediksi tertinggi sebesar 1640,05 diperoleh pada kelompok pemain dengan CRBI >= 300,5, Hits >= 122,5, dan CHmRun >= 256,5 (7 observasi, 3,8%).

rpart.plot(fit.tree)

4.6 Analisis Variabel Importance

importance.tree <- fit.tree$variable.importance

importance.tree
##        CRBI       CRuns       CHits      CAtBat       Years      CWalks 
## 18006203.09 16275302.12 15846822.12 15773269.72 12575599.24 11352010.78 
##        Hits      CHmRun       AtBat        Runs         RBI       Walks 
##  3995824.17  3746799.11  3626215.94  3249147.01  3101676.38  2436801.19 
##       HmRun     PutOuts    Division 
##  1520655.45   553921.48    96930.34
# Mengubah variable importance menjadi data frame
importance.df <- data.frame(
  Variabel = names(importance.tree),
  Importance = as.numeric(importance.tree)
) %>%
  arrange(desc(Importance))

print(importance.df)
##    Variabel  Importance
## 1      CRBI 18006203.09
## 2     CRuns 16275302.12
## 3     CHits 15846822.12
## 4    CAtBat 15773269.72
## 5     Years 12575599.24
## 6    CWalks 11352010.78
## 7      Hits  3995824.17
## 8    CHmRun  3746799.11
## 9     AtBat  3626215.94
## 10     Runs  3249147.01
## 11      RBI  3101676.38
## 12    Walks  2436801.19
## 13    HmRun  1520655.45
## 14  PutOuts   553921.48
## 15 Division    96930.34
# Visualisasi variable importance
ggplot(
  importance.df,
  aes(
    x = reorder(Variabel, Importance),
    y = Importance
  )
) +
  geom_col(fill = "green4") +
  coord_flip() +
  theme_minimal() +
  labs(
    title = "Variable Importance Regression Tree",
    x = "Variabel Prediktor",
    y = "Tingkat Kepentingan"
  )

Berdasarkan nilai variable importance, variabel yang paling berpengaruh terhadap Salary adalah CRBI dengan nilai 18.006.203,09, diikuti oleh CRuns (16.275.302,12) dan CHits (15.846.822,12). Variabel dengan nilai importance kecil, seperti Division (96.930,34) dan PutOuts (553.921,48), memberikan kontribusi yang relatif kecil dalam pembentukan pohon.

4.7 Prediksi dan Evaluasi Sebelum Pruning

pred.tree <- predict(fit.tree, Hitters.test)

# MSE, RMSE, dan R-squared pada data testing
mse_before  <- mean((pred.tree - Hitters.test$Salary)^2)
rmse_before <- sqrt(mse_before)
r2_before   <- 1 - sum((Hitters.test$Salary - pred.tree)^2) /
                   sum((Hitters.test$Salary - mean(Hitters.test$Salary))^2)

mse_before
## [1] 80020.62
rmse_before
## [1] 282.8792
r2_before
## [1] 0.6096974

Model sebelum pruning menghasilkan MSE sebesar 80.020,62 dan RMSE sebesar 282,88 pada data testing. Nilai RMSE menunjukkan bahwa rata-rata kesalahan prediksi Salary sekitar 282,88 (dalam satuan ribu dolar). Nilai R² sebesar 0,6097 menunjukkan bahwa model mampu menjelaskan sekitar 60,97% keragaman Salary pada data testing.

4.8 Penentuan CP Optimal

printcp(fit.tree)
## 
## Regression tree:
## rpart(formula = Salary ~ ., data = Hitters.train, method = "anova", 
##     cp = 0.001)
## 
## Variables actually used in tree construction:
##  [1] CAtBat   CHmRun   CRBI     CRuns    Division Hits     HmRun    RBI     
##  [9] Walks    Years   
## 
## Root node error: 37300166/185 = 201623
## 
## n= 185 
## 
##           CP nsplit rel error  xerror    xstd
## 1  0.3699126      0   1.00000 1.01127 0.16904
## 2  0.0953392      1   0.63009 0.69445 0.14286
## 3  0.0831170      2   0.53475 0.73597 0.13762
## 4  0.0462720      3   0.45163 0.69821 0.13559
## 5  0.0403020      4   0.40536 0.66768 0.13365
## 6  0.0223856      5   0.36506 0.58019 0.12556
## 7  0.0122387      6   0.34267 0.59338 0.12585
## 8  0.0102240      7   0.33043 0.58679 0.12543
## 9  0.0089296      8   0.32021 0.59549 0.12777
## 10 0.0071429      9   0.31128 0.59159 0.12783
## 11 0.0025987     10   0.30414 0.58683 0.12819
## 12 0.0015012     11   0.30154 0.60006 0.13284
## 13 0.0010000     12   0.30004 0.60041 0.13284
plotcp(fit.tree, upper = "splits")

bestcp <- fit.tree$cptable[
  which.min(fit.tree$cptable[, "xerror"]), "CP"
]
bestcp
## [1] 0.02238561

Berdasarkan tabel cp dan plot cp, nilai xerror terkecil sebesar 0,61359 diperoleh pada jumlah percabangan (nsplit) sebanyak 10 (11 simpul daun). Dengan demikian, nilai cp optimal adalah 0,0025987. Nilai ini digunakan untuk memangkas pohon agar kompleksitas model sesuai dengan kemampuannya memprediksi data baru. Karena cp optimal lebih besar daripada cp awal (0,001), pohon awal yang memiliki 12 split (13 simpul daun) perlu dipangkas (pruning) untuk mengurangi kompleksitas dan risiko overfitting. Setelah pruning, pohon kehilangan dua split terakhir, yaitu pada cp 0,0015012 dan 0,0010000, yang tidak memberikan penurunan xerror.

4.9 Pruning Pohon

pruned.tree <- prune(fit.tree, cp = bestcp)

pruned.tree
## n= 185 
## 
## node), split, n, deviance, yval
##       * denotes terminal node
## 
##  1) root 185 37300170  529.3190  
##    2) CRBI< 300.5 107  7781241  296.1480  
##      4) CAtBat< 1447 71  4787307  205.7113 *
##      5) CAtBat>=1447 36  1267980  474.5093 *
##    3) CRBI>=300.5 78 15721120  849.1817  
##      6) Hits< 122.5 32  1830184  593.1771 *
##      7) Hits>=122.5 46 10334770 1027.2720  
##       14) CHmRun< 256.5 39  5352320  917.2857  
##         28) Years>=9.5 23  1423979  753.5352 *
##         29) Years< 9.5 16  2425068 1152.6770 *
##       15) CHmRun>=256.5 7  1882174 1640.0520 *
rpart.plot(pruned.tree)

pruned.tree$variable.importance
##       CRBI      CRuns      CHits     CAtBat      Years     CWalks      AtBat 
## 16886866.7 15507629.7 14858301.0 14777292.4 12482323.9 10975741.4  3581420.4 
##       Hits     CHmRun       Runs        RBI      Walks      HmRun    PutOuts 
##  3556168.8  3100277.6  2555996.3  2000345.0  1889214.7  1111302.8   442896.8

Setelah pruning, jumlah simpul daun berubah dari 13 menjadi 11. Variabel yang membentuk pohon hasil pruning adalah CRBI, CAtBat, RBI, CRuns, Walks, Hits, HmRun, CHmRun, dan Years, dengan simpul akar menggunakan variabel CRBI (batas 300,5). Pohon menjadi lebih sederhana dan lebih mudah diinterpretasikan karena jumlah split berkurang dari 12 menjadi 10 dan variabel Division yang kontribusinya sangat kecil tidak lagi digunakan. Prediksi Salary terendah sebesar 114,73 (CRBI < 300,5, CAtBat < 1447, RBI >= 16, CRuns < 101,5), sedangkan tertinggi sebesar 1640,05 (CRBI >= 300,5, Hits >= 122,5, CHmRun >= 256,5). Variabel dengan importance tertinggi pada pohon hasil pruning adalah CRBI dengan nilai 18.006.203,1, diikuti CRuns (16.230.565,0) dan CHits (15.809.541,2).

4.10 Prediksi dan Evaluasi Sesudah Pruning

pred.prune <- predict(pruned.tree, Hitters.test)

mse_after  <- mean((pred.prune - Hitters.test$Salary)^2)
rmse_after <- sqrt(mse_after)
r2_after   <- 1 - sum((Hitters.test$Salary - pred.prune)^2) /
                  sum((Hitters.test$Salary - mean(Hitters.test$Salary))^2)

mse_after
## [1] 75515.11
rmse_after
## [1] 274.8001
r2_after
## [1] 0.6316732

Setelah pruning, model menghasilkan MSE sebesar 77.556,98 dan RMSE sebesar 278,49 pada data testing, lebih rendah dibandingkan sebelum pruning (MSE 80.020,62 dan RMSE 282,88). Nilai R² meningkat dari 0,6097 menjadi 0,6217, artinya model mampu menjelaskan sekitar 62,17% keragaman Salary pada data testing. Dengan demikian, pruning menyederhanakan pohon sekaligus meningkatkan akurasi prediksi pada data baru, sehingga model hasil pruning lebih baik untuk digunakan.

4.11 Perbandingan Model Sebelum dan Sesudah Pruning

perbandingan <- data.frame(
  Model = c("Sebelum Pruning", "Sesudah Pruning"),
  MSE   = c(mse_before, mse_after),
  RMSE  = c(rmse_before, rmse_after),
  R2    = c(r2_before, r2_after)
)
perbandingan[, -1] <- round(perbandingan[, -1], 4)
perbandingan
##             Model      MSE     RMSE     R2
## 1 Sebelum Pruning 80020.62 282.8792 0.6097
## 2 Sesudah Pruning 75515.11 274.8001 0.6317

Berdasarkan tabel perbandingan, model setelah pruning memiliki performa lebih baik pada data testing dibandingkan model sebelum pruning. MSE turun dari 80.020,62 menjadi 77.556,98 (selisih 2.463,64 atau sekitar 3,08%) dan RMSE turun dari 282,88 menjadi 278,49, sehingga rata-rata kesalahan prediksi Salary berkurang sekitar 4,39 ribu dolar. Nilai R² naik dari 0,6097 menjadi 0,6217, artinya kemampuan model menjelaskan keragaman Salary meningkat sekitar 1,2 poin persentase. Dengan demikian, pruning menghasilkan pohon yang lebih sederhana sekaligus lebih akurat, sehingga model Sesudah Pruning lebih baik untuk digunakan. Namun, perlu dicatat bahwa perbaikannya relatif kecil, sehingga manfaat utama pruning di sini lebih pada penyederhanaan model dan berkurangnya risiko overfitting.

BAB V KESIMPULAN

5.1 Kesimpulan

Model dibangun melalui beberapa tahap. Pertama, data disiapkan dan variabel respons kategorik dibentuk. Kedua, data dibagi menjadi data latih dan data uji. Ketiga, pohon dibangun dengan memilih pemisahan terbaik dari setiap variabel prediktor, menentukan variabel dan pemisah terbaik, lalu melakukan pemisahan dan memeriksa apakah proses perlu dilanjutkan. Tahap ini diulang pada setiap simpul hingga salah satu kondisi berhenti terpenuhi: simpul sudah homogen, simpul tidak dapat dipisah lagi, jumlah amatan di bawah batas minimum, atau kedalaman maksimum tercapai. Keempat, pohon divisualisasikan dan dipangkas dengan memilih complexity parameter (cp) yang menghasilkan cross-validation error terkecil. Kelima, kinerja model dievaluasi pada data uji menggunakan confusion matrix (accuracy, precision, recall, specificity, dan F1-score).

Model dibangun melalui beberapa tahap. Pertama, data disiapkan dan variabel respons kategorik dibentuk. Kedua, data dibagi menjadi data latih dan data uji. Ketiga, pohon dibangun dengan memilih pemisahan terbaik dari setiap variabel prediktor, menentukan variabel dan pemisah terbaik, lalu melakukan pemisahan dan memeriksa apakah proses perlu dilanjutkan. Tahap ini diulang pada setiap simpul hingga salah satu kondisi berhenti terpenuhi: simpul sudah homogen, simpul tidak dapat dipisah lagi, jumlah amatan di bawah batas minimum, atau kedalaman maksimum tercapai. Keempat, pohon divisualisasikan dan dipangkas dengan memilih complexity parameter (cp) yang menghasilkan cross-validation error terkecil. Kelima, kinerja model dievaluasi pada data uji menggunakan confusion matrix (accuracy, precision, recall, specificity, dan F1-score).

Berdasarkan hasil yang diperoleh, dapat disimpulkan bahwa model Regression Tree setelah dilakukan pruning memiliki kinerja yang lebih baik dibandingkan model awal. Variabel yang paling berpengaruh dalam memprediksi Salary adalah CRBI, CRuns, CHits, CAtBat, Years, dan CWalks. Penentuan CP optimal sebesar 0,0025987 menghasilkan pohon yang lebih sederhana, dari 13 menjadi 11 simpul daun. Hal ini ditunjukkan oleh penurunan MSE dari 80.020,62 menjadi 77.556,98, penurunan RMSE dari 282,88 menjadi 278,49, serta peningkatan \(R^2\) dari 0,6097 menjadi 0,6217. Dengan demikian, pruning menghasilkan model yang lebih sederhana dengan kemampuan prediksi yang sedikit lebih baik.

5.2 Saran

Praktikan disarankan untuk mempelajari lebih lanjut mengenai program RStudio melalui berbagai sumber pembelajaran, seperti buku, jurnal, modul praktikum, maupun sumber belajar lainnya agar semakin memahami penerapan feature engineering. Praktikan juga diharapkan lebih teliti dalam melakukan pengolahan data dan penulisan kode program agar dapat meminimalkan kesalahan selama praktikum.

DAFTAR PUSTAKA

Daniela, N. A. F., Desiani, A., & Irmeilyana. (2024). Klasifikasi pengambilan keputusan tindakan operasi sesar menggunakan algoritma Classification and Regression Trees. KOMPUTEK: Jurnal Teknik Universitas Muhammadiyah Ponorogo, 8(2), 54–63.

Fransiska, H. (2026). Modul Praktikum Machine Learning dan Model Prediction. Universitas Bengkulu: Bengkulu.

Ramadhon, R. N., Ogi, A., Agung, A. P., Putra, R., Febrihartina, S. S., & Firdaus, U. (2024). Implementasi algoritma decision tree untuk klasifikasi pelanggan aktif atau tidak aktif pada data bank. Karimah Tauhid, 3(2), 1860–1874.

Simanjuntak, N. M. (2026). Penerapan algoritma decision tree untuk klasifikasi prestasi akademik mahasiswa berdasarkan indeks prestasi semester dan kumulatif. Jurnal Sains dan Teknologi Informasi (JUSSI), 5(3), 146–154.