BAB I PENDAHULUAN

1.1 Latar Belakang Masalah

Perkembangan teknologi informasi telah menghasilkan data dalam jumlah besar yang dapat dimanfaatkan untuk memperoleh informasi dan mendukung proses pengambilan keputusan. Namun, data yang berukuran besar memerlukan metode analisis yang tepat agar dapat diolah menjadi informasi yang mudah dipahami dan bermanfaat. Salah satu metode yang dapat digunakan untuk mengolah data dan menemukan pola hubungan antarvariabel adalah data mining. Dalam penerapannya, data mining memiliki berbagai metode, salah satunya adalah decision tree atau pohon keputusan yang digunakan untuk melakukan klasifikasi dan prediksi berdasarkan pola yang terdapat dalam data (Han dan Kamber, 2001).

Decision tree merupakan metode klasifikasi dan prediksi yang mengubah kumpulan data menjadi struktur pohon yang merepresentasikan aturan-aturan keputusan. Menurut Linoff (2004), pohon keputusan dapat membagi kumpulan data yang besar menjadi himpunan data yang lebih kecil melalui serangkaian aturan keputusan. Struktur tersebut menyerupai flowchart, dengan simpul internal yang menunjukkan pengujian atribut, cabang yang merepresentasikan hasil pengujian, dan simpul daun yang menunjukkan kelas atau distribusi kelas (Han & Kamber, 2001).

Proses klasifikasi menggunakan decision tree dilakukan dengan menelusuri alur keputusan dari simpul akar (root node) hingga simpul daun (leaf node) untuk memperoleh hasil prediksi berdasarkan karakteristik data. Setiap percabangan dibentuk berdasarkan kondisi tertentu pada atribut sehingga menghasilkan aturan yang dapat digunakan untuk menentukan kelas suatu pengamatan. Selain itu, decision tree memiliki keunggulan berupa struktur yang relatif mudah dipahami dan diinterpretasikan serta dapat dikonversi menjadi aturan klasifikasi yang sistematis (Zalilia, 2007). Karakteristik tersebut menjadikan decision tree sebagai salah satu metode yang dapat diterapkan dalam analisis data untuk mendukung pengambilan keputusan. Oleh karena itu pada praktikum kali ini dibahas mengenai “Decision Tree”.

1.2 Rumusan Masalah

Berdasarkan latar belakang, rumusan masalah pada penelitian ini, yaitu:

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

  2. Bagaimana cara membangun model Classification Tree menggunakan algoritma CART?

1.3 Tujuan

Berdasarkan rumusan masalah di atas, tujuan pada penelitian ini, yaitu:

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

  2. Membangun model Classification Tree menggunakan algoritma CART.

1.4 Manfaat

Adapun manfaat pada penelitian ini, yaitu:

  1. Dapat memberikan informasi serta pengetahuan tentang decision tree menggunakan program RStudio.

  2. Mengembangkan dan menerapkan wawasan ilmu yang telah diperoleh khususnya tentang decision tree di RStudio.

1.5 Batasan Masalah

Batasan masalah pada penelitian ini, yaitu menggunakan 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 variabel importance, lakukan prediksi dan evaluasi menggunakan MSE, tentukan CP terbaik, lakukan pruning, dan evaluasi kembali model menggunakan MSE.

1.6 Sistematika Penulisan

Adapun sistematika penulisan dari praktikum ini adalah:

BAB I PENDAHULUAN

Bab I terdiri dari latar belakang, rumusan masalah, batasan masalah, tujuan penelitian, manfaat penelitian, dan sistematika penulisan.

BAB II TINJAUAN PUSTAKA

Bab ini berisi tentang kajian pustaka yang terdiri dari jurnal-jurnal, buku-buku, dan informasi pendukung tentang Machine Learning pada program R.

BAB III METODE PENELITIAN

Bab ini terdiri dari analisis jenis dan sumber data, variabel penelitian, algoritma penelitian, dan diagram alur.

BAB IV HASIL DAN PEMBAHASAN

Bab ini merupakan tahapan pencapaian hasil yang diperoleh dari analisis data yang dilakukan serta penjelasan dari hasil tersebut di bagian pembahasan.

BAB V KESIMPULAN DAN SARAN

