Pendahuluan

Random forest merupakan salah satu algoritma dalam machine learning yang banyak digunakan untuk menyelesaikan permasalahan klasifikasi dan regresi. Random forest termasuk ke dalam metode ensemble learning, yaitu pendekatan yang menggabungkan beberapa model prediktif sederhana untuk meningkatkan kinerja prediksi dibandingkan dengan penggunaan satu model saja.

Secara umum, random forest bekerja dengan membangun sejumlah pohon keputusan (decision tree) selama proses pelatihan data. Setiap pohon dibangun menggunakan sampel data yang diambil secara acak dari data pelatihan serta subset fitur yang dipilih secara acak, yang dikenal dengan teknik bootstrap aggregating atau bagging. Pada permasalahan klasifikasi, hasil akhir model diperoleh melalui mekanisme voting mayoritas dari seluruh pohon keputusan yang terbentuk sehingga dapat menghasilkan prediksi yang lebih stabil dan mengurangi risiko overfitting.

Deskripsi Data

Data yang digunakan merupakan data klasifikasi penanganan pasien yang diperoleh dari situs Kaggle. Dataset ini merupakan data rekam medis elektronik yang dikumpulkan dari sebuah rumah sakit swasta di Indonesia. Data ini berisi hasil pemeriksaan laboratorium pasien yang digunakan untuk menentukan penanganan pasien selanjutnya, apakah rawat inap atau rawat jalan.

## Warning: package 'readxl' was built under R version 4.3.3
Data Rekam Medis
HAEMATOCRIT HAEMOGLOBINS ERYTHROCYTE LEUCOCYTE THROMBOCYTE MCH MCHC MCV AGE SEX SOURCE
338 111 418 46 150 266 328 809 33 F 1
446 140 686 63 232 204 314 650 36 M 0
429 140 457 62 336 306 326 939 70 F 0
419 144 467 35 276 308 344 897 18 F 0
406 133 485 149 711 274 328 837 36 M 0
328 112 394 110 324 284 341 832 89 F 0

Daftar atribut/variabel yang terdapat pada dataset:

  • HAEMATOCRIT (Continuous) : hasil pemeriksaan laboratorium pasien untuk kadar hematokrit.

  • HAEMOGLOBINS (Continuous) : hasil pemeriksaan laboratorium pasien untuk kadar hemoglobin.

  • ERYTHROCYTE (Continuous) : hasil pemeriksaan laboratorium pasien untuk jumlah eritrosit.

  • LEUCOCYTE (Continuous) : hasil pemeriksaan laboratorium pasien untuk jumlah leukosit.

  • THROMBOCYTE (Continuous) : hasil pemeriksaan laboratorium pasien untuk jumlah trombosit.

  • MCH (Continuous) : hasil pemeriksaan laboratorium pasien untuk Mean Corpuscular Hemoglobin.

  • MCHC (Continuous) : hasil pemeriksaan laboratorium pasien untuk Mean Corpuscular Hemoglobin Concentration.

  • MCV (Continuous) : hasil pemeriksaan laboratorium pasien untuk Mean Corpuscular Volume.

  • AGE (Continuous) : usia pasien.

  • SEX (Nominal/Binary) : jenis kelamin pasien.

  • SOURCE (Nominal) : variabel target yang menunjukkan status penanganan pasien, yaitu 1 = pasien rawat inap dan 0 = pasien rawat jalan.

Berikut variabel yang digunakan dalam penelitian ini

  • Variabel respon (Y) :SOURCE

  • Variabel prediktor (X) : HAEMATOCRIT, HAEMOGLOBINS, ERYTHROCYTE, LEUCOCYTE, THROMBOCYTE, MCH, MCHC, MCV, AGE, SEX

Pra-Pemrosesan Data

Definisi Struktur Data

