BAB I PENDAHULUAN

1.1 Latar Belakang

Perkembangan teknologi membuat data yang tersedia semakin banyak, dan machine learning menjadi salah satu cara yang sering digunakan untuk mengolah data tersebut. Pada supervised learning, model belajar dari data yang sudah memiliki label atau variabel target. Jika variabel targetnya berupa kategori, misalnya tumor jinak dan tumor ganas, maka masalahnya disebut klasifikasi (Géron, 2019). Salah satu metode klasifikasi yang banyak digunakan adalah decision tree, yaitu metode yang membagi data secara bertahap berdasarkan variabel prediktor sehingga terbentuk aturan keputusan dalam bentuk pohon yang mudah dibaca dan diinterpretasikan (James dkk., 2021). Algoritma yang paling dikenal untuk membentuk pohon keputusan adalah Classification and Regression Tree (CART) yang diperkenalkan oleh Breiman dkk. (1984). Jika variabel responnya berupa kategori, pohon yang terbentuk disebut classification tree.

Klasifikasi sangat dibutuhkan di bidang kesehatan, salah satunya untuk membedakan tumor payudara jinak (benign) dan ganas (malignant). Sung dkk. (2021) melaporkan bahwa pada tahun 2020 kanker payudara perempuan menjadi kanker yang paling banyak didiagnosis di dunia dengan sekitar 2,3 juta kasus baru. Karena itu, model yang dapat membantu membedakan kondisi tumor berdasarkan hasil pemeriksaan sel menjadi hal yang penting. Dataset BreastCancer pada paket mlbench berisi sembilan karakteristik sel hasil pemeriksaan sitologi yang berasal dari penelitian Wolberg dan Mangasarian (1990), sehingga dataset ini sering digunakan untuk mempelajari klasifikasi kondisi kanker payudara.

Sebelum model dibangun, data perlu diperiksa terlebih dahulu karena data mentah jarang bisa langsung digunakan. Salah satu masalah yang sering ditemui adalah missing value atau data yang hilang. Menurut Emmanuel dkk. (2021), data yang hilang dapat terjadi karena gangguan sistem saat pengumpulan data maupun kesalahan manusia saat mengolah data. Pada dataset BreastCancer, missing value terdapat pada variabel Bare.nuclei. Salah satu metode yang dapat digunakan untuk mengisinya adalah Multivariate Imputation by Chained Equations (MICE), yaitu metode imputasi yang mengisi data kosong menggunakan model dari variabel-variabel lain secara berantai, termasuk untuk variabel kategorik (van Buuren & Groothuis-Oudshoorn, 2011).

Setelah data siap, data dibagi menjadi data training dan data testing agar kemampuan model dapat diuji pada data baru (Muraina, 2022). Pohon yang dibentuk tanpa pembatasan cenderung terlalu rumit dan berisiko mengalami overfitting, sehingga pohon perlu disederhanakan melalui pruning dengan memilih nilai complexity parameter (CP) yang tepat (Breiman dkk., 1984; Therneau & Atkinson, 2019). Kemampuan model kemudian dievaluasi menggunakan confusion matrix (Sokolova & Lapalme, 2009) serta kurva Receiver Operating Characteristic (ROC) dan nilai Area Under the Curve (AUC) (Fawcett, 2006). Berdasarkan hal tersebut, pada praktikum Pertemuan 2 ini dilakukan pembentukan classification tree dengan metode CART untuk mengklasifikasikan kondisi kanker payudara menggunakan RStudio.

1.2 Rumusan Masalah

Berdasarkan latar belakang di atas, rumusan masalah dalam praktikum ini adalah sebagai berikut:

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

1.3 Tujuan Penelitian

Berdasarkan rumusan masalah di atas, tujuan praktikum ini adalah sebagai berikut:

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

1.4 Manfaat Penelitian

Adapun manfaat pada penelitian ini yaitu:

  1. Bagi penulis
  1. Memberikan informasi serta pengetahuan tentang Decision Tree dengan metode CART dalam Machine Learning.
  2. Mengembangkan dan menerapkan wawasan ilmu yang telah diperoleh dalam bidang statistika khususnya tentang Classification Tree dengan RStudio.
  1. Bagi pembaca Menambah ilmu pengetahuan dan pemahaman yang berkaitan tentang Decision Tree dengan RStudio.

1.5 Batasan Masalah

Adapun batasan masalah pada praktikum ini yaitu gunakan dataset BreastCancer dari paket 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 IPENDAHULUAN

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

BAB IITINJAUAN PUSTAKA

Bab ini berisi tentang kajian pustaka yang terdiri dari jurnal-jurnal, buku-buku, dan informasi pendukung tentang Pengantar Data Sains pada program RStudio.

BAB IIIMETODE PENELITIAN

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

BAB IVHASIL DAN PEMBAHASAN

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

BAB VKESIMPULAN DAN SARAN

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

DAFTAR PUSTAKA

LAMPIRAN

BAB II TINJAUAN PUSTAKA

2.1 Machine Learning dan Decision Tree

Machine learning adalah bidang ilmu yang membuat komputer dapat belajar dari data tanpa harus diprogram secara khusus untuk setiap tugas (Géron, 2019). Pada supervised learning, data yang digunakan sudah memiliki variabel target. Jika variabel targetnya berupa kategori, masalahnya disebut klasifikasi, sedangkan jika berupa angka kontinu disebut regresi (James dkk., 2021).

Decision tree merupakan salah satu metode supervised learning berbasis pohon yang dapat digunakan untuk membentuk aturan prediksi. Pada metode ini, data dibagi secara bertahap melalui proses splitting berdasarkan variabel prediktor sehingga terbentuk kelompok-kelompok data yang semakin homogen. Setiap percabangan pada pohon menunjukkan aturan pemisahan, sedangkan simpul akhir (leaf node) menunjukkan hasil prediksi (Hastie, Tibshirani, & Friedman, 2009). Decision tree memiliki beberapa karakteristik, yaitu:

  1. Mudah dipahami dan diinterpretasikan karena model dapat divisualisasikan dalam bentuk pohon.
  2. Dapat menggunakan variabel prediktor numerik maupun kategorik.
  3. Membagi data secara bertahap melalui proses splitting sehingga kelompok yang terbentuk semakin homogen.
  4. Dapat digunakan untuk memprediksi kelas pada kasus klasifikasi maupun nilai numerik pada kasus regresi.
  5. Dapat disederhanakan melalui pruning untuk mengurangi kompleksitas pohon dan risiko overfitting.

Sebuah decision tree tersusun atas beberapa komponen utama sebagai berikut.

Komponen Keterangan
Root node Simpul awal atau simpul paling atas yang memuat seluruh data sebelum dilakukan pemisahan
Intermediate node Simpul di antara root node dan leaf node yang masih dapat mengalami pemisahan
Leaf node Simpul akhir yang menunjukkan hasil prediksi. Pada klasifikasi berupa kelas, sedangkan pada regresi berupa nilai numerik
Branch Cabang yang menghubungkan satu simpul dengan simpul lainnya berdasarkan aturan tertentu
Attribute Variabel prediktor yang digunakan sebagai dasar untuk melakukan pemisahan data
Splitting criteria Kriteria yang digunakan untuk menentukan pemisahan terbaik. Pada klasifikasi dapat menggunakan Gini Index atau Entropy, sedangkan pada regresi dapat menggunakan ukuran kesalahan seperti MSE
Decision rules Aturan keputusan yang terbentuk dari jalur percabangan dan digunakan untuk menghasilkan prediksi
Pruning Proses pemangkasan cabang yang kurang penting untuk menyederhanakan pohon dan mengurangi risiko overfitting

