Machine learning merupakan bidang yang memungkinkan komputer mempelajari pola dari data untuk menghasilkan prediksi atau keputusan berdasarkan informasi yang tersedia. Pendekatan ini banyak digunakan dalam analisis data karena mampu membangun model berdasarkan data yang telah diamati dan menerapkannya untuk memperkirakan hasil pada data baru. Alpaydın (2020) menjelaskan bahwa machine learning berkaitan dengan pengembangan algoritma yang memungkinkan komputer memanfaatkan data atau pengalaman sebelumnya untuk menyelesaikan suatu permasalahan. Salah satu pendekatan dalam machine learning adalah supervised learning, yaitu proses pembelajaran menggunakan data yang memiliki variabel prediktor dan variabel respons. Melalui pendekatan tersebut, model dapat mempelajari hubungan antara variabel prediktor dan variabel respons untuk menghasilkan prediksi pada pengamatan baru.
Salah satu metode dalam supervised learning adalah Classification and Regression Tree (CART), yaitu metode yang membentuk model prediksi melalui pembagian data secara bertahap berdasarkan variabel prediktor. CART mencakup dua jenis pemodelan, yaitu Classification Tree untuk memprediksi variabel respons kategorik dan Regression Tree untuk memprediksi variabel respons numerik. Abedinia dan Seydi (2024) menjelaskan bahwa pohon keputusan merupakan metode pembelajaran statistik yang dapat digunakan untuk permasalahan klasifikasi dan regresi melalui proses pembagian data secara rekursif. Struktur pohon yang dihasilkan memungkinkan aturan prediksi disajikan secara sistematis sehingga lebih mudah dipahami dan diinterpretasikan. Selain itu, kompleksitas pohon dapat dikendalikan melalui proses pruning atau pemangkasan cabang. Chew et al. (2025) membahas penerapan strategi pruning untuk menyederhanakan struktur pohon keputusan sekaligus mempertahankan kinerja model. Dengan demikian, CART dapat digunakan untuk membangun model prediksi yang memiliki struktur interpretatif dan dapat disesuaikan kompleksitasnya berdasarkan kebutuhan analisis.
Oleh karena itu, pemahaman mengenai konsep machine learning dan metode CART diperlukan sebagai dasar untuk memahami proses pembentukan model prediksi berbasis pohon keputusan. Pemahaman tersebut mencakup prinsip pembagian data, pembentukan struktur pohon, serta perbedaan penggunaan Classification Tree dan Regression Tree berdasarkan jenis variabel respons. Selain itu, pemahaman mengenai kompleksitas model dan proses pruning diperlukan agar struktur pohon yang terbentuk dapat diinterpretasikan dengan baik. Penguasaan konsep dasar tersebut diharapkan dapat membantu mahasiswa memahami prinsip kerja metode Decision Tree dan penerapannya dalam analisis data.
Berdasarkan latar belakang, rumusan masalah yang dapat disimpulkan yaitu sebagai berikut:
Berdasarkan rumusan masalah, tujuan yang dapat disimpulkan yaitu sebagai berikut:
Adapun manfaat pada penelitian ini yaitu:
Bagi penulis:
Dapat memberikan informasi serta pengetahuan tentang konsep dasar Decision Tree untuk klasifikasi menggunakan metode CART, dan membangun model Classification Tree menggunakan algoritma CART dengan program R.
Dapat mengembangkan dan menerapkan pengetahuan yang telah diperoleh dalam bidang Machine Learning dan program R.
Bagi pembaca:
Menambah ilmu pengetahuan dan pemahaman tentang konsep dasar Decision Tree untuk klasifikasi menggunakan metode CART, dan membangun model Classification Tree menggunakan algoritma CART dengan program R.
Menjadi rujukan bagi peneliti selanjutnya.
Adapun batasan masalah pada penelitian ini yaitu, gunakan
dataset BreastCancer dari package
mlbench untuk mengklasifikasikan kondisi kanker payudara
menggunakan Decision Tree (Classification Tree). Lakukan
pengecekan dan penanganan missing value menggunakan mice,
kemudian bagi data menjadi training dan testing.
Selanjutnya, bangun dan visualisasikan tree, analisis
variable importance, lakukan prediksi dan evaluasi menggunakan
confusion matrix, tentukan CP terbaik, lakukan
pruning, dan evaluasi kembali model menggunakan confusion
matrix, ROC, dan AUC.
Adapun sistematika penulisan dari praktikum ini adalah:
BAB I PENDAHULUAN
Bab ini merupakan bab yang memuat latar belakang, rumusan masalah, tujuan dan manfaat, batasan masalah dan sistematika penulisan.
BAB II TINJAUAN PUSTAKA
Bab ini merupakan bab yang memuat pengertian dan teori yang diperlukan untuk rancangan penelitian pada bab-bab berikutnya.
BAB III METODE PENELITIAN
Bab ini merupakan bab yang memuat jenis dan sumber data, variabel penelitian, analisis data, dan diagram alir yang diperlukan untuk rancangan penelitian pada bab-bab berikutnya.
BAB IV HASIL DAN PEMBAHASAN
Bab ini merupakan bab yang memuat hasil dan pembahasan yang telah dilakukan pada program, kemudian diinterpretasikan untuk rancangan penelitian pada bab-bab berikutnya.
BAB V KESIMPULAN DAN SARAN
Bab ini merupakan bab yang memuat kesimpulan dan saran yang telah dilakukan.
DAFTAR PUSTAKA
Machine learning merupakan pendekatan dalam ilmu komputer yang memungkinkan sistem mempelajari pola dan hubungan dari data untuk menghasilkan prediksi atau keputusan. Proses pembelajaran dilakukan dengan membangun model berdasarkan data yang tersedia, sehingga model tersebut dapat digunakan untuk menganalisis pengamatan baru. Kemampuan model dalam menghasilkan prediksi dipengaruhi oleh karakteristik data, pemilihan metode, serta proses evaluasi yang dilakukan.
Salah satu pendekatan dalam machine learning adalah supervised learning, yaitu pembelajaran menggunakan data yang memiliki variabel prediktor dan variabel respons. Variabel prediktor digunakan sebagai dasar untuk memperkirakan nilai variabel respons. Berdasarkan jenis variabel responsnya, supervised learning dibedakan menjadi klasifikasi dan regresi. Klasifikasi digunakan ketika variabel respons berbentuk kategori, sedangkan regresi digunakan ketika variabel respons berbentuk numerik.
Salah satu metode supervised learning adalah Decision Tree. Metode ini membentuk model prediksi melalui serangkaian aturan pemisahan data berdasarkan variabel prediktor. Hasil pemodelannya berupa struktur pohon yang menunjukkan proses pengambilan keputusan dari simpul awal hingga simpul akhir. Decision Tree dapat digunakan untuk klasifikasi maupun regresi, serta memiliki kelebihan berupa struktur model yang relatif mudah dipahami dan diinterpretasikan. Oleh karena itu, metode ini dapat digunakan untuk mempelajari hubungan antara variabel prediktor dan variabel respons dalam suatu data (Fransiska, 2026).
Decision Tree merupakan metode pemodelan yang merepresentasikan aturan pengambilan keputusan dalam bentuk struktur menyerupai pohon. Struktur tersebut terdiri atas beberapa komponen, yaitu root node sebagai simpul awal yang memuat seluruh pengamatan, intermediate node sebagai simpul yang membagi pengamatan berdasarkan kriteria tertentu, branch sebagai cabang yang menghubungkan simpul, serta leaf node sebagai simpul akhir yang menghasilkan prediksi. Pembentukan pohon dilakukan melalui pemisahan data secara bertahap hingga diperoleh kelompok pengamatan yang sesuai dengan tujuan pemodelan (Fransiska, 2026).
Salah satu algoritma yang digunakan untuk membentuk Decision Tree adalah Classification and Regression Tree (CART) yang diperkenalkan oleh Breiman dkk. (1984). Algoritma ini dapat digunakan untuk dua jenis pemodelan, yaitu Classification Tree dan Regression Tree. Classification Tree digunakan ketika variabel respons bersifat kategorik, sedangkan Regression Tree digunakan ketika variabel respons bersifat numerik. CART membentuk pohon melalui proses pemisahan biner (binary splitting), yaitu membagi setiap simpul menjadi dua kelompok berdasarkan kriteria pemisahan tertentu. Pemisahan dilakukan secara berulang untuk memperoleh kelompok yang sesuai dengan karakteristik variabel respons (Sinambela, 2008).
Pada Classification Tree, pemisahan dipilih berdasarkan kemampuannya menghasilkan simpul yang semakin homogen. Ukuran yang digunakan antara lain Gini Index dan Entropy (Fransiska, 2026). Gini Index mengukur ketidakmurnian kelas pada suatu simpul \(t\):
\[ Gini(t)=1-\sum_{k=1}^{K}p_k^2 \]
dengan \(K\) merupakan jumlah kelas dan \(p_k\) merupakan proporsi pengamatan kelas ke-\(k\) pada simpul tersebut. Sementara itu, Entropy mengukur tingkat ketidakpastian kelas pada suatu simpul:
\[ Entropy(t)=-\sum_{k=1}^{K}p_k\log_2 p_k \]
Nilai Gini Index dan Entropy yang lebih kecil menunjukkan simpul yang lebih homogen, dan keduanya bernilai 0 apabila seluruh pengamatan dalam simpul berasal dari satu kelas yang sama. Jika suatu simpul dibagi menjadi dua bagian \(D_1\) dan \(D_2\), kualitas pemisahan pada Gini Index dihitung dengan rata-rata terbobot:
\[ Gini_{split}=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2) \]
Pemisahan terbaik adalah pemisahan yang menghasilkan nilai \(Gini_{split}\) paling kecil. Pada Regression Tree, pemisahan dilakukan untuk memperoleh kelompok dengan nilai respons yang relatif homogen. Prediksi pada setiap simpul akhir umumnya berupa rata-rata nilai respons pengamatan yang berada dalam simpul tersebut. Pendekatan pohon regresi dapat digunakan untuk mempelajari pola hubungan antara variabel respons numerik dan variabel prediktor (Luqman dkk., 2015; Nopianti dkk., 2022).
Kinerja Classification Tree dievaluasi dengan membandingkan kelas aktual dan kelas hasil prediksi pada data testing. Hasil perbandingan tersebut disajikan dalam confusion matrix (Fransiska, 2026), yaitu tabel yang memuat jumlah prediksi benar dan salah untuk setiap kelas.
| Prediksi Positif | Prediksi Negatif | |
|---|---|---|
| Aktual Positif | True Positive (TP) | False Negative (FN) |
| Aktual Negatif | False Positive (FP) | True Negative (TN) |
Keterangan: TP adalah pengamatan positif yang diprediksi positif, TN adalah pengamatan negatif yang diprediksi negatif, FP adalah pengamatan negatif yang salah diprediksi positif, dan FN adalah pengamatan positif yang salah diprediksi negatif. Berdasarkan confusion matrix, beberapa ukuran evaluasi yang digunakan adalah sebagai berikut.
\[ Accuracy=\frac{TP+TN}{TP+TN+FP+FN} \]
\[ Precision=\frac{TP}{TP+FP} \]
\[ Recall=\frac{TP}{TP+FN} \]
\[ Specificity=\frac{TN}{TN+FP} \]
\[ F1\text{-}Score=2\times\frac{Precision\times Recall}{Precision+Recall} \]
Accuracy mudah diinterpretasikan, tetapi dapat menyesatkan apabila proporsi kelas tidak seimbang, sehingga perlu dilengkapi dengan sensitivity, specificity, precision, dan F1-Score. Pada kasus medis seperti diagnosis kanker, nilai sensitivity menjadi perhatian utama karena kesalahan false negative (kasus positif yang terlewat) umumnya memiliki konsekuensi yang lebih serius daripada false positive.
Selain itu, kemampuan model membedakan kedua kelas pada berbagai ambang klasifikasi dapat dinilai menggunakan kurva Receiver Operating Characteristic (ROC). Kurva ini menggambarkan hubungan antara true positive rate (sensitivity) pada sumbu vertikal dan false positive rate (\(1-Specificity\)) pada sumbu horizontal (Fawcett, 2006). Ringkasan numeriknya adalah Area Under the Curve (AUC), yaitu luas di bawah kurva ROC. Nilai AUC berkisar antara 0 hingga 1; semakin mendekati 1, semakin baik kemampuan model membedakan kelas, sedangkan nilai 0,5 setara dengan tebakan acak (Fawcett, 2006).
Kinerja model regresi dapat dievaluasi menggunakan Mean Squared Error (MSE), yaitu rata-rata kuadrat selisih antara nilai aktual dan nilai prediksi. MSE dirumuskan sebagai berikut.
\[ MSE=\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y}_i)^2 \] dengan \(n\) merupakan jumlah pengamatan, \(y_i\) merupakan nilai aktual, dan \(\hat{y}_i\) merupakan nilai prediksi. Nilai MSE yang lebih kecil menunjukkan tingkat kesalahan prediksi yang lebih rendah pada data evaluasi.
Kompleksitas pohon juga menjadi aspek penting dalam pembentukan
model. Pohon yang terlalu sederhana berpotensi tidak mampu menangkap
pola data dengan baik, sedangkan pohon yang terlalu kompleks dapat
mengalami overfitting. Kondisi tersebut terjadi ketika model
terlalu menyesuaikan diri dengan data pelatihan sehingga kemampuan
prediksinya pada data baru dapat menurun. Salah satu cara untuk
mengendalikan kompleksitas pohon adalah pruning atau
pemangkasan cabang. Dalam implementasi CART menggunakan paket
rpart pada R, kompleksitas pohon dapat dikendalikan melalui
complexity parameter (CP). Pemilihan CP dapat mempertimbangkan
kesalahan validasi silang (cross-validation error) untuk
memperoleh struktur pohon yang lebih sederhana tanpa mengabaikan
kemampuan prediksinya (Fransiska, 2026).
Secara umum, pemodelan Classification Tree dilakukan melalui beberapa tahapan berikut.
Data diperiksa untuk mengetahui kelengkapan, tipe variabel, dan
kesesuaian variabel prediktor serta variabel respons. Apabila terdapat
missing value, dilakukan penanganan, misalnya dengan imputasi
menggunakan paket mice yang mengisi nilai hilang
berdasarkan hubungan antarvariabel (van Buuren &
Groothuis-Oudshoorn, 2011). Tahap ini bertujuan memastikan data yang
digunakan sesuai dengan kebutuhan pemodelan.
Data dibagi menjadi data training dan testing. Data training digunakan untuk membentuk model, sedangkan data testing digunakan untuk mengukur kemampuan model dalam memprediksi pengamatan yang tidak digunakan selama pelatihan. Pembagian dilakukan secara terstratifikasi berdasarkan variabel respons agar proporsi kelas pada kedua himpunan data tetap terjaga.
Model Classification Tree dibangun dengan membagi data secara bertahap berdasarkan variabel prediktor. Proses pemisahan bertujuan membentuk kelompok pengamatan yang semakin homogen terhadap kelas respons, sehingga setiap simpul akhir dapat merepresentasikan satu kelas prediksi.
Struktur pohon divisualisasikan untuk memperlihatkan aturan pemisahan dan kelas prediksi pada setiap simpul. Selain itu, variable importance digunakan untuk menggambarkan kontribusi relatif variabel prediktor dalam pembentukan model.
Kemampuan prediksi model dievaluasi menggunakan data testing. Hasil prediksi dibandingkan dengan kelas aktual dalam confusion matrix, kemudian dihitung ukuran evaluasi seperti accuracy, sensitivity, specificity, precision, dan F1-Score. Semakin tinggi nilai ukuran tersebut, semakin baik kemampuan model mengklasifikasikan pengamatan.
Pemangkasan dilakukan untuk mengendalikan kompleksitas pohon dan
mengurangi risiko overfitting. Pada paket rpart,
nilai CP dapat dipilih dengan mempertimbangkan tabel kompleksitas dan
nilai kesalahan validasi silang (xerror) yang paling
kecil.
Model hasil pruning dievaluasi kembali menggunakan data testing dan ukuran evaluasi yang sama, ditambah kurva ROC dan nilai AUC. Perbandingan hasil sebelum dan sesudah pemangkasan dapat digunakan untuk menilai perubahan kinerja klasifikasi serta menentukan apakah struktur pohon yang lebih sederhana memberikan kinerja yang sebanding atau lebih baik (Fransiska, 2026).
Secara umum, pemodelan Regression Tree dilakukan melalui beberapa tahapan berikut.
Data diperiksa untuk mengetahui kelengkapan, tipe variabel, dan kesesuaian variabel prediktor serta variabel respons. Tahap ini bertujuan memastikan data yang digunakan sesuai dengan kebutuhan pemodelan.
Data dibagi menjadi data training dan testing. Data training digunakan untuk membentuk model, sedangkan data testing digunakan untuk mengukur kemampuan model dalam memprediksi pengamatan yang tidak digunakan selama pelatihan.
Model Regression Tree dibangun dengan membagi data secara bertahap berdasarkan variabel prediktor. Proses pemisahan bertujuan membentuk kelompok pengamatan dengan nilai respons yang relatif homogen, sehingga prediksi pada setiap simpul akhir dapat merepresentasikan kelompok tersebut.
Struktur pohon divisualisasikan untuk memperlihatkan aturan pemisahan dan hasil prediksi pada setiap simpul. Selain itu, variable importance digunakan untuk menggambarkan kontribusi relatif variabel prediktor dalam pembentukan model.
Kemampuan prediksi model dievaluasi menggunakan data testing. Salah satu ukuran yang dapat digunakan adalah MSE, yang menunjukkan rata-rata kuadrat selisih antara nilai aktual dan nilai prediksi. Semakin kecil nilai MSE, semakin rendah kesalahan prediksi pada data yang dievaluasi.
Pemangkasan dilakukan untuk mengendalikan kompleksitas pohon dan
mengurangi risiko overfitting. Pada paket rpart,
nilai CP dapat dipilih dengan mempertimbangkan tabel kompleksitas dan
nilai kesalahan validasi silang.
Model hasil pruning dievaluasi kembali menggunakan data pengujian dan ukuran evaluasi yang sama. Perbandingan hasil sebelum dan sesudah pemangkasan dapat digunakan untuk menilai perubahan kesalahan prediksi serta menentukan apakah struktur pohon yang lebih sederhana memberikan kinerja yang lebih baik (Fransiska, 2026).
Jenis data yang digunakan dalam praktikum ini adalah data kuantitatif
dan data kategorik. Data kuantitatif berupa karakteristik sel yang
digunakan sebagai variabel prediktor, sedangkan data kategorik berupa
kondisi kanker payudara yang terdiri atas dua kelas, yaitu jinak
(benign) dan ganas (malignant). Sumber data
yang digunakan merupakan data sekunder dari dataset
BreastCancer dalam package mlbench pada
perangkat lunak R. Dataset ini memuat informasi karakteristik sel untuk
mengklasifikasikan kondisi kanker payudara. Data tersebut digunakan
dalam pemodelan Decision Tree dengan pendekatan Classification Tree.
Variabel penelitian terdiri atas variabel respons dan variabel
prediktor. Variabel respons yang digunakan adalah Class, yang
menunjukkan kondisi kanker payudara dalam kategori jinak
(benign) dan ganas (malignant). Sementara itu,
variabel prediktor meliputi Cl.thickness,
Cell.size, Cell.shape,
Marg.adhesion, Epith.c.size,
Bare.nuclei, Bl.cromatin,
Normal.nucleoli, dan Mitoses, yang
menggambarkan karakteristik sel untuk mengklasifikasikan kondisi kanker
payudara menggunakan metode Decision Tree (Classification Tree).
Langkah-langkah analisis yang dilakukan dalam praktikum Decision Tree menggunakan Regression Tree adalah sebagai berikut.
mlbench dan memuat dataset
BreastCancer ke dalam R.mice.Tahap pertama adalah memanggil seluruh library yang
dibutuhkan dan memuat dataset BreastCancer dari package
mlbench. Dataset ini berisi hasil pengamatan karakteristik
sel dari biopsi payudara yang digunakan untuk mengklasifikasikan kondisi
kanker payudara menjadi jinak (benign) atau ganas
(malignant).
library(mlbench)
library(mice)
library(rpart)
library(rpart.plot)
library(yardstick)
library(caret)
library(tidyverse)
# fungsi bantu: format angka dengan koma desimal untuk teks interpretasi
koma <- function(x, d = 4) format(round(x, d), decimal.mark = ",", nsmall = 0)
data("BreastCancer")
data_raw <- BreastCancer
dim(data_raw)## [1] 699 11
## 'data.frame': 699 obs. of 11 variables:
## $ Id : chr "1000025" "1002945" "1015425" "1016277" ...
## $ Cl.thickness : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 5 5 3 6 4 8 1 2 2 4 ...
## $ Cell.size : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 1 1 2 ...
## $ Cell.shape : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 2 1 1 ...
## $ Marg.adhesion : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 5 1 1 3 8 1 1 1 1 ...
## $ Epith.c.size : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 2 7 2 3 2 7 2 2 2 2 ...
## $ Bare.nuclei : Factor w/ 10 levels "1","2","3","4",..: 1 10 2 4 1 10 10 1 1 1 ...
## $ Bl.cromatin : Factor w/ 10 levels "1","2","3","4",..: 3 3 3 3 3 9 3 3 1 2 ...
## $ Normal.nucleoli: Factor w/ 10 levels "1","2","3","4",..: 1 2 1 7 1 7 1 1 1 1 ...
## $ Mitoses : Factor w/ 9 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 5 1 ...
## $ Class : Factor w/ 2 levels "benign","malignant": 1 1 1 1 1 2 1 1 1 1 ...
| Id | Cl.thickness | Cell.size | Cell.shape | Marg.adhesion | Epith.c.size | Bare.nuclei | Bl.cromatin | Normal.nucleoli | Mitoses | Class |
|---|---|---|---|---|---|---|---|---|---|---|
| 1000025 | 5 | 1 | 1 | 1 | 2 | 1 | 3 | 1 | 1 | benign |
| 1002945 | 5 | 4 | 4 | 5 | 7 | 10 | 3 | 2 | 1 | benign |
| 1015425 | 3 | 1 | 1 | 1 | 2 | 2 | 3 | 1 | 1 | benign |
| 1016277 | 6 | 8 | 8 | 1 | 3 | 4 | 3 | 7 | 1 | benign |
| 1017023 | 4 | 1 | 1 | 3 | 2 | 1 | 3 | 1 | 1 | benign |
| 1017122 | 8 | 10 | 10 | 8 | 7 | 10 | 9 | 7 | 1 | malignant |
Dari output dapat diketahui bahwa dataset memiliki 699 observasi dan
11 variabel. Variabel Id merupakan nomor identitas pasien
sehingga tidak mengandung informasi untuk klasifikasi dan akan
dikeluarkan. Variabel Class adalah variabel respons dengan
dua kategori, sedangkan sembilan variabel lainnya adalah karakteristik
sel yang menjadi variabel prediktor. Pada output str()
terlihat seluruh variabel prediktor tersimpan bertipe
factor (sebagian ordered factor) dengan 10
level, yaitu skor 1 sampai 10. Karena skor tersebut merupakan ukuran
bertingkat sehingga kesembilan prediktor diubah menjadi numerik (1
sampai 10).
data_bc <- data_raw %>%
select(-Id) %>%
mutate(across(-Class, ~ as.numeric(as.character(.x))))
str(data_bc)## 'data.frame': 699 obs. of 10 variables:
## $ Cl.thickness : num 5 5 3 6 4 8 1 2 2 4 ...
## $ Cell.size : num 1 4 1 8 1 10 1 1 1 2 ...
## $ Cell.shape : num 1 4 1 8 1 10 1 2 1 1 ...
## $ Marg.adhesion : num 1 5 1 1 3 8 1 1 1 1 ...
## $ Epith.c.size : num 2 7 2 3 2 7 2 2 2 2 ...
## $ Bare.nuclei : num 1 10 2 4 1 10 10 1 1 1 ...
## $ Bl.cromatin : num 3 3 3 3 3 9 3 3 1 2 ...
## $ Normal.nucleoli: num 1 2 1 7 1 7 1 1 1 1 ...
## $ Mitoses : num 1 1 1 1 1 1 1 1 5 1 ...
## $ Class : Factor w/ 2 levels "benign","malignant": 1 1 1 1 1 2 1 1 1 1 ...
## Cl.thickness Cell.size Cell.shape Marg.adhesion
## Min. : 1.000 Min. : 1.000 Min. : 1.000 Min. : 1.000
## 1st Qu.: 2.000 1st Qu.: 1.000 1st Qu.: 1.000 1st Qu.: 1.000
## Median : 4.000 Median : 1.000 Median : 1.000 Median : 1.000
## Mean : 4.418 Mean : 3.134 Mean : 3.207 Mean : 2.807
## 3rd Qu.: 6.000 3rd Qu.: 5.000 3rd Qu.: 5.000 3rd Qu.: 4.000
## Max. :10.000 Max. :10.000 Max. :10.000 Max. :10.000
##
## Epith.c.size Bare.nuclei Bl.cromatin Normal.nucleoli
## Min. : 1.000 Min. : 1.000 Min. : 1.000 Min. : 1.000
## 1st Qu.: 2.000 1st Qu.: 1.000 1st Qu.: 2.000 1st Qu.: 1.000
## Median : 2.000 Median : 1.000 Median : 3.000 Median : 1.000
## Mean : 3.216 Mean : 3.545 Mean : 3.438 Mean : 2.867
## 3rd Qu.: 4.000 3rd Qu.: 6.000 3rd Qu.: 5.000 3rd Qu.: 4.000
## Max. :10.000 Max. :10.000 Max. :10.000 Max. :10.000
## NAs :16
## Mitoses Class
## Min. : 1.000 benign :458
## 1st Qu.: 1.000 malignant:241
## Median : 1.000
## Mean : 1.589
## 3rd Qu.: 1.000
## Max. :10.000
##
Setelah Id dikeluarkan dan variabel prediktor diubah
menjadi numerik, data terdiri dari 699 observasi dan 10 variabel
(sembilan prediktor dan satu respons). Statistik deskriptif menunjukkan
seluruh prediktor berada pada rentang skor 1 sampai 10. Pada Statistik
deskriptif tersebut juga sudah terlihat adanya missing value
NA pada Bare.nuclei.
tabel_class <- data.frame(
Kelas = names(table(data_bc$Class)),
Jumlah = as.vector(table(data_bc$Class)),
Persen = round(as.vector(prop.table(table(data_bc$Class))) * 100, 2)
)
knitr::kable(tabel_class, align = "c", caption = "Distribusi kelas variabel Class")| Kelas | Jumlah | Persen |
|---|---|---|
| benign | 458 | 65.52 |
| malignant | 241 | 34.48 |
ggplot(tabel_class, aes(x = Kelas, y = Jumlah, fill = Kelas)) +
geom_col(color = "black", width = 0.6) +
geom_text(aes(label = Jumlah), vjust = -0.4) +
scale_fill_manual(values = c("#008080", "#E69F00")) +
labs(title = "Distribusi Kondisi Kanker Payudara", x = "Class", y = "Jumlah") +
theme_minimal() +
theme(legend.position = "none")Dari 699 observasi, sebanyak 458 observasi (65,52%) termasuk kelas
jinak (benign) dan 241 observasi (34,48%) termasuk kelas
ganas (malignant). Dimana kelas jinak lebih banyak, tetapi
perbedaannya tidak terlalu ekstrem sehingga data masih tergolong cukup
seimbang untuk dimodelkan tanpa teknik penyeimbangan. Seandainya model
hanya menebak benign untuk semua pasien, tebakannya tetap
benar sekitar 65,52% karena kelas ini paling banyak. Jadi, model baru
dianggap baik jika akurasinya lebih tinggi dari angka tersebut.
tabel_missing <- data.frame(
Variabel = names(data_bc),
Jumlah_NA = as.vector(colSums(is.na(data_bc))),
Persen_NA = round(as.vector(colMeans(is.na(data_bc))) * 100, 2)
)
knitr::kable(tabel_missing, align = "c", caption = "Jumlah dan persentase missing value per variabel")| Variabel | Jumlah_NA | Persen_NA |
|---|---|---|
| Cl.thickness | 0 | 0.00 |
| Cell.size | 0 | 0.00 |
| Cell.shape | 0 | 0.00 |
| Marg.adhesion | 0 | 0.00 |
| Epith.c.size | 0 | 0.00 |
| Bare.nuclei | 16 | 2.29 |
| Bl.cromatin | 0 | 0.00 |
| Normal.nucleoli | 0 | 0.00 |
| Mitoses | 0 | 0.00 |
| Class | 0 | 0.00 |
## Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size Bl.cromatin
## 683 1 1 1 1 1 1
## 16 1 1 1 1 1 1
## 0 0 0 0 0 0
## Normal.nucleoli Mitoses Class Bare.nuclei
## 683 1 1 1 1 0
## 16 1 1 1 0 1
## 0 0 0 16 16
Seperti yang telah disinggung pada hasil statistik deskriptif,
missing value hanya ditemukan pada satu variabel, yaitu
Bare.nuclei, sebanyak 16 observasi (2,29%). Sembilan
variabel lainnya, termasuk variabel respons Class tidak
terdapat missing value. Tabel pola data hilang menunjukkan hanya ada dua
pola, yaitu 683 baris lengkap dan 16 baris yang hanya kehilangan nilai
pada Bare.nuclei. Oleh karena itu untuk menangani data
hilang ini dipilih imputasi dengan packages mice agar data
tetap dapat diproses oleh fungsi pemodelan dan tanpa perlu dilakukan
penghapusan baris yang dapat mengurangi ukuran sampel.
miceMultivariate Imputation by Chained Equations
(mice) merupakan metode imputasi dimana mengisi nilai
hilang dengan memanfaatkan hubungan antarvariabel. Karena
Bare.nuclei bertipe numerik, metode yang digunakan secara
default adalah predictive mean matching
(pmm), yaitu mengambil nilai dari pengamatan lengkap yang
memiliki prediksi paling mirip. Dengan cara ini, hasil imputasi selalu
berupa skor yang benar-benar ada pada data yaitu bilangan bulat 1 sampai
10. Jumlah imputasi dan iterasi menggunakan nilai bawaan
mice (m = 5, maxit = 5), yang
dinilai memadai karena proporsi data hilang hanya 2,29% dan terbatas
pada satu variabel.
## Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size
## "" "" "" "" ""
## Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses Class
## "pmm" "" "" "" ""
nilai_imputasi <- imp$imp$Bare.nuclei
knitr::kable(nilai_imputasi, row.names = TRUE, align = "c",
caption = "Nilai imputasi Bare.nuclei pada lima kali imputasi (baris = nomor observasi)")| 1 | 2 | 3 | 4 | 5 | |
|---|---|---|---|---|---|
| 24 | 3 | 10 | 10 | 8 | 10 |
| 41 | 5 | 2 | 4 | 7 | 2 |
| 140 | 1 | 1 | 1 | 1 | 3 |
| 146 | 1 | 1 | 1 | 2 | 1 |
| 159 | 1 | 1 | 2 | 1 | 1 |
| 165 | 1 | 8 | 3 | 1 | 1 |
| 236 | 10 | 2 | 2 | 2 | 1 |
| 250 | 1 | 1 | 1 | 1 | 1 |
| 276 | 1 | 1 | 1 | 1 | 1 |
| 293 | 3 | 10 | 10 | 9 | 5 |
| 295 | 1 | 1 | 1 | 1 | 1 |
| 298 | 1 | 1 | 3 | 1 | 1 |
| 316 | 2 | 2 | 7 | 1 | 1 |
| 322 | 2 | 1 | 1 | 1 | 1 |
| 412 | 1 | 1 | 1 | 1 | 2 |
| 618 | 1 | 1 | 1 | 1 | 1 |
Dari ouput imp$method menunjukkan bahwa hanya
Bare.nuclei yang diimputasi dengan metode pmm,
sedangkan variabel lain tidak memerlukan imputasi.Dimana tabel nilai
imputasi menampilkan 16 observasi yang terisi pada setiap kali imputasi,
dan terlihat nilai yang dihasilkan dapat berbeda antarimputasi. Hal ini
mencerminkan ketidakpastian dalam pengisian data. Pada
stripplot, titik biru (imputasi 0) merupakan data
asli sedangkan titik merah (imputasi 1 sampai 5) adalah nilai hasil
imputasi. Sebaran titik merah berada pada rentang yang sama dengan data
asli, sehingga nilai imputasi yang dilakukan dinilai masuk akal. Karena
Decision Tree dibangun dari satu dataset lengkap, pemodelan
selanjutnya menggunakan hasil imputasi pertama. Pemilihan ini bersifat
praktis, karena kelima hasil imputasi sama-sama valid dan proporsi data
yang diimputasi sangat kecil (2,29%). Untuk melihat apakah memang benar
tidak masalah menggunakan data hasil imputasi pertama maka akan
dilakukan pemeriksaan pengaruh pemilihan imputasi terhadap kinerja
modelpada subbab 4.3 setelah dilakukan spliting data.
## Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size
## 0 0 0 0 0
## Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses Class
## 0 0 0 0 0
## [1] 699 10
Setelah dilakukan imputasi pada data dapat dilihat tidak ada lagi missing value pada seluruh variabel (0 nilai hilang) dan jumlah observasi tetap 699. Dengan demikian, tidak ada informasi yang terbuang dan data siap dipakai pada pemodelan.
Selanjutnya data dibagi menjadi data training (70%) dan data
testing (30%) menggunakan fungsi
createDataPartition(). Fungsi ini melakukan pengambilan
sampel acak yang terstratifikasi berdasarkan Class,
sehingga proporsi kelas jinak dan ganas pada kedua himpunan data tetap
terjaga.
set.seed(234)
train <- createDataPartition(data_imp$Class, p = 0.7, list = FALSE)
data_train <- data_imp[train, ]
data_test <- data_imp[-train, ]
cat("Dimensi data training :", dim(data_train), "\n")## Dimensi data training : 490 10
## Dimensi data testing : 209 10
perbandingan <- rbind(
Data_Asli = round(prop.table(table(data_imp$Class)) * 100, 2),
Data_Training = round(prop.table(table(data_train$Class)) * 100, 2),
Data_Testing = round(prop.table(table(data_test$Class)) * 100, 2)
)
knitr::kable(perbandingan, align = "c", caption = "Persentase kelas Class (%) pada tiap himpunan data")| benign | malignant | |
|---|---|---|
| Data_Asli | 65.52 | 34.48 |
| Data_Training | 65.51 | 34.49 |
| Data_Testing | 65.55 | 34.45 |
Data terbagi menjadi 490 observasi training dan 209 observasi testing (sekitar 70:30). Tabel perbandingan menunjukkan proporsi kelas jinak dan ganas pada data training dan testing hampir sama dengan data asli, sehingga kedua himpunan data mewakili kondisi data sebenarnya. Data training digunakan untuk membangun model, sedangkan data testing hanya digunakan untuk menguji kemampuan prediksi pada pengamatan baru.
Karena pada modelan hanya satu dari lima hasil imputasi yang akan dipakai, sehingga perlu diperiksa apakah pilihan tersebut memengaruhi hasil. Pada pemeriksaan ini, model dibangun pada setiap hasil imputasi dengan pembagian data (training dan testing) dan pengaturan model yang sama, lalu akurasinya pada data testing dibandingkan.
akurasi_imp <- sapply(1:5, function(i) {
d <- complete(imp, i)
tr <- d[train, ]
te <- d[-train, ]
set.seed(234)
m <- rpart(Class ~ ., data = tr, method = "class", cp = 0.008)
p <- predict(m, te, type = "class")
unname(confusionMatrix(p, te$Class, positive = "malignant")$overall["Accuracy"])
})
tabel_sens <- data.frame(Imputasi = 1:5, Accuracy = round(akurasi_imp, 4))
knitr::kable(tabel_sens, align = "c", caption = "Akurasi model pada masing-masing hasil imputasi")| Imputasi | Accuracy |
|---|---|
| 1 | 0.9474 |
| 2 | 0.9474 |
| 3 | 0.9139 |
| 4 | 0.9139 |
| 5 | 0.9139 |
Akurasi model pada kelima hasil imputasi berkisar antara 91,39% sampai 94,74% (selisih 3,35 poin persentase). Selisih ini cukup terlihat, yang berarti pilihan hasil imputasi dapat memengaruhi kinerja model. Hal ini perlu diperhatikan saat menafsirkan hasil, dan hasil imputasi pertama tetap digunakan agar analisis konsisten dengan pembagian data yang sama.
Model dibangun dengan fungsi rpart() menggunakan
method = "class" karena variabel respons bersifat
kategorik. Parameter kompleksitas awal (complexity parameter)
ditetapkan sebesar cp = 0.008, yaitu nilai yang cukup kecil
agar pohon dapat tumbuh dengan struktur yang kompleks terlebih dahulu.
Struktur tersebut selanjutnya disederhanakan melalui proses pemangkasan
(pruning) pada subbab 4.7. Kriteria pemisahan yang digunakan
secara default oleh fungsi rpart yaitu menggunakan
Gini Index.
set.seed(234)
fit.tree <- rpart(
Class ~ .,
data = data_train,
method = "class",
cp = 0.008
)
fit.tree## n= 490
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 490 169 benign (0.65510204 0.34489796)
## 2) Cell.size< 2.5 309 11 benign (0.96440129 0.03559871)
## 4) Bare.nuclei< 5.5 302 5 benign (0.98344371 0.01655629) *
## 5) Bare.nuclei>=5.5 7 1 malignant (0.14285714 0.85714286) *
## 3) Cell.size>=2.5 181 23 malignant (0.12707182 0.87292818)
## 6) Bare.nuclei< 2.5 33 16 benign (0.51515152 0.48484848)
## 12) Cell.size< 3.5 16 1 benign (0.93750000 0.06250000) *
## 13) Cell.size>=3.5 17 2 malignant (0.11764706 0.88235294) *
## 7) Bare.nuclei>=2.5 148 6 malignant (0.04054054 0.95945946) *
rpart.plot(fit.tree, type = 4, extra = 104, under = FALSE,
main = "Classification Tree (Sebelum Pruning)")Pohon yang terbentuk memiliki 4 pemisahan (split) dan 5 simpul akhir (leaf node). Pemisahan pertama pada simpul akar menggunakan variabel Cell.size dengan batas 2,5, yang berarti variabel inilah yang paling mampu memisahkan kelas jinak dan ganas pada data training. Pada visualisasi, setiap simpul menampilkan kelas prediksi, proporsi tiap kelas, dan persentase observasi yang berada pada simpul tersebut. Simpul yang mayoritas diisi satu kelas (proporsi mendekati 1) menunjukkan pemisahan yang sudah homogen. Aturan keputusan dibaca dari akar ke simpul akhir: observasi yang memenuhi kondisi pada cabang kiri (jawaban “yes”) mengikuti cabang kiri, sedangkan yang tidak memenuhi mengikuti cabang kanan, hingga tiba pada simpul akhir yang menentukan prediksi kelas.
Variable importance menunjukkan seberapa besar kontribusi tiap variabel prediktor dalam menurunkan ketidakmurnian (impurity) selama pembentukan pohon, baik sebagai pemisah utama maupun pemisah pengganti (surrogate).
vi <- fit.tree$variable.importance
vi_tabel <- data.frame(
Variabel = names(vi),
Nilai = round(as.numeric(vi), 3),
Persen = round(as.numeric(vi) / sum(vi) * 100, 2)
)
knitr::kable(vi_tabel, align = "c", caption = "Variable importance model sebelum pruning")| Variabel | Nilai | Persen |
|---|---|---|
| Cell.size | 171.133 | 21.20 |
| Cell.shape | 137.340 | 17.01 |
| Bare.nuclei | 131.474 | 16.28 |
| Bl.cromatin | 123.383 | 15.28 |
| Epith.c.size | 119.036 | 14.74 |
| Normal.nucleoli | 113.922 | 14.11 |
| Marg.adhesion | 6.925 | 0.86 |
| Cl.thickness | 4.143 | 0.51 |
vi_tabel %>%
ggplot(aes(x = fct_reorder(Variabel, Nilai), y = Nilai)) +
geom_pointrange(aes(ymin = 0, ymax = Nilai), color = "cadetblue", size = .3) +
theme_minimal() +
coord_flip() +
labs(x = "", y = "Importance",
title = "Variable Importance with Simple Classification")Variabel dengan kepentingan tertinggi adalah Cell.size (21,2%), diikuti Cell.shape (17,01%) dan Bare.nuclei (16,28%). Ketiga variabel ini secara bersama menyumbang 54,49% dari total kepentingan, sehingga karakteristik sel inilah yang paling menentukan klasifikasi. Variabel dengan nilai terendah, yaitu Cl.thickness (0,51%), memberikan kontribusi paling kecil. Hasil ini sejalan dengan perbedaan rata-rata skor antarkelas pada subbab 4.2, karena variabel yang skornya paling berbeda antara sel jinak dan ganas cenderung menjadi pemisah yang baik.
Model digunakan untuk memprediksi kelas pada data testing,
kemudian hasilnya dibandingkan dengan kelas aktual melalui confusion
matrix. Kelas malignant ditetapkan sebagai kelas
positif (positive = "malignant") karena kesalahan yang
paling berbahaya secara klinis adalah gagal mendeteksi sel ganas.
pred.tree <- predict(fit.tree, data_test, type = "class")
table(Prediksi = pred.tree, Aktual = data_test$Class)## Aktual
## Prediksi benign malignant
## benign 126 0
## malignant 11 72
## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 126 0
## malignant 11 72
##
## Accuracy : 0.9474
## 95% CI : (0.9078, 0.9734)
## No Information Rate : 0.6555
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.8875
##
## Mcnemar's Test P-Value : 0.002569
##
## Sensitivity : 1.0000
## Specificity : 0.9197
## Pos Pred Value : 0.8675
## Neg Pred Value : 1.0000
## Prevalence : 0.3445
## Detection Rate : 0.3445
## Detection Prevalence : 0.3971
## Balanced Accuracy : 0.9599
##
## 'Positive' Class : malignant
##
Dari 209 data testing, model memprediksi dengan benar 72 observasi ganas (true positive) dan 126 observasi jinak (true negative). Kesalahan prediksi berjumlah 11, terdiri dari 11 observasi jinak yang diprediksi ganas (false positive) dan 0 observasi ganas yang diprediksi jinak (false negative). Akurasi model mencapai 94,74%, jauh di atas No Information Rate sebesar 65,55% (akurasi bila selalu menebak kelas mayoritas), dengan nilai Kappa 0,8875. Sensitivity sebesar 100% berarti 100% sel ganas berhasil terdeteksi, sedangkan specificity sebesar 91,97% berarti 91,97% sel jinak dikenali dengan benar. Precision sebesar 86,75% menunjukkan bahwa dari seluruh prediksi ganas, sebesar itulah yang benar-benar ganas.
Complexity parameter (CP) mengendalikan kompleksitas pohon:
pemisahan hanya dipertahankan jika mampu menurunkan ketidakmurnian
setidaknya sebesar CP. Tabel CP berisi nilai xerror, yaitu
kesalahan hasil validasi silang 10-lipat (cross-validation),
yang digunakan untuk memilih ukuran pohon yang paling baik dalam
memprediksi data baru.
##
## Classification tree:
## rpart(formula = Class ~ ., data = data_train, method = "class",
## cp = 0.008)
##
## Variables actually used in tree construction:
## [1] Bare.nuclei Cell.size
##
## Root node error: 169/490 = 0.3449
##
## n= 490
##
## CP nsplit rel error xerror xstd
## 1 0.798817 0 1.000000 1.00000 0.062260
## 2 0.041420 1 0.201183 0.24852 0.036667
## 3 0.029586 3 0.118343 0.20118 0.033284
## 4 0.008000 4 0.088757 0.15385 0.029360
## [1] 0.008
Tabel CP menunjukkan bahwa xerror menurun seiring
bertambahnya pemisahan, lalu mencapai nilai terkecil sebesar 0,1538 pada
pohon dengan 4 pemisahan. Pada grafik plotcp, titik
terendah kurva berada pada ukuran pohon yang sama, sedangkan penambahan
pemisahan di luar titik tersebut tidak lagi memperbaiki kesalahan
validasi silang dan berisiko menyebabkan overfitting.
Berdasarkan kriteria xerror minimum, CP terbaik adalah
0,008. Nilai kesalahan simpul akar (root node
error) pada keluaran printcp sebesar 0,3449 menjadi
pembanding: xerror bernilai relatif terhadap angka ini,
sehingga xerror sebesar 0,1538 berarti kesalahan validasi
silang model hanya sekitar 15,38% dari kesalahan model tanpa
pemisahan.
Selanjutnya dilakukan pruning menggunakan CP terbaik yang telah di peroleh.
pruned.tree <- prune(fit.tree, cp = bestcp)
rpart.plot(pruned.tree, type = 4, extra = 104, under = FALSE,
main = "Classification Tree (Setelah Pruning)")Hasil pruning menunjukkan struktur pohon tidak berubah, yaitu tetap 4 pemisahan dan 5 simpul akhir. Hal ini terjadi karena CP terbaik bertepatan dengan ukuran pohon awal, artinya pohon awal sudah berada pada kompleksitas optimal menurut validasi silang dan tidak ada cabang yang perlu dipangkas.
pred.prune <- predict(pruned.tree, data_test, type = "class")
table(Prediksi = pred.prune, Aktual = data_test$Class)## Aktual
## Prediksi benign malignant
## benign 126 0
## malignant 11 72
## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 126 0
## malignant 11 72
##
## Accuracy : 0.9474
## 95% CI : (0.9078, 0.9734)
## No Information Rate : 0.6555
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.8875
##
## Mcnemar's Test P-Value : 0.002569
##
## Sensitivity : 1.0000
## Specificity : 0.9197
## Pos Pred Value : 0.8675
## Neg Pred Value : 1.0000
## Prevalence : 0.3445
## Detection Rate : 0.3445
## Detection Prevalence : 0.3971
## Balanced Accuracy : 0.9599
##
## 'Positive' Class : malignant
##
Setelah pruning, model memprediksi benar 72 observasi ganas dan 126 observasi jinak, dengan 11 false positive dan 0 false negative (total kesalahan 11). Akurasi model sebesar 94,74%, sensitivity 100%, specificity 91,97%, dan precision 86,75%.
Kurva Receiver Operating Characteristic (ROC) menggambarkan
hubungan antara sensitivity (true positive rate) dan 1
− specificity (false positive rate) pada berbagai
ambang probabilitas. Sedangkan Area Under the Curve (AUC)
meringkas kemampuan model dalam membedakan kedua kelas, dengan nilai 1
berarti pemisahan sempurna dan 0,5 setara dengan tebakan acak. Untuk
keperluan ini, model memprediksi probabilitas kelas
malignant pada data testing.
prob_full <- predict(fit.tree, data_test, type = "prob")
prob_prune <- predict(pruned.tree, data_test, type = "prob")
preds_prune <- bind_cols(
as.data.frame(prob_prune),
predicted = pred.prune,
actual = data_test$Class
)
head(preds_prune)## benign malignant predicted actual
## 5 0.98344371 0.01655629 benign benign
## 7 0.14285714 0.85714286 malignant benign
## 9 0.98344371 0.01655629 benign benign
## 12 0.98344371 0.01655629 benign benign
## 19 0.04054054 0.95945946 malignant malignant
## 27 0.98344371 0.01655629 benign benign
auc_prune <- Metrics::auc(
actual = preds_prune$actual == "malignant",
predicted = preds_prune$malignant
)
auc_full <- Metrics::auc(
actual = data_test$Class == "malignant",
predicted = prob_full[, "malignant"]
)
auc_prune## [1] 0.9665957
roc_prune <- yardstick::roc_curve(preds_prune, truth = actual, malignant,
event_level = "second")
ggplot(roc_prune, aes(x = 1 - specificity, y = sensitivity)) +
geom_path(color = "#008080", linewidth = 1) +
geom_abline(linetype = "dashed", color = "grey40") +
coord_equal() +
labs(title = "ROC Curve (Model Setelah Pruning)",
subtitle = paste0("AUC = ", round(auc_prune, 4)),
x = "1 - Specificity (False Positive Rate)",
y = "Sensitivity (True Positive Rate)") +
theme_minimal()Nilai AUC model setelah pruning sebesar 0,9666, yang termasuk kategori sangat baik (excellent). Artinya, bila diambil satu pasien dengan sel ganas dan satu pasien dengan sel jinak secara acak, model memberikan probabilitas ganas yang lebih tinggi pada pasien yang benar-benar ganas dengan peluang sekitar 96,66%. Kurva ROC berada jauh di atas garis diagonal (batas tebakan acak) dan mendekati sudut kiri atas, yang menunjukkan sensitivity tinggi dapat dicapai dengan false positive rate yang rendah. Bentuk kurva yang bertingkat (seperti tangga) wajar pada Decision Tree, karena probabilitas prediksi hanya mengambil sejumlah nilai terbatas sesuai banyaknya simpul akhir.
hasil_cmp <- data.frame(
Metrik = c("Jumlah pemisahan (split)", "Jumlah simpul akhir (leaf)",
"Accuracy", "Sensitivity (Recall)", "Specificity",
"Precision", "F1-Score", "AUC"),
Sebelum_Pruning = c(n_split_full, n_leaf_full, m_full, auc_full),
Sesudah_Pruning = c(n_split_prune, n_leaf_prune, m_prune, auc_prune)
)
knitr::kable(hasil_cmp, digits = 4, align = "c",
caption = "Perbandingan kinerja model sebelum dan sesudah pruning")| Metrik | Sebelum_Pruning | Sesudah_Pruning |
|---|---|---|
| Jumlah pemisahan (split) | 4.0000 | 4.0000 |
| Jumlah simpul akhir (leaf) | 5.0000 | 5.0000 |
| Accuracy | 0.9474 | 0.9474 |
| Sensitivity (Recall) | 1.0000 | 1.0000 |
| Specificity | 0.9197 | 0.9197 |
| Precision | 0.8675 | 0.8675 |
| F1-Score | 0.9290 | 0.9290 |
| AUC | 0.9666 | 0.9666 |
# kurva ROC kedua model dalam satu grafik
roc_full <- yardstick::roc_curve(
data.frame(actual = data_test$Class, malignant = prob_full[, "malignant"]),
truth = actual, malignant, event_level = "second")
bind_rows(
mutate(roc_full, Model = "Sebelum pruning"),
mutate(roc_prune, Model = "Sesudah pruning")
) %>%
ggplot(aes(x = 1 - specificity, y = sensitivity, color = Model)) +
geom_path(linewidth = 1, alpha = 0.8) +
geom_abline(linetype = "dashed", color = "grey40") +
coord_equal() +
scale_color_manual(values = c("#E69F00", "#008080")) +
labs(title = "Perbandingan Kurva ROC",
x = "1 - Specificity", y = "Sensitivity") +
theme_minimal()Karena struktur pohon tidak berubah setelah pruning, seluruh ukuran kinerja pada kedua model identik: akurasi 94,74%, sensitivity 100%, specificity 91,97%, dan AUC 0,9666. Hal ini menunjukkan bahwa pohon awal dengan cp = 0,008 sudah optimal menurut validasi silang, dan proses pruning berfungsi sebagai konfirmasi bahwa tidak ada cabang yang perlu dipangkas.
Secara keseluruhan, model Classification Tree mampu mengklasifikasikan kondisi kanker payudara dengan akurasi dan AUC yang tinggi. Karena kesalahan false negative (sel ganas yang terlewat) memiliki konsekuensi yang lebih serius daripada false positive, nilai sensitivity sebesar 100% menjadi ukuran yang perlu diperhatikan secara khusus dalam menilai kelayakan model ini.
Decision Tree merupakan metode supervised learning yang membentuk model prediksi melalui serangkaian aturan pemisahan berdasarkan variabel prediktor. Metode ini memiliki dua pendekatan utama, yaitu Classification Tree untuk memprediksi variabel respons kategoris dan Regression Tree untuk memprediksi variabel respons numerik. Pada Classification Tree, proses pemisahan dilakukan untuk membentuk simpul yang semakin homogen terhadap kelas respons, sedangkan prediksi pada setiap simpul terminal umumnya berupa kelas mayoritas pada kelompok tersebut. Struktur pohon yang dihasilkan juga relatif mudah diinterpretasikan karena aturan pemisahannya dapat ditelusuri dari simpul akar hingga simpul terminal.
Pembentukan Classification Tree dilakukan melalui beberapa
tahapan, yaitu pemeriksaan dan penanganan missing value
menggunakan mice, pembagian data menjadi data
training dan testing, pembentukan serta visualisasi
pohon, analisis variable importance, dan evaluasi hasil
prediksi menggunakan confusion matrix. Dari confusion
matrix dihitung ukuran evaluasi seperti accuracy,
sensitivity, specificity, precision, dan
F1-Score. Kompleksitas pohon dapat dikendalikan menggunakan
Complexity Parameter (CP), sedangkan proses pruning
dilakukan untuk menyederhanakan pohon dengan menghilangkan cabang yang
tidak diperlukan. Pemilihan CP dapat didasarkan pada nilai
cross-validation error (xerror) terkecil. Setelah
pruning, model dievaluasi kembali menggunakan confusion
matrix, kurva Receiver Operating Characteristic (ROC), dan
Area Under the Curve (AUC). Kurva ROC dan AUC menilai kemampuan
model membedakan kedua kelas pada berbagai ambang klasifikasi, dengan
nilai AUC yang semakin mendekati 1 menunjukkan kemampuan pembedaan yang
semakin baik.
Berdasarkan hasil pemodelan Classification Tree dengan
algoritma CART pada dataset BreastCancer, dapat disimpulkan
sebagai berikut: 1. Decision Tree dengan metode CART membentuk
model prediksi melalui pemisahan data secara bertahap berdasarkan
variabel prediktor, dan pada variabel respons kategorik pohon yang
terbentuk disebut Classification Tree. Aturan prediksi dapat
ditelusuri dari simpul akar hingga simpul akhir sehingga mudah
diinterpretasikan. 2. Dataset terdiri dari 699 observasi dengan sembilan
variabel prediktor karakteristik sel dan satu variabel respons
Class, dengan 65,52% kelas jinak dan 34,48% kelas ganas.
Missing value hanya ditemukan pada Bare.nuclei
sebanyak 16 observasi dan berhasil ditangani menggunakan
mice dengan metode predictive mean matching,
sehingga tidak ada observasi yang dihapus. 3. Data dibagi menjadi 490
observasi training dan 209 observasi testing dengan
proporsi kelas yang terjaga. Model awal membentuk 4 pemisahan dengan 5
simpul akhir, dan pemisahan pertama dilakukan pada variabel Cell.size.
4. Variabel yang paling berpengaruh dalam klasifikasi adalah Cell.size,
Cell.shape, dan Bare.nuclei, yang bersama-sama menyumbang 54,49% dari
total kepentingan variabel. 5. Model sebelum pruning
menghasilkan akurasi 94,74% pada data testing, dengan
sensitivity 100% dan specificity 91,97%. 6. CP terbaik
berdasarkan xerror minimum adalah 0,008 dengan 4 pemisahan.
Pruning tidak mengubah struktur pohon karena pohon awal sudah berada
pada kompleksitas optimal. 7. Model setelah pruning memperoleh
akurasi 94,74%, sensitivity 100%, specificity 91,97%,
dan AUC sebesar 0,9666. Nilai AUC tersebut menunjukkan kemampuan model
membedakan kondisi jinak dan ganas tergolong sangat baik.
minsplit, maxdepth, dan cp secara
sistematis (misalnya dengan caret::train) serta menggunakan
validasi silang berulang agar hasil evaluasi tidak bergantung pada satu
kali pembagian data.Abedinia, A., & Seydi, V. (2024). Building semi-supervised decision trees with semi-CART algorithm. International Journal of Machine Learning and Cybernetics, 15(10), 4493–4510. https://doi.org/10.1007/s13042-024-02161-z
Alpaydın, E. (2020). Introduction to machine learning (4th ed.). The MIT Press. https://mitpress.mit.edu/9780262043793/introduction-to-machine-learning/
Breiman, L., Friedman, J. H., Olshen, R. A., & Stone, C. J. (1984). Classification and regression trees. Belmont, CA: Wadsworth.
Chew, Y. J., Ooi, S. Y., Pang, Y. H., & Lim, Z. Y. (2025). Decision tree pruning with privacy-preserving strategies. Electronics, 14(15), Article 3139. https://doi.org/10.3390/electronics14153139
Fawcett, T. (2006). An introduction to ROC analysis. Pattern Recognition Letters, 27(8), 861–874. https://doi.org/10.1016/j.patrec.2005.10.010
Fransiska, H. (2026). Modul Praktikum Machine Learning and Modern Prediction. Laboratorium Matematika Universitas Bengkulu.
Luqman, M., dkk. (2015). Identifikasi variabel yang mempengaruhi besar pinjaman dengan metode pohon regresi (Studi kasus di Unit Pengelola Kegiatan PNPM Mandiri). Jurnal Gaussian, 4(4). https://ejournal3.undip.ac.id/index.php/gaussian/article/view/10238
Nopianti, R., Panudju, A. T., & Permana, A. (2022). Prediksi harga saham Indonesia pada masa Covid-19 menggunakan regresi pohon keputusan. Jurnal Ecodemica: Jurnal Ekonomi, Manajemen, dan Bisnis, 6(1). https://ejournal.bsi.ac.id/ejurnal/index.php/ecodemica/article/view/11365
Sinambela, Y. E. S. (2008). Penerapan metode klasifikasi dengan algoritma CART pada data status daerah kabupaten di Indonesia [Karya ilmiah, Institut Pertanian Bogor]. Repository IPB. http://repository.ipb.ac.id/handle/123456789/50394
van Buuren, S., & Groothuis-Oudshoorn, K. (2011). mice: Multivariate imputation by chained equations in R. Journal of Statistical Software, 45(3), 1–67. https://doi.org/10.18637/jss.v045.i03