Bab ini merupakan bagian penutup dalam laporan ini berupa penarikan kesimpulan mengenai hasil analisis dari penelitian serta penyampaian saran oleh penulis.

DAFTAR PUSTAKA

LAMPIRAN

BAB II TINJAUAN PUSTAKA

2.1 Decision Tree

Pohon keputusan (decision tree) merupakan metode klasifikasi dan prediksi yang sangat kuat dan sangat populer. Metode pohon keputusan mengubah fakta yang sangat besar menjadi pohon keputusan yang mempresenstasikan aturan. Sebuah pohon keputusan adalah sebuah struktur yang dapat digunakan untuk membagi kumpulan data yang besar menjadi himpunan-himpunan record yang lebih kecil dengan menerapkan serangkaian aturan-aturan keputusan (Linoff, 2004).

Pembagian data tersebut berupa struktur flowchart yang menyerupai tree (pohon), dimana setiap simpul internal menandakan suatu tes pada atribut, setiap cabang merepresentasikan hasil tes, dan simpul daun merepresentasikan kelas atau distribusi kelas (Han dan Kamber, 2001). Alur pada decision tree ditelusuri dari simpul akar ke simpul daun yang memegang prediksi kelas. Decision tree mudah untuk dikonversi ke aturan klasifikasi (classification). Sebuah decision tree terdiri atas (Zalilia, 2007):

  1. Root node, yaitu node yang tidak memiliki edge yang mengarah pada dirinya.

  2. Internal node, yaitu node yang memiliki sebuah edge yang mengarah pada dirinya dan dua atau lebih edge yang mengarah keluar.

  3. Leaf node, yaitu node yang memiliki satu edge yang menuju ke dirinya dan tidak memiliki edge menuju keluar.

2.2 Classification and Regression Tree (CART)

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). Berikut penjelasan dari masing-masing tree (Fransiska, 2026):

  1. 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. Information Gain digunakan untuk mengukur seberapa besar tingkat ketidakpastian (Entropy) berkurang setelah dilakukan suatu split. Semakin besar nilai Information Gain, semakin baik pemisahan yang dilakukan karena kelompok data yang terbentuk menjadi semakin homogen. Gini Index digunakan untuk mengukur tingkat ketidakmurnian kelas (Gini impurity) dalam suatu simpul. Semakin kecil nilai Gini Index, semakin homogen data dalam simpul tersebut.

  1. 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 respon dengan rata-rata respon dalam suatu simpul. 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.

BAB III METODE PENELITIAN

3.1 Sumber Data

Jenis data pada penelitian ini adalah data kuantitatif. Data kuantitatif adalah jenis data yang berbentuk angka atau bilangan dan dapat diukur atau dihitung secara langsung. Laporan ini memiliki satu batasan masalah yang menggunakan sumber data sekunder. Data sekunder adalah data yang diperoleh secara tidak langsung melalui media perantara. Data didapatkan dari program R secara langsung.

3.2 Variabel Penelitian

Variabel penelitian adalah karakter atau segala sesuatu yang menjadi perhatian dalam suatu penelitian. Pada batasan masalah terdapat 20 variabel. Variabel tersebut terdiri dari variabel numerik dan kategorik.

3.3 Langkah-langkah Analisis

  1. Input data
  2. Lakukan pengecekan dan penanganan missing value
  3. Bagi data menjadi data latih (training data) dan data uji (testing data)
  4. Membangun model Regression Tree
  5. Mengidentifikasi variable importance
  6. Melakukan prediksi dan evaluasi model awal
  7. Menentukan nilai Complexity Parameter (CP)
  8. Melakukan pruning atau pemangkasan pohon
  9. Melakukan pemeriksaan variable importance setelah pruning
  10. Melakukan prediksi dan evaluasi model setelah pruning
  11. Membandingkan kinerja model sebelum dan sesudah pruning

BAB IV HASIL DAN PEMBAHASAN

4.1 Library

Tuliskan terlebih dahulu library yang akan digunakan pada laporan ini. Selanjutnya input data yang akan digunakan, yaitu data curah hujan.

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(ROCR)
library(ISLR)

4.2 Data

data <- data(package = "ISLR")
data$results[, "Item"]
##  [1] "Auto"      "Caravan"   "Carseats"  "College"   "Credit"    "Default"  
##  [7] "Hitters"   "Khan"      "NCI60"     "OJ"        "Portfolio" "Smarket"  
## [13] "Wage"      "Weekly"
data(Hitters)

