Untuk pembahasan mengenai Prediksi Kelulusan Peserta UTBK 2019 Soshum dapat dilihat disini.
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(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
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.
## [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"
##
## 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.
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 :
pass
) serta berbagai macam mata ujian lainnya.Selanjutnya model dikenakan 2 data baru dalam melakukan prediksi, yaitu :
# 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)
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
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.
## 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 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.
# 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
##
# 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
# 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
##
# 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
##
## 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
##
# 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
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 :
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.