BAB I PENDAHULUAN

1.1 Latar Belakang

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.

1.2 Rumusan Masalah

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

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

1.3 Tujuan

Berdasarkan rumusan masalah, tujuan yang dapat disimpulkan yaitu sebagai berikut:

  1. Mahasiswa mampu menjelaskan konsep dasar Decision Tree untuk klasifikasi menggunakan metode Classification and Regression Tree (CART).
  2. Mahasiswa mampu membangun model Classification Tree menggunakan algoritma CART.

1.4 Manfaat Penelitian

Adapun manfaat pada penelitian ini yaitu:

  1. Bagi penulis:

    1. 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.

    2. Dapat mengembangkan dan menerapkan pengetahuan yang telah diperoleh dalam bidang Machine Learning dan program R.

  2. Bagi pembaca:

    1. 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.

    2. Menjadi rujukan bagi peneliti selanjutnya.

1.5 Batasan masalah

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.

1.6 Sistematika Penulisan

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

BAB II TINJAUAN PUSTAKA

2.1 Machine Learning

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).

2.2 Decision Tree dan Classification and Regression Tree (CART)

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).

2.2.1 Kriteria Pemisahan pada Classification Tree

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).

2.2.2 Metrik Evaluasi Model Klasifikasi

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.

  1. Accuracy, yaitu proporsi prediksi yang benar dari seluruh pengamatan.

\[ Accuracy=\frac{TP+TN}{TP+TN+FP+FN} \]

  1. Precision, yaitu proporsi prediksi positif yang benar-benar positif.

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

  1. Recall atau Sensitivity, yaitu proporsi pengamatan positif yang berhasil terdeteksi oleh model.

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

  1. Specificity, yaitu proporsi pengamatan negatif yang berhasil dikenali dengan benar.

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

  1. F1-Score, yaitu rata-rata harmonik antara precision dan recall.

\[ 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).

2.2.3 Metrik Evaluasi Model Regresi

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.

2.2.4 Kompleksitas Pohon dan Pruning

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).

2.3 Tahapan Pemodelan Classification Tree

Secara umum, pemodelan Classification Tree dilakukan melalui beberapa tahapan berikut.

  1. Persiapan data

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.

  1. Pembagian data

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.

  1. Pembentukan model

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.

  1. Visualisasi dan identifikasi kepentingan variabel

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.

  1. Evaluasi 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.

  1. Pemangkasan pohon (pruning)

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.

  1. Evaluasi setelah pemangkasan

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).

2.4 Tahapan Pemodelan Regression Tree

Secara umum, pemodelan Regression Tree dilakukan melalui beberapa tahapan berikut.

  1. Persiapan data

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.

  1. Pembagian data

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.

  1. Pembentukan model

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.

  1. Visualisasi dan identifikasi kepentingan variabel

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.

  1. Evaluasi 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.

  1. Pemangkasan pohon (pruning)

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.

  1. Evaluasi setelah pemangkasan

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).

BAB III METODE PENELITIAN

3.1 Sumber Data

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.

3.2 Variabel Penelitian

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).

3.3 Langkah-langkah Analisis

Langkah-langkah analisis yang dilakukan dalam praktikum Decision Tree menggunakan Regression Tree adalah sebagai berikut.

  1. Membuka aplikasi RStudio.
  2. Memanggil paket mlbench dan memuat dataset BreastCancer ke dalam R.
  3. Memeriksa struktur data, jumlah observasi, jumlah variabel, dan tipe data.
  4. Memeriksa keberadaan missing value pada setiap variabel.
  5. Menangani missing value dengan menghapus pengamatan yang mengandung nilai hilang menggunakan fungsi mice.
  6. Menentukan Class sebagai variabel respons dan variabel lainnya sebagai variabel prediktor.
  7. Membagi data menjadi data training dan data testing.
  8. Membangun model Decision Tree menggunakan data training.
  9. Memvisualisasikan struktur pohon klasifikasi yang terbentuk.
  10. Menganalisis variable importance untuk mengetahui variabel prediktor yang paling berpengaruh dalam klasifikasi.
  11. Melakukan prediksi kondisi kanker payudara pada data testing menggunakan model yang telah dibangun.
  12. Mengevaluasi hasil klasifikasi menggunakan confusion matrix.
  13. Menentukan nilai complexity parameter (CP) terbaik berdasarkan tabel kompleksitas pohon dengan mempertimbangkan kesalahan validasi silang.
  14. Melakukan pruning atau pemangkasan pohon menggunakan nilai CP terbaik.
  15. Melakukan prediksi kembali pada data testing menggunakan model hasil pruning.
  16. Mengevaluasi kembali hasil klasifikasi setelah pruning menggunakan confusion matrix, kurva Receiver Operating Characteristic (ROC), dan nilai Area Under the Curve (AUC).
  17. Membandingkan hasil evaluasi model sebelum dan sesudah pruning untuk mengetahui perubahan kinerja klasifikasi.
  18. Menarik kesimpulan berdasarkan hasil pemodelan, variable importance, dan perbandingan kinerja model sebelum serta sesudah pruning.