Susunan komponen tersebut dapat dilihat pada Gambar 1.

Gambar 1. Ilustrasi struktur *decision tree*

Gambar 1. Ilustrasi struktur decision tree

Pada Gambar 1, root node berwarna oranye memuat seluruh data lalu dipisahkan oleh suatu aturan pemisahan menjadi dua cabang, yaitu cabang “Ya” dan “Tidak”. Intermediate node berwarna biru masih dapat dipisahkan lagi, sedangkan leaf node berwarna hijau sudah tidak dipisahkan dan langsung menunjukkan kelas hasil prediksi.

2.2 Classification and Regression Tree (CART)

CART adalah salah satu metode decision tree yang dapat digunakan untuk dua jenis pemodelan, yaitu klasifikasi untuk memprediksi kategori atau kelas dan regresi untuk memprediksi nilai numerik. Jika variabel respon berupa kategori, pohon yang terbentuk disebut pohon klasifikasi (classification tree), sedangkan jika variabel respon berupa numerik kontinu disebut pohon regresi (regression tree). CART membentuk pohon melalui pemisahan biner secara rekursif, yaitu setiap simpul hanya dipisahkan menjadi dua simpul anak (Breiman dkk., 1984).

2.2.1 Classification Tree

Pada classification tree, proses pemisahan data dilakukan dengan memilih aturan yang menghasilkan simpul-simpul yang semakin homogen. Beberapa ukuran yang digunakan antara lain Entropy, Information Gain, dan Gini Index. Entropy digunakan untuk mengukur tingkat ketidakpastian atau ketidakmurnian kelas dalam suatu simpul (Quinlan, 1986). Semakin kecil nilai Entropy, semakin homogen simpul tersebut. Entropy dirumuskan sebagai

\[ Entropy(t) = -\sum_{k=1}^{K} p_k \log_2 (p_k) \]

dengan \(t\) adalah simpul, \(k\) adalah indeks kelas ke-\(k\) (\(k = 1, 2, \ldots, K\)), dan \(p_k\) adalah proporsi observasi dari kelas ke-\(k\) dalam simpul. Untuk dataset \(D\) dengan dua kelas yang proporsinya \(p_1\) dan \(p_2\) (\(p_1 + p_2 = 1\)), maka \(E(D) = -p_1 \log_2 p_1 - p_2 \log_2 p_2\). Jika seluruh amatan dalam suatu simpul berasal dari satu kelas yang sama, nilai Entropy sama dengan 0, sedangkan nilainya semakin besar apabila proporsi kelas dalam simpul semakin seimbang.

Information Gain digunakan untuk mengukur seberapa besar Entropy berkurang setelah dilakukan suatu pemisahan. Semakin besar nilai Information Gain, semakin baik pemisahan yang dilakukan. Jika dataset \(D\) dipartisi menjadi \(D_1, D_2, \ldots, D_J\), maka

\[ IG = E(D) - \sum_{j=1}^{J} \frac{|D_j|}{|D|}\, E(D_j) \]

dengan \(E(D)\) adalah Entropy sebelum pemisahan, \(E(D_j)\) adalah Entropy bagian ke-\(j\), \(|D_j|\) adalah banyaknya amatan pada bagian ke-\(j\), dan \(|D|\) adalah banyaknya seluruh amatan.

Gini Index digunakan untuk mengukur tingkat ketidakmurnian kelas (Gini impurity) dalam suatu simpul. Semakin kecil nilai Gini Index, semakin homogen simpul tersebut. Gini Index dirumuskan sebagai

\[ Gini(t) = 1 - \sum_{k=1}^{K} p_k^{2} \]

Jika dataset \(D\) dipartisi menjadi dua bagian \(D_1\) dan \(D_2\), nilai Gini setelah pemisahan dihitung menggunakan 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 fungsi rpart() di R, ukuran pemisahan yang digunakan secara default untuk klasifikasi adalah Gini Index (Therneau & Atkinson, 2019).

2.2.2 Regression Tree

Regression tree digunakan ketika variabel respon berupa data numerik kontinu. Prinsip pembentukan pohonnya sama dengan classification tree, tetapi pemisahan dilakukan agar nilai respon dalam setiap simpul menjadi semakin seragam. Ukuran yang dapat digunakan adalah Mean Squared Error (MSE), yaitu rata-rata kuadrat selisih antara nilai respon dengan rata-rata respon dalam suatu simpul.

\[ MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2 \]

Pada praktikum ini variabel responnya berupa kategori (jinak atau ganas) sehingga yang digunakan adalah classification tree.

2.3 Algoritma Pembentukan Pohon

Pembentukan pohon CART dilakukan melalui tahapan berikut (Breiman dkk., 1984).

  1. Mencari pemisahan (splitting) terbaik dari setiap variabel prediktor.
  2. Menentukan variabel dan pemisah terbaik di antara semua variabel prediktor.
  3. Melakukan pemisahan berdasarkan hasil tahap 2 dan memeriksa apakah proses perlu dilanjutkan.

Ketiga tahapan tersebut dilakukan secara berulang pada setiap simpul yang terbentuk. Proses pemisahan berhenti apabila salah satu kondisi berikut tercapai:

  1. Simpul sudah cukup homogen terhadap variabel respon.
  2. Nilai variabel prediktor pada simpul tidak memungkinkan pemisahan lebih lanjut.
  3. Jumlah amatan dalam simpul lebih kecil dari batas minimum yang telah ditentukan.
  4. Kedalaman pohon telah mencapai batas maksimum.

Pada fungsi rpart(), pemisahan juga berhenti jika suatu pemisahan tidak mampu memperbaiki kecocokan pohon paling sedikit sebesar nilai complexity parameter (cp) yang ditentukan (Therneau & Atkinson, 2019).

2.4 Pruning dan Complexity Parameter (CP)

Pohon yang dibiarkan tumbuh sangat besar dapat menghafal pola pada data training sehingga kemampuannya menurun pada data baru (overfitting). Untuk mengatasinya, pohon besar dipangkas melalui pruning. Pada CART, pruning dilakukan dengan cost-complexity pruning, yaitu memilih pohon yang meminimumkan

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

dengan \(R(T)\) adalah galat klasifikasi pohon \(T\), \(|T|\) adalah banyaknya simpul akhir, dan \(\alpha\) adalah parameter yang mengatur penalti terhadap kerumitan pohon (Breiman dkk., 1984). Pada paket rpart, nilai \(\alpha\) dinyatakan secara relatif terhadap galat simpul akar sehingga \(cp = \alpha / R(T_1)\), dengan \(T_1\) adalah pohon yang hanya terdiri dari simpul akar (Therneau & Atkinson, 2019). Semakin besar nilai cp, semakin sederhana pohon yang dihasilkan.

Fungsi printcp() menampilkan tabel CP yang berisi kolom CP, nsplit (banyaknya pemisahan), rel error (galat pada data training relatif terhadap simpul akar), xerror (galat hasil validasi silang relatif terhadap simpul akar), dan xstd (galat baku dari xerror). Secara default, rpart() menggunakan validasi silang 10 lipatan. CP terbaik dipilih dari baris yang memiliki nilai xerror paling kecil. Selain itu, terdapat aturan satu galat baku (1-SE rule), yaitu memilih pohon paling sederhana yang nilai xerror-nya masih berada dalam jarak satu xstd dari xerror minimum (Breiman dkk., 1984).

2.5 Variable Importance

