BAB 1 PENDAHULUAN

1.1 Latar Belakang

Perkembangan teknologi membuat data yang tersimpan semakin banyak, dan data tersebut baru berguna jika bisa diolah menjadi informasi untuk mengambil keputusan. Salah satu cara mengolahnya adalah klasifikasi, yaitu membuat model dari data yang sudah ada untuk memprediksi kelas atau kategori dari data baru. Decision tree (pohon keputusan) adalah salah satu teknik klasifikasi yang caranya mirip alur pertanyaan bercabang. Data berbentuk tabel diubah menjadi model pohon yang dimulai dari simpul akar (root), bercabang melalui simpul keputusan, dan berakhir di simpul daun (leaf) yang berisi hasil klasifikasi. Model pohon ini kemudian bisa dibaca sebagai aturan keputusan yang sederhana (Putro & Setiadi, 2023).

Dalam membuat model decision tree, dataset biasanya dibagi menjadi dua bagian, yaitu data latih (training) yang dipakai untuk membangun model dan data uji (testing) yang dipakai untuk menguji seberapa baik model memprediksi data baru. Hasil prediksi pada data uji lalu dievaluasi, misalnya dengan confusion matrix untuk melihat nilai akurasi, presisi, recall, dan F1-score. Dengan begitu, kualitas model dapat diukur secara jelas, tidak hanya dilihat dari bentuk pohonnya (Indriyani et al., 2025).

Keunggulan decision tree adalah hasilnya mudah dipahami. Dalam penelitian prediksi prestasi siswa, model pohon keputusan mencapai akurasi 89,7% dan dapat membantu sekolah mengenali siswa yang berpotensi berprestasi rendah lebih awal sehingga penanganan bisa dilakukan lebih cepat (Halimatussa’diyah & Rohman, 2026). Karena itu, praktikum Machine Learning dengan topik Decision Tree penting dilakukan agar mahasiswa memahami cara kerja pohon keputusan, mulai dari membangun model dari data hingga menguji dan menilai hasil klasifikasinya.

1.2 Rumusan Masalah

Rumusan masalah yang dapat disimpulkan adalah sebagai berikut:

  1. Bagaimana konsep dasar Decision Tree klasifikasi menggunakan metode CART (Classification and Regression Tree)

  2. Bagaimana membangun model Classification Tree menggunakan algoritma CART?

1.3 Tujuan Masalah

Tujuan dari praktikum ini adalah sebagai berikut:

  1. Menjelaskan konsep dasar Decision Tree untuk klasfikasi menggunakan metode CART (Classification and Regression Tree).

  2. Membangun model Classification Tree menggunakan algoritma cart.

1.4 Manfaat Praktikum

Adapun manfaat pada praktikum ini adalah:

  1. Bagi Penulis
  1. Dapat memberi informasi serta menambah pengetahuan tentang Decision Tree.

  2. Menerapkan pengetahuan yang diperoleh tentang Decision Tree.

  1. Bagi Pembaca
  1. Menambah pengetahuan tentang Decision Tree.

  2. Menjadi rujukan bagi praktikan selanjutnya.

1.5 Batasan Masalah

Gunakan dataset Hitters dari package ISLR untuk memprediksi Salary menggunakan Decision Tree (Regression Tree). Lakukan pengecekan dan penanganan missing value menggunakan na.omit(), kemudian bagi data menjadi training dan testing. Selanjutnya, bangun dan visualisasikan tree, analisis variable importance, lakukan prediksi dan evaluasi menggunakan MSE, tentukan CP terbaik, lakukan pruning, dan evaluasi kembali model menggunakan MSE.

BAB 2 TINJAUAN PUSTAKA

2.1 Decision Tree

Decision tree (pohon keputusan) adalah teknik model prediksi untuk klasifikasi. Data berbentuk tabel diubah menjadi model pohon yang terdiri atas simpul-simpul keputusan yang dihubungkan oleh cabang. Alurnya bergerak ke bawah dari simpul akar (root) dan berakhir di simpul daun (leaf) yang berisi hasil klasifikasi. Atribut yang menjadi simpul dipilih lewat ukuran tertentu, misalnya entropy untuk mengukur ketidakmurnian kelas pada data dan gain untuk melihat seberapa besar sebuah atribut menurunkan entropy. Atribut dengan gain tertinggi dijadikan simpul (Putro & Setiadi, 2023).

\[Entropy(S) = -\sum_{i=1}^{n} p_i \log_2(p_i)\]

\[Gain(S,A) = Entropy(S) - \sum_{i=1}^{n} \frac{|S_i|}{|S|} \times Entropy(S_i)\]

Keterangan: \(S\) adalah himpunan kasus, \(A\) adalah atribut, \(p_i\) adalah proporsi data kelas ke-\(i\), \(|S_i|\) adalah jumlah kasus pada partisi ke-\(i\), dan \(|S|\) adalah jumlah seluruh kasus.

Tabel 2.1 Elemen pada pohon keputusan

