Overview

Untuk pembahasan mengenai Prediksi Kelulusan Peserta UTBK 2019 Soshum dapat dilihat disini.

Sekilas UTBK

Ujian Tulis Berbasis Komputer (UTBK) merupakan ujian masuk Perguruan Tinggi Negeri yang diadakan oleh Lembaga Tes masuk Perguruan Tinggi (LTMPT) Kementrian Riset, Teknologi dan Pendidikan Tinggi (Ristekdikti). UTBK dapat diikuti oleh siswa lulusan tahun yang sama dengan pelaksanaan UTBK hingga 2 tahun setelah kelulusan pendidikan SMA/MA/SMK dan sederajat. Nilai yang didapatkan dari UTBK kemudian digunakan untuk mengikuti Seleksi Bersama Masuk Perguruan Tinggi Negeri (SBMPTN).

Berbagai lembaga bimbel dan media edukasi setiap tahunnya memiliki program Prediksi kelulusan SBMPTN. Prediksi ini dibuat berdasarka data rill yang diperoleh di tahun sebelumnya. Pada kesempatan kali ini penulis mencoba membuat model klasifikasi kelulusan peserta UTBK 2019.

Library dan Setup

library(readxl) #Untuk read data excel
library(tidyverse) #Untuk data pre-processing
library(caret) #Untuk pembentukan confusion matrix dan sampling
library(e1071) #Untuk pembentukan model naive bayes
library(partykit) #Untuk pembentukan model decision tree
library(randomForest) #Untuk pembentukan model random forest

Preparasi Data

# Membaca data
saintek <- read_xlsx("UTBKClass.xlsx", sheet = "Saintek")

Dataset UTBKClass berisikan daftar nilai dari peserta UTBK 2019 beserta pilihan program studi yang dipilih. Dataset terbagi menjadi dua data frame, yaitu saintek sebanyak 86569 peserta. Berikut spesifikasi setiap kolom yang terdapat pada dataset :

index, merupakan nomor urut baris yang dimulai dari 0 sampai (n-1) baris.

id_first_major, merupakan kode program studi pilihan pertama peserta.

first_major, merupakan nama program studi pilihan pertama peserta.

capacity_first_major, merupakan daya tampung program studi pilihan pertama peserta yang dapat diterima.

id_first_university, merupakan kode Perguruan Tinggi Negeri pilihan pertama peserta.

first_university, merupakan nama Perguruan Tinggi Negeri pilihan pertama peserta.

id_second_major, merupakan kode program studi pilihan kedua peserta.

second_major, merupakan nama program studi pilihan kedua peserta.

capacity_second_major, merupakan daya tampung program studi pilihan kedua peserta yang dapat diterima.

id_second_university, merupakan kode Perguruan Tinggi Negeri pilihan kedua peserta.

second_university, merupakan nama Perguruan Tinggi Negeri pilihan kedua peserta.

id_user, merupakan nomor urut peserta (digabung dengan peserta soshum)

score_bio, merupakan nilai mata ujian Biologi user.

score_fis, merupakan nilai mata ujian Fisika user.

score_kim, merupakan nilai mata ujian Kimia user.

score_kmb, merupakan nilai mata ujian Kemampuan Memahami Bacaan & Menulis user.

score_kpu, merupakan nilai mata ujian Kemampuan Penalaran Umum user.

score_kua, merupakan nilai mata ujian Kemampuan Kuantitatif user.

score_mat, merupakan nilai mata ujian Matematika Saintek user.

score_ppu, merupakan nilai mata ujian Pengetahuan & Pemahaman Umum user.

pass_university, merupakan keputusan apakah dinyatakan berhasil atau gagal dari SBMPTN.

dari semua kolom yang terdapat pada dataframe, yang akan digunakan sebagai data pembuatan model terdapat pada kolom berbagai macam skor serta kolom pass_university. untuk itu diperlukan tahapan persiapan data sebelum melakukan pemodelan.

# Cek Missing Value
anyNA(saintek)
## [1] FALSE

Dataset tidak memiliki missing value di setiap selnya, sehingga tidak perlu dilakukan pembersihan data.

Kolom yang digunakan pada pembuatan model hanya kolom yang berisikan berbagai macam skor serta keputusan kelulusan setiap peserta. Kolom lainnya yang tidak terpakai dapat dibuang.

# Data Pre-Processing
saintek <- saintek %>% 
  select(c(score_bio , score_fis , score_kim , score_mat , score_kmb , score_kpu , score_kua , score_ppu, pass_university)) %>% 
  mutate(pass_university = as.factor(pass_university))