# Struktur data
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 ...
# Melihat beberapa baris pertama
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
# Informasi statistik deskriptif
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 berasal dari package ISLR dan berisi data pemain bisbol. Berdasarkan output fungsi str(Hitters), dataset awal terdiri atas 322 observasi dan 20 variabel. Variabel yang tersedia mencakup statistik permainan, seperti AtBat, Hits, HmRun, Runs, RBI, Walks, CAtBat, CHits, CRuns, dan CRBI, serta variabel kategorik League, Division, dan NewLeague. Variabel Salary digunakan sebagai variabel respon yang akan diprediksi karena memiliki tipe data numerik, sehingga sesuai untuk pemodelan regresi. Output head(Hitters) memperlihatkan enam observasi pertama, termasuk adanya nilai NA pada variabel Salary untuk observasi pertama. Sementara itu, output summary(Hitters) menunjukkan bahwa nilai Salary yang tersedia memiliki nilai minimum 67,5, median 425, rata-rata 535,9, dan maksimum 2.460, dengan 59 nilai hilang. Informasi ini menjadi dasar untuk melakukan penanganan missing value sebelum data digunakan dalam pembentukan model.

4.3 Penanganan Missing Value

# Menghitung missing value setiap variabel
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
# Menghitung total missing value
sum(is.na(Hitters))
## [1] 59
# Menghapus baris yang mengandung missing value
Hitters.clean <- na.omit(Hitters)

# Memeriksa kembali missing value
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
# Ukuran data setelah penanganan missing value
dim(Hitters.clean)
## [1] 263  20

Pengecekan nilai hilang dilakukan menggunakan fungsi colSums(is.na(Hitters)) dan sum(is.na(Hitters)). Terdapat 59 nilai hilang pada variabel Salary, sedangkan 19 variabel lainnya tidak memiliki nilai hilang. Selanjutnya, fungsi na.omit() digunakan untuk menghapus observasi yang mengandung nilai hilang agar data yang digunakan dalam pemodelan memiliki nilai lengkap. Setelah penanganan dilakukan, output sum(is.na(Hitters.clean)) menunjukkan nilai 0, yang berarti tidak terdapat lagi missing value pada dataset. Ukuran data juga berubah dari 322 observasi menjadi 263 observasi dengan 20 variabel, sehingga sebanyak 59 observasi dihapus. Data hasil pembersihan ini kemudian digunakan pada tahap pembagian data training dan testing.

4.4 Splitting Data

set.seed(234)

# Pembagian data: 70% training dan 30% testing
index <- createDataPartition(
  Hitters.clean$Salary,
  p = 0.70,
  list = FALSE)

Hitters.train <- Hitters.clean[index, ]
Hitters.test  <- Hitters.clean[-index, ]

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

Pembagian data dilakukan dengan proporsi 70% untuk data training dan 30% untuk data testing. Berdasarkan output, data training terdiri atas 185 observasi, sedangkan data testing terdiri atas 78 observasi. Data training digunakan untuk membangun model Regression Tree, sedangkan data testing digunakan untuk mengevaluasi kemampuan model dalam memprediksi data yang tidak digunakan selama proses pelatihan. Dengan demikian, evaluasi model dilakukan menggunakan data terpisah dari data pembentukan model.

4.5 Membangun Model Regression Tree

set.seed(234)

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

# Menampilkan ringkasan model
print(fit.tree)
## n= 185 
## 
## node), split, n, deviance, yval
##       * denotes terminal node
## 
##  1) root 185 37300170.0  529.3190  
##    2) CRBI< 300.5 107  7781241.0  296.1480  
##      4) CAtBat< 1447 71  4787307.0  205.7113  
##        8) RBI>=16 64   451745.4  169.8464 *
##        9) RBI< 16 7  3500575.0  533.6190 *
##      5) CAtBat>=1447 36  1267980.0  474.5093  
##       10) Walks< 60.5 27   759116.7  418.9753 *
##       11) Walks>=60.5 9   175788.9  641.1111 *
##    3) CRBI>=300.5 78 15721120.0  849.1817  
##      6) Hits< 122.5 32  1830184.0  593.1771  
##       12) HmRun< 7.5 16   724360.0  484.0104 *
##       13) HmRun>=7.5 16   724468.4  702.3438 *
##      7) Hits>=122.5 46 10334770.0 1027.2720  
##       14) CHmRun< 256.5 39  5352320.0  917.2857  
##         28) Years>=9.5 23  1423979.0  753.5352  
##           56) CRuns< 751.5 13   361905.4  629.9725 *
##           57) CRuns>=751.5 10   605568.1  914.1667 *
##         29) Years< 9.5 16  2425068.0 1152.6770 *
##       15) CHmRun>=256.5 7  1882174.0 1640.0520 *
# Visualisasi pohon 
rpart.plot(
  fit.tree,
  type = 2,
  extra = 101,
  fallen.leaves = TRUE,
  main = "Regression Tree untuk Prediksi Salary")