Variable importance menunjukkan seberapa besar kontribusi suatu variabel prediktor dalam pembentukan pohon. Pada paket rpart, nilai variable importance suatu variabel dihitung dari jumlah penurunan ketidakmurnian pada setiap pemisahan yang menggunakan variabel tersebut sebagai pemisah utama, ditambah kontribusi variabel tersebut ketika berperan sebagai pemisah pengganti (surrogate split) (Therneau & Atkinson, 2019). Akibatnya, sebuah variabel dapat memiliki nilai importance yang besar walaupun tidak muncul pada gambar pohon akhir, karena variabel tersebut mirip dengan variabel yang dipilih sebagai pemisah utama.

2.6 Handling Missing Value dengan mice

Missing value adalah kondisi ketika tidak ada nilai yang tersimpan pada observasi tertentu dalam suatu variabel. Little dan Rubin (2019) membagi mekanisme terjadinya missing value menjadi tiga jenis, yaitu:

  1. Missing Completely at Random (MCAR), yaitu data hilang secara acak dan tidak berkaitan dengan variabel apa pun di dalam data.
  2. Missing at Random (MAR), yaitu peluang data hilang berkaitan dengan variabel lain yang teramati, tetapi tidak berkaitan dengan nilai yang hilang itu sendiri.
  3. Missing Not at Random (MNAR), yaitu peluang data hilang berkaitan dengan nilai yang hilang itu sendiri.

Missing value dapat ditangani dengan menghapus baris yang memiliki data kosong (deletion) atau dengan imputasi, yaitu mengisi data kosong dengan nilai dugaan (Little & Rubin, 2019). Multivariate Imputation by Chained Equations (MICE) adalah metode imputasi ganda (multiple imputation) yang diperkenalkan oleh van Buuren dan Groothuis-Oudshoorn (2011) dan tersedia pada paket mice di R. Cara kerjanya adalah sebagai berikut.

  1. Setiap data kosong terlebih dahulu diisi dengan nilai sementara yang diambil secara acak dari nilai yang teramati.
  2. Untuk setiap variabel yang memiliki data kosong, dibentuk model dengan variabel tersebut sebagai respon dan variabel lain sebagai prediktor, lalu data kosong pada variabel tersebut diisi ulang dengan nilai yang dibangkitkan dari model.
  3. Langkah kedua diulang untuk semua variabel dan diulang sebanyak maxit iterasi sampai hasil imputasi stabil.
  4. Seluruh proses diulang sebanyak \(m\) kali sehingga diperoleh \(m\) dataset lengkap yang berbeda.

Metode pembentuk model pada mice disesuaikan dengan tipe variabel. Secara default, variabel numerik menggunakan predictive mean matching (pmm), variabel biner menggunakan regresi logistik (logreg), variabel kategorik tidak berurutan dengan lebih dari dua kategori menggunakan regresi logistik multinomial (polyreg), dan variabel kategorik berurutan menggunakan regresi logistik ordinal (polr) (van Buuren & Groothuis-Oudshoorn, 2011). Pada analisis lanjutan, hasil dari \(m\) dataset sebaiknya digabungkan menggunakan aturan Rubin (Rubin, 1987). Pada praktikum ini, salah satu dataset lengkap hasil imputasi diambil menggunakan fungsi complete() untuk membangun pohon.

2.7 Splitting Data

Splitting data adalah proses membagi data menjadi data training untuk melatih model dan data testing untuk menguji kemampuan model pada data yang belum pernah dilihat sebelumnya (Muraina, 2022). Rasio yang umum digunakan adalah 70% sampai 80% untuk training dan sisanya untuk testing (Géron, 2019). Pada data klasifikasi, pembagian dapat dilakukan secara stratified, yaitu pembagian dilakukan pada setiap kelas secara terpisah sehingga proporsi kelas pada data training dan data testing tetap sama dengan data awal. Pada paket caret, pembagian seperti ini dilakukan menggunakan fungsi createDataPartition() (Kuhn, 2008).

2.8 Evaluasi Model Classification Tree

Evaluasi classification tree dilakukan dengan membandingkan kelas aktual dan kelas hasil prediksi. Hasil perbandingan tersebut disajikan dalam confusion matrix (Sokolova & Lapalme, 2009), yaitu sebagai berikut.

Predicted Positive Predicted Negative
Actual Positive True Positive (TP) False Negative (FN)
Actual Negative False Positive (FP) True Negative (TN)

Berdasarkan confusion matrix, beberapa ukuran evaluasi yang dapat digunakan adalah sebagai berikut.

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

\[ Recall = \frac{TP}{TP + FN} \qquad Specificity = \frac{TN}{TN + FP} \]

\[ F1\text{-}Score = 2\left(\frac{Precision \times Recall}{Precision + Recall}\right) \qquad Balanced\ Accuracy = \frac{Recall + Specificity}{2} \]

Recall disebut juga sensitivity, yaitu kemampuan model mengenali kelas positif yang sebenarnya positif. Specificity adalah kemampuan model mengenali kelas negatif yang sebenarnya negatif. Selain itu, nilai Kappa mengukur kesesuaian prediksi dengan kelas aktual setelah memperhitungkan kesesuaian yang terjadi secara kebetulan, yaitu

\[ Kappa = \frac{p_o - p_e}{1 - p_e} \]

dengan \(p_o\) adalah akurasi yang teramati dan \(p_e\) adalah akurasi yang diharapkan terjadi secara kebetulan. Pada kasus kanker payudara, kelas positif yang digunakan adalah malignant (ganas). Dengan demikian, False Negative berarti tumor ganas yang diprediksi jinak, sedangkan False Positive berarti tumor jinak yang diprediksi ganas.

2.9 Kurva ROC dan AUC

Kurva ROC adalah grafik yang menggambarkan kemampuan model membedakan dua kelas pada berbagai nilai ambang batas (threshold) probabilitas. Sumbu vertikal berisi True Positive Rate (TPR) yang sama dengan recall, sedangkan sumbu horizontal berisi False Positive Rate (FPR), yaitu

\[ TPR = \frac{TP}{TP + FN} \qquad FPR = \frac{FP}{FP + TN} = 1 - Specificity \]

Kurva yang mendekati sudut kiri atas menunjukkan model yang baik (Fawcett, 2006). Area Under the Curve (AUC) adalah luas di bawah kurva ROC dengan nilai antara 0 dan 1. Nilai AUC sebesar 0,5 berarti model tidak mampu membedakan kedua kelas. Menurut Hosmer, Lemeshow, dan Sturdivant (2013), nilai AUC 0,7 sampai kurang dari 0,8 tergolong cukup baik (acceptable), 0,8 sampai kurang dari 0,9 tergolong sangat baik (excellent), dan 0,9 atau lebih tergolong luar biasa (outstanding).

BAB III METODE PENELITIAN

3.1 Sumber Data

Data yang digunakan adalah data sekunder berupa dataset BreastCancer yang tersedia pada paket mlbench di R (Leisch & Dimitriadou, 2010). Data ini berasal dari penelitian Wolberg dan Mangasarian (1990) yang dikumpulkan di University of Wisconsin Hospitals, Madison. Data terdiri dari 699 observasi dan 11 variabel, yaitu satu variabel pengenal, sembilan variabel karakteristik sel, dan satu variabel kelas.

3.2 Variabel Penelitian