head(saintek)

Untuk melihat performa model maka data dibagi menjadi dua subset yaitu data train dan data test. Data train nantinya akan digunakan untuk melatih model, sementara data test digunakan sebagai data prediksi yang merupakan objek baru pada model yang telah dibentuk.

# Split Data Train - Data Test
RNGkind(sample.kind = "Rounding")
set.seed(100)
row_data <- nrow(saintek)

# sampel dan ambil 80% data secara acak
index <- sample(row_data, row_data*0.8)

saintek_train <- saintek[ index, ]
saintek_test <- saintek[ -index, ]

levels(saintek$pass_university)
## [1] "fail" "pass"
# Cek kesiapan data
prop.table(table(saintek_train$pass_university))
## 
##       fail       pass 
## 0.91372464 0.08627536

Dikarenakan data memiliki proporsi kelulusan yang tidak seimbang, maka data diperlukan teknik upsampling untuk level “pass” agar proporsi data menjadi seimbang dan model dapat belajar dari data tersebut.

set.seed(123)
saintek_train_up <- upSample(x = saintek_train %>% select(-pass_university),
                            y = saintek_train$pass_university,
                            list = FALSE,
                            yname = "pass_university")

prop.table(table(saintek_train_up$pass_university))
## 
## fail pass 
##  0.5  0.5

Proporsi data kini telah seimbang antara level fail dan pass. Model siap dibentuk dengan data yang diolah sebelumnya.

Model Naive Bayes

Naive Bayes memanfaatkan Teorema Bayes dalam pembentukan model klasifikasi. Selain itu, model Naive Bayes yang dibentuk memiliki karakteristik antara prediktor dan target memiliki sifat dependen namun setiap prediktornya memiliki sifat saling independen.

# Membuat model Naive Bayes
model_nb <- naiveBayes(x = saintek_train %>% select(-pass_university),
                       y = saintek_train$pass_university,
                       laplace = 1)
model_nb
## 
## Naive Bayes Classifier for Discrete Predictors
## 
## Call:
## naiveBayes.default(x = saintek_train %>% select(-pass_university), 
##     y = saintek_train$pass_university, laplace = 1)
## 
## A-priori probabilities:
## saintek_train$pass_university
##       fail       pass 
## 0.91372464 0.08627536 
## 
## Conditional probabilities:
##                              score_bio
## saintek_train$pass_university     [,1]     [,2]
##                          fail 526.4045 89.96135
##                          pass 651.9587 90.50404
## 
##                              score_fis
## saintek_train$pass_university     [,1]     [,2]
##                          fail 528.1045 95.12430
##                          pass 662.2196 96.08921
## 
##                              score_kim
## saintek_train$pass_university     [,1]      [,2]
##                          fail 529.7882 102.41800
##                          pass 702.3441  94.70527
## 
##                              score_mat
## saintek_train$pass_university     [,1]      [,2]
##                          fail 520.0802  93.59137
##                          pass 628.8521 102.88758
## 
##                              score_kmb
## saintek_train$pass_university     [,1]     [,2]
##                          fail 556.8317 91.77832
##                          pass 663.0946 73.87860
## 
##                              score_kpu
## saintek_train$pass_university     [,1]     [,2]
##                          fail 559.9052 86.70199
##                          pass 676.9120 64.32616
## 
##                              score_kua
## saintek_train$pass_university     [,1]      [,2]
##                          fail 554.7757 102.16802
##                          pass 722.8365  83.71884
## 
##                              score_ppu
## saintek_train$pass_university     [,1]     [,2]
##                          fail 538.3376 86.20027
##                          pass 612.6531 69.49652

Beberapa hal yang dapat diinterpretasikan melalui pemodelan di atas diantaranya yaitu :

  1. Peserta UTBK Saintek 2019 yang lulus hanya memiliki persentase sebanyak 8.6 % dari keseluruhan peserta UTBK Saintek.
  2. Setiap mata ujian memiliki nilai aman yang mengisyaratkan bahwa setiap peserta yang ingin mendapatkan kelulusan UTBK diharapkan memiliki nilai diatas minimum model, seperti skor biologi sebesar 651.9587 (lihat bagian score_bio di sel pass) serta berbagai macam mata ujian lainnya.

Selanjutnya model dikenakan 2 data baru dalam melakukan prediksi, yaitu :

  1. Data train untuk cek performa model.
  2. Data test untuk memprediksi data baru.
# Prediksi performa model Naive Bayes dengan Data Train
perform_nb <- predict(object = model_nb,
                      newdata = saintek_train, 
                      type = "class")