Elemen Penjelasan
Simpul akar (root) Titik awal pohon, berisi atribut dengan pengaruh terbesar
Simpul keputusan Titik percabangan yang menguji nilai suatu atribut
Cabang Hasil pengujian pada simpul keputusan
Simpul daun (leaf) Titik akhir yang berisi kelas hasil klasifikasi

2.2 CART (Classification and Regression Tree)

CART adalah algoritma decision tree yang membangun model prediksi dengan membagi dataset menjadi subset yang lebih kecil, dan dapat dipakai untuk klasifikasi maupun regresi. Pada klasifikasi, hasilnya disebut classification tree, dan setiap pemisahan menghasilkan dua simpul, yaitu simpul kiri dan simpul kanan. Pemisahan dinilai dengan indeks Gini, yaitu ukuran ketepatan pemisahan data pada sebuah simpul. Semakin kecil nilainya, semakin murni simpul tersebut, dan nilai 0 berarti seluruh datanya berasal dari satu kelas. Dari semua calon pemisah dipilih yang memiliki goodness of split tertinggi, lalu setiap simpul diberi label kelas berdasarkan kelas yang paling banyak di simpul tersebut (Nurdila, 2023).

\[i(t) = Gini(t) = 1 - \sum_{j} p_j^2\]

\[\Phi(s,t) = i(t) - P_L \, i(t_L) - P_R \, i(t_R)\]

Keterangan: \(p_j\) adalah proporsi data kelas ke-\(j\) pada simpul \(t\), \(s\) adalah calon pemisah, \(t_L\) dan \(t_R\) adalah simpul kiri dan kanan, serta \(P_L\) dan \(P_R\) adalah proporsi data yang masuk ke simpul kiri dan kanan.

Tabel 2.2 Perbandingan ukuran pemilihan simpul

Aspek Entropy dan Gain Indeks Gini (CART)
Fungsi Mengukur ketidakmurnian kelas dan penurunannya Mengukur ketepatan pemisahan data pada simpul
Rumus \(-\sum p_i \log_2(p_i)\) \(1 - \sum p_j^2\)
Simpul terpilih Atribut dengan gain tertinggi Pemisah dengan goodness of split tertinggi
Hasil pemisahan Sesuai jumlah nilai atribut Dua simpul (kiri dan kanan)

2.3 Missing Value dan Penanganan dengan na.omit()

Missing value merupakan kondisi ketika terdapat nilai yang tidak tersedia pada satu atau lebih variabel dalam suatu dataset. Keberadaan nilai yang hilang dapat mengurangi jumlah informasi yang tersedia dan memengaruhi proses analisis data. Handayany dkk. (2023) menjelaskan bahwa data hilang dapat terjadi karena pengumpulan informasi yang tidak lengkap, kesulitan memperoleh informasi, maupun kelalaian dalam proses pengumpulan data. Oleh karena itu, penanganan missing value menjadi salah satu tahapan penting dalam persiapan data sebelum dilakukan pemodelan statistik atau machine learning.

Salah satu cara menangani missing value dalam R adalah menggunakan fungsi na.omit(), yaitu fungsi yang menghapus observasi atau baris yang mengandung nilai hilang. Penghapusan tersebut dilakukan apabila terdapat setidaknya satu nilai NA pada suatu baris, sehingga hanya observasi yang lengkap yang dipertahankan untuk analisis selanjutnya. Dalam penelitian ini, fungsi na.omit() digunakan untuk menyiapkan data sebelum pembentukan model Regression Tree tanpa melakukan pengisian atau imputasi terhadap nilai yang hilang. Penghapusan observasi merupakan salah satu pendekatan penanganan data hilang yang perlu dipertimbangkan berdasarkan karakteristik dan jumlah data yang tersedia (Prasetya dkk., 2023).

2.4 Pruning dan Evaluasi Model

Pohon maksimal yang terbentuk biasanya terlalu besar sehingga perlu dipangkas (pruning) agar lebih optimal. Pemangkasan dapat dilakukan dengan cost complexity yang dikombinasikan dengan cross validation untuk mencari parameter alpha yang optimal. Setelah itu, model diuji dengan confusion matrix untuk menghitung sensitivity (ketepatan prediksi pada kelas positif), specificity (ketepatan prediksi pada kelas negatif), dan akurasi (Nurdila, 2023).

\[R_\alpha(T) = R(T) + \alpha \, |\tilde{T}|\]

Keterangan: \(R(T)\) adalah kesalahan klasifikasi pohon \(T\), \(|\tilde{T}|\) adalah jumlah simpul terminal, dan \(\alpha\) adalah parameter kompleksitas. Semakin besar \(\alpha\), semakin banyak cabang yang dipangkas.

Tabel 2.4 Confusion matrix

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

Sumber: Indriyani et al. (2025).

Dari confusion matrix tersebut dapat dihitung juga akurasi, presisi, recall, dan F1-score. Semakin tinggi nilai F1-score, semakin baik modelnya (Indriyani et al., 2025).

Tabel 2.5 Rumus evaluasi model

