BAB I PENDAHULUAN

1.1 Latar Belakang Masalah

Perkembangan teknologi informasi menyebabkan data yang dihasilkan semakin besar dan beragam sehingga diperlukan metode machine learning untuk mengolah data dan memprediksi suatu kelas berdasarkan pola yang terbentuk. Salah satu metode klasifikasi yang banyak digunakan adalah Random Forest, yaitu metode ensemble learning berbasis pohon keputusan yang membangun banyak pohon dan menggabungkan prediksinya untuk meningkatkan akurasi serta mengurangi overfitting (Fransiska, 2026). Metode ini merupakan pengembangan dari bagging dengan tambahan pemilihan variabel prediktor secara acak pada setiap pemisahan pohon (Jatmiko dkk., 2019). Pengembangan lebih lanjut dari Random Forest adalah Double Random Forest (DRF), yaitu metode yang membentuk setiap pohon menggunakan seluruh data training sehingga cenderung menghasilkan pohon yang lebih besar (Fransiska, 2026).

Penerapan Random Forest telah digunakan dalam berbagai permasalahan klasifikasi karena mampu menghasilkan prediksi yang baik melalui penggabungan banyak pohon keputusan. Mutoffar dkk. (2022), misalnya, menerapkan metode Random Forest untuk mengklasifikasikan kualitas air sumur dan memperoleh nilai presisi sebesar 0,823 serta sensitivitas sebesar 0,83. Hasil tersebut menunjukkan bahwa Random Forest dapat dimanfaatkan untuk mendukung pengambilan keputusan berdasarkan pola data yang tersedia.

Berbeda dengan Random Forest, Double Random Forest dikembangkan untuk mengatasi masalah underfitting yang dapat terjadi ketika model kurang mampu menangkap pola data. Khairunnisa dkk. (2024) menunjukkan bahwa Double Random Forest memiliki interpretabilitas yang lebih baik daripada Random Forest pada data yang mengalami underfitting, berdasarkan kualitas aturan asosiasi yang dihasilkan. Oleh karena itu, perbandingan kedua metode diperlukan untuk mengetahui kinerja model dalam mengklasifikasikan data serta menentukan metode yang lebih sesuai dengan karakteristik data penelitia

1.2 Rumusan Masalah

Berdasarkan latar belakang di atas, adapun rumusan masalah sebagai berikut:

  1. Bagaimana konsep Random Forest dan Double Random Forest sebagai metode ensemble berbasi decision tree.
  2. Bagaimana menerapkan Random Forest untuk klasifikasi dan regresi, serta Double Random Forest untuk klasifikasi dan regresi.
  3. Bagaimana dapat mengavaluasi performa model, memahami Out-of-Bag OOB error dan membandingankan Random Forest dengan Double Random Forest.

1.3 Tujuan Penelitian

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

  1. Mahasiswa dapat memhami Random Forest dan Double Random Forest sebagai metode ensemble berbasi decision tree.
  2. Mahasiswa dapat menerapkan Random Forest untuk klasifikasi dan regresi, serta Double Random Forest untuk klasifikasi dan regresi.
  3. Mahasiswa dapat mengavaluasi performa model, memahami Out-of-Bag OOB error dan membandingankan Random Forest dengan Double Random Forest.

1.4 Manfaat Penelitian

Manfaat yang diperoleh melalui penelitian ini, yaitu:

  1. Bagi penulis:

    1. Menambah pengetahuan dan pemahaman mengenai Random Forest sebagai salah satu metode ensemble.
    2. Mampu mengaplikasikan R untuk melakukan Random Forest Classification.
  2. Bagi pembaca:

    1. Menambah ilmu pengetahuan dan pemahaman yang berkaitan dengan Random Forest Classification menggunakan R.
    2. Rujukan penelitian selanjutnya.

1.5 Batasan Masalah

Adapun batasan masalah pada penelitian ini dengan menggunakan dataset BreastCancer dari package mlbench untuk mengklasifikasikan variabel Class (benign dan malignant) menggunakan Random Forest. Kolom Id dihapus dan observasi yang memiliki nilai hilang dihapus menggunakan na.omit(), kemudian data dibagi menjadi training (70%) dan testing (30%). Selanjutnya, dibangun sembilan model dengan mtry sebesar 2, 3, dan 5 serta num.trees sebesar 200, 500, dan 1000. Model dievaluasi menggunakan OOB error, confusion matrix, Accuracy, Precision, Recall, Specificity, dan F1-score dengan kelas malignant sebagai kelas positif, kemudian dianalisis permutation variable importance-nya dan ditentukan model terbaik. Implementasi pada R dibatasi pada Random Forest Classification, sedangkan Double Random Forest dibahas pada tingkat konsep.

1.6 Sistematika Penulisan

Adapun sistematika penulisan dari praktikum ini adalah:

BAB I PENDAHULUAN

Bab ini memuat latar belakang, rumusan masalah, tujuan dan manfaat, batasan masalah dan sistematika penulisan.

BAB II TINJAUAN PUSTAKA

Bab ini merupakan bab yang memuat pengertian dan teori yang diperlukan untuk rancangan penelitian pada bab-bab berikutnya.

BAB III METODE PENELITIAN

Bab ini merupakan bab yang memuat jenis dan sumber data, variabel penelitian, dan langkah-langkah analisis yang diperlukan untuk rancangan penelitian pada bab-bab berikutnya.

BAB IV HASIL DAN PEMBAHASAN

Bab ini merupakan bab yang memuat hasil dan pembahasan yang telah dilakukan pada program kemudian diinterpretasikan.