Variabel yang digunakan terdiri dari satu variabel target dan sembilan variabel prediktor. Variabel target (Y) adalah Class yang terdiri dari dua kategori, yaitu benign (jinak) dan malignant (ganas). Variabel prediktor (X) berjumlah sembilan, semuanya berupa hasil penilaian karakteristik sel dengan skor 1 sampai 10 yang pada R terbaca sebagai data kategorik (factor). Variabel Id hanya berupa kode pengenal sampel sehingga tidak digunakan dalam analisis. Rincian variabel dapat dilihat pada tabel berikut.

Variabel Keterangan Peran
Id Kode sampel Tidak digunakan
Cl.thickness Ketebalan gumpalan sel (clump thickness) Prediktor (X1)
Cell.size Keseragaman ukuran sel Prediktor (X2)
Cell.shape Keseragaman bentuk sel Prediktor (X3)
Marg.adhesion Adhesi marginal (marginal adhesion) Prediktor (X4)
Epith.c.size Ukuran sel epitel tunggal Prediktor (X5)
Bare.nuclei Inti sel telanjang (bare nuclei) Prediktor (X6)
Bl.cromatin Kromatin halus (bland chromatin) Prediktor (X7)
Normal.nucleoli Nukleolus normal Prediktor (X8)
Mitoses Mitosis Prediktor (X9)
Class Kondisi tumor: benign atau malignant Target (Y)

3.3 Langkah-langkah Analisis

Langkah-langkah analisis yang dilakukan adalah sebagai berikut.

  1. Mengimpor dataset BreastCancer dari paket mlbench, menghapus variabel Id, dan menampilkan ringkasan data untuk melihat gambaran umum data.
  2. Memeriksa missing value pada setiap variabel.
  3. Menangani missing value menggunakan mice.
  4. Membagi data menjadi 70% data training dan 30% data testing secara stratified berdasarkan variabel Class menggunakan createDataPartition().
  5. Membangun classification tree dengan algoritma CART menggunakan rpart() dengan cp = 0,008, kemudian memvisualisasikan pohon yang terbentuk.
  6. Menganalisis variable importance dari pohon yang terbentuk.
  7. Melakukan prediksi pada data testing dan mengevaluasi model menggunakan confusion matrix.
  8. Menentukan CP terbaik dari tabel CP, yaitu CP pada baris dengan xerror paling kecil.
  9. Melakukan pruning menggunakan CP terbaik, kemudian mengevaluasi kembali model menggunakan confusion matrix, kurva ROC, dan AUC.
  10. Menginterpretasikan setiap output dan menarik kesimpulan.

3.4 Diagram Alir Penelitian

Gambar 2. Diagram alir penelitian

Gambar 2. Diagram alir penelitian

BAB IV HASIL DAN PEMBAHASAN

4.1 Library dan Import Data

Library yang digunakan adalah dplyr, tidyverse, rpart, caret, rpart.plot, ROCR, mlbench, mice, yardstick, dan Metrics. Paket mlbench digunakan untuk mengambil dataset, mice untuk imputasi, rpart dan rpart.plot untuk membentuk dan menggambar pohon, caret untuk membagi data dan menghitung confusion matrix, serta Metrics, ROCR, dan yardstick untuk AUC dan kurva ROC.

library(dplyr)
library(tidyverse)
library(rpart)
library(caret)
library(rpart.plot)
library(ROCR)
library(mlbench)
library(mice)
library(yardstick)
library(Metrics)

Dataset BreastCancer dipanggil menggunakan fungsi data().

data(BreastCancer)
str(BreastCancer)
## '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 ...
head(BreastCancer)
##        Id Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size Bare.nuclei
## 1 1000025            5         1          1             1            2           1
## 2 1002945            5         4          4             5            7          10
## 3 1015425            3         1          1             1            2           2
## 4 1016277            6         8          8             1            3           4
## 5 1017023            4         1          1             3            2           1
## 6 1017122            8        10         10             8            7          10
##   Bl.cromatin Normal.nucleoli Mitoses     Class
## 1           3               1       1    benign
## 2           3               2       1    benign
## 3           3               1       1    benign
## 4           3               7       1    benign
## 5           3               1       1    benign
## 6           9               7       1 malignant

Berdasarkan output str(), data terdiri dari 699 observasi dan 11 variabel. Variabel Id bertipe karakter, variabel Cl.thickness, Cell.size, Cell.shape, Marg.adhesion, dan Epith.c.size bertipe Ord.factor (kategorik berurutan dengan 10 level), sedangkan Bare.nuclei, Bl.cromatin, Normal.nucleoli, dan Mitoses bertipe Factor. Variabel Mitoses hanya memiliki 9 level karena tidak ada observasi dengan skor 9. Variabel Class bertipe Factor dengan dua level, yaitu benign dan malignant. Output head() menampilkan enam baris pertama data, yang seluruhnya berupa skor 1 sampai 10 untuk setiap karakteristik sel.

Variabel Id hanya berupa kode pengenal sehingga dihapus sebelum analisis.

# variabel Id dihapus karena hanya berupa kode pengenal
data_bc <- BreastCancer[, -1]
dim(data_bc)
## [1] 699  10
# statistik deskriptif
summary(data_bc)
##   Cl.thickness   Cell.size     Cell.shape  Marg.adhesion  Epith.c.size  Bare.nuclei 
##  1      :145   1      :384   1      :353   1      :407   2      :386   1      :402  
##  5      :130   10     : 67   2      : 59   2      : 58   3      : 72   10     :132  
##  3      :108   3      : 52   10     : 58   3      : 58   4      : 48   2      : 30  
##  4      : 80   2      : 45   3      : 56   10     : 55   1      : 47   5      : 30  
##  10     : 69   4      : 40   4      : 44   4      : 33   6      : 41   3      : 28  
##  2      : 50   5      : 30   5      : 34   8      : 25   5      : 39   (Other): 61  
##  (Other):117   (Other): 81   (Other): 95   (Other): 63   (Other): 66   NAs    : 16  
##   Bl.cromatin  Normal.nucleoli    Mitoses          Class    
##  2      :166   1      :443     1      :579   benign   :458  
##  3      :165   10     : 61     2      : 35   malignant:241  
##  1      :152   3      : 44     3      : 33                  
##  7      : 73   2      : 36     10     : 14                  
##  4      : 40   8      : 24     4      : 12                  
##  5      : 34   6      : 22     7      :  9                  
##  (Other): 69   (Other): 69     (Other): 17
# jumlah dan persentase kelas target
table(data_bc$Class)
## 
##    benign malignant 
##       458       241
round(prop.table(table(data_bc$Class)) * 100, 2)
## 
##    benign malignant 
##     65.52     34.48
ggplot(data_bc, aes(x = Class, fill = Class)) +
  geom_bar() +
  geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.4) +
  scale_fill_manual(values = c("benign" = "#008080", "malignant" = "#E07B00")) +
  ylim(0, 520) +
  labs(x = "Class", y = "Jumlah") +
  theme_minimal() +
  theme(legend.position = "none")
Gambar 3. Jumlah observasi pada variabel Class

Gambar 3. Jumlah observasi pada variabel Class

Setelah Id dihapus, data tersisa 699 baris dan 10 variabel. Pada summary() terlihat bahwa hanya Bare.nuclei yang memiliki data kosong (16 data). Sebagian besar variabel didominasi skor rendah, misalnya skor 1 pada Cell.size (384 observasi) dan Mitoses (579 observasi). Kelas benign berjumlah 458 observasi (65,52%) dan kelas malignant 241 observasi (34,48%) seperti pada Gambar 3. Ketidakseimbangannya ringan sehingga data dianalisis apa adanya, dan proporsi kelas dijaga saat pembagian data.

4.2 Pengecekan dan Penanganan Missing Value