Model Regression Tree dibangun menggunakan fungsi rpart(). Argumen method = “anova” menunjukkan bahwa model dibangun untuk memprediksi variabel numerik, sedangkan cp = 0.008 digunakan sebagai parameter kompleksitas awal pohon. Berdasarkan output, model dibentuk menggunakan 185 observasi dengan nilai prediksi pada simpul akar (root node) sebesar 529,319. Hasil pembentukan pohon menunjukkan bahwa variabel CRBI menjadi pemisah pertama, dengan batas nilai 300,5. Pada kelompok dengan CRBI kurang dari 300,5, pohon membentuk percabangan berikutnya berdasarkan CAtBat, kemudian menggunakan RBI atau Walks untuk menentukan prediksi pada simpul terminal. Sementara itu, pada kelompok dengan CRBI minimal 300,5, pohon menggunakan Hits, HmRun, CHmRun, Years, dan CRuns untuk membentuk percabangan lanjutan. Nilai pada setiap simpul terminal merupakan prediksi Salary untuk observasi yang memenuhi aturan percabangan tersebut.

4.6 Analisis Variable Importance

importance <- fit.tree$variable.importance
importance <- sort(importance, decreasing = TRUE)

print(importance)
##       CRBI      CRuns      CHits     CAtBat      Years     CWalks       Hits 
## 17828583.0 15964135.0 15572714.5 15491705.9 12482323.9 11203994.1  3951028.6 
##     CHmRun      AtBat       Runs        RBI      Walks      HmRun    PutOuts 
##  3588693.2  3581420.4  3215550.3  3073679.2  2436801.2  1492658.2   553921.5
# Visualisasi variable importance
barplot(
  importance,
  las = 2,
  col = "skyblue",
  main = "Variable Importance",
  ylab = "Tingkat Kepentingan Variabel",
  cex.names = 0.8)

Analisis variabel importance dilakukan untuk mengetahui tingkat kepentingan setiap variabel prediktor dalam pembentukan pohon regresi. Berdasarkan output, variabel CRBI memiliki nilai kepentingan tertinggi, diikuti oleh CRuns, CHits, dan CAtBat. Hasil tersebut menunjukkan bahwa CRBI, yaitu jumlah runs batted in kumulatif sepanjang karier, merupakan variabel dengan kontribusi relatif terbesar dalam pembentukan model awal. Sebaliknya, PutOuts memiliki nilai kepentingan paling rendah. Grafik batang variabel importance digunakan untuk mempermudah perbandingan tingkat kepentingan antarprediktor. Nilai kepentingan menunjukkan kontribusi relatif terhadap pembentukan pohon.

4.7 Prediksi dan Evaluasi Model

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

# Menghitung Mean Squared Error (MSE)
mse.tree <- mean((Hitters.test$Salary - pred.tree)^2)
cat("MSE model sebelum pruning =", mse.tree, "\n")
## MSE model sebelum pruning = 79151.77

Setelah model awal terbentuk, prediksi dilakukan terhadap data testing. Hasil prediksi tersebut dibandingkan dengan nilai Salary aktual pada data testing menggunakan Mean Squared Error (MSE). MSE dihitung dengan mengambil rata-rata kuadrat selisih antara nilai aktual dan nilai prediksi, sehingga nilai yang lebih kecil menunjukkan kesalahan prediksi kuadrat rata-rata yang lebih rendah. Berdasarkan output, model Regression Tree sebelum pruning menghasilkan nilai MSE sebesar 79.151,77. Nilai ini menjadi tolok ukur awal untuk menilai kinerja model sebelum dilakukan penyederhanaan pohon. Selanjutnya, nilai MSE tersebut dibandingkan dengan MSE model setelah pruning untuk mengetahui perubahan kesalahan prediksi pada data testing.