head(perform_nb)
## [1] fail fail fail fail fail pass
## Levels: fail pass
# Prediksi dari model Naive Bayes dengan Data Test
predict_nb <- predict(object = model_nb,
                      newdata = saintek_test, 
                      type = "class")
head(predict_nb)
## [1] pass pass fail fail fail fail
## Levels: fail pass

Threshold yang digunakan pada prediksi yaitu treshold bawaan R sebesar 0.5 (jika peluang > 0.5 maka dianggap pass dan jika dibawah 0.5 maka dianggap fail)

Model Decision Tree

Decision Tree menggunakan konsep tree-based model dalam membangun model dan prediksi. Konsep yang digunakan dapat menghasilkan model yang baik serta mudah untuk diinterpretasikan.

# Membuat model Decision Tree
model_dt <- ctree(formula = pass_university ~.,                      
                    data = saintek_train_up)
# Prediksi performa model Decision Tree dengan Data Train
perform_dt <- predict(object = model_dt,
                      newdata = saintek_train, 
                      type = "response")
head(perform_dt)
##    1    2    3    4    5    6 
## fail fail fail pass fail fail 
## Levels: fail pass
# Prediksi dari model Decision Tree dengan Data Test
predict_dt <- predict(object = model_dt,
                      newdata = saintek_test, 
                      type = "response")
head(predict_dt)
##    1    2    3    4    5    6 
## pass fail fail fail fail fail 
## Levels: fail pass

Model Random Forest

Singkatnya, model Random Forest dibentuk dari gabungan Decision Tree yang dimana setiap Decision Tree memiliki karakteristik masing-masing dan tidak saling berhubungan. Model ini biasanya digunakan ketika prediktor yang dipakai untuk membuat model memiliki tipe data gabungan numerik dan faktor.

# Membuat model Random Forest

# set.seed(100)
#
# ctrl <- trainControl(method = "repeatedcv",
#                      number = 4, # banyaknya k-fold
#                      repeats = 3) # repetisi
#  
# model_rf <- train(pass_university ~ .,
#                    data = saintek_train_up,
#                    method = "rf", # random forest
#                    trControl = ctrl)
# 
# model_rf
# 
# saveRDS(model_rf, "model_rf.RDS") # simpan model

Catatan : Chunk di atas sengaja diberi tanda comment karena pemodelan Random Forest membutuhkan waktu yang relatif lama dibanding kedua model sebelumnya.

# Hasil model Random Forest
model_rf <- readRDS("model_rf.RDS")
model_rf
## Random Forest 
## 
## 126560 samples
##      8 predictor
##      2 classes: 'fail', 'pass' 
## 
## No pre-processing
## Resampling: Cross-Validated (4 fold, repeated 3 times) 
## Summary of sample sizes: 94920, 94920, 94920, 94920, 94920, 94920, ... 
## Resampling results across tuning parameters:
## 
##   mtry  Accuracy   Kappa    
##   2     0.9955647  0.9911294
##   5     0.9943900  0.9887800
##   8     0.9933260  0.9866519
## 
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was mtry = 2.
# Prediksi performa model Random Forest dengan Data Train
perform_rf <- predict(object = model_rf,
                      newdata = saintek_train, 
                      type = "raw")
head(perform_dt)
##    1    2    3    4    5    6 
## fail fail fail pass fail fail 
## Levels: fail pass
# Prediksi dari model Random Forest dengan Data Test
predict_rf <- predict(model_rf, saintek_test, type = "raw")
head(predict_rf)
## [1] pass fail fail fail fail fail
## Levels: fail pass

Evaluasi Model

Evaluasi model diperlukan guna menilai seberapa baik model yang telah dibuat.Metriks yang digunakan dalam mengevaluasi model yaitu Akurasi dan Sensitivitas / Recall.

Akurasi : menunjukkan berapa persen dari semua data yang berhasil diprediksi dengan tepat. Dalam hal ini model dapat memprediksi kelulusan atau gagalnya peserta dengan baik.

Sensitivitas / Recall : menunjukkan berapa persen yang diprediksi sebagai positif. Dalam hal ini model dapat memprediksi seberapa besar presentase siswa yang dinyatakan gagal dan tidak ada kelulusan semu (false negative) oleh model.

Evaluasi Model Naive Bayes

Performa Model