BAB V KESIMPULAN DAN SARAN

Bab ini merupakan bab yang memuat kesimpulan dan saran.

DAFTAR PUSTAKA

BAB II TINJAUAN PUSTAKA

2.1 Random Forest Classification

Random Forest adalah algoritma ensemble learning berbasis pohon yang membangun banyak decision tree dan menggabungkan prediksinya untuk meningkatkan akurasi serta mengurangi overfitting (Fransiska, 2026). Metode ini merupakan pengembangan dari bagging (Bootstrap Aggregating). Menurut Jatmiko dkk. (2019), Random Forest menambahkan satu lapisan pengacakan pada proses resampling sehingga bukan hanya sampel data yang diambil secara acak untuk membentuk pohon klasifikasi, tetapi juga variabel independen yang digunakan. Lestari dan Sirodj (2021) menyebutkan bahwa Random Forest menerapkan bootstrap aggregating dan random feature selection, yang merupakan perkembangan dari Classification and Regression Trees (CART).

Tujuan pengacakan prediktor adalah mengurangi korelasi antarpohon. Apabila seluruh pohon terlalu mirip, manfaat agregasi menjadi terbatas, sehingga pohon yang kuat tetapi tidak saling berkorelasi tinggi dapat mengurangi variance model (Fransiska, 2026). Perbedaan Bagging dan Random Forest dirangkum pada Tabel 1 berikut (Fransiska, 2026).

Tabel 1. Perbedaan Bagging dan Random Forest

Aspek Bagging Random Forest
Data tiap pohon Umumnya sampel bootstrap Umumnya sampel bootstrap
Prediktor pada pemisahan Semua prediktor dapat dipertimbangkan Hanya mtry prediktor yang dipilih secara acak
Korelasi antarpohon Dapat relatif tinggi Ditekan melalui random feature selection
Agregasi klasifikasi Majority voting Majority voting
Agregasi regresi Rata-rata prediksi Rata-rata prediksi
Fokus utama Mengurangi variance melalui agregasi Mengurangi variance sekaligus mendekorelasi pohon

2.2 Proses Pembentukan Random Forest

Misalkan tersedia data latih \(D=(x_i,y_i)\), \(i=1,2,\ldots,n\) dan akan dibentuk \(B\) pohon. Secara sederhana, proses Random Forest dilakukan sebagai berikut (Fransiska, 2026):

  1. Mengambil sampel bootstrap dari data latih untuk membentuk data bagi pohon ke-\(b\).
  2. Pada setiap node, memilih mtry prediktor secara acak dari seluruh \(p\) prediktor.
  3. Menentukan pemisahan terbaik hanya dari mtry prediktor yang terpilih.
  4. Menumbuhkan pohon hingga memenuhi aturan penghentian, misalnya ukuran node minimum.
  5. Mengulangi proses sampai diperoleh \(B\) pohon, kemudian menggabungkan prediksi seluruh pohon.

Pada kasus klasifikasi, setiap pohon menghasilkan satu suara prediksi dan hasil akhir ditentukan berdasarkan suara terbanyak (majority vote) (Lestari & Sirodj, 2021). Hasil akhir dirumuskan sebagai berikut (Fransiska, 2026):

\[ \hat{G}_{RF}(x)=\operatorname{mode}\{G_1(x),G_2(x),\ldots,G_B(x)\} \]

Keterangan:

  • \(\hat{G}_{RF}(x)\) = kelas prediksi akhir Random Forest untuk pengamatan \(x\).
  • \(G_b(x)\) = kelas prediksi pohon ke-\(b\).
  • \(B\) = jumlah pohon dalam forest.

Setiap pohon dapat dibentuk secara relatif independen sehingga Random Forest termasuk parallel ensemble, berbeda dengan Boosting yang bersifat sekuensial (Fransiska, 2026).

2.3 Double Random Forest (DRF)

Double Random Forest (DRF) diperkenalkan oleh Han, Kim, dan Lee pada tahun 2020. Metode ini dikembangkan untuk situasi ketika Random Forest masih mengalami underfitting karena pohon yang dihasilkan belum cukup besar. Pada Random Forest standar, setiap pohon dibentuk dari satu sampel bootstrap yang hanya memuat sekitar 63,2% observasi unik, sedangkan pada DRF setiap pohon dibangun menggunakan seluruh data training dan bootstrap digunakan sementara pada setiap node untuk mencari aturan pemisahan. Proses DRF dilakukan sebagai berikut (Fransiska, 2026):

  1. Memulai setiap pohon dengan seluruh data training, bukan satu sampel bootstrap untuk seluruh pohon.
  2. Pada node yang sedang diproses, mengambil sampel bootstrap dari observasi yang mencapai node tersebut.
  3. Memilih mtry prediktor secara acak dan mencari pemisahan terbaik menggunakan sampel bootstrap pada node.
  4. Setelah pemisahan terbaik ditemukan, sampel bootstrap tidak diteruskan. Pemisahan tersebut diterapkan kembali pada data asli yang mencapai node, kemudian observasi asli dikirim ke child node.
  5. Mengulangi proses pada node berikutnya sampai aturan penghentian tercapai, lalu mengulangi untuk seluruh pohon.
  6. Menggabungkan prediksi seluruh pohon melalui majority voting pada klasifikasi atau rata-rata pada regresi.