Ukuran Rumus
Akurasi \(\dfrac{TP + TN}{TP + TN + FP + FN}\)
Presisi \(\dfrac{TP}{TP + FP}\)
Recall / Sensitivity \(\dfrac{TP}{TP + FN}\)
Specificity \(\dfrac{TN}{TN + FP}\)
F1-score \(2 \times \dfrac{Presisi \times Recall}{Presisi + Recall}\)

BAB III. METODE PENELITIAN

3.1 Jenis dan Sumber Data

Jenis data yang digunakan dalam penelitian kali ini merupakan jenis data numerik dan kategorik. Jenis data numerik adalah data yang berbentuk angka dan dapat diukur serta dianalisis secara kuantitatif, sedangkan data kategorik adalah data yang berbentuk kelompok atau kategori. Data yang digunakan dalam penelitian ini berupa dataset Hitters yang berisi informasi mengenai pemain bisbol, termasuk karakteristik pemain serta gaji (Salary) yang diperoleh.

Sumber data penelitian ini adalah sumber data sekunder. Sumber data sekunder adalah data yang diperoleh dari pihak lain dan tidak dikumpulkan secara langsung oleh peneliti. Data sekunder yang digunakan dalam penelitian ini merupakan dataset Hitters yang tersedia pada package ISLR di R. Data yang memiliki missing value dihapus menggunakan fungsi na.omit() sebelum dilakukan pemodelan.

3.2 Variabel Penelitian

Variabel penelitian adalah sesuatu yang menjadi fokus perhatian yang memberikan pengaruh dan mempunyai nilai. Variabel penelitian yang digunakan dalam penelitian ini terdiri atas variabel respons dan variabel prediktor. Variabel respons yaitu Salary, yang menunjukkan gaji pemain bisbol dalam ribuan dolar. Variabel prediktor yaitu karakteristik pemain, seperti pengalaman bermain (Years), jumlah pertandingan yang dimainkan (Games), jumlah pukulan (Hits), jumlah home run (HmRun), dan karakteristik statistik permainan lainnya. Variabel League, Division, dan NewLeague merupakan variabel kategorik, sedangkan variabel lainnya berupa numerik. Variabel Salary diprediksi menggunakan metode Decision Tree (Regression Tree) untuk mengetahui pola hubungan antara karakteristik pemain dan gaji yang diperoleh.

3.3 Analisis Data

Berikut adalah langkah-langkah yang dilakukan dalam analisis:

  1. Membaca dan memeriksa dataset Hitters dari package ISLR.
  2. Memeriksa dan menangani missing value menggunakan fungsi na.omit().
  3. Membagi data menjadi data training dan testing.
  4. Membangun model Regression Tree menggunakan metode CART dan memvisualisasikan tree.
  5. Menganalisis variable importance untuk mengetahui variabel prediktor yang berperan penting dalam pemodelan.
  6. Melakukan prediksi pada data testing dan mengevaluasi model menggunakan Mean Squared Error (MSE).
  7. Menentukan nilai Complexity Parameter (CP) terbaik berdasarkan cross-validation error.
  8. Melakukan pruning pada tree berdasarkan nilai CP terbaik.
  9. Melakukan prediksi kembali menggunakan model hasil pruning dan mengevaluasi model menggunakan MSE.
  10. Membandingkan nilai MSE sebelum dan setelah pruning untuk mengetahui perubahan kinerja model.
  11. Menampilkan dan menginterpretasikan output dari setiap tahapan analisis.

3.4 Diagram Alir Penelitian

BAB 4 HASIL DAN PEMBAHASAN