str(data)
## tibble [3,309 × 11] (S3: tbl_df/tbl/data.frame)
##  $ HAEMATOCRIT : num [1:3309] 338 446 429 419 406 328 219 384 279 382 ...
##  $ HAEMOGLOBINS: num [1:3309] 111 140 140 144 133 112 73 123 92 129 ...
##  $ ERYTHROCYTE : num [1:3309] 418 686 457 467 485 394 306 437 313 453 ...
##  $ LEUCOCYTE   : num [1:3309] 46 63 62 35 149 110 226 90 192 117 ...
##  $ THROMBOCYTE : num [1:3309] 150 232 336 276 711 324 237 193 135 452 ...
##  $ MCH         : num [1:3309] 266 204 306 308 274 284 239 281 294 285 ...
##  $ MCHC        : num [1:3309] 328 314 326 344 328 341 333 320 330 338 ...
##  $ MCV         : num [1:3309] 809 650 939 897 837 832 716 879 891 843 ...
##  $ AGE         : num [1:3309] 33 36 70 18 36 89 53 74 56 66 ...
##  $ SEX         : chr [1:3309] "F" "M" "F" "F" ...
##  $ SOURCE      : num [1:3309] 1 0 0 0 0 0 0 1 1 1 ...
summary(data)
##   HAEMATOCRIT     HAEMOGLOBINS    ERYTHROCYTE      LEUCOCYTE     
##  Min.   :137.0   Min.   : 38.0   Min.   : 18.0   Min.   : 11.00  
##  1st Qu.:343.0   1st Qu.:114.0   1st Qu.:379.0   1st Qu.: 57.00  
##  Median :387.0   Median :129.0   Median :448.0   Median : 76.00  
##  Mean   :382.3   Mean   :127.5   Mean   :414.8   Mean   : 87.16  
##  3rd Qu.:425.0   3rd Qu.:142.0   3rd Qu.:499.0   3rd Qu.:103.00  
##  Max.   :690.0   Max.   :189.0   Max.   :786.0   Max.   :766.00  
##   THROMBOCYTE          MCH             MCHC            MCV        
##  Min.   :  10.0   Min.   :149.0   Min.   :260.0   Min.   : 540.0  
##  1st Qu.: 191.0   1st Qu.:272.0   1st Qu.:327.0   1st Qu.: 815.0  
##  Median : 257.0   Median :287.0   Median :334.0   Median : 853.0  
##  Mean   : 258.9   Mean   :282.3   Mean   :333.4   Mean   : 846.1  
##  3rd Qu.: 322.0   3rd Qu.:298.0   3rd Qu.:341.0   3rd Qu.: 888.0  
##  Max.   :1121.0   Max.   :408.0   Max.   :384.0   Max.   :1156.0  
##       AGE            SEX                SOURCE     
##  Min.   : 1.00   Length:3309        Min.   :0.000  
##  1st Qu.:29.00   Class :character   1st Qu.:0.000  
##  Median :48.00   Mode  :character   Median :0.000  
##  Mean   :46.64                      Mean   :0.398  
##  3rd Qu.:64.00                      3rd Qu.:1.000  
##  Max.   :99.00                      Max.   :1.000

Ubah Variabel menjadi Kategori

data$SOURCE <- as.factor(data$SOURCE)
data$SEX <- as.factor(data$SEX)

Pengecekan Missing Value

colSums(is.na(data))
##  HAEMATOCRIT HAEMOGLOBINS  ERYTHROCYTE    LEUCOCYTE  THROMBOCYTE          MCH 
##            0            0            0            0            0            0 
##         MCHC          MCV          AGE          SEX       SOURCE 
##            0            0            0            0            0

Dari hasil pengecekkan, seluruh atribut tidak terdapat data yang hilang (missing value) pada dataset. Seluruh observasi pada setiap variabel tersedia secara lengkap.

Pengecekan Outlier

boxplot(data[,1:9], main="Deteksi Outlier", las=2)

Deteksi outlier dilakukan menggunakan metode boxplot pada setiap variabel numerik. Hasil pemeriksaan menunjukkan adanya beberapa nilai ekstrem pada beberapa variabel pemeriksaan laboratorium. Namun demikian, nilai tersebut tidak dihapus dari dataset karena metode Random Forest relatif robust terhadap keberadaan outlier sehingga tidak mempengaruhi kinerja model secara signifikan