Karena setiap pohon menggunakan seluruh data training, DRF cenderung menghasilkan pohon yang lebih besar, sedangkan penggunaan bootstrap pada setiap node dan random feature subset tetap menambah keragaman aturan pemisahan. Konsekuensinya, DRF umumnya membutuhkan waktu komputasi lebih besar daripada Random Forest. Perbedaan keduanya dirangkum pada Tabel 2 berikut (Fransiska, 2026).

Tabel 2. Perbedaan Random Forest dan Double Random Forest

Aspek Random Forest Double Random Forest
Penggunaan data Setiap pohon dibentuk dari hasil bootstrap pada data latih Setiap pohon dibentuk dari seluruh data latih
Jumlah observasi unik Sekitar \(1-e^{-1}\approx 0{,}63\) kali data latih Bootstrap digunakan sementara pada setiap node untuk mencari pemisahan
Proses pemisahan Random feature subset Bootstrap sampling pada setiap node dan random feature subset
Ukuran pohon Relatif lebih kecil Cenderung lebih besar dan beragam
Waktu komputasi Lebih cepat Lebih lama
Hasil prediksi akhir Majority voting Majority voting

2.4 Parameter mtry dan num.trees

Beberapa parameter penting dalam Random Forest menggunakan package ranger dirangkum pada Tabel 3 berikut (Fransiska, 2026).

Tabel 3. Parameter Penting Random Forest

Parameter Peran
num.trees Menentukan jumlah pohon yang dibentuk dalam ensemble.
mtry Menentukan banyaknya prediktor kandidat yang dipilih secara acak pada setiap node.
min.node.size Mengatur ukuran minimum node dan secara tidak langsung kompleksitas pohon.
replace dan sample.fraction Mengatur mekanisme dan proporsi sampling.
splitrule Menentukan aturan pemisahan, misalnya Gini untuk klasifikasi.
importance Menentukan apakah dan bagaimana variable importance dihitung.

Menurut Ilmi dkk. (2025), mtry menentukan keragaman di antara pohon keputusan, sedangkan ukuran node minimum berfungsi sebagai kriteria penghentian yang mengontrol kedalaman pohon. Lestari dan Sirodj (2021) menentukan jumlah pohon dan mtry yang optimal berdasarkan nilai error OOB terkecil, dan hasil penelitian tersebut menunjukkan bahwa perubahan error OOB tidak selalu menurun secara konsisten ketika jumlah pohon bertambah. Oleh karena itu, pemilihan parameter sebaiknya didasarkan pada hasil evaluasi model, bukan hanya pada besarnya nilai parameter.

2.5 Out-of-Bag (OOB) Error

Pada bootstrap berukuran \(n\) yang diambil dengan pengembalian dari \(n\) observasi, sebagian observasi dapat terambil lebih dari sekali dan sebagian lainnya tidak terambil. Secara rata-rata, proporsi observasi unik dalam satu sampel bootstrap mendekati \(1-e^{-1}\approx 0{,}632\), sehingga sekitar 36,8% observasi tidak digunakan untuk membentuk pohon tertentu dan disebut observasi Out-of-Bag (OOB) (Fransiska, 2026)

Prediksi OOB untuk setiap observasi diperoleh hanya dari pohon-pohon yang tidak menggunakan observasi tersebut ketika dibentuk. Pada ranger, error OOB dihitung secara otomatis dan untuk klasifikasi prediction.error menyatakan proporsi salah klasifikasi OOB (Fransiska, 2026). Error OOB dihitung dari proporsi kesalahan klasifikasi hasil prediksi OOB pada seluruh amatan data asli (Lestari & Sirodj, 2021), yaitu:

\[ \text{OOB error}=\frac{1}{n}\sum_{i=1}^{n}I\left(y_i\neq\hat{y}_i^{OOB}\right) \]

Keterangan:

  • \(n\) = jumlah observasi data latih.
  • \(y_i\) = kelas aktual observasi ke-\(i\).
  • \(\hat{y}_i^{OOB}\) = kelas prediksi OOB observasi ke-\(i\).
  • \(I(\cdot)\) = fungsi indikator yang bernilai 1 jika kondisi terpenuhi dan 0 jika tidak.

Nilai error OOB yang lebih kecil menunjukkan estimasi kesalahan internal model yang lebih kecil. Ilmi dkk. (2025) juga menggunakan sampel OOB untuk memperkirakan kesalahan model pada data latih.

2.6 Variable Importance

Variable importance digunakan untuk melihat seberapa kuat suatu variabel prediktor memengaruhi hasil prediksi. Semakin tinggi nilai variable importance, semakin besar kontribusi variabel tersebut terhadap hasil prediksi (Ilmi dkk., 2025). Pada praktikum ini digunakan permutation importance, yaitu ukuran yang dihitung dengan mengamati penurunan kinerja model setelah nilai suatu variabel diacak, dengan argumen importance = "permutation" pada ranger (Fransiska, 2026). Nilai ini menggambarkan kontribusi prediktif variabel dalam model dan tidak menunjukkan hubungan sebab-akibat.

BAB III METODE PENELITIAN

3.1 Jenis dan Sumber Data

Penelitian ini merupakan penelitian terapan dengan pendekatan kuantitatif. Data yang digunakan adalah data sekunder berupa dataset BreastCancer dari package mlbench pada program R. Data tersebut memuat hasil pengamatan sel jaringan payudara yang digunakan untuk mengklasifikasikan tumor sebagai benign (jinak) atau malignant (ganas) menggunakan metode Random Forest Classification.

3.2 Variabel Penelitian