4.1 Ekspolarasi Data Awal

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(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.1     ✔ readr     2.2.0
## ✔ ggplot2   4.0.3     ✔ stringr   1.6.0
## ✔ lubridate 1.9.5     ✔ tibble    3.3.1
## ✔ purrr     1.2.2     ✔ tidyr     1.3.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(rpart)
library(caret)
## Loading required package: lattice
## 
## Attaching package: 'caret'
## 
## The following object is masked from 'package:purrr':
## 
##     lift
library(rpart.plot)
library(ISLR)

data(Hitters)    # Memanggil dataset Hitters
str(Hitters)     # Melihat struktur data
## '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)    # Melihat beberapa data
##                   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
summary(Hitters) # Melihat ringkasan data
##      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
dim(Hitters)     # Melihat dimensi data
## [1] 322  20
colSums(is.na(Hitters))           # Memeriksa missing value
##     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
Hitters.bersih <- na.omit(Hitters)# Menghapus missing value
colSums(is.na(Hitters.bersih))    # Memeriksa missing value
##     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
dim(Hitters.bersih)  # Melihat dimensi data setelah pembersihan
## [1] 263  20

Pemeriksaan awal menunjukkan bahwa dataset Hitters memuat 322 observasi dan 20 variabel. Nilai yang hilang hanya ditemukan pada variabel Salary, yakni sebanyak 59 observasi (sekitar 18,3% dari seluruh data), sementara 19 variabel lainnya terisi lengkap. Penanganan dilakukan dengan na.omit(), yaitu membuang setiap observasi yang memiliki nilai hilang. Setelah proses ini tersisa 263 observasi dengan 20 variabel, dan pengecekan ulang memastikan tidak ada lagi missing value. Data tersebut selanjutnya menjadi data lengkap yang dipakai pada seluruh tahap analisis berikutnya.

4.2 Splitting Data

Data dipisahkan menjadi dua bagian: satu untuk membentuk model dan satu lagi untuk menguji kemampuan prediksinya. Komposisi yang dipakai adalah 80% data training dan 20% data testing. Fungsi createDataPartition() dipilih agar pembagian tetap memperhatikan sebaran variabel respons Salary, sedangkan set.seed(234) menjamin hasil pembagian bisa direproduksi.

set.seed(234)

train <- createDataPartition( Hitters.bersih$Salary,
  p = 0.8,list = FALSE)

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

# Melihat jumlah data training dan testing
dim(Hitters.train)
## [1] 212  20
dim(Hitters.test)
## [1] 51 20

Pembagian data menghasilkan 212 observasi untuk training dan 51 observasi untuk testing. Data training dipakai untuk membangun model Regression Tree, sedangkan data testing menjadi bahan uji untuk melihat seberapa baik model menebak Salary pada data yang tidak ikut dilibatkan saat pelatihan. Dengan pemisahan ini, penilaian kinerja model tidak tercampur dengan proses pembentukannya.

4.3 Model Regression Tree

Model dibangun dengan fungsi rpart(), dengan Salary sebagai variabel respons dan semua variabel lain sebagai prediktor. Argumen method = “anova” dipilih karena respons berupa data numerik. Nilai cp = 0.001 sengaja dibuat kecil supaya pohon awal tumbuh cukup besar dan kompleks sebelum nantinya dipangkas (pruning).

Berikut merupakan hasil pembentukan dan visualisasi model Regression Tree.

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

fit.tree                     # Melihat hasil model
## n= 212 
## 
## node), split, n, deviance, yval
##       * denotes terminal node
## 
##   1) root 212 46453330.00  544.9977  
##     2) CRBI< 307.5 124  9065008.00  309.6062  
##       4) CAtBat< 1428 79  4910701.00  201.3143  
##         8) RBI>=16.5 72   561989.70  169.0069  
##          16) CRuns< 101.5 43    66050.42  114.8837 *
##          17) CRuns>=101.5 29   183208.80  249.2586  
##            34) CWalks< 117.5 20    45028.44  213.3750 *
##            35) CWalks>=117.5 9    55199.50  329.0000 *
##         9) RBI< 16.5 7  3500575.00  533.6190 *
##       5) CAtBat>=1428 45  1601443.00  499.7185  
##        10) Hits< 118 24   540337.00  417.7014  
##          20) NewLeague=A 14   132261.00  358.0239 *
##          21) NewLeague=N 10   288412.60  501.2500 *
##        11) Hits>=118 21   715156.00  593.4524  
##          22) CHmRun< 23 7   267142.90  457.8571 *
##          23) CHmRun>=23 14   254959.40  661.2500 *
##     3) CRBI>=307.5 88 20836090.00  876.6857  
##       6) AtBat< 424 32  2174114.00  543.1250  
##        12) CHmRun< 122.5 21   777955.40  453.5318  
##          24) Years>=10.5 13    95525.68  360.8975 *
##          25) Years< 10.5 8   389599.20  604.0625 *
##        13) CHmRun>=122.5 11   905784.70  714.1666 *
##       7) AtBat>=424 56 13067050.00 1067.2920  
##        14) CHmRun< 256.5 47  6300814.00  964.6910  
##          28) Walks< 68.5 37  3302243.00  863.0534  
##            56) Assists>=236.5 11   324834.50  645.1948 *
##            57) Assists< 236.5 26  2234440.00  955.2243  
##             114) Runs< 78.5 19   760675.30  860.8772 *
##             115) Runs>=78.5 7   845580.20 1211.3100 *
##          29) Walks>=68.5 10  1202151.00 1340.7500 *
##        15) CHmRun>=256.5 9  3687698.00 1603.0960 *
rpart.plot(fit.tree)         # Visualisasi Regression Tree

fit.tree$variable.importance # Melihat variable importance
##        CRBI      CAtBat       CRuns       CHits      CWalks      CHmRun 
## 21370107.10 18625493.78 18296949.70 17732855.43 15734994.14 15724153.17 
##        Hits       AtBat        Runs       Walks         RBI       HmRun 
##  6379536.90  6254013.74  5973517.41  5245870.75  4944750.92  2667878.66 
##       Years     Assists      Errors     PutOuts   NewLeague      League 
##  1597627.90  1126033.19   607859.11   179642.11   119663.41    95730.73

Pohon regresi membagi data secara bertahap berdasarkan nilai variabel prediktor untuk memperkirakan Salary. Setiap percabangan adalah aturan pemisahan, dan setiap simpul terminal memuat nilai prediksi Salary bagi pemain yang memenuhi seluruh aturan di jalur menuju simpul itu. Pada pohon awal, pemisahan pertama dilakukan pada variabel CRBI dengan batas 307,5: sebanyak 124 pemain dengan CRBI kurang dari 307,5 memiliki rata-rata Salary sekitar 309,6, sedangkan 88 pemain dengan CRBI yang lebih besar rata-ratanya sekitar 876,7 (dalam ribuan dolar). Pohon akhirnya memiliki 16 simpul terminal (15 pemisahan) yang melibatkan 13 variabel, sehingga model awal terbilang rumit dan berpotensi terlalu menyesuaikan diri dengan data training.

Selanjutnya, analisis variable importance dilakukan untuk mengetahui prediktor mana yang memberi kontribusi relatif besar dalam pembentukan model.

Berikut merupakan visualisasi tingkat kepentingan variabel pada model Regression Tree.

#  Visualisasi Variabel *Importance*
fit.tree$variable.importance %>%
  data.frame() %>%
  rownames_to_column(var = "Feature") %>%
  rename(Importance = ".") %>%
  ggplot(
    aes(
      x = fct_reorder(Feature, Importance),
      y = Importance
    )
  ) + geom_pointrange(aes(ymin = 0, ymax = Importance),
    color = "cadetblue", size = 0.3
  ) +
  theme_minimal() +
  coord_flip() +
  labs( x = "", y = "",
    title = "Variable Importance pada Regression Tree"
  )

Variabel dengan nilai importance paling tinggi adalah yang paling besar sumbangannya dalam membentuk pembagian simpul pada pohon; makin tinggi nilainya, makin besar peran variabel tersebut, dan sebaliknya. Dari grafik terlihat bahwa variabel CRBI menempati urutan teratas (sekitar 21,37 juta), disusul CAtBat (18,63 juta), CRuns (18,30 juta), CHits (17,73 juta), CWalks (15,73 juta), dan CHmRun (15,72 juta). Keenam variabel ini seluruhnya merupakan statistik karier (kumulatif) pemain. Variabel seperti PutOuts, NewLeague, dan League memiliki nilai importance paling rendah sehingga kontribusinya terhadap prediksi Salary relatif kecil. Hasil ini menunjukkan bahwa gaji pemain lebih banyak dijelaskan oleh rekam jejak sepanjang karier dibandingkan oleh performa satu musim atau kategori liga dan divisi.

4.4 Prediksi dan Evaluasi Model Awal

Setelah model terbentuk, dilakukan prediksi terhadap data testing dengan predict(), lalu hasilnya dibandingkan dengan Salary aktual. Kinerja dinilai dengan Mean Squared Error (MSE), yaitu rata-rata kuadrat selisih antara nilai aktual dan nilai prediksi. Semakin kecil MSE, semakin rendah rata-rata kesalahan prediksi model.

# Melakukan prediksi pada data testing
pred.tree <- predict( fit.tree, newdata = Hitters.test)

# Membandingkan nilai aktual dan prediksi
hasil.prediksi <- data.frame( 
  Aktual = Hitters.test$Salary, Prediksi = pred.tree)
head(hasil.prediksi)
##                   Aktual Prediksi
## -Al Newman            70 533.6190
## -Argenis Salazar     100 114.8837
## -Andre Thornton     1100 714.1666
## -Andy VanSlyke       550 501.2500
## -Alan Wiggins        700 358.0239
## -Buddy Biancalana    175 533.6190
# Menghitung Mean Squared Error (MSE)
mse.awal <- mean((Hitters.test$Salary - pred.tree)^2)
mse.awal
## [1] 76127.9

Hasil prediksi model Regression Tree awal pada enam observasi pertama data testing menunjukkan selisih yang bervariasi antara Salary aktual dan prediksi (dalam ribuan dolar). Prediksi cukup dekat pada Argenis Salazar (aktual 100, prediksi 114,88) dan Andy VanSlyke (aktual 550, prediksi 501,25). Prediksi terlalu tinggi terjadi pada Al Newman (aktual 70, prediksi 533,62) dan Buddy Biancalana (aktual 175, prediksi 533,62), sedangkan prediksi terlalu rendah terjadi pada Andre Thornton (aktual 1.100, prediksi 714,17) dan Alan Wiggins (aktual 700, prediksi 358,02). Al Newman dan Buddy Biancalana mendapat prediksi yang sama karena keduanya jatuh pada simpul terminal yang sama, sehingga perbedaan gaji antarpemain dalam satu simpul tidak tertangkap oleh model. Secara keseluruhan, model awal menghasilkan MSE sebesar 76.127,9 pada data testing, atau RMSE sekitar 275,9 ribu dolar, yang berarti prediksi rata-rata menyimpang sekitar 275.900 dolar dari gaji sebenarnya. Simpangan ini cukup besar jika dibandingkan dengan rata-rata Salary pada data (sekitar 535,9 ribu dolar), sehingga kinerja model awal belum optimal. Hal ini diduga karena pohon awal terlalu kompleks (cp = 0.001) dan menyesuaikan diri terlalu rinci dengan data training (overfitting). Nilai MSE ini selanjutnya digunakan sebagai pembanding untuk model setelah pruning.

Selanjutnya, Complexity Parameter (CP) digunakan untuk mengendalikan kompleksitas pohon. Nilai CP yang sesuai dapat dipilih berdasarkan nilai cross-validation error terkecil pada tabel CP model.

# Menentukan CP Terbaik
printcp(fit.tree)                  # Menampilkan tabel CP
## 
## Regression tree:
## rpart(formula = Salary ~ ., data = Hitters.train, method = "anova", 
##     cp = 0.001)
## 
## Variables actually used in tree construction:
##  [1] Assists   AtBat     CAtBat    CHmRun    CRBI      CRuns     CWalks   
##  [8] Hits      NewLeague RBI       Runs      Walks     Years    
## 
## Root node error: 46453326/212 = 219119
## 
## n= 212 
## 
##           CP nsplit rel error  xerror    xstd
## 1  0.3563195      0   1.00000 1.00816 0.15341
## 2  0.1204419      1   0.64368 0.68692 0.11946
## 3  0.0662717      2   0.52324 0.72977 0.12157
## 4  0.0549555      3   0.45697 0.71152 0.12765
## 5  0.0386715      4   0.40201 0.64994 0.12969
## 6  0.0182578      5   0.36334 0.65490 0.12969
## 7  0.0159939      6   0.34508 0.69478 0.13070
## 8  0.0135229      7   0.32909 0.69799 0.13038
## 9  0.0105563      8   0.31557 0.72500 0.13524
## 10 0.0074473      9   0.30501 0.72502 0.13537
## 11 0.0067321     10   0.29756 0.72499 0.13647
## 12 0.0063038     11   0.29083 0.72336 0.13656
## 13 0.0041559     12   0.28453 0.72223 0.13582
## 14 0.0025760     13   0.28037 0.72288 0.13581
## 15 0.0017863     14   0.27779 0.72296 0.13581
## 16 0.0010000     15   0.27601 0.72057 0.13581
plotcp(fit.tree, upper = "splits") # Visualisasi CP

# Menentukan CP terbaik berdasarkan xerror terkecil
bestcp <- fit.tree$cptable[which.min(fit.tree$cptable[, "xerror"]),
  "CP"
]
bestcp
## [1] 0.03867153

Plot CP menunjukkan hubungan antara kompleksitas pohon (jumlah pemisahan pada sumbu atas dan nilai CP pada sumbu bawah) dengan cross-validation error relatif (X-val Relative Error) pada sumbu vertikal. Pada pohon tanpa pemisahan (0 split), error relatif berada di titik tertinggi, sekitar 1,0. Error turun tajam pada 1 pemisahan menjadi sekitar 0,69, naik sedikit pada 2 dan 3 pemisahan, kemudian mencapai titik terendah pada 4 pemisahan dengan nilai sekitar 0,65. Setelah itu error cenderung naik lagi dan mendatar di kisaran 0,72 mulai 8 hingga 15 pemisahan, sehingga penambahan cabang tidak memperbaiki prediksi pada data baru dan hanya membuat pohon lebih kompleks (overfitting). Garis putus-putus horizontal pada sekitar 0,78 adalah batas satu standar error di atas error minimum, sedangkan garis vertikal pada tiap titik menunjukkan rentang standar error cross-validation. Pohon dengan 4 pemisahan memiliki error terkecil, yang sesuai dengan nilai CP terbaik pada tabel CP (0,0387), sehingga ukuran inilah yang dipilih untuk pruning. Namun, pohon dengan 1 pemisahan juga berada di bawah garis batas tersebut, artinya pohon yang jauh lebih sederhana sebenarnya masih layak jika menggunakan aturan satu standar error. Dalam praktikum ini digunakan kriteria error terkecil sehingga dipilih pohon dengan 4 pemisahan.

# Melakukan pruning menggunakan CP terbaik
pruned.tree <- prune(fit.tree, cp = bestcp)

# Menampilkan hasil model setelah pruning
print(pruned.tree)
## n= 212 
## 
## node), split, n, deviance, yval
##       * denotes terminal node
## 
##  1) root 212 46453330  544.9977  
##    2) CRBI< 307.5 124  9065008  309.6062  
##      4) CAtBat< 1428 79  4910701  201.3143 *
##      5) CAtBat>=1428 45  1601443  499.7185 *
##    3) CRBI>=307.5 88 20836090  876.6857  
##      6) AtBat< 424 32  2174114  543.1250 *
##      7) AtBat>=424 56 13067050 1067.2920  
##       14) CHmRun< 256.5 47  6300814  964.6910 *
##       15) CHmRun>=256.5 9  3687698 1603.0960 *
# Visualisasi pohon setelah pruning
rpart.plot(pruned.tree)

# Melihat variable importance setelah pruning
pruned.tree$variable.importance
##     CRBI    CRuns   CAtBat    CHits   CHmRun   CWalks    AtBat     Hits 
## 20077896 17544847 17343995 16603144 14740336 14650933  5594926  5245243 
##     Runs      RBI    Walks    HmRun    Years 
##  4545877  3671670  3314364  2098097  1304797

Pohon regresi hasil pruning memiliki 4 pemisahan dan 5 simpul terminal. Setiap simpul menampilkan rata-rata Salary (dalam ribuan dolar) dan persentase observasi data training yang masuk ke simpul tersebut, sedangkan warna biru yang makin pekat menunjukkan nilai prediksi Salary yang makin tinggi. Simpul akar berisi seluruh data (100%) dengan rata-rata Salary 545 dan dipisahkan oleh variabel CRBI dengan batas 308. Pemain dengan CRBI kurang dari 308 (58% data) memiliki rata-rata Salary 310 dan dibagi lagi berdasarkan CAtBat dengan batas 1428: pemain dengan CAtBat kurang dari 1428 (37% data) diprediksi bergaji 201, yang merupakan kelompok gaji terendah, sedangkan pemain dengan CAtBat 1428 atau lebih (21% data) diprediksi bergaji 500. Pemain dengan CRBI 308 atau lebih (42% data) memiliki rata-rata Salary 877 dan dibagi berdasarkan AtBat dengan batas 424: pemain dengan AtBat kurang dari 424 (15% data) diprediksi bergaji 543, sedangkan pemain dengan AtBat 424 atau lebih (26% data, rata-rata 1067) dibagi lagi berdasarkan CHmRun dengan batas 257. Pemain dengan CHmRun kurang dari 257 (22% data) diprediksi bergaji 965, dan pemain dengan CHmRun 257 atau lebih (4% data) diprediksi bergaji 1603, yang merupakan kelompok gaji tertinggi. Secara keseluruhan, pola pohon menunjukkan bahwa pemain dengan akumulasi RBI karier, jumlah kesempatan memukul, dan jumlah home run karier yang lebih besar cenderung memiliki gaji lebih tinggi. Variabel CRBI menjadi penentu utama karena berada pada simpul akar, sehingga pohon ini jauh lebih sederhana dan mudah ditafsirkan dibandingkan pohon awal yang memiliki 16 simpul terminal.

# Prediksi pada data testing
pred.prune <- predict(
  pruned.tree,
  newdata = Hitters.test
)

# Membandingkan nilai aktual dan prediksi
hasil.pruning <- data.frame(
  Aktual = Hitters.test$Salary,
  Prediksi = pred.prune
)

head(hasil.pruning)
##                   Aktual Prediksi
## -Al Newman            70 201.3143
## -Argenis Salazar     100 201.3143
## -Andre Thornton     1100 543.1250
## -Andy VanSlyke       550 499.7185
## -Alan Wiggins        700 499.7185
## -Buddy Biancalana    175 201.3143
# Menghitung MSE setelah pruning
mse.pruned <- mean(
  (Hitters.test$Salary - pred.prune)^2
)

mse.pruned
## [1] 61881.45

Tabel berikut membandingkan nilai MSE model sebelum dan setelah pruning pada data testing untuk mengetahui apakah pemangkasan pohon meningkatkan akurasi prediksi.

# Membuat tabel perbandingan MSE
perbandingan.mse <- data.frame(
  Model = c(
    "Sebelum Pruning",
    "Setelah Pruning"
  ),
  MSE = c(
    mse.awal,
    mse.pruned
  )
)

perbandingan.mse
##             Model      MSE
## 1 Sebelum Pruning 76127.90
## 2 Setelah Pruning 61881.45

4.5 Perbandingan dan Evaluasi Model

Perbedaan nilai MSE kedua model tersebut kemudian divisualisasikan dalam diagram batang berikut agar selisih kesalahan prediksi sebelum dan setelah pruning lebih mudah dibandingkan.

ggplot(
  perbandingan.mse,
  aes(x = Model, y = MSE)
) +
  geom_col(fill = "cadetblue") +
  geom_text(
    aes(label = round(MSE, 2)),
    vjust = -0.5
  ) +
  theme_minimal() +
  labs(
    title = "Perbandingan MSE Sebelum dan Setelah Pruning",
    x = "",
    y = "Mean Squared Error (MSE)"
  )

Diagram batang menunjukkan bahwa model sebelum pruning memiliki MSE sebesar 76.127,9, sedangkan model setelah pruning memiliki MSE sebesar 61.881,45, sehingga batang model setelah pruning tampak lebih pendek. Selisihnya sebesar 14.246,45, atau penurunan kesalahan prediksi sekitar 18,7%. Hal ini menunjukkan bahwa pruning berhasil meningkatkan kemampuan prediksi model pada data testing, karena pohon awal yang terlalu kompleks cenderung menyesuaikan diri terlalu rinci dengan data training (overfitting), sedangkan pohon hasil pruning yang lebih sederhana mampu memprediksi data baru dengan lebih baik. Dengan demikian, model Regression Tree setelah pruning dengan CP terbaik lebih baik digunakan untuk memprediksi Salary karena lebih akurat sekaligus lebih mudah ditafsirkan.

BAB 5 KESIMPULAN DAN SARAN

5.1 Kesimpulan

konsep dasar decision tree untuk klasifikasi dengan metode CART (Classification and Regression Tree) adalah membangun model prediksi dengan membagi data secara berulang menjadi subset yang lebih kecil. Data berbentuk tabel diubah menjadi pohon yang terdiri atas simpul akar, simpul keputusan, dan simpul daun yang berisi hasil klasifikasi. Pada CART, setiap pemisahan menghasilkan dua simpul (kiri dan kanan), dan pemisah terbaik dipilih menggunakan indeks Gini dan kriteria goodness of split. Semakin kecil nilai indeks Gini, semakin murni simpul tersebut karena datanya didominasi satu kelas.

Cara membangun model classification tree dengan algoritma CART dimulai dari persiapan data, yaitu menangani missing value, misalnya dengan imputasi MICE atau dengan menghapus data yang hilang. Data kemudian dibagi menjadi data latih dan data uji. Pohon maksimal dibentuk dari data latih dengan memilih pemisah terbaik pada setiap simpul, lalu setiap simpul diberi label kelas berdasarkan kelas yang paling banyak. Pohon tersebut dipangkas (pruning) dengan cost complexity dan cross validation agar lebih optimal, kemudian diuji pada data uji menggunakan confusion matrix untuk menghitung akurasi, presisi, recall, dan F1-score.

Berdasarkan hasil analisis dataset Hitters, data awal sebanyak 322 observasi dengan 59 missing value pada variabel Salary dibersihkan menggunakan na.omit() sehingga tersisa 263 observasi, yang kemudian dibagi menjadi 212 data training dan 51 data testing. Model Regression Tree awal dengan cp = 0.001 menghasilkan pohon yang kompleks dengan 16 simpul terminal dan MSE sebesar 76.127,9 pada data testing, dengan CRBI, CAtBat, dan CRuns sebagai variabel yang paling berkontribusi dalam pembentukan pohon. Berdasarkan tabel dan plot CP, cross-validation error terkecil (0,650) dicapai pada 4 pemisahan dengan CP terbaik sebesar 0,0387, sehingga pohon dipangkas menjadi 5 simpul terminal dengan variabel pemisah CRBI, CAtBat, AtBat, dan CHmRun. Pohon hasil pruning memprediksi bahwa pemain dengan akumulasi RBI karier, jumlah kesempatan memukul, dan jumlah home run karier yang lebih besar cenderung bergaji lebih tinggi, dengan prediksi Salary berkisar dari 201 hingga 1.603 ribu dolar. Model setelah pruning menghasilkan MSE sebesar 61.881,45, lebih rendah sekitar 18,7% dibandingkan model sebelum pruning, sehingga dapat disimpulkan bahwa pruning dengan CP terbaik mampu mengurangi overfitting dan menghasilkan model Regression Tree yang lebih akurat sekaligus lebih sederhana dan mudah diinterpretasikan.

5.2 Saran

Program R sangatlah bermanfaat bagi semua orang khususnya pada mahasiswa statistika, hal ini sangat memudahkan dalam mengolah suatu data di komputer. Tetapi pengguna harus lebih hati-hati dalam memasukan sintaks dan data karena apabila terjadi kesalahan dalam memasukan maupun mengolah data tersebut hasilnya akan sangat berpengaruh.

DAFTAR PUSTAKA

Eldiyana, I., Nurlaelah, E., & Herrhyanto, N. (2021). Estimasi missing data dengan metode Multivariate Imputation by Chained Equations (MICE) untuk membentuk persamaan regresi linear berganda. EurekaMatika, 9(1), 95–106.

Halimatussa’diyah, U., & Rohman, A. (2026). A Prediksi Prestasi Siswa Menggunakan Algoritma Decision Tree C4. 5. Jurnal Algoritma, 23(1), 51-58.

Handayany, I., Kusnandar, D., & Andani, W. (2023). Pendugaan data hilang menggunakan perbandingan imputasi Hot-Deck dan K-Nearest Neighbor. BIMASTER: Buletin Ilmiah Matematika, Statistika dan Terapannya, 12(4).

Indriyani, T., Suprapto, C., Mahendra, I. I., Pratama, R., & Wahyudi, M. N. (2025, June). Metode Decision Tree C4. 5 untuk Klasifikasi Berat Badan Obesitas. In Prosiding Seminar Nasional Teknik Elektro, Sistem Informasi, dan Teknik Informatika (SNESTIK) (Vol. 5, No. 1, pp. 361-370).

Nurdila, F. A. (2023). Penggunaan metode Classification and Regression Tree (CART) dalam mengklasifikasikan faktor yang mempengaruhi penyakit diabetes. Jurnal Ilmiah Matematika (Konvergensi), 10(2), 83–92.

Prasetya, M. R. A., Priyatno, A. M., & Nurhaeni. (2023). Penanganan imputasi Missing Values pada data Time Series dengan menggunakan metode Data Mining. Jurnal Informasi dan Teknologi, 5(2), 52–62.

Putro, A. W. G. P., & Setiadi, T. (2023). Penerapan Klasifikasi Decision Tree (C4. 5) untuk memprediksi kelulusan siswa sekolah dasar di Kecamatan Juai. Jurnal Format, 12(2), 151-157.