Perkembangan teknologi pengolahan data mendorong pemanfaatan machine learning untuk membantu proses klasifikasi dan pengambilan keputusan. Salah satu metode yang dapat digunakan adalah Decision Tree, yaitu metode pembelajaran terawasi (supervised learning) yang membentuk aturan prediksi melalui pemisahan data berdasarkan variabel prediktor. Metode ini memiliki keunggulan karena hasil pemodelannya dapat divisualisasikan dalam bentuk pohon sehingga lebih mudah dipahami dan diinterpretasikan. Dalam bidang kesehatan, Decision Tree dapat diterapkan untuk mengklasifikasikan kondisi kanker payudara ke dalam kategori jinak (benign) dan ganas (malignant) berdasarkan karakteristik sel. Mellina dkk. (2024) membahas penerapan algoritma Decision Tree untuk prediksi kanker payudara, sedangkan Munir dkk. (2024) membandingkan algoritma Naive Bayes dan Decision Tree dalam klasifikasi penyakit kanker payudara.
Pada praktikum ini, dataset BreastCancer dari package mlbench digunakan untuk membangun model Classification Tree. Tahapan analisis diawali dengan pemeriksaan dan penanganan missing value menggunakan package mice, kemudian data dibagi menjadi data training dan testing. Selanjutnya, model dibangun dan divisualisasikan, serta dilakukan analisis variable importance untuk mengetahui variabel yang berperan dalam klasifikasi. Kinerja model dievaluasi menggunakan confusion matrix, kemudian dilakukan penentuan Complexity Parameter (CP) terbaik dan pruning untuk menyederhanakan struktur pohon. Model setelah pruning dievaluasi kembali menggunakan confusion matrix, kurva Receiver Operating Characteristic (ROC), dan nilai Area Under the Curve (AUC) untuk mengetahui kemampuan model dalam membedakan kategori jinak dan ganas.
1.Menjelaskan konsep dasar Decision Tree untuk klasifikasi menggunakan metode CART (Classification and Regression Tree). 2.Membangun model Classification Tree menggunakan algoritma CART.
Decision Tree atau pohon keputusan merupakan metode machine learning yang termasuk dalam supervised learning dan digunakan untuk membentuk aturan prediksi berdasarkan pola dalam data. Model ini membagi data secara bertahap berdasarkan variabel prediktor hingga menghasilkan kelompok yang digunakan untuk menentukan hasil prediksi. Struktur Decision Tree terdiri atas root node sebagai simpul awal, branch sebagai cabang pemisahan, intermediate node sebagai simpul perantara, dan leaf node sebagai simpul akhir yang menghasilkan prediksi. Metode ini memiliki keunggulan berupa hasil pemodelan yang dapat divisualisasikan sehingga aturan keputusan relatif mudah dipahami dan diinterpretasikan (Berk, 2020).
Dalam klasifikasi kanker payudara, Decision Tree dapat digunakan untuk mengelompokkan kondisi kanker ke dalam kategori jinak (benign) dan ganas (malignant) berdasarkan karakteristik sel. Pembentukan pohon keputusan dilakukan dengan memilih variabel yang mampu memisahkan data ke dalam kelompok kelas secara efektif. Proses tersebut berlanjut hingga terbentuk aturan keputusan yang digunakan untuk mengklasifikasikan data baru. Kemampuan Decision Tree dalam membentuk aturan yang mudah diinterpretasikan menjadikannya salah satu metode yang dapat diterapkan pada permasalahan klasifikasi.
Classification and Regression Tree (CART) merupakan metode pembentukan pohon keputusan yang digunakan untuk menyelesaikan permasalahan klasifikasi maupun regresi. Pada Classification Tree, variabel target berbentuk kategori, sedangkan pada Regression Tree, variabel target berupa nilai numerik. CART membentuk pohon melalui proses splitting atau pemisahan data berdasarkan variabel prediktor agar kelompok yang terbentuk semakin homogen. Dalam klasifikasi, salah satu ukuran yang dapat digunakan untuk menentukan kualitas pemisahan adalah Gini Index. Semakin kecil nilai ketidakmurnian suatu simpul, semakin besar dominasi kelas tertentu dalam simpul tersebut (Breiman dkk., 2017).
Pembentukan pohon CART dapat menghasilkan struktur yang kompleks apabila pemisahan dilakukan secara berulang hingga terlalu menyesuaikan diri dengan data pelatihan. Oleh karena itu, digunakan proses pruning atau pemangkasan untuk mengurangi cabang yang kurang diperlukan dan menyederhanakan model. Dalam implementasi menggunakan package rpart pada R, Complexity Parameter (CP) digunakan untuk mengendalikan kompleksitas pohon dan membantu menentukan model yang lebih sederhana. Pendekatan pengembangan pohon keputusan juga terus diteliti, termasuk penggunaan data berlabel sebagian dalam pembentukan pohon klasifikasi (Abedinia & Seydi, 2024). Pada praktikum ini, CART diterapkan untuk membangun Classification Tree menggunakan dataset BreastCancer, kemudian model dievaluasi sebelum dan sesudah pruning untuk melihat kemampuan klasifikasinya.
Data yang digunakan dalam penelitian ini merupakan data sekunder berupa data kondisi kanker payudara yang diperoleh dari dataset BreastCancer pada package mlbench dalam perangkat lunak R. Data tersebut memuat informasi karakteristik sel yang digunakan untuk mengklasifikasikan kondisi kanker payudara ke dalam dua kategori, yaitu jinak (benign) dan ganas (malignant). Data terdiri atas 699 observasi sebelum penanganan missing value. Data selanjutnya diolah menggunakan perangkat lunak RStudio dengan menerapkan metode Decision Tree (Classification Tree) untuk memperoleh hasil klasifikasi.
Variabel yang digunakan dalam penelitian ini terdiri atas variabel respon dan variabel prediktor yang menggambarkan karakteristik sel pada kanker payudara. Variabel respon yang digunakan adalah Class, sedangkan variabel prediktor terdiri atas sembilan karakteristik sel. Adapun definisi masing-masing variabel disajikan pada tabel berikut.
| Variabel | Nama Variabel | Definisi |
|---|---|---|
| Y | Class | Kategori kondisi kanker payudara, yaitu jinak (benign) dan ganas (malignant). |
| X₁ | Cl.thickness | Ketebalan gumpalan sel. |
| X₂ | Cell.size | Keseragaman ukuran sel. |
| X₃ | Cell.shape | Keseragaman bentuk sel. |
| X₄ | Marg.adhesion | Tingkat perlekatan marginal sel. |
| X₅ | Epith.c.size | Ukuran sel epitel tunggal. |
| X₆ | Bare.nuclei | Kondisi inti sel yang tidak tertutup sitoplasma. |
| X₇ | Bl.cromatin | Karakteristik kromatin sel. |
| X₈ | Normal.nucleoli | Kondisi nukleolus sel. |
| X₉ | Mitoses | Tingkat aktivitas mitosis sel. |
Variabel Id tidak digunakan dalam pemodelan karena hanya berfungsi sebagai identitas setiap observasi. Variabel Class digunakan sebagai target klasifikasi, sedangkan sembilan variabel lainnya digunakan sebagai prediktor dalam pembentukan model Decision Tree (Classification Tree).
Analisis data dilakukan menggunakan perangkat lunak RStudio dengan metode Decision Tree (Classification Tree). Adapun tahapan analisis yang dilakukan adalah sebagai berikut.
knitr::opts_chunk$set(echo = FALSE)
# Jika package belum tersedia, jalankan satu kali:
# install.packages(c("ISLR", "rpart", "rpart.plot", "dplyr", "ggplot2"))
library(ISLR)
library(rpart)
library(rpart.plot)
library(dplyr)
library(ggplot2)
# Memuat dataset Hitters
data(Hitters)
# Memeriksa struktur dan ringkasan 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 ...
## 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
## [1] 322 20
## 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
Syntax pada bagian ini digunakan untuk memanggil package yang
diperlukan dalam analisis, memuat dataset Hitters, dan
memeriksa karakteristik awal data. Fungsi str() menampilkan
struktur serta tipe setiap variabel, summary() menyajikan
ringkasan statistik, dim() menunjukkan jumlah baris dan
kolom, sedangkan head() menampilkan beberapa observasi
pertama. Pemeriksaan ini membantu mengenali bentuk dataset dan
memastikan variabel Salary tersedia sebagai target
prediksi.
Dataset Hitters memuat variabel numerik dan kategorik.
Variabel Salary menjadi target yang akan diprediksi.
Pemeriksaan awal dilakukan untuk mengenali nama variabel, tipe data,
serta kondisi data sebelum diproses.
## AtBat Hits HmRun Runs RBI Walks Years CAtBat
## 0 0 0 0 0 0 0 0
## CHits CHmRun CRuns CRBI CWalks League Division PutOuts
## 0 0 0 0 0 0 0 0
## Assists Errors Salary NewLeague
## 0 0 59 0
## [1] 59
## [1] 322 20
## [1] 263 20
## [1] 0
Pemeriksaan missing value dilakukan menggunakan
is.na() yang dikombinasikan dengan colSums()
untuk menghitung jumlah nilai hilang pada setiap variabel. Fungsi
sum() digunakan untuk menghitung jumlah missing
value secara keseluruhan. Selanjutnya, na.omit()
menghapus observasi yang memiliki setidaknya satu nilai hilang dan
menyimpan hasilnya dalam objek Hitters_clean. Perbandingan
dimensi data sebelum dan sesudah penghapusan menunjukkan jumlah
observasi yang tersisa, sedangkan pemeriksaan terakhir memastikan tidak
ada missing value pada data bersih.
Penanganan ini mengikuti batasan masalah yang menggunakan
na.omit(). Konsekuensinya, jumlah observasi untuk pemodelan
berkurang apabila terdapat baris yang memiliki nilai hilang.
## [1] 184 20
## [1] 79 20
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 68.0 178.8 425.0 556.0 750.0 2460.0
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 67.5 195.0 385.0 489.2 720.8 2127.3
Pembagian data diawali dengan set.seed(234) agar
pengacakan dapat diulang dengan hasil yang sama. Fungsi
nrow() menghitung jumlah observasi setelah missing
value dihapus, sedangkan sample() memilih 70% indeks
observasi secara acak sebagai data training tanpa pengembalian.
Observasi yang tidak terpilih digunakan sebagai data testing.
Data training dipakai untuk membangun model, sementara data
testing digunakan untuk menilai kemampuan prediksi pada data
yang tidak digunakan selama pelatihan. Fungsi dim() dan
summary() membantu memeriksa ukuran data serta ringkasan
Salary pada masing-masing bagian.
## n= 184
##
## node), split, n, deviance, yval
## * denotes terminal node
##
## 1) root 184 41961210.00 555.9910
## 2) CHits< 439 82 1332171.00 210.5325
## 4) CRBI< 115.5 55 182826.90 143.9939
## 8) CRuns< 81 34 28217.26 107.6471 *
## 9) CRuns>=81 21 36969.14 202.8413 *
## 5) CRBI>=115.5 27 409807.40 346.0741
## 10) CWalks< 118 13 99676.69 269.3462 *
## 11) CWalks>=118 14 162530.80 417.3214 *
## 3) CHits>=439 102 22975850.00 833.7125
## 6) RBI< 80.5 77 8627815.00 693.9066
## 12) AtBat< 394.5 32 2133386.00 511.7969
## 24) CHmRun< 124.5 23 702139.20 439.8913
## 48) Errors< 6 13 289156.40 377.0513 *
## 49) Errors>=6 10 294911.50 521.5834 *
## 25) CHmRun>=124.5 9 1008422.00 695.5556 *
## 13) AtBat>=394.5 45 4678518.00 823.4069
## 26) Walks< 77.5 36 1783381.00 759.8836
## 52) Assists>=396 10 363046.00 567.4143 *
## 53) Assists< 396 26 907412.10 833.9102
## 106) CAtBat< 2734 8 35380.47 695.3125 *
## 107) CAtBat>=2734 18 650057.10 895.5092 *
## 27) Walks>=77.5 9 2168800.00 1077.5000 *
## 7) RBI>=80.5 25 8207560.00 1264.3150
## 14) Walks< 52.5 10 923861.40 837.9167 *
## 15) Walks>=52.5 15 4253446.00 1548.5800 *
##
## Regression tree:
## rpart(formula = Salary ~ ., data = Hitters_train, method = "anova",
## control = rpart.control(cp = 0.001, minsplit = 20))
##
## Variables actually used in tree construction:
## [1] Assists AtBat CAtBat CHits CHmRun CRBI CRuns CWalks Errors
## [10] RBI Walks
##
## Root node error: 41961207/184 = 228050
##
## n= 184
##
## CP nsplit rel error xerror xstd
## 1 0.4207026 0 1.00000 1.00595 0.15887
## 2 0.1463369 1 0.57930 0.65808 0.11353
## 3 0.0722156 2 0.43296 0.61104 0.10369
## 4 0.0432759 3 0.36074 0.61884 0.12285
## 5 0.0176243 4 0.31747 0.55011 0.11292
## 6 0.0173097 5 0.29984 0.54534 0.11288
## 7 0.0122237 6 0.28253 0.55052 0.11501
## 8 0.0100766 7 0.27031 0.53931 0.11394
## 9 0.0052900 8 0.26023 0.52777 0.11152
## 10 0.0035175 9 0.25494 0.51243 0.10894
## 11 0.0028138 10 0.25143 0.51494 0.10922
## 12 0.0028036 11 0.24861 0.51494 0.10922
## 13 0.0010000 12 0.24581 0.51647 0.10929
Model dibangun menggunakan formula Salary ~ ., yang
menetapkan Salary sebagai variabel respons dan seluruh
variabel lain sebagai prediktor. Argumen method = "anova"
menunjukkan bahwa model yang dibentuk merupakan pohon regresi untuk
target numerik. Pengaturan cp = 0.001 memungkinkan
pembentukan pohon awal yang cukup rinci untuk proses pemilihan CP,
sedangkan minsplit = 20 menetapkan jumlah minimum observasi
pada simpul agar pemisahan dapat dipertimbangkan. Fungsi
print() dan printcp() menampilkan ringkasan
model serta tabel kompleksitas. Selanjutnya, rpart.plot()
memvisualisasikan aturan pemisahan, dengan variabel pada simpul sebagai
dasar pemisahan dan simpul terminal sebagai nilai prediksi
Salary.
Pohon yang terbentuk menunjukkan aturan pemisahan data berdasarkan variabel yang dipilih oleh algoritma. Variabel dan nilai batas pemisahan yang muncul pada hasil aktual harus dibaca langsung dari visualisasi, karena hasilnya ditentukan oleh data training dan pengacakan yang digunakan.
## Variabel Importance
## 1 CHits 18675326
## 2 CAtBat 18084942
## 3 CRuns 17519152
## 4 CRBI 17276732
## 5 CWalks 16038217
## 6 Years 12456880
## 7 RBI 7299030
## 8 Walks 4687275
## 9 Runs 3762997
## 10 HmRun 3752785
## 11 PutOuts 2931433
## 12 AtBat 2712577
## 13 Assists 1760445
## 14 CHmRun 1724412
## 15 Hits 1521265
## 16 Errors 1027147
Nilai variable importance diambil dari objek model melalui
fit_tree$variable.importance, kemudian disusun menjadi
tabel menggunakan data.frame(). Fungsi
arrange(desc(Importance)) mengurutkan variabel berdasarkan
nilai kepentingan dari yang tertinggi hingga terendah. Grafik batang
dibuat menggunakan ggplot() dan geom_col(),
sedangkan coord_flip() mengatur orientasi grafik agar nama
variabel lebih mudah dibaca. Tabel dan grafik tersebut membantu
mengidentifikasi prediktor yang paling berkontribusi terhadap pemisahan
pada pohon yang terbentuk.
Variabel dengan nilai importance tertinggi merupakan variabel yang paling berkontribusi terhadap pemisahan pada pohon yang terbentuk. Nilai importance bukan bukti hubungan sebab-akibat dan tidak selalu berarti variabel tersebut paling penting untuk semua model atau semua sampel.
Jika tidak ada variabel yang tercantum pada tabel, periksa kembali apakah pohon berhasil dibentuk dan apakah model menghasilkan pemisahan.
## MSE model awal = 121881.8
## Salary_Aktual Salary_Prediksi Error
## 1 480.0 695.3125 -215.31250
## 2 500.0 895.5092 -395.50922
## 3 91.5 107.6471 -16.14706
## 4 512.5 521.5834 -9.08340
## 5 700.0 521.5834 178.41660
## 6 240.0 521.5834 -281.58340
Interpretasi syntax:
Prediksi Salary untuk data testing dihasilkan
menggunakan fungsi predict() berdasarkan model awal.
Selanjutnya, MSE dihitung dengan mencari rata-rata kuadrat selisih
antara nilai aktual dan nilai prediksi. Fungsi cat()
menampilkan nilai MSE, sedangkan objek hasil_awal menyusun
nilai aktual, prediksi, dan kesalahan prediksi dalam sebuah tabel. MSE
yang lebih kecil menunjukkan kesalahan prediksi kuadrat yang lebih
rendah pada data testing, dengan kesalahan besar memberikan
kontribusi lebih besar karena selisihnya dikuadratkan.
MSE model awal menjadi ukuran dasar untuk membandingkan kinerja model setelah pruning. MSE yang lebih rendah menunjukkan kesalahan prediksi kuadrat yang lebih kecil pada data testing. Karena kesalahan dikuadratkan, kesalahan prediksi yang besar akan memberikan kontribusi yang lebih besar terhadap MSE.
## CP nsplit rel error xerror xstd
## 1 0.420702615 0 1.0000000 1.0059494 0.1588688
## 2 0.146336874 1 0.5792974 0.6580783 0.1135276
## 3 0.072215578 2 0.4329605 0.6110425 0.1036873
## 4 0.043275935 3 0.3607449 0.6188363 0.1228541
## 5 0.017624299 4 0.3174690 0.5501089 0.1129212
## 6 0.017309735 5 0.2998447 0.5453421 0.1128783
## 7 0.012223738 6 0.2825350 0.5505155 0.1150062
## 8 0.010076559 7 0.2703112 0.5393078 0.1139363
## 9 0.005289993 8 0.2602347 0.5277652 0.1115177
## 10 0.003517531 9 0.2549447 0.5124322 0.1089440
## 11 0.002813819 10 0.2514271 0.5149365 0.1092211
## 12 0.002803553 11 0.2486133 0.5149365 0.1092211
## 13 0.001000000 12 0.2458098 0.5164655 0.1092910
## CP terbaik berdasarkan xerror terkecil = 0.003517531
## xerror pada CP terbaik = 0.5124322
Tabel kompleksitas diperoleh dari fit_tree$cptable dan
berisi informasi seperti CP, jumlah pemisahan, kesalahan relatif, serta
perkiraan kesalahan cross-validation yang ditunjukkan oleh
xerror. Fungsi which.min(tabel_cp$xerror)
mencari baris dengan nilai xerror terkecil, kemudian CP
pada baris tersebut dipilih sebagai CP terbaik sesuai kriteria analisis.
Nilai cp_terbaik selanjutnya digunakan untuk melakukan
pruning. Perlu diperhatikan bahwa xerror merupakan
perkiraan kesalahan relatif dari cross-validation pada data
training, bukan MSE pada data testing.
xerror merupakan perkiraan kesalahan relatif berdasarkan
cross-validation internal pada data training, bukan
MSE pada data testing. Karena itu, CP dipilih menggunakan
xerror, sedangkan kinerja akhir tetap dibandingkan
menggunakan MSE pada data testing.
## n= 184
##
## node), split, n, deviance, yval
## * denotes terminal node
##
## 1) root 184 41961210.00 555.9910
## 2) CHits< 439 82 1332171.00 210.5325
## 4) CRBI< 115.5 55 182826.90 143.9939 *
## 5) CRBI>=115.5 27 409807.40 346.0741 *
## 3) CHits>=439 102 22975850.00 833.7125
## 6) RBI< 80.5 77 8627815.00 693.9066
## 12) AtBat< 394.5 32 2133386.00 511.7969
## 24) CHmRun< 124.5 23 702139.20 439.8913 *
## 25) CHmRun>=124.5 9 1008422.00 695.5556 *
## 13) AtBat>=394.5 45 4678518.00 823.4069
## 26) Walks< 77.5 36 1783381.00 759.8836
## 52) Assists>=396 10 363046.00 567.4143 *
## 53) Assists< 396 26 907412.10 833.9102
## 106) CAtBat< 2734 8 35380.47 695.3125 *
## 107) CAtBat>=2734 18 650057.10 895.5092 *
## 27) Walks>=77.5 9 2168800.00 1077.5000 *
## 7) RBI>=80.5 25 8207560.00 1264.3150
## 14) Walks< 52.5 10 923861.40 837.9167 *
## 15) Walks>=52.5 15 4253446.00 1548.5800 *
Pemangkasan pohon dilakukan menggunakan prune() dengan
memasukkan model awal dan nilai CP terbaik. Fungsi ini menyederhanakan
struktur pohon berdasarkan tingkat kompleksitas yang dipilih. Fungsi
print() menampilkan ringkasan model hasil pemangkasan,
sedangkan rpart.plot() menggambarkan struktur pohon yang
baru. Perbandingan jumlah cabang dan simpul terminal antara pohon awal
dan pohon hasil pruning menunjukkan perubahan kompleksitas
model. Pohon yang lebih sederhana berpotensi mengurangi
overfitting, tetapi belum tentu menghasilkan MSE yang lebih
rendah sehingga perlu dievaluasi kembali.
Pruning bertujuan menyederhanakan pohon dan berpotensi mengurangi overfitting. Namun, pohon yang lebih sederhana tidak otomatis menghasilkan MSE testing yang lebih rendah; hasilnya harus diperiksa melalui evaluasi ulang.
## MSE model awal = 121881.8
## MSE setelah pruning = 118091
## Model MSE
## 1 Regression Tree Awal 121881.8
## 2 Regression Tree Setelah Pruning 118091.0
## MSE menurun setelah pruning. Pada data testing ini, model hasil pruning memiliki kesalahan prediksi lebih rendah.
Fungsi predict() digunakan untuk menghasilkan prediksi
Salary dari pohon yang telah dipangkas. MSE setelah
pruning dihitung menggunakan data testing yang sama
dengan model awal agar perbandingan dilakukan secara adil. Objek
perbandingan_mse merangkum nilai MSE kedua model, sedangkan
struktur if membandingkan hasilnya dan menampilkan
keterangan apakah MSE menurun, meningkat, atau tetap sama setelah
pruning. Jika MSE hasil pruning lebih kecil, model
hasil pemangkasan memiliki kesalahan prediksi lebih rendah pada data
testing tersebut; jika lebih besar, model awal lebih baik
menurut kriteria MSE.
Jika mse_pruned lebih kecil daripada
mse_awal, model hasil pruning lebih baik menurut
kriteria MSE pada data testing. Jika lebih besar, model awal
menghasilkan kesalahan prediksi yang lebih kecil. Perbandingan ini
berlaku untuk pembagian data dan seed yang digunakan dalam
analisis.
## Jumlah observasi awal : 322
## Jumlah observasi setelah na.omit : 263
## Jumlah data training : 184
## Jumlah data testing : 79
## CP terbaik : 0.003517531
## MSE model awal : 121881.8
## MSE setelah pruning : 118091
## Kesimpulan evaluasi: MSE lebih rendah setelah pruning.
Kode ringkasan menampilkan jumlah observasi sebelum dan sesudah penanganan missing value, ukuran data training dan testing, CP terbaik, serta MSE kedua model. Angka yang muncul setelah Knit dapat digunakan sebagai dasar penyusunan pembahasan dan kesimpulan akhir.
Analisis ini membangun Regression Tree menggunakan dataset
Hitters untuk memprediksi Salary. Observasi
yang memiliki missing value dihapus menggunakan
na.omit(), kemudian data dibagi menjadi data
training dan testing. Model awal dibangun dan
divisualisasikan, variabel penting dianalisis, dan kinerja prediksi
diukur menggunakan MSE. CP terbaik dipilih berdasarkan nilai
xerror terkecil pada tabel kompleksitas, kemudian digunakan
untuk melakukan pruning. Kesimpulan mengenai apakah
pruning meningkatkan kinerja model ditentukan berdasarkan
perbandingan MSE pada data testing setelah dokumen
dijalankan.
Analisis lanjutan dapat membandingkan beberapa seed
pembagian data atau menggunakan cross-validation untuk menilai
kestabilan model. Selain MSE, ukuran seperti RMSE dapat dipertimbangkan
agar besar kesalahan prediksi dapat dibaca dalam satuan
Salary. Hasil prediksi juga perlu diinterpretasikan dengan
memperhatikan definisi dan satuan variabel pada dataset
Hitters.
Mellina, A. D. F., Suhartono, & Yaqin, M. A. (2024). Algoritma Decision Tree untuk prediksi deteksi penyakit kanker payudara. JISKA (Jurnal Informatika Sunan Kalijaga), 9(1), 70–78. https://doi.org/10.14421/jiska.2024.9.1.70-78
Munir, A. S., Saputra, A. B., Aziz, A., & Barata, M. A. (2024). Perbandingan akurasi algoritma Naive Bayes dan algoritma Decision Tree dalam pengklasifikasian penyakit kanker payudara. Jurnal Ilmiah Informatika Global, 15(1), 23–29. https://doi.org/10.36982/jiig.v15i1.3578
Abedinia, A., & Seydi, V. (2024). Building semi-supervised decision trees with semi-cart algorithm. International Journal of Machine Learning and Cybernetics, 15, 4493–4510. https://doi.org/10.1007/s13042-024-02161-z
Berk, R. A. (2020). Statistical learning from a regression perspective (3rd ed.). Springer. https://doi.org/10.1007/978-3-030-40189-4
Breiman, L., Friedman, J. H., Olshen, R. A., & Stone, C. J. (2017). Classification and regression trees. CRC Press.