Variabel yang digunakan dalam penelitian ini terdiri atas variabel respons dan variabel prediktor. Variabel respons adalah Class, yaitu kelas tumor dengan kategori benign dan malignant. Variabel prediktor meliputi Cl.thickness, Cell.size, Cell.shape, Marg.adhesion, Epith.c.size, Bare.nuclei, Bl.cromatin, Normal.nucleoli, dan Mitoses. Kolom Id tidak digunakan karena hanya berfungsi sebagai identitas observasi.

3.3 Analisi Data

Berikut merupakan algoritma pengolahan data:

  1. Mulai.

  2. Mengimpor dan membersihkan data.

  3. Melakukan statistik deskriptif.

  4. Membagi data training dan testing.

  5. Membentuk sembilan model Random Forest dan menghitung OOB error.

  6. Menyusun confusion matrix dan menghitung Accuracy, Precision, Recall, Specificity, dan F1-score.

  7. Menganalisis variable importance.

  8. Membandingkan hasil evaluasi model dan menentukan model terbaik.

  9. Menarik kesimpulan.

  10. Selesai.

3.4 Diagram ALir Penelitian

Berikut merupakan diagram alir penelitian:

Gambar 3.1 Diagram Alir Penelitian

BAB IV HASIL DAN PEMBAHASAN

4.1 Persiapan dan Preprocessing Data

# 1. Library
library(ranger)
library(mlbench)
library(caret)
library(knitr)
library(ggplot2)
library(dplyr)
library(tidyr)

4.1.1 Deskripsi Data

# 2. Data
# Mengambil Dataset
data("BreastCancer", package = "mlbench")
bc.raw <- BreastCancer
# Melihat Struktur Data
str(bc.raw)
## 'data.frame':    699 obs. of  11 variables:
##  $ Id             : chr  "1000025" "1002945" "1015425" "1016277" ...
##  $ Cl.thickness   : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 5 5 3 6 4 8 1 2 2 4 ...
##  $ Cell.size      : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 1 1 2 ...
##  $ Cell.shape     : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 2 1 1 ...
##  $ Marg.adhesion  : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 5 1 1 3 8 1 1 1 1 ...
##  $ Epith.c.size   : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 2 7 2 3 2 7 2 2 2 2 ...
##  $ Bare.nuclei    : Factor w/ 10 levels "1","2","3","4",..: 1 10 2 4 1 10 10 1 1 1 ...
##  $ Bl.cromatin    : Factor w/ 10 levels "1","2","3","4",..: 3 3 3 3 3 9 3 3 1 2 ...
##  $ Normal.nucleoli: Factor w/ 10 levels "1","2","3","4",..: 1 2 1 7 1 7 1 1 1 1 ...
##  $ Mitoses        : Factor w/ 9 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 5 1 ...
##  $ Class          : Factor w/ 2 levels "benign","malignant": 1 1 1 1 1 2 1 1 1 1 ...
# Melihat Dimensi Data
dim(bc.raw)
## [1] 699  11

Interpretasi: Dataset BreastCancer terdiri atas 699 observasi dan 11 variabel, yaitu kolom Id, sembilan variabel prediktor, dan variabel Class. Seluruh variabel bertipe factor, sehingga prediktor perlu diubah menjadi numerik sebelum dimodelkan.

4.1.2 Pemeriksaan dan Penanganan Missing Value

