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.
Berdasarkan latar belakang di atas, rumusan masalah dalam praktikum ini adalah sebagai berikut:
Berdasarkan rumusan masalah di atas, tujuan praktikum ini adalah sebagai berikut:
Adapun manfaat pada penelitian ini yaitu:
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.
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
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:
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
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.
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).
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).
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.
Pembentukan pohon CART dilakukan melalui tahapan berikut (Breiman dkk., 1984).
Ketiga tahapan tersebut dilakukan secara berulang pada setiap simpul yang terbentuk. Proses pemisahan berhenti apabila salah satu kondisi berikut tercapai:
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).
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).
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.
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:
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.
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.
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).
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.
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).
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.
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) |
Langkah-langkah analisis yang dilakukan adalah sebagai berikut.
Gambar 2. Diagram alir penelitian
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.frame': 699 obs. of 11 variables:
## $ Id : chr "1000025" "1002945" "1015425" "1016277" ...
## $ Cl.thickness : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 5 5 3 6 4 8 1 2 2 4 ...
## $ Cell.size : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 1 1 2 ...
## $ Cell.shape : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 2 1 1 ...
## $ Marg.adhesion : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 5 1 1 3 8 1 1 1 1 ...
## $ Epith.c.size : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 2 7 2 3 2 7 2 2 2 2 ...
## $ Bare.nuclei : Factor w/ 10 levels "1","2","3","4",..: 1 10 2 4 1 10 10 1 1 1 ...
## $ Bl.cromatin : Factor w/ 10 levels "1","2","3","4",..: 3 3 3 3 3 9 3 3 1 2 ...
## $ Normal.nucleoli: Factor w/ 10 levels "1","2","3","4",..: 1 2 1 7 1 7 1 1 1 1 ...
## $ Mitoses : Factor w/ 9 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 5 1 ...
## $ Class : Factor w/ 2 levels "benign","malignant": 1 1 1 1 1 2 1 1 1 1 ...
## Id Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size Bare.nuclei
## 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.
## [1] 699 10
## 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
##
## benign malignant
## 458 241
##
## 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
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.
Pada tahap ini dilakukan dua langkah, yaitu memeriksa jumlah dan pola data kosong, kemudian mengisi data kosong menggunakan mice.
## 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
## 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
##
## benign malignant
## 14 2
## 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
## [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.
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.
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
## [1] 209 10
##
## benign malignant
## 321 169
##
## 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.
## 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) *
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.
## 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
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.
## 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.
##
## 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
Gambar 6. Plot CP terhadap xerror pada pohon sebelum pruning
## [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.
## 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) *
Gambar 7. Classification Tree setelah pruning (cp = 0,0237)
## 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.
## Class.test
## pred.prune benign malignant
## benign 126 1
## malignant 11 71
## 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
## [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
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.
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.
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.
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