BAB IV HASIL DAN PEMBAHASAN

4.1 Library dan Eksplorasi Data

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
str(data_raw)
## '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 ...
knitr::kable(head(data_raw), align = "c", caption = "Enam baris pertama dataset BreastCancer")
Enam baris pertama dataset BreastCancer
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 ...
summary(data_bc)
##   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.

Distribusi Variabel Respons

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")
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.

4.2 Pengecekan dan Penanganan Missing Value

Pengecekan Missing Value

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")
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
# Pola data hilang
mice::md.pattern(data_bc, plot = FALSE)
##     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.

Imputasi dengan Paket mice

Multivariate 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.

imp <- mice(data_bc, m = 5, maxit = 5, seed = 123, printFlag = FALSE)

imp$method
##    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)")
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
stripplot(imp, Bare.nuclei ~ .imp, pch = 20, cex = 1.2)

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.

data_imp <- complete(imp, 1)

colSums(is.na(data_imp))
##    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
dim(data_imp)
## [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.

Karakteristik Sel Menurut Kelas

rata_kelas <- aggregate(. ~ Class, data = data_imp, FUN = mean)
rata_t <- t(rata_kelas[, -1])
colnames(rata_t) <- as.character(rata_kelas$Class)
knitr::kable(rata_t, digits = 2, align = "c", caption = "Rata-rata skor karakteristik sel menurut kelas")
Rata-rata skor karakteristik sel menurut kelas
benign malignant
Cl.thickness 2.96 7.20
Cell.size 1.33 6.57
Cell.shape 1.44 6.56
Marg.adhesion 1.36 5.55
Epith.c.size 2.12 5.30
Bare.nuclei 1.37 7.59
Bl.cromatin 2.10 5.98
Normal.nucleoli 1.29 5.86
Mitoses 1.06 2.59

Rata-rata skor pada kelas malignant lebih tinggi daripada kelas benign pada seluruh karakteristik sel. Selisih terbesar terdapat pada Bare.nuclei (7,59 pada kelas ganas dibanding 1,37 pada kelas jinak). Artinya, semakin tinggi skor karakteristik sel, semakin besar kecenderungan sel tergolong ganas. Pola ini menunjukkan bahwa prediktor memuat informasi yang cukup untuk membedakan kedua kelas, sehingga Classification Tree yang dialkukan nanti dapat membentuk aturan pemisahan yang bermakna.

4.3 Splitting Data

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
cat("Dimensi data testing  :", dim(data_test), "\n")
## 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")
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.

Pemeriksaan Sensitivitas terhadap Pilihan Imputasi

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")
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.

4.4 Pembentukan dan Visualisasi Classification Tree

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.

4.5 Analisis Variable Importance

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")
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.

4.6 Prediksi dan Evaluasi Model Sebelum Pruning

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
cm_full <- confusionMatrix(pred.tree, data_test$Class, positive = "malignant")
cm_full
## 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.

4.7 Penentuan CP Terbaik dan Pruning

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.

printcp(fit.tree)
## 
## 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
plotcp(fit.tree, upper = "splits")

bestcp <- fit.tree$cptable[which.min(fit.tree$cptable[, "xerror"]), "CP"]
bestcp
## [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.

4.8 Evaluasi Model Setelah Pruning

Confusion Matrix

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
cm_prune <- confusionMatrix(pred.prune, data_test$Class, positive = "malignant")
cm_prune
## 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 ROC dan AUC

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.

4.9 Perbandingan Model Sebelum dan Sesudah Pruning

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")
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.

BAB V KESIMPULAN

5.1 Kesimpulan

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.

5.2 Saran

  1. Penelitian selanjutnya dapat membandingkan Classification Tree dengan metode lain yang lebih stabil, seperti Random Forest atau Gradient Boosting, karena satu pohon keputusan cenderung sensitif terhadap perubahan data training.
  2. Pemilihan parameter dapat diperluas dengan menyetel 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.
  3. Mengingat konsekuensi klinis dari sel ganas yang tidak terdeteksi, evaluasi model sebaiknya menekankan sensitivity dan dapat dilengkapi dengan penyesuaian ambang klasifikasi (threshold) berdasarkan kurva ROC.
  4. Pada praktikum berikutnya, imputasi sebaiknya dilakukan dengan memperhatikan potensi kebocoran informasi, yaitu dengan menjalankan imputasi hanya berdasarkan data training lalu menerapkannya pada data testing.

DAFTAR PUSTAKA

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