# Cek performa model naive Bayes
confusionMatrix(perform_nb, saintek_train$pass_university, positive = "fail")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  fail  pass
##       fail 60790    41
##       pass  2490  5934
##                                          
##                Accuracy : 0.9635         
##                  95% CI : (0.962, 0.9648)
##     No Information Rate : 0.9137         
##     P-Value [Acc > NIR] : < 2.2e-16      
##                                          
##                   Kappa : 0.8045         
##                                          
##  Mcnemar's Test P-Value : < 2.2e-16      
##                                          
##             Sensitivity : 0.9607         
##             Specificity : 0.9931         
##          Pos Pred Value : 0.9993         
##          Neg Pred Value : 0.7044         
##              Prevalence : 0.9137         
##          Detection Rate : 0.8778         
##    Detection Prevalence : 0.8784         
##       Balanced Accuracy : 0.9769         
##                                          
##        'Positive' Class : fail           
## 

Prediksi Model

# Cek keakuratan prediksi model naive Bayes
confusionMatrix(predict_nb, saintek_test$pass_university, positive = "fail")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  fail  pass
##       fail 15225    11
##       pass   650  1428
##                                           
##                Accuracy : 0.9618          
##                  95% CI : (0.9589, 0.9646)
##     No Information Rate : 0.9169          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.7916          
##                                           
##  Mcnemar's Test P-Value : < 2.2e-16       
##                                           
##             Sensitivity : 0.9591          
##             Specificity : 0.9924          
##          Pos Pred Value : 0.9993          
##          Neg Pred Value : 0.6872          
##              Prevalence : 0.9169          
##          Detection Rate : 0.8793          
##    Detection Prevalence : 0.8800          
##       Balanced Accuracy : 0.9757          
##                                           
##        'Positive' Class : fail            
## 

Resume dari model Naive Bayes dapat dilihat pada data berikut:

# Resume model Naive Bayes
resume_nb <- data.frame(Prediksi = c("Data Train", "Data Test"),
                        Akurasi = c(0.9635, 0.9618),
                        Recall = c(0.9607, 0.9591))
resume_nb

Evaluasi Model Decision Tree

Performa Model

# Cek performa model Decision Tree
confusionMatrix(perform_dt, saintek_train$pass_university, positive = "fail")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  fail  pass
##       fail 62100    24
##       pass  1180  5951
##                                           
##                Accuracy : 0.9826          
##                  95% CI : (0.9816, 0.9836)
##     No Information Rate : 0.9137          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.8986          
##                                           
##  Mcnemar's Test P-Value : < 2.2e-16       
##                                           
##             Sensitivity : 0.9814          
##             Specificity : 0.9960          
##          Pos Pred Value : 0.9996          
##          Neg Pred Value : 0.8345          
##              Prevalence : 0.9137          
##          Detection Rate : 0.8967          
##    Detection Prevalence : 0.8970          
##       Balanced Accuracy : 0.9887          
##                                           
##        'Positive' Class : fail            
## 

Prediksi Model

# Cek keakuratan prediksi model Decision Tree
confusionMatrix(predict_dt, saintek_test$pass_university, positive = "fail")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  fail  pass
##       fail 15414   162
##       pass   461  1277
##                                           
##                Accuracy : 0.964           
##                  95% CI : (0.9611, 0.9667)
##     No Information Rate : 0.9169          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.7843          
##                                           
##  Mcnemar's Test P-Value : < 2.2e-16       
##                                           
##             Sensitivity : 0.9710          
##             Specificity : 0.8874          
##          Pos Pred Value : 0.9896          
##          Neg Pred Value : 0.7348          
##              Prevalence : 0.9169          
##          Detection Rate : 0.8903          
##    Detection Prevalence : 0.8996          
##       Balanced Accuracy : 0.9292          
##                                           
##        'Positive' Class : fail            
## 

Resume dari model Decision Tree dapat dilihat pada data berikut:

# Resume model Decision Tree
resume_dt <- data.frame(Prediksi = c("Data Train", "Data Test"),
                        Akurasi = c(0.9826, 0.964),
                        Recall = c(0.9814, 0.9710))
resume_dt

Evaluasi Random Forest

Performa Model

# Hasil akhir model Random Forest
model_rf$finalModel
## 
## Call:
##  randomForest(x = x, y = y, mtry = param$mtry) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 2
## 
##         OOB estimate of  error rate: 0.32%
## Confusion matrix:
##       fail  pass class.error
## fail 62875   405 0.006400126
## pass     0 63280 0.000000000

Nilai OOB menunjukkan nilai error yang dihasilkan oleh model Random Forest. Nilai OOB sebesar 0.32 % menandakan model yang dibentuk memiliki keakuratan yang sangat tinggi.