Pada tahap ini dilakukan dua langkah, yaitu memeriksa jumlah dan pola data kosong, kemudian mengisi data kosong menggunakan mice.

4.2.1 Pengecekan Missing Value

# jumlah dan persentase missing value tiap variabel
colSums(is.na(data_bc))
##    Cl.thickness       Cell.size      Cell.shape   Marg.adhesion    Epith.c.size 
##               0               0               0               0               0 
##     Bare.nuclei     Bl.cromatin Normal.nucleoli         Mitoses           Class 
##              16               0               0               0               0
round(colMeans(is.na(data_bc)) * 100, 2)
##    Cl.thickness       Cell.size      Cell.shape   Marg.adhesion    Epith.c.size 
##            0.00            0.00            0.00            0.00            0.00 
##     Bare.nuclei     Bl.cromatin Normal.nucleoli         Mitoses           Class 
##            2.29            0.00            0.00            0.00            0.00
# baris yang Bare.nuclei-nya kosong dan kelasnya
baris_na <- which(is.na(data_bc$Bare.nuclei))
baris_na
##  [1]  24  41 140 146 159 165 236 250 276 293 295 298 316 322 412 618
table(data_bc$Class[baris_na])
## 
##    benign malignant 
##        14         2
# pola missing value
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
# jumlah baris yang tersisa jika semua baris ber-NA dihapus
nrow(na.omit(data_bc))
## [1] 683

Hanya Bare.nuclei yang memiliki data kosong, yaitu 16 data (2,29%). Dari 16 baris tersebut, 14 berasal dari kelas benign dan 2 dari kelas malignant, sedangkan variabel lain pada baris tersebut lengkap. Jika baris-baris ini dihapus, data tersisa 683 baris. Agar seluruh 699 observasi tetap terpakai, data kosong diisi menggunakan mice.

4.2.2 Imputasi dengan mice

set.seed(234)
imp <- mice(data_bc, m = 5, maxit = 5, seed = 234, printFlag = FALSE)

# metode imputasi yang dipakai pada setiap variabel
imp$method
##    Cl.thickness       Cell.size      Cell.shape   Marg.adhesion    Epith.c.size 
##              ""              ""              ""              ""              "" 
##     Bare.nuclei     Bl.cromatin Normal.nucleoli         Mitoses           Class 
##       "polyreg"              ""              ""              ""              ""
# ambil dataset lengkap pertama dari 5 hasil imputasi
data_imp <- mice::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
# nilai hasil imputasi pada 16 baris yang sebelumnya kosong
data.frame(Baris = baris_na,
           Kelas = data_bc$Class[baris_na],
           Hasil_Imputasi = data_imp$Bare.nuclei[baris_na])
##    Baris     Kelas Hasil_Imputasi
## 1     24 malignant              9
## 2     41    benign             10
## 3    140    benign              1
## 4    146    benign              1
## 5    159    benign              4
## 6    165    benign              1
## 7    236    benign              1
## 8    250    benign              1
## 9    276    benign              1
## 10   293 malignant              2
## 11   295    benign              1
## 12   298    benign              3
## 13   316    benign              6
## 14   322    benign              1
## 15   412    benign              1
## 16   618    benign              1
# perbandingan frekuensi dan persentase Bare.nuclei sebelum dan sesudah imputasi
rbind(Sebelum = table(data_bc$Bare.nuclei),
      Sesudah = table(data_imp$Bare.nuclei))
##           1  2  3  4  5 6 7  8  9  10
## Sebelum 402 30 28 19 30 4 8 21  9 132
## Sesudah 412 31 29 20 30 5 8 21 10 133
round(rbind(Sebelum = prop.table(table(data_bc$Bare.nuclei)),
            Sesudah = prop.table(table(data_imp$Bare.nuclei))) * 100, 2)
##             1    2    3    4    5    6    7    8    9    10
## Sebelum 58.86 4.39 4.10 2.78 4.39 0.59 1.17 3.07 1.32 19.33
## Sesudah 58.94 4.43 4.15 2.86 4.29 0.72 1.14 3.00 1.43 19.03

Mice dijalankan dengan m = 5 dan maxit = 5, dengan Class ikut digunakan sebagai prediktor imputasi. Hanya Bare.nuclei yang diimputasi, menggunakan metode polyreg karena bertipe Factor tidak berurutan dengan lebih dari dua kategori. Dataset lengkap yang pertama (mice::complete(imp, 1)) dipakai untuk analisis selanjutnya, dan tidak ada lagi data kosong. Hasil imputasi bervariasi antarbaris karena mempertimbangkan variabel lain. Misalnya, baris 24 dari kelas malignant diisi skor 9, sedangkan sebagian besar baris benign diisi skor 1. Sebaran Bare.nuclei hampir tidak berubah setelah imputasi (skor 1: 58,86% menjadi 58,94%), sehingga hasil imputasi masih sesuai dengan pola data asli. Perlu dicatat bahwa imputasi dilakukan sebelum pembagian data dan memakai Class, sehingga label data testing ikut digunakan dalam proses imputasi. Hal ini menjadi keterbatasan praktikum ini, walaupun jumlah data kosongnya sangat kecil.

4.3 Splitting Data

set.seed(234)
train <- createDataPartition(
  data_imp$Class,
  p = 0.7,
  list = FALSE)
BC.train = data_imp[train, ]
BC.test  = data_imp[-train, ]
Class.test = data_imp$Class[-train]

dim(BC.train)
## [1] 490  10
dim(BC.test)
## [1] 209  10
# jumlah dan proporsi kelas target
table(BC.train$Class)
## 
##    benign malignant 
##       321       169
table(BC.test$Class)
## 
##    benign malignant 
##       137        72
round(rbind("Data awal"     = prop.table(table(data_imp$Class)),
            "Data training" = prop.table(table(BC.train$Class)),
            "Data testing"  = prop.table(table(BC.test$Class))) * 100, 2)
##               benign malignant
## Data awal      65.52     34.48
## Data training  65.51     34.49
## Data testing   65.55     34.45

Data dibagi menjadi 490 data training (321 benign, 169 malignant) dan 209 data testing (137 benign, 72 malignant). Proporsi malignant pada data awal, training, dan testing hampir sama (34,48%, 34,49%, dan 34,45%), sehingga pembagian stratified berhasil menjaga proporsi kelas.

4.4 Membangun dan Memvisualisasikan Classification Tree