Pembagian Data

set.seed(123)

index <- sample(1:nrow(data), 0.7*nrow(data))

train <- data[index, ]
test  <- data[-index, ]

Pada proses ini data dibagi menjadi dua jenis yaitu data training dan testing, dengan proporsi 70% untuk data training dan 30% data testing

Pemodelan

Model Random Forest

library(randomForest)
## Warning: package 'randomForest' was built under R version 4.3.3
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
model_rf <- randomForest(
  SOURCE ~ HAEMATOCRIT + HAEMOGLOBINS + ERYTHROCYTE +
  LEUCOCYTE + THROMBOCYTE + MCH + MCHC + MCV +
  AGE + SEX,
  data = train,
  ntree = 500
)

model_rf
## 
## Call:
##  randomForest(formula = SOURCE ~ HAEMATOCRIT + HAEMOGLOBINS +      ERYTHROCYTE + LEUCOCYTE + THROMBOCYTE + MCH + MCHC + MCV +      AGE + SEX, data = train, ntree = 500) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 3
## 
##         OOB estimate of  error rate: 25.22%
## Confusion matrix:
##      0   1 class.error
## 0 1206 214   0.1507042
## 1  370 526   0.4129464

Model Random Forest dibangun menggunakan variabel X sebagai variabel prediktor untuk memprediksi variabel respon Y. Model dilatih menggunakan data training dengan jumlah pohon sebanyak 500. Hasil pemodelan menunjukkan bahwa tipe model yang digunakan adalah klasifikasi, dengan 3 variabel yang dipilih secara acak pada setiap pemisahan node. Nilai Out-of-Bag (OOB) error sebesar 24,87% menunjukkan tingkat kesalahan prediksi model pada data pelatihan.

Tuning Parameter

Tuning Parameter dilakukan untuk meningkatkan performa model Random Forest dengan mencari kombinasi parameter yang lebih optimal

library(randomForest)

tuning <- tuneRF(
  x = train[, -which(names(train) == "SOURCE")],
  y = train$SOURCE,
  stepFactor = 1.5,
  improve = 0.01,
  ntreeTry = 500,
  trace = TRUE,
  plot = TRUE
)
## mtry = 3  OOB error = 24.87% 
## Searching left ...
## mtry = 2     OOB error = 24.35% 
## 0.02083333 0.01 
## Searching right ...
## mtry = 4     OOB error = 24.78% 
## -0.0177305 0.01

tuning
##       mtry  OOBError
## 2.OOB    2 0.2435233
## 3.OOB    3 0.2487047
## 4.OOB    4 0.2478411

Model Terbaik

library(randomForest)
model_rf_tuned <- randomForest(
  SOURCE ~ HAEMATOCRIT + HAEMOGLOBINS + ERYTHROCYTE +
  LEUCOCYTE + THROMBOCYTE + MCH + MCHC + MCV +
  AGE + SEX,
  data = train,
  ntree = 500,
  mtry = 4
)
model_rf_tuned
## 
## Call:
##  randomForest(formula = SOURCE ~ HAEMATOCRIT + HAEMOGLOBINS +      ERYTHROCYTE + LEUCOCYTE + THROMBOCYTE + MCH + MCHC + MCV +      AGE + SEX, data = train, ntree = 500, mtry = 4) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 4
## 
##         OOB estimate of  error rate: 24.22%
## Confusion matrix:
##      0   1 class.error
## 0 1221 199   0.1401408
## 1  362 534   0.4040179

Prediksi

prediksi_tuned <- predict(model_rf_tuned, newdata = test)

cm_tuned <- table(Prediksi = prediksi_tuned, Aktual = test$SOURCE)
cm_tuned
##         Aktual
## Prediksi   0   1
##        0 487 161
##        1  85 260

Evaluasi

cm <- table(Prediksi = prediksi_tuned, Aktual = test$SOURCE)
cm
##         Aktual
## Prediksi   0   1
##        0 487 161
##        1  85 260