# Cek performa model Random Forest
confusionMatrix(perform_rf, saintek_train$pass_university, positive = "fail")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  fail  pass
##       fail 63280     0
##       pass     0  5975
##                                      
##                Accuracy : 1          
##                  95% CI : (0.9999, 1)
##     No Information Rate : 0.9137     
##     P-Value [Acc > NIR] : < 2.2e-16  
##                                      
##                   Kappa : 1          
##                                      
##  Mcnemar's Test P-Value : NA         
##                                      
##             Sensitivity : 1.0000     
##             Specificity : 1.0000     
##          Pos Pred Value : 1.0000     
##          Neg Pred Value : 1.0000     
##              Prevalence : 0.9137     
##          Detection Rate : 0.9137     
##    Detection Prevalence : 0.9137     
##       Balanced Accuracy : 1.0000     
##                                      
##        'Positive' Class : fail       
## 

Prediksi Model

# Cek keakuratan prediksi model Random Forest
confusionMatrix(predict_rf, saintek_test$pass_university, positive = "fail")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  fail  pass
##       fail 15784   165
##       pass    91  1274
##                                          
##                Accuracy : 0.9852         
##                  95% CI : (0.9833, 0.987)
##     No Information Rate : 0.9169         
##     P-Value [Acc > NIR] : < 2.2e-16      
##                                          
##                   Kappa : 0.9007         
##                                          
##  Mcnemar's Test P-Value : 5.055e-06      
##                                          
##             Sensitivity : 0.9943         
##             Specificity : 0.8853         
##          Pos Pred Value : 0.9897         
##          Neg Pred Value : 0.9333         
##              Prevalence : 0.9169         
##          Detection Rate : 0.9116         
##    Detection Prevalence : 0.9212         
##       Balanced Accuracy : 0.9398         
##                                          
##        'Positive' Class : fail           
## 

Resume dari model Random Forest dapat dilihat pada data berikut:

# Resume model Random Forest
resume_rf <- data.frame(Prediksi = c("Data Train", "Data Test"),
                        Akurasi = c(1, 0.9852),
                        Recall = c(1, 0.9943))
resume_rf

Interpretasi dan Konklusi

Interpretasi

Berikut merupakan hasil keakuratan prediksi yang didapatkan dari kedua model.

# Resume perbandingan dua model di data test
resume <- data.frame(Metode = c("Naive Bayes", "Decision Tree", "Random Forest"),
                     Akurasi = c(0.9618, 0.9640, 0.9852),
                     Recall = c(0.9591, 0.9710, 0.9943))
resume

Beberapa hal yang dapat diinterpretasikan diantaranya yaitu :

  1. Ketiga model yang dibentuk memiliki performa yang baik. Pernyataan ini dibuktikan oleh kecilnya selisih akurasi dan recall antara data train dan data test sehingga model tidak mengalami Overfitting atau Underfitting
  2. Dari ketiga model yang dibentuk, model Random Forest memiliki tingkat akurasi dan recall yang paling tinggi yaitu di angka 98.5 % dan 99.4 %.
  3. Meskipun memiliki Sensitivitas / Recall yang lebih tinggi, model Random Forest sangat sulit untuk diinterpretasikan secara redaktif dan seringkali hanya dapat digunakan dalam kepentingan prediksi.
  4. Informasi mengenai nilai aman (nilai minimun yang didapatkan berdasarkan model) setiap mata ujian dapat dilihat dengan menggunakan pendekatan Naive Bayes.

Konklusi

Model regresi logistik dan KNN dapat digunakan dengan baik guna kepeluan prediksi data UTBK 2019 Soshum. hal ini ditunjukan dengan tingginya metriks akurasi dan sensitivitas / recall. Untuk melengkapi analisis prediksi, maka pembentukan model Naive Bayes dan Decision Tree dapat diperuntukan guna keperluan interpretasi model dan model Random Forest digunakan sebagai model yang dapat memprediksi data baru.

Satu hal yang penting untuk para pembaca yang merupakan peserta UTBK, sebaiknya pembaca tidak terlena dengan hasil prediksi kelulusan yang dikeluarkan oleh serbagai macam lembaga. Memang betul model memiliki tingkat keakuratan yang sangat tinggi, namun prediksi dibuat berdasarkan data tahun sebelumnya. Ada baiknya peserta menggunakan strategi lain guan kelulusan yang ingin dicapai, seperti optimisasi pemilihan program studi dan efisiensi pengerjaan soal setiap mata ujian UTBK.

Akhir kata, semoga analisis dan prediksi yang dibuat dapat bermanfaat bagi para pembaca, terutama yang berkaitan dengan dunia pendidikan.

Terima Kasih.