set.seed(234)
fit.tree = rpart(
  Class ~ .,
  data = BC.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=1,2 309  11 benign (0.96440129 0.03559871)  
##      4) Bare.nuclei=1,2,3,4 297   3 benign (0.98989899 0.01010101) *
##      5) Bare.nuclei=5,6,7,8,10 12   4 malignant (0.33333333 0.66666667) *
##    3) Cell.size=3,4,5,6,7,8,9,10 181  23 malignant (0.12707182 0.87292818)  
##      6) Bare.nuclei=1,6 23   9 benign (0.60869565 0.39130435)  
##       12) Cell.size=1,2,3 12   0 benign (1.00000000 0.00000000) *
##       13) Cell.size=4,5,6,7,8,9,10 11   2 malignant (0.18181818 0.81818182) *
##      7) Bare.nuclei=2,3,4,5,7,8,9,10 158   9 malignant (0.05696203 0.94303797) *
rpart.plot(fit.tree)
Gambar 4. Classification Tree sebelum pruning (cp = 0,008)

Gambar 4. Classification Tree sebelum pruning (cp = 0,008)

Model dibentuk dengan rpart() menggunakan method = “class” karena responnya berupa kategori, dengan ukuran pemisahan Gini Index (default). Nilai cp = 0,008 dipilih lebih kecil daripada nilai default (0,01) agar pohon awal tumbuh sedikit lebih besar sebelum dipangkas. Pohon awal memiliki 5 simpul akhir dan hanya menggunakan Cell.size dan Bare.nuclei sebagai pemisah. Pemisahan pertama menggunakan Cell.size: observasi dengan skor 1 atau 2 (309 observasi) sebagian besar benign (96,44%), sedangkan skor 3 sampai 10 (181 observasi) sebagian besar malignant (87,29%). Kedua simpul tersebut kemudian dipisahkan lagi oleh Bare.nuclei, dan satu simpul dipisahkan lagi oleh Cell.size. Misalnya, observasi dengan Cell.size 1 atau 2 dan Bare.nuclei 1 sampai 4 diprediksi benign (297 observasi, 98,99%), sedangkan Cell.size 3 sampai 10 dan Bare.nuclei 2, 3, 4, 5, 7, 8, 9, atau 10 diprediksi malignant (158 observasi, 94,30%). Karena Bare.nuclei bertipe Factor tidak berurutan, kategorinya dikelompokkan secara bebas sehingga kelompok seperti 1 dan 6 dapat berada dalam satu cabang.

4.5 Analisis Variable Importance

fit.tree$variable.importance
##       Cell.size      Cell.shape     Bare.nuclei     Bl.cromatin    Epith.c.size 
##      167.736760      134.863251      131.817137      123.323709      117.704827 
## Normal.nucleoli   Marg.adhesion    Cl.thickness 
##      115.070973        7.115416        2.486025
# persentase kontribusi tiap variabel
round(fit.tree$variable.importance / sum(fit.tree$variable.importance) * 100, 2)
##       Cell.size      Cell.shape     Bare.nuclei     Bl.cromatin    Epith.c.size 
##           20.96           16.86           16.47           15.41           14.71 
## Normal.nucleoli   Marg.adhesion    Cl.thickness 
##           14.38            0.89            0.31
fit.tree$variable.importance %>%
  data.frame() %>%
  rownames_to_column(var = "Feature") %>%
  rename(Overall = '.') %>%
  ggplot(
    aes(
      x = fct_reorder(Feature, Overall),
      y = Overall)) +
  geom_pointrange(
    aes(
      ymin = 0,
      ymax = Overall),
    color = "cadetblue",
    size = .3) +
  theme_minimal() +
  coord_flip() +
  labs(
    x = "",
    y = "",
    title =
      "Variable Importance with Simple Classification")
Gambar 5. Variable importance pada Classification Tree sebelum pruning

Gambar 5. Variable importance pada Classification Tree sebelum pruning

Cell.size memiliki importance tertinggi (167,74; 20,96%), diikuti Cell.shape (134,86; 16,86%) dan Bare.nuclei (131,82; 16,47%). Enam variabel teratas bersama-sama menyumbang sekitar 98,8%, sedangkan Marg.adhesion (0,89%) dan Cl.thickness (0,31%) sangat kecil, dan Mitoses tidak berkontribusi.

Cell.shape, Bl.cromatin, Epith.c.size, dan Normal.nucleoli bernilai besar walaupun tidak muncul pada Gambar 4, karena rpart juga menghitung kontribusi surrogate split, yaitu variabel yang mirip dengan pemisah utama. Jadi ukuran sel, bentuk sel, dan inti sel telanjang adalah karakteristik yang paling berperan dalam membedakan tumor jinak dan ganas.

4.6 Prediksi dan Evaluasi Model sebelum Pruning

pred.tree = predict(
  fit.tree,
  BC.test,
  type = "class"
)
table(
  pred.tree,
  Class.test)
##            Class.test
## pred.tree   benign malignant
##   benign       122         0
##   malignant     15        72
# kelas positif adalah malignant
cm.awal <- confusionMatrix(
  pred.tree,
  BC.test$Class,
  positive = "malignant")
cm.awal
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       122         0
##   malignant     15        72
##                                           
##                Accuracy : 0.9282          
##                  95% CI : (0.8844, 0.9593)
##     No Information Rate : 0.6555          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.8486          
##                                           
##  Mcnemar's Test P-Value : 0.0003006       
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.8905          
##          Pos Pred Value : 0.8276          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.3445          
##          Detection Rate : 0.3445          
##    Detection Prevalence : 0.4163          
##       Balanced Accuracy : 0.9453          
##                                           
##        'Positive' Class : malignant       
## 

Kelas positif yang digunakan adalah malignant karena tujuan utama model adalah mengenali tumor ganas. Dari 72 tumor ganas pada data testing, semuanya terdeteksi (False Negative = 0), sedangkan dari 137 tumor jinak, 15 diprediksi salah sebagai ganas (False Positive). Akurasi sebesar 0,9282 (194 dari 209 data benar), jauh di atas No Information Rate 0,6555 dengan p-value < 2,2e-16, sehingga model lebih baik daripada menebak semua data sebagai benign. Sensitivity sebesar 1,0000 dan specificity sebesar 0,8905, sedangkan Kappa sebesar 0,8486 menunjukkan kesesuaian yang sangat baik. Dalam konteks kesehatan, hasil ini menguntungkan karena tidak ada tumor ganas yang terlewat, tetapi masih ada 15 peringatan palsu pada tumor jinak.

4.7 Menentukan CP Terbaik

printcp(fit.tree)
## 
## Classification tree:
## rpart(formula = Class ~ ., data = BC.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.00000 1.00000 0.062260
## 2 0.035503      1   0.20118 0.21893 0.034607
## 3 0.023669      3   0.13018 0.15976 0.029887
## 4 0.008000      4   0.10651 0.15976 0.029887
plotcp(fit.tree, upper = "splits")
Gambar 6. Plot CP terhadap xerror pada pohon sebelum pruning

Gambar 6. Plot CP terhadap xerror pada pohon sebelum pruning

bestcp <- fit.tree$cptable[which.min(fit.tree$cptable[, "xerror"]), "CP"]
bestcp
## [1] 0.02366864
# batas aturan 1-SE sebagai pembanding: xerror minimum + xstd pada baris tersebut
idx <- which.min(fit.tree$cptable[, "xerror"])
fit.tree$cptable[idx, "xerror"] + fit.tree$cptable[idx, "xstd"]
## [1] 0.1896507

Pohon sebelum pruning memiliki root node error 0,3449 (169/490) dan hanya memakai Bare.nuclei dan Cell.size. Pada tabel CP, xerror turun dari 1,0000 menjadi 0,2189 setelah satu pemisahan, lalu menjadi 0,1598 setelah tiga pemisahan (CP = 0,0237). Pemisahan keempat (CP = 0,0080) menurunkan rel error dari 0,1302 menjadi 0,1065 tetapi xerror tetap 0,1598, artinya pemisahan tersebut hanya memperbaiki data training dan tidak memperbaiki galat validasi silang. Xerror minimum (0,1598) muncul pada dua baris, yaitu CP 0,0237 dan 0,0080. Fungsi which.min() memilih baris pertama sehingga CP terbaik adalah 0,0237, yaitu pohon yang lebih sederhana dengan galat validasi silang yang sama. Aturan 1-SE pada Gambar 6 juga memberikan pilihan CP yang sama.

4.8 Pruning

pruned.tree <- prune(fit.tree, cp = bestcp)
pruned.tree
## n= 490 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 490 169 benign (0.65510204 0.34489796)  
##    2) Cell.size=1,2 309  11 benign (0.96440129 0.03559871) *
##    3) Cell.size=3,4,5,6,7,8,9,10 181  23 malignant (0.12707182 0.87292818)  
##      6) Bare.nuclei=1,6 23   9 benign (0.60869565 0.39130435)  
##       12) Cell.size=1,2,3 12   0 benign (1.00000000 0.00000000) *
##       13) Cell.size=4,5,6,7,8,9,10 11   2 malignant (0.18181818 0.81818182) *
##      7) Bare.nuclei=2,3,4,5,7,8,9,10 158   9 malignant (0.05696203 0.94303797) *
rpart.plot(pruned.tree)
Gambar 7. Classification Tree setelah pruning (cp = 0,0237)

Gambar 7. Classification Tree setelah pruning (cp = 0,0237)

pruned.tree$variable.importance
##       Cell.size      Cell.shape     Bl.cromatin     Bare.nuclei    Epith.c.size 
##      167.736760      134.863251      122.495034      121.873036      117.704827 
## Normal.nucleoli   Marg.adhesion 
##      112.584948        6.286741

Pruning dilakukan dengan prune() menggunakan CP terbaik sebesar 0,0237. Pemisahan Bare.nuclei pada simpul 2 dipangkas sehingga simpul 2 menjadi simpul akhir (309 observasi, benign 96,44%). Pohon hasil pruning memiliki 3 pemisahan dan 4 simpul akhir, lebih sederhana daripada pohon awal (4 pemisahan dan 5 simpul akhir). Aturan keputusannya adalah sebagai berikut.

No Aturan keputusan Prediksi Banyak observasi Proporsi kelas prediksi
1 Cell.size 1 atau 2 benign 309 96,44%
2 Cell.size 3 sampai 10, Bare.nuclei 1 atau 6, dan Cell.size 3 benign 12 100%
3 Cell.size 3 sampai 10, Bare.nuclei 1 atau 6, dan Cell.size 4 sampai 10 malignant 11 81,82%
4 Cell.size 3 sampai 10 dan Bare.nuclei 2, 3, 4, 5, 7, 8, 9, atau 10 malignant 158 94,30%

Setelah pruning, Cell.size tetap menjadi variabel terpenting (167,74), diikuti Cell.shape (134,86), Bl.cromatin (122,50), dan Bare.nuclei (121,87). Cl.thickness tidak muncul lagi dan Mitoses tetap tidak berkontribusi. Urutan variabel terpenting hampir sama dengan sebelum pruning.

4.9 Evaluasi Model setelah Pruning

pred.prune = predict(
  pruned.tree,
  BC.test,
  type = "class")
table(pred.prune, Class.test)
##            Class.test
## pred.prune  benign malignant
##   benign       126         1
##   malignant     11        71
cm.prune <- confusionMatrix(
  pred.prune,
  BC.test$Class,
  positive = "malignant")
cm.prune
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       126         1
##   malignant     11        71
##                                         
##                Accuracy : 0.9426        
##                  95% CI : (0.9019, 0.97)
##     No Information Rate : 0.6555        
##     P-Value [Acc > NIR] : < 2.2e-16     
##                                         
##                   Kappa : 0.8769        
##                                         
##  Mcnemar's Test P-Value : 0.009375      
##                                         
##             Sensitivity : 0.9861        
##             Specificity : 0.9197        
##          Pos Pred Value : 0.8659        
##          Neg Pred Value : 0.9921        
##              Prevalence : 0.3445        
##          Detection Rate : 0.3397        
##    Detection Prevalence : 0.3923        
##       Balanced Accuracy : 0.9529        
##                                         
##        'Positive' Class : malignant     
## 
# perbandingan ukuran evaluasi sebelum dan sesudah pruning
perbandingan <- data.frame(
  Ukuran = c("Accuracy", "Sensitivity (Recall)", "Specificity",
             "Precision", "F1-Score", "Balanced Accuracy", "Kappa"),
  Sebelum_Pruning = round(c(cm.awal$overall["Accuracy"],
                            cm.awal$byClass[c("Sensitivity", "Specificity", "Precision",
                                              "F1", "Balanced Accuracy")],
                            cm.awal$overall["Kappa"]), 4),
  Sesudah_Pruning = round(c(cm.prune$overall["Accuracy"],
                            cm.prune$byClass[c("Sensitivity", "Specificity", "Precision",
                                               "F1", "Balanced Accuracy")],
                            cm.prune$overall["Kappa"]), 4),
  row.names = NULL
)
perbandingan
##                 Ukuran Sebelum_Pruning Sesudah_Pruning
## 1             Accuracy          0.9282          0.9426
## 2 Sensitivity (Recall)          1.0000          0.9861
## 3          Specificity          0.8905          0.9197
## 4            Precision          0.8276          0.8659
## 5             F1-Score          0.9057          0.9221
## 6    Balanced Accuracy          0.9453          0.9529
## 7                Kappa          0.8486          0.8769

Pada pohon hasil pruning, dari 137 tumor jinak sebanyak 126 diprediksi benar dan 11 salah (False Positive), sedangkan dari 72 tumor ganas sebanyak 71 diprediksi benar dan 1 salah (False Negative). Akurasi sebesar 0,9426 (197 dari 209 data), sensitivity 0,9861, specificity 0,9197, dan Kappa 0,8769.

Dibandingkan sebelum pruning, akurasi naik dari 0,9282 menjadi 0,9426 dan specificity naik dari 0,8905 menjadi 0,9197 karena False Positive turun dari 15 menjadi 11. Namun sensitivity turun dari 1,0000 menjadi 0,9861 karena muncul satu False Negative, dan pada kasus kesehatan False Negative umumnya lebih berbahaya. Selisih akurasi hanya 3 dari 209 data dan selang kepercayaan kedua model saling tumpang tindih, sehingga belum cukup bukti bahwa pohon hasil pruning jauh lebih baik. Keuntungan utamanya adalah pohon yang lebih sederhana dengan kemampuan prediksi yang setara.

Selanjutnya, probabilitas prediksi pada data testing dihitung untuk membuat kurva ROC dan menghitung AUC.

BC_preds_cart <- bind_cols(
  as.data.frame(predict(
    pruned.tree,
    newdata = BC.test,
    type = "prob")),
  predicted = predict(
    pruned.tree,
    newdata = BC.test,
    type = "class"),
  actual = BC.test$Class)
head(BC_preds_cart, 10)
##        benign  malignant predicted    actual
## 5  0.96440129 0.03559871    benign    benign
## 7  0.96440129 0.03559871    benign    benign
## 9  0.96440129 0.03559871    benign    benign
## 12 0.96440129 0.03559871    benign    benign
## 19 0.05696203 0.94303797 malignant malignant
## 27 0.96440129 0.03559871    benign    benign
## 30 0.96440129 0.03559871    benign    benign
## 32 0.96440129 0.03559871    benign    benign
## 33 0.05696203 0.94303797 malignant malignant
## 37 0.18181818 0.81818182 malignant malignant
# jumlah nilai probabilitas yang berbeda
unique(round(BC_preds_cart$malignant, 4))
## [1] 0.0356 0.9430 0.8182 0.0000
# AUC (kelas positif: malignant)
mdl_auc <- Metrics::auc(
  actual =
    BC_preds_cart$actual == "malignant",
  BC_preds_cart$malignant)
mdl_auc
## [1] 0.9524027
# pengecekan AUC dengan paket ROCR
pred_rocr <- prediction(BC_preds_cart$malignant,
                        BC_preds_cart$actual == "malignant")
performance(pred_rocr, "auc")@y.values[[1]]
## [1] 0.9524027
# AUC pohon sebelum pruning sebagai pembanding
prob.awal <- predict(fit.tree, newdata = BC.test, type = "prob")
Metrics::auc(BC.test$Class == "malignant", prob.awal[, "malignant"])
## [1] 0.958232
yardstick::roc_curve(
  BC_preds_cart,
  actual,
  malignant,
  event_level = "second"
) %>%
  autoplot() +
  labs(
    title = "ROC Curve",
    subtitle =
      paste0(
        "AUC = ",
        round(mdl_auc, 4)))
Gambar 8. Kurva ROC pohon hasil pruning pada data testing

Gambar 8. Kurva ROC pohon hasil pruning pada data testing

Karena pohon hasil pruning hanya memiliki 4 simpul akhir, probabilitas prediksi hanya memiliki 4 nilai berbeda (0,0356; 0,0000; 0,8182; dan 0,9430), sehingga kurva ROC berbentuk garis patah dengan sedikit titik sudut. AUC pohon hasil pruning sebesar 0,9524, sama dengan hasil perhitungan paket ROCR, dan tergolong outstanding menurut Hosmer dkk. (2013). Pada Gambar 8, kurva ROC naik cepat ke sudut kiri atas dan berada jauh di atas garis diagonal, artinya model jauh lebih baik daripada tebakan acak. AUC pohon sebelum pruning sebesar 0,9582, selisihnya hanya 0,0058. Karena kemampuan membedakan kelasnya hampir sama, pohon hasil pruning lebih disukai karena lebih sederhana.

BAB V KESIMPULAN DAN SARAN

5.1 Kesimpulan

Decision tree dengan metode CART adalah metode supervised learning yang membagi data secara bertahap berdasarkan variabel prediktor sehingga terbentuk aturan keputusan dalam bentuk pohon. Jika variabel responnya berupa kategori, pohon yang terbentuk disebut classification tree, dengan pemisahan dipilih berdasarkan Gini Index, dan pohon yang terlalu rumit dapat disederhanakan melalui pruning menggunakan nilai CP yang sesuai.

Pembentukan model di RStudio dilakukan dengan bantuan beberapa paket dan fungsi. Dataset BreastCancer diambil dari paket mlbench, missing value ditangani dengan fungsi mice() dan mice::complete(), data dibagi secara stratified menggunakan createDataPartition() dari paket caret, dan pohon dibentuk dengan rpart() lalu divisualisasikan dengan rpart.plot(). Variable importance diperoleh dari fit.tree$variable.importance, CP terbaik ditentukan dari tabel CP menggunakan printcp() dan plotcp(), pruning dilakukan dengan prune(), serta evaluasi dilakukan dengan confusionMatrix(), Metrics::auc(), dan yardstick::roc_curve().

Berdasarkan hasil praktikum, missing value hanya terdapat pada variabel Bare.nuclei sebanyak 16 data (2,29%) dan berhasil diisi menggunakan mice sehingga seluruh 699 observasi dapat digunakan. Data dibagi menjadi 490 data training dan 209 data testing dengan proporsi kelas yang tetap sama. Pohon awal dengan cp = 0,008 memiliki 5 simpul akhir dan hanya menggunakan variabel Cell.size dan Bare.nuclei sebagai pemisah, dengan akurasi 0,9282 pada data testing, sensitivity 1,0000, dan specificity 0,8905. Variabel yang paling berperan adalah Cell.size, Cell.shape, dan Bare.nuclei. CP terbaik adalah 0,0237 dan setelah pruning pohon menjadi lebih sederhana dengan 4 simpul akhir. Pohon hasil pruning memiliki akurasi 0,9426, sensitivity 0,9861, specificity 0,9197, dan Kappa 0,8769, serta nilai AUC sebesar 0,9524 yang termasuk kategori luar biasa. Dengan demikian, model classification tree hasil pruning mampu mengklasifikasikan kondisi kanker payudara dengan baik dan lebih sederhana dibandingkan pohon awal.

5.2 Saran

Pada praktikum Machine Learning berikutnya, disarankan agar praktikan lebih teliti dalam memasukkan dan mengolah data menggunakan RStudio, terutama dalam penggunaan sintaks serta interpretasi nilai CP, akurasi, sensitivity, specificity, dan AUC. Selain itu, pemilihan nilai cp perlu diperhatikan agar pohon yang dihasilkan tidak terlalu rumit dan tetap mampu mengklasifikasikan data dengan baik. Hasil evaluasi juga sebaiknya tidak hanya dilihat dari nilai akurasi, tetapi dikaitkan dengan sensitivity, specificity, dan AUC sehingga kesimpulan mengenai kemampuan model menjadi lebih tepat.

DAFTAR PUSTAKA

Breiman, L., Friedman, J. H., Olshen, R. A., & Stone, C. J. (1984). Classification and regression trees. Chapman & Hall/CRC.

Emmanuel, T., Maupong, T., Mpoeleng, D., Semong, T., Mphago, B., & Tabona, O. (2021). A survey on missing data in machine learning. Journal of Big Data, 8, 140. https://doi.org/10.1186/s40537-021-00516-9

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

Géron, A. (2019). Hands-on machine learning with Scikit-Learn, Keras, and TensorFlow (2nd ed.). O’Reilly Media.

Hastie, T., Tibshirani, R., & Friedman, J. (2009). The elements of statistical learning: Data mining, inference, and prediction (2nd ed.). Springer.

Hosmer, D. W., Lemeshow, S., & Sturdivant, R. X. (2013). Applied logistic regression (3rd ed.). Wiley.

James, G., Witten, D., Hastie, T., & Tibshirani, R. (2021). An introduction to statistical learning: With applications in R (2nd ed.). Springer.

Kuhn, M. (2008). Building predictive models in R using the caret package. Journal of Statistical Software, 28(5), 1–26. https://doi.org/10.18637/jss.v028.i05

Leisch, F., & Dimitriadou, E. (2010). mlbench: Machine learning benchmark problems [R package]. The Comprehensive R Archive Network.

Little, R. J. A., & Rubin, D. B. (2019). Statistical analysis with missing data (3rd ed.). Wiley.

Muraina, I. O. (2022). Ideal dataset splitting ratios in machine learning algorithms: General concerns for data scientists and data analysts. Dalam Proceedings of the 7th International Mardin Artuklu Scientific Research Conference (hlm. 496–504).

Quinlan, J. R. (1986). Induction of decision trees. Machine Learning, 1(1), 81–106. https://doi.org/10.1007/BF00116251

Rubin, D. B. (1987). Multiple imputation for nonresponse in surveys. Wiley.

Sokolova, M., & Lapalme, G. (2009). A systematic analysis of performance measures for classification tasks. Information Processing & Management, 45(4), 427–437. https://doi.org/10.1016/j.ipm.2009.03.002

Sung, H., Ferlay, J., Siegel, R. L., Laversanne, M., Soerjomataram, I., Jemal, A., & Bray, F. (2021). Global cancer statistics 2020: GLOBOCAN estimates of incidence and mortality worldwide for 36 cancers in 185 countries. CA: A Cancer Journal for Clinicians, 71(3), 209–249. https://doi.org/10.3322/caac.21660

Therneau, T. M., & Atkinson, E. J. (2019). An introduction to recursive partitioning using the RPART routines. Mayo Foundation.

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

Wolberg, W. H., & Mangasarian, O. L. (1990). Multisurface method of pattern separation for medical diagnosis applied to breast cytology. Proceedings of the National Academy of Sciences, 87(23), 9193–9196. https://doi.org/10.1073/pnas.87.23.9193