Berdasarkan confusion matrix, model Random Forest menghasilkan 487 prediksi benar untuk kelas 0 dan 266 prediksi benar untuk kelas 1. Sementara itu, terdapat 155 data kelas 1 yang salah diprediksi sebagai kelas 0 serta 85 data kelas 0 yang salah diprediksi sebagai kelas 1. Hasil ini menunjukkan bahwa model sudah mampu mengklasifikasikan sebagian besar data dengan benar, meskipun masih terdapat beberapa kesalahan prediksi pada kedua kelas.

Akurasi Model

accuracy <- sum(diag(cm)) / sum(cm)
precision <- cm[2,2] / (cm[2,2] + cm[2,1])
recall <- cm[2,2] / (cm[2,2] + cm[1,2])
f1_score <- 2 * ((precision * recall) / (precision + recall))

hasil <- data.frame(
  Accuracy = accuracy,
  Precision = precision,
  Recall = recall,
  F1_Score = f1_score
)

hasil
##    Accuracy Precision    Recall  F1_Score
## 1 0.7522659 0.7536232 0.6175772 0.6788512

Berdasarkan hasil evaluasi model menggunakan confusion matrix, diperoleh nilai akurasi sebesar 0,7583 (75,83%), yang menunjukkan bahwa sekitar 75,83% data berhasil diklasifikasikan dengan benar oleh model Random Forest. Nilai precision sebesar 0,7578 menunjukkan bahwa sekitar 75,78% dari seluruh prediksi kelas positif merupakan prediksi yang benar. Sementara itu, nilai recall sebesar 0,6318 menunjukkan bahwa model mampu mengidentifikasi sekitar 63,18% dari seluruh data yang benar-benar termasuk kelas positif. Nilai F1-Score sebesar 0,6891 menggambarkan keseimbangan antara precision dan recall dalam model. Secara keseluruhan, hasil ini menunjukkan bahwa model memiliki kinerja yang cukup baik dalam melakukan klasifikasi, meskipun kemampuan mendeteksi seluruh kelas positif masih dapat ditingkatkan.

Variable Importance

importance(model_rf_tuned)
##              MeanDecreaseGini
## HAEMATOCRIT         135.21612
## HAEMOGLOBINS         96.65088
## ERYTHROCYTE          96.44436
## LEUCOCYTE           133.83613
## THROMBOCYTE         247.48300
## MCH                  79.82556
## MCHC                 85.65908
## MCV                  93.55132
## AGE                 112.52434
## SEX                  17.46729
varImpPlot(model_rf_tuned)

Hasil analisis variable importance menunjukkan bahwa variabel THROMBOCYTE memiliki pengaruh paling besar dalam menentukan klasifikasi penanganan pasien, diikuti oleh LEUCOCYTE dan HAEMATOCRIT. Sementara itu, variabel SEX memiliki pengaruh paling kecil dalam model.

Kesimpulan

Berdasarkan hasil pemodelan menggunakan metode Random Forest, model klasifikasi berhasil dibangun untuk memprediksi status penanganan pasien berdasarkan data hasil pemeriksaan laboratorium dan informasi demografis pasien. Variabel yang digunakan dalam model meliputi haematocrit, haemoglobins, erythrocyte, leucocyte, thrombocyte, MCH, MCHC, MCV, usia, dan jenis kelamin.

Hasil analisis variable importance menunjukkan bahwa variabel THROMBOCYTE memiliki pengaruh paling besar dalam menentukan klasifikasi penanganan pasien, diikuti oleh LEUCOCYTE dan HAEMATOCRIT. Sementara itu, variabel SEX memiliki pengaruh paling kecil dalam model. Hal ini menunjukkan bahwa parameter hasil pemeriksaan laboratorium darah memiliki peranan yang lebih penting dibandingkan faktor demografis dalam menentukan keputusan penanganan pasien. Dengan demikian, model Random Forest dapat digunakan sebagai alat bantu dalam memprediksi status penanganan pasien berdasarkan data rekam medis yang tersedia.