4.8 Menentukan CP Terbaik

# Menampilkan tabel kompleksitas pohon
printcp(fit.tree)
## 
## Regression tree:
## rpart(formula = Salary ~ ., data = Hitters.train, method = "anova", 
##     control = rpart.control(cp = 0.008))
## 
## Variables actually used in tree construction:
## [1] CAtBat CHmRun CRBI   CRuns  Hits   HmRun  RBI    Walks  Years 
## 
## Root node error: 37300166/185 = 201623
## 
## n= 185 
## 
##           CP nsplit rel error  xerror    xstd
## 1  0.3699126      0   1.00000 1.01440 0.16933
## 2  0.0953392      1   0.63009 0.66573 0.13523
## 3  0.0831170      2   0.53475 0.73618 0.13772
## 4  0.0462720      3   0.45163 0.69985 0.12396
## 5  0.0403020      4   0.40536 0.69910 0.13299
## 6  0.0223856      5   0.36506 0.64196 0.13100
## 7  0.0122387      6   0.34267 0.66030 0.13128
## 8  0.0102240      7   0.33043 0.65698 0.12895
## 9  0.0089296      8   0.32021 0.65061 0.12904
## 10 0.0080000      9   0.31128 0.64249 0.12920
# Visualisasi hubungan CP dan cross-validation error
plotcp(fit.tree)

# Memilih CP dengan xerror terkecil
bestcp <- fit.tree$cptable[
  which.min(fit.tree$cptable[, "xerror"]),"CP"]

cat("CP terbaik =", bestcp, "\n")
## CP terbaik = 0.02238561

Penentuan CP dilakukan untuk menampilkan tabel kompleksitas pohon. Tabel memuat nilai CP, jumlah percabangan (nsplit), relative error, cross-validation error (xerror), dan standar error dari hasil validasi silang (xstd). Nilai CP mengatur kompleksitas pohon, pemangkasan dengan CP yang lebih besar pada umumnya menghasilkan pohon yang lebih sederhana. Berdasarkan output, nilai xerror terkecil adalah 0,64196, yang terdapat pada baris dengan nilai CP sebesar 0,0223856 dan jumlah percabangan sebanyak lima. Oleh karena itu, berdasarkan kriteria nilai xerror terkecil, CP terbaik yang diperoleh adalah 0,02238561. Nilai ini kemudian digunakan untuk melakukan pruning pada model pohon regresi.

4.9 Pruning Decision Tree

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