# 3. Preprocessing Data
# Memeriksa Missing Value
colSums(is.na(bc.raw))
##              Id    Cl.thickness       Cell.size      Cell.shape   Marg.adhesion 
##               0               0               0               0               0 
##    Epith.c.size     Bare.nuclei     Bl.cromatin Normal.nucleoli         Mitoses 
##               0              16               0               0               0 
##           Class 
##               0
# Menghapus Kolom Id (Identitas Observasi)
bc <- bc.raw
bc$Id <- NULL
# Menghapus Pengamatan dengan Missing Value
bc <- na.omit(bc)
# Mengubah Prediktor Menjadi Numerik
kolom.prediktor <- setdiff(names(bc), "Class")
bc[kolom.prediktor] <- lapply(bc[kolom.prediktor], function(x) {
  as.numeric(as.character(x))
})
# Menetapkan Urutan Kelas (benign sebagai Level Pertama)
bc$Class <- factor(as.character(bc$Class), levels = c("benign", "malignant"))
# Memeriksa Kembali Missing Value
colSums(is.na(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 
##               0               0               0               0               0
# Melihat Dimensi Data Setelah Preprocessing
dim(bc)
## [1] 683  10

Interpretasi: Terdapat 16 data kosong pada variabel Bare.nuclei. Data kosong ditangani menggunakan na.omit() sehingga tersisa 683 observasi dan 10 variabel (9 prediktor dan 1 respons) tanpa data kosong. Kolom Id dihapus karena hanya berfungsi sebagai identitas dan tidak memberikan informasi untuk klasifikasi.

4.1.3 Statistik Deskriptif

# 4. Eksplorasi Data
# Ringkasan Statistik Dataset
summary(bc)
##   Cl.thickness      Cell.size        Cell.shape     Marg.adhesion  
##  Min.   : 1.000   Min.   : 1.000   Min.   : 1.000   Min.   : 1.00  
##  1st Qu.: 2.000   1st Qu.: 1.000   1st Qu.: 1.000   1st Qu.: 1.00  
##  Median : 4.000   Median : 1.000   Median : 1.000   Median : 1.00  
##  Mean   : 4.442   Mean   : 3.151   Mean   : 3.215   Mean   : 2.83  
##  3rd Qu.: 6.000   3rd Qu.: 5.000   3rd Qu.: 5.000   3rd Qu.: 4.00  
##  Max.   :10.000   Max.   :10.000   Max.   :10.000   Max.   :10.00  
##   Epith.c.size     Bare.nuclei      Bl.cromatin     Normal.nucleoli
##  Min.   : 1.000   Min.   : 1.000   Min.   : 1.000   Min.   : 1.00  
##  1st Qu.: 2.000   1st Qu.: 1.000   1st Qu.: 2.000   1st Qu.: 1.00  
##  Median : 2.000   Median : 1.000   Median : 3.000   Median : 1.00  
##  Mean   : 3.234   Mean   : 3.545   Mean   : 3.445   Mean   : 2.87  
##  3rd Qu.: 4.000   3rd Qu.: 6.000   3rd Qu.: 5.000   3rd Qu.: 4.00  
##  Max.   :10.000   Max.   :10.000   Max.   :10.000   Max.   :10.00  
##     Mitoses             Class    
##  Min.   : 1.000   benign   :444  
##  1st Qu.: 1.000   malignant:239  
##  Median : 1.000                  
##  Mean   : 1.603                  
##  3rd Qu.: 1.000                  
##  Max.   :10.000
# Distribusi Kelas
table(bc$Class)
## 
##    benign malignant 
##       444       239
round(prop.table(table(bc$Class)), 4)
## 
##    benign malignant 
##    0.6501    0.3499

Interpretasi: Seluruh prediktor memiliki nilai minimum 1 dan maksimum 10. Rata-rata tertinggi terdapat pada Cl.thickness (4,442) dan Bare.nuclei (3,545), sedangkan rata-rata terendah terdapat pada Mitoses (1,603) dengan median 1. Distribusi kelas menunjukkan 444 observasi benign (65,0%) dan 239 observasi malignant (35,0%). Dengan demikian, data tidak seimbang sempurna sehingga evaluasi model tidak cukup hanya menggunakan Accuracy.

4.2 Pembagian Data Training dan Testing

4.2.1 Penentuan Variabel Respons dan Prediktor

# 5. Pemisahan Variabel Respons dan Prediktor
# Variabel Respons
Y <- bc$Class
# Variabel Prediktor
X <- bc[, names(bc) != "Class"]
# Memeriksa Tipe Data Variabel Respons
class(Y)
## [1] "factor"
levels(Y)
## [1] "benign"    "malignant"

Interpretasi: Variabel respons yang digunakan adalah Class dengan tipe factor dan dua level, yaitu benign dan malignant. Seluruh variabel lainnya menjadi prediktor. Karena benign berada pada level pertama, kelas malignant berperan sebagai kelas positif pada evaluasi.

4.2.2 Pembagian Data Training dan Testing

# 6. Pembagian Data Training dan Testing
set.seed(234)
train <- createDataPartition(
  Y,
  p = 0.7,
  list = FALSE
)
bc.train <- bc[train, ]
bc.test <- bc[-train, ]

# Memeriksa Dimensi Data Training dan Testing
dim(bc.train)
## [1] 479  10
dim(bc.test)
## [1] 204  10
# Distribusi Kelas Data Training dan Testing
table(bc.train$Class)
## 
##    benign malignant 
##       311       168
table(bc.test$Class)
## 
##    benign malignant 
##       133        71

Interpretasi: Data dibagi menjadi 70% data training sebanyak 479 observasi dan 30% data testing sebanyak 204 observasi. Data training terdiri atas 311 observasi benign dan 168 observasi malignant, sedangkan data testing terdiri atas 133 observasi benign dan 71 observasi malignant. Proporsi kedua kelas relatif terjaga pada kedua bagian data, dan data testing yang sama digunakan untuk membandingkan seluruh model.

4.3 Pembentukan Model Random Forest

4.3.1 Pembentukan Sembilan Model dan OOB Error

# 7. Pembentukan Model Random Forest
kombinasi <- expand.grid(
  mtry = c(2, 3, 5),
  num.trees = c(200, 500, 1000),
  KEEP.OUT.ATTRS = FALSE,
  stringsAsFactors = FALSE
)
nama.model <- paste0("mtry", kombinasi$mtry, "_trees", kombinasi$num.trees)

model.rf <- vector("list", nrow(kombinasi))
names(model.rf) <- nama.model

for (i in seq_len(nrow(kombinasi))) {
  model.rf[[i]] <- ranger(
    Class ~ .,
    data = bc.train,
    num.trees = kombinasi$num.trees[i],
    mtry = kombinasi$mtry[i],
    min.node.size = 1,
    replace = TRUE,
    sample.fraction = 1,
    importance = "permutation",
    seed = 234
  )
}

# Menyusun OOB Error Seluruh Model
hasil.oob <- data.frame(
  Model = nama.model,
  mtry = kombinasi$mtry,
  Num_Trees = kombinasi$num.trees,
  OOB_Error = sapply(model.rf, function(m) m$prediction.error),
  row.names = NULL
)
kable(hasil.oob, digits = 4,
      caption = "Perbandingan OOB Error pada Sembilan Model")
Perbandingan OOB Error pada Sembilan Model
Model mtry Num_Trees OOB_Error
mtry2_trees200 2 200 0.0292
mtry3_trees200 3 200 0.0271
mtry5_trees200 5 200 0.0292
mtry2_trees500 2 500 0.0292
mtry3_trees500 3 500 0.0292
mtry5_trees500 5 500 0.0292
mtry2_trees1000 2 1000 0.0292
mtry3_trees1000 3 1000 0.0271
mtry5_trees1000 5 1000 0.0271

Interpretasi: Nilai OOB error kesembilan model berkisar antara 0,0271 hingga 0,0292 (sekitar 2,71%–2,92%). OOB error terendah sebesar 0,0271 diperoleh pada mtry3_trees200, mtry3_trees1000, dan mtry5_trees1000, sedangkan enam konfigurasi lainnya bernilai 0,0292. Selisih antarmodel sangat kecil (sekitar satu observasi dari 479 data training) dan penambahan jumlah pohon tidak selalu menurunkan OOB error. Oleh karena itu, penentuan model terbaik tidak cukup hanya berdasarkan OOB error tetapi juga perlu mempertimbangkan metrik pada data testing.

4.3.2 Analisis Variable Importance

# 8. Analisis Variable Importance (Permutation)
importance.all <- bind_rows(lapply(names(model.rf), function(nm) {
  imp <- model.rf[[nm]]$variable.importance
  data.frame(
    Model = nm,
    Variabel = names(imp),
    Permutation_Importance = as.numeric(imp),
    row.names = NULL
  )
}))

# Variabel Terpenting pada Model mtry2_trees200
importance.all %>%
  filter(Model == "mtry2_trees200") %>%
  arrange(desc(Permutation_Importance))
##            Model        Variabel Permutation_Importance
## 1 mtry2_trees200     Bare.nuclei            0.083924522
## 2 mtry2_trees200       Cell.size            0.078718154
## 3 mtry2_trees200      Cell.shape            0.060967868
## 4 mtry2_trees200    Cl.thickness            0.024489152
## 5 mtry2_trees200     Bl.cromatin            0.021478062
## 6 mtry2_trees200 Normal.nucleoli            0.020446839
## 7 mtry2_trees200   Marg.adhesion            0.019251533
## 8 mtry2_trees200    Epith.c.size            0.011737675
## 9 mtry2_trees200         Mitoses            0.003751688
# Visualisasi Variable Importance Seluruh Model
ggplot(importance.all,
       aes(x = reorder(Variabel, Permutation_Importance),
           y = Permutation_Importance)) +
  geom_col() +
  coord_flip() +
  facet_wrap(~ Model) +
  labs(
    title = "Variable Importance pada Sembilan Model Random Forest",
    x = "Variabel",
    y = "Permutation Importance"
  ) +
  theme_minimal()

Interpretasi: Pada seluruh model, Bare.nuclei dan Cell.size selalu berada pada dua peringkat teratas, diikuti Cell.shape pada model dengan mtry 2 dan 3. Pada model mtry2_trees200, lima variabel terpenting adalah Bare.nuclei (0,0839), Cell.size (0,0787), Cell.shape (0,0610), Cl.thickness (0,0245), dan Bl.cromatin (0,0215), sedangkan Mitoses memiliki nilai terendah (0,0038). Pada model dengan mtry = 5, nilai Bare.nuclei lebih besar (sekitar 0,12) sedangkan nilai Cell.shape menurun (sekitar 0,04–0,05) meskipun tetap berada pada peringkat ketiga. Nilai yang lebih tinggi berarti pengacakan variabel tersebut menurunkan kinerja model lebih besar. Meskipun demikian, ukuran ini hanya menggambarkan kontribusi prediktif dalam model dan tidak menunjukkan hubungan sebab-akibat.

4.4 Evaluasi Model pada Data Testing

4.4.1 Confusion Matrix

# 9. Prediksi dan Confusion Matrix
hitung.evaluasi <- function(aktual, prediksi) {
  prediksi <- factor(as.character(prediksi), levels = c("benign", "malignant"))
  tab <- table(Aktual = aktual, Prediksi = prediksi)
  TN <- tab["benign", "benign"]
  FP <- tab["benign", "malignant"]
  FN <- tab["malignant", "benign"]
  TP <- tab["malignant", "malignant"]
  precision <- TP / (TP + FP)
  recall <- TP / (TP + FN)
  data.frame(
    TN = as.integer(TN), FP = as.integer(FP),
    FN = as.integer(FN), TP = as.integer(TP),
    Accuracy = (TP + TN) / sum(tab),
    Precision = precision,
    Recall = recall,
    Specificity = TN / (TN + FP),
    F1_Score = 2 * precision * recall / (precision + recall)
  )
}

hasil.metrik <- bind_rows(lapply(seq_along(model.rf), function(i) {
  pred <- predict(model.rf[[i]], data = bc.test)$predictions
  data.frame(
    Model = nama.model[i],
    mtry = kombinasi$mtry[i],
    Num_Trees = kombinasi$num.trees[i],
    hitung.evaluasi(bc.test$Class, pred)
  )
}))

# Confusion Matrix Seluruh Model
kable(hasil.metrik[, c("Model", "TN", "FP", "FN", "TP")],
      caption = "Confusion Matrix Seluruh Model (kelas positif: malignant)")
Confusion Matrix Seluruh Model (kelas positif: malignant)
Model TN FP FN TP
mtry2_trees200 130 3 1 70
mtry3_trees200 130 3 3 68
mtry5_trees200 129 4 4 67
mtry2_trees500 129 4 1 70
mtry3_trees500 130 3 3 68
mtry5_trees500 129 4 4 67
mtry2_trees1000 129 4 2 69
mtry3_trees1000 129 4 3 68
mtry5_trees1000 129 4 5 66

Interpretasi: Pada mtry2_trees200, sebanyak 130 observasi benign diklasifikasikan benar (TN) dan 3 observasi salah diklasifikasikan sebagai malignant (FP), sedangkan 70 observasi malignant diklasifikasikan benar (TP) dan hanya 1 observasi salah diklasifikasikan sebagai benign (FN). Jumlah FN terkecil (1 observasi) dicapai oleh mtry2_trees200 dan mtry2_trees500, sedangkan FN terbesar (5 observasi) terjadi pada mtry5_trees1000. Pada kasus kanker, FN merupakan kesalahan yang paling perlu dihindari karena kasus ganas yang tidak terdeteksi berpotensi terlambat ditangani.

4.4.2 Metrik Evaluasi

# 10. Metrik Evaluasi Data Testing
kable(hasil.metrik[, c("Model", "Accuracy", "Precision", "Recall",
                       "Specificity", "F1_Score")],
      digits = 4,
      caption = "Perbandingan Metrik Evaluasi pada Data Testing")
Perbandingan Metrik Evaluasi pada Data Testing
Model Accuracy Precision Recall Specificity F1_Score
mtry2_trees200 0.9804 0.9589 0.9859 0.9774 0.9722
mtry3_trees200 0.9706 0.9577 0.9577 0.9774 0.9577
mtry5_trees200 0.9608 0.9437 0.9437 0.9699 0.9437
mtry2_trees500 0.9755 0.9459 0.9859 0.9699 0.9655
mtry3_trees500 0.9706 0.9577 0.9577 0.9774 0.9577
mtry5_trees500 0.9608 0.9437 0.9437 0.9699 0.9437
mtry2_trees1000 0.9706 0.9452 0.9718 0.9699 0.9583
mtry3_trees1000 0.9657 0.9444 0.9577 0.9699 0.9510
mtry5_trees1000 0.9559 0.9429 0.9296 0.9699 0.9362

Interpretasi: Model mtry2_trees200 memperoleh Accuracy 0,9804 (98,04%), Precision 0,9589 (95,89%), Recall 0,9859 (98,59%), Specificity 0,9774 (97,74%), dan F1-score 0,9722 (97,22%), yang merupakan nilai tertinggi pada kelima metrik tersebut (Recall sama tinggi dengan mtry2_trees500, dan Specificity sama tinggi dengan mtry3_trees200 serta mtry3_trees500). Seluruh model memiliki Accuracy di atas 95% (0,9559–0,9804). Specificity relatif seragam (0,9699–0,9774), sedangkan Recall lebih bervariasi (0,9296–0,9859), sehingga perbedaan kinerja antarmodel terutama terletak pada kemampuan mendeteksi kasus malignant.

4.4.3 Perbandingan Kinerja Model

# 11. Visualisasi Perbandingan Metrik
kolom.metrik <- c("Accuracy", "Precision", "Recall", "Specificity", "F1_Score")
hasil.metrik$Konfigurasi <- paste0("mtry=", hasil.metrik$mtry,
                                   ", trees=", hasil.metrik$Num_Trees)

hasil.long <- pivot_longer(
  hasil.metrik,
  cols = all_of(kolom.metrik),
  names_to = "Metrik",
  values_to = "Nilai"
)

ggplot(hasil.long, aes(x = Konfigurasi, y = Nilai)) +
  geom_point(size = 2) +
  facet_wrap(~ Metrik, scales = "free_y") +
  labs(
    title = "Perbandingan Metrik Random Forest pada Data Testing",
    x = "Konfigurasi Model",
    y = "Nilai Metrik"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Interpretasi: Grafik memperlihatkan bahwa mtry2_trees200 berada pada posisi tertinggi untuk Accuracy, Precision, dan F1-score, serta sama tinggi untuk Recall. Konfigurasi dengan mtry = 5 cenderung menghasilkan nilai terendah, misalnya mtry5_trees1000 dengan Recall 0,9296 (92,96%) dan F1-score 0,9362 (93,62%). Selain itu, penambahan jumlah pohon dari 200 menjadi 1000 tidak meningkatkan kinerja; pada mtry = 2, Recall justru turun dari 0,9859 menjadi 0,9718. Hal ini menunjukkan bahwa jumlah pohon yang lebih banyak tidak selalu memperbaiki hasil klasifikasi.

4.5 Penentuan Model Terbaik

# 12. Peringkat Model (peringkat kecil = lebih baik)
peringkat <- hasil.metrik %>%
  left_join(hasil.oob %>% select(Model, OOB_Error), by = "Model") %>%
  mutate(
    Rank_Accuracy = rank(-Accuracy, ties.method = "min"),
    Rank_Precision = rank(-Precision, ties.method = "min"),
    Rank_Recall = rank(-Recall, ties.method = "min"),
    Rank_Specificity = rank(-Specificity, ties.method = "min"),
    Rank_F1 = rank(-F1_Score, ties.method = "min"),
    Rank_OOB = rank(OOB_Error, ties.method = "min"),
    Rata_Rata_Peringkat = (Rank_Accuracy + Rank_Precision + Rank_Recall +
                             Rank_Specificity + Rank_F1 + Rank_OOB) / 6
  ) %>%
  arrange(Rata_Rata_Peringkat, desc(Recall), OOB_Error)

kable(peringkat %>%
        select(Model, OOB_Error, starts_with("Rank_"), Rata_Rata_Peringkat),
      digits = 4,
      caption = "Peringkat Model Berdasarkan Metrik Testing dan OOB Error")
Peringkat Model Berdasarkan Metrik Testing dan OOB Error
Model OOB_Error Rank_Accuracy Rank_Precision Rank_Recall Rank_Specificity Rank_F1 Rank_OOB Rata_Rata_Peringkat
mtry2_trees200 0.0292 1 1 1 1 1 4 1.5000
mtry3_trees200 0.0271 3 2 4 1 4 1 2.5000
mtry2_trees500 0.0292 2 4 1 4 2 4 2.8333
mtry3_trees500 0.0292 3 2 4 1 4 4 3.0000
mtry2_trees1000 0.0292 3 5 3 4 3 4 3.6667
mtry3_trees1000 0.0271 6 6 4 4 6 1 4.5000
mtry5_trees200 0.0292 7 7 7 4 7 4 6.0000
mtry5_trees500 0.0292 7 7 7 4 7 4 6.0000
mtry5_trees1000 0.0271 9 9 9 4 9 1 6.8333
# Model Terbaik
model.terbaik <- peringkat$Model[1]
model.terbaik
## [1] "mtry2_trees200"

Interpretasi: Berdasarkan rata-rata peringkat enam ukuran (lima metrik testing dan OOB error), mtry2_trees200 menempati peringkat pertama dengan rata-rata 1,5. Model ini peringkat 1 pada Accuracy, Precision, Recall, Specificity, dan F1-score, tetapi hanya peringkat 4 pada OOB error (0,0292). Peringkat berikutnya adalah mtry3_trees200 (2,5) dan mtry2_trees500 (2,833). Dengan demikian, mtry2_trees200 dipilih sebagai model terbaik karena memiliki kinerja klasifikasi tertinggi pada data testing, terutama Recall terhadap kelas malignant sebesar 98,59%. Selisih OOB error terhadap model lain sangat kecil, sehingga tidak mengubah pilihan ini. Namun, hasil ini masih terbatas pada dataset dan satu kali pembagian data yang digunakan, sehingga diperlukan pengujian pada data independen apabila model akan diterapkan dalam konteks medis.

BAB V KESIMPULAN DAN SARAN

5.1 Kesimpulan

Random Forest merupakan metode ensemble yang menggabungkan banyak decision tree melalui pemilihan sampel dan fitur secara acak. Double Random Forest merupakan pengembangan metode Random Forest dengan dua tahap pemodelan. Kedua metode bertujuan menghasilkan prediksi yang akurat untuk klasifikasi dan regresi.

Penerapan Random Forest dan Double Random Forest dilakukan melalui persiapan data, pelatihan model, dan prediksi. Pada klasifikasi, model memprediksi kategori, sedangkan pada regresi model memprediksi nilai numerik. Hasil prediksi diperoleh berdasarkan mekanisme masing-masing algoritma.

Evaluasi klasifikasi menggunakan accuracy dan F1-score, sedangkan regresi menggunakan RMSE dan R^2. Out-of-Bag (OOB) eror digunakan untuk mengestimasi kesalahan prediksi model. Perbandingan kedua metode dilakukan berdasarkan hasil evaluasi untuk menentukan model dengan performa terbaik.

Model Random Forest pada dataset BreastCancer menggunakan 683 observasi dengan OOB error sebesar 0,0271–0,0292 dari sembilan kombinasi parameter. Model terbaik dengan mtry = 2 dan num.trees = 200 memperoleh Accuracy 98,04% dan F1-score 97,22%, dengan satu kasus malignant tidak terdeteksi. Variabel terpenting dalam model adalah Bare.nuclei, Cell.size, dan Cell.shape.

5.2 Saran

Penelitian selanjutnya disarankan untuk memperbaiki penulisan kode dan sintaks program agar terhindar dari kesalahan (error). Setiap tahapan analisis perlu diperiksa untuk memastikan proses berjalan sesuai prosedur. Selain itu, ketelitian dalam menjalankan dan mengevaluasi program perlu ditingkatkan agar hasil analisis lebih akurat.

DAFTAR PUSTAKA

  1. Fransiska, H. (2026). Modul praktikum machine learning and modern prediction: Pertemuan V Random Forest dan Double Random Forest. Laboratorium Matematika, Fakultas Matematika dan Ilmu Pengetahuan Alam, Universitas Bengkulu.
  2. Ilmi, I. N., Mustafid, & Suparti. (2025). Penerapan model regresi random forest untuk prediksi harga laptop berdasarkan fitur laptop. Jurnal Gaussian, 14(2), 269–279. https://doi.org/10.14710/j.gauss.14.2.269-279
  3. Jatmiko, Y. A., Padmadisastra, S., & Chadidjah, A. (2019). Analisis perbandingan kinerja CART konvensional, bagging dan random forest pada klasifikasi objek: Hasil dari dua simulasi. Media Statistika, 12(1), 1–12. https://doi.org/10.14710/medstat.12.1.1-12
  4. Khairunnisa, A., Notodiputro, K. A., & Sartono, B. (2024). A Comparative Study of Random Forest and Double Random Forest Models from View Points of Their Interpretability. Scientific Journal of Informatics, 11(1)
  5. Lestari, T. S., & Sirodj, D. A. N. (2021). Klasifikasi penipuan transaksi kartu kredit menggunakan metode random forest. Jurnal Riset Statistika, 1(2), 160–167. https://doi.org/10.29313/jrs.v1i2.525
  6. Mutoffar, M. M., Naseer, M., & Fadillah, A. (2022). Klasifikasi Kualitas Air Sumur Menggunakan Algoritma Random Forest. Naratif: Jurnal Nasional Riset, Aplikasi dan Teknik Informatika, 4(2).

.