# Ringkasan model setelah pruning
print(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 *
# Visualisasi pohon setelah pruning
rpart.plot(
  pruned.tree,
  type = 2,
  extra = 101,
  fallen.leaves = TRUE,
  main = "Regression Tree Setelah Pruning")

# Variable importance setelah pruning
importance.pruned <- pruned.tree$variable.importance
importance.pruned <- sort(
  importance.pruned,
  decreasing = TRUE)

print(importance.pruned)
##       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

Tahap ini bertujuan menyederhanakan struktur pohon dengan menghilangkan percabangan yang tidak dipertahankan berdasarkan parameter kompleksitas terpilih. Model setelah pruning tetap menggunakan 185 observasi pada data training, tetapi memiliki struktur yang lebih sederhana dibandingkan model awal. Pada model awal, pohon memiliki sembilan percabangan, sedangkan setelah pruning jumlah percabangan berkurang menjadi lima. Analisis variabel importance setelah pruning menunjukkan bahwa CRBI tetap menjadi variabel dengan nilai kepentingan tertinggi. Variabel berikutnya adalah CRuns, CHits, dan CAtBat.

4.10 Prediksi dan Evaluasi Setelah Pruning

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

# Menghitung MSE setelah pruning
mse.pruned <- mean(
  (Hitters.test$Salary - pred.pruned)^2)
cat("MSE model setelah pruning =", mse.pruned, "\n")
## MSE model setelah pruning = 75515.11

Setelah proses pruning, prediksi kembali dilakukan terhadap data testing. Nilai prediksi kemudian dibandingkan dengan nilai Salary aktual untuk memperoleh MSE setelah pruning. Evaluasi menggunakan data testing yang sama seperti pada model awal memungkinkan perbandingan kesalahan prediksi kedua model secara langsung. Berdasarkan output, model setelah pruning menghasilkan nilai MSE sebesar 75.515,11.

4.11 Perbandingan MSE Sebelum dan Sesudah Pruning

hasil.evaluasi <- data.frame(
  Model = c(
    "Regression Tree Sebelum Pruning",
    "Regression Tree Setelah Pruning"),
  MSE = c(mse.tree,
          mse.pruned))
print(hasil.evaluasi)
##                             Model      MSE
## 1 Regression Tree Sebelum Pruning 79151.77
## 2 Regression Tree Setelah Pruning 75515.11

Hasil perbandingan menunjukkan bahwa MSE menurun dibandingkan dengan MSE sebelum pruning. Penurunan ini menunjukkan bahwa model setelah pruning memiliki kesalahan prediksi kuadrat rata-rata yang lebih rendah pada data testing. Oleh karena itu, berdasarkan kriteria MSE pada data testing, model setelah pruning memberikan hasil prediksi yang lebih baik pada percobaan ini.

BAB V KESIMPULAN

5.1 Kesimpulan

Decision Tree merupakan metode pembelajaran mesin yang merepresentasikan proses pengambilan keputusan dalam bentuk struktur pohon. Pada klasifikasi, algoritma CART membagi data menjadi beberapa kelompok berdasarkan variabel prediktor sehingga diperoleh kelompok yang semakin homogen terhadap kelas target. Pemilihan pemisah dilakukan dengan meminimalkan ketidakmurnian kelas, yang umumnya diukur menggunakan indeks Gini. Struktur pohon terdiri atas simpul akar (root node), simpul internal (internal node), cabang (branch), dan simpul terminal (terminal node) yang menunjukkan hasil klasifikasi.

Pembangunan model Classification Tree diawali dengan menyiapkan data, menentukan variabel target dan prediktor, serta membagi data menjadi data latih dan data uji. Selanjutnya, algoritma CART membentuk pohon secara rekursif dengan memilih pemisahan terbaik berdasarkan penurunan ketidakmurnian kelas pada setiap simpul. Model yang terbentuk kemudian dievaluasi menggunakan data uji dengan metrik evaluasi klasifikasi, seperti confusion matrix, akurasi, presisi, recall, dan F1-score. Untuk mengurangi kompleksitas pohon dan mencegah overfitting, dilakukan pemangkasan (pruning) jika diperlukan, kemudian kinerja model sebelum dan sesudah pemangkasan dibandingkan untuk menentukan model yang lebih baik.

Model Regression Tree menunjukkan bahwa CRBI merupakan variabel yang paling penting dalam memprediksi nilai Salary, diikuti oleh CRuns dan CHits. Setelah dilakukan pruning, nilai MSE menurun dari 79.151,77 menjadi 75.515,11, atau berkurang sekitar 4,59%. Hal ini menunjukkan bahwa pemangkasan pohon menghasilkan kesalahan prediksi yang lebih rendah pada data uji. Dengan demikian, model setelah pruning memberikan kinerja prediksi yang lebih baik dibandingkan model sebelum pruning pada pengujian ini.

5.2 Saran

Ketika menjalankan suatu fungsi pada program R diharapkan untuk teliti saat mengoperasikannya. Penulisan syntax sangat perlu diperhatikan karena apabila terdapat kesalahan penulisan akan membuat program error. Selain itu, perlu untuk memperhatikan tatacara penulisan yang sesuai dengan KBBI, sehingga dapat menghasilkan laporan yang baik.

DAFTAR PUSTAKA

Fransiska, H. (2026). Modul Praktikum Machine Learning. Bengkulu: Laboratorium Statistika FMIPA Universitas Bengkulu.

Han, J., & Kamber, M. (2001). Data mining: Concepts and techniques. San Francisco: Morgan Kaufmann Publishers.

Linoff, M. J. (2004). Data Mining Technuques For Marketing Sales. Canada: Wiley Publishing.

Zalilia, L. (2007). Penerapan Data Mining untuk IDS. Bandung: Institut Teknologi Bandung.