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.
Dataset didapatkan dari Kaggle.
Dataset UTBKClass berisikan daftar nilai dari peserta UTBK 2019 soshum beserta pilihan program studi yang dipilih. 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_eko, merupakan nilai mata ujian Ekonomi user.
score_geo, merupakan nilai mata ujian Geografi 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 Soshum user.
score_ppu, merupakan nilai mata ujian Pengetahuan & Pemahaman Umum user.
score_sej, merupakan nilai mata ujian Sejarah user.
score_sos, merupakan nilai mata ujian Sosiologi user.
pass_university, merupakan keputusan user 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
soshum <- soshum %>%
select(c(score_eko , score_geo , score_sej , score_sos , score_mat , score_kmb , score_kpu , score_kua , score_ppu, pass_university)) %>%
mutate(pass_university = as.factor(pass_university))
head(soshum)
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(soshum)
# sampel dan ambil 80% data secara acak
index <- sample(row_data, row_data*0.8)
soshum_train <- soshum[ index, ]
soshum_test <- soshum[ -index, ]
levels(soshum$pass_university)
## [1] "fail" "pass"
##
## fail pass
## 0.92132032 0.07867968
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.
# Upsampling data
set.seed(123)
soshum_train_up <- upSample(x = soshum_train %>% select(-pass_university),
y = soshum_train$pass_university,
list = FALSE,
yname = "pass_university")
prop.table(table(soshum_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.
Regresi logistik merupakan perkembangan dari regresi linier dimana baik digunakan guna membentuk model klasifikasi. Variabel target yang dibentuk sangat disarankan memiliki tipe faktor dengan jumlah level 2 (pada kasus klasifikasi ini level yang digunakan yaitu fail dan pass).
# Membuat model Regresi Logistik
model_lg <- glm(pass_university ~ .,
soshum_train_up,
family = "binomial")
Selanjutnya model yang telah dibuat dilakukan optimisasi menggunakan teknik Stepwise
untuk mendapatkan prediktor mana saja yang paling baik digunakan untuk membangun model.
## Start: AIC=16509.07
## pass_university ~ score_eko + score_geo + score_sej + score_sos +
## score_mat + score_kmb + score_kpu + score_kua + score_ppu
##
## Df Deviance AIC
## <none> 16489 16509
## - score_kpu 1 20235 20253
## - score_ppu 1 21259 21277
## - score_geo 1 21716 21734
## - score_kmb 1 21794 21812
## - score_eko 1 22761 22779
## - score_sej 1 23006 23024
## - score_sos 1 24582 24600
## - score_kua 1 24882 24900
## - score_mat 1 32555 32573
Analisis Stepwise
yang dilakukan menunjukkan bahwa setiap tidak ada perubahan terhadap pembentukan model regresi logistik sehingga dapat dilanjutkan ke tahap selanjutnya. Berikut merupakan model akhir yang dihasilkan.
##
## Call:
## glm(formula = pass_university ~ score_eko + score_geo + score_sej +
## score_sos + score_mat + score_kmb + score_kpu + score_kua +
## score_ppu, family = "binomial", data = soshum_train_up)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -6.0070 -0.0013 0.0000 0.0999 1.0740
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.143e+02 1.367e+00 -83.60 <2e-16 ***
## score_eko 1.967e-02 3.234e-04 60.81 <2e-16 ***
## score_geo 2.012e-02 3.495e-04 57.57 <2e-16 ***
## score_sej 2.165e-02 3.536e-04 61.24 <2e-16 ***
## score_sos 2.085e-02 3.197e-04 65.22 <2e-16 ***
## score_mat 2.349e-02 3.183e-04 73.81 <2e-16 ***
## score_kmb 1.937e-02 3.386e-04 57.20 <2e-16 ***
## score_kpu 2.044e-02 3.953e-04 51.70 <2e-16 ***
## score_kua 2.236e-02 3.380e-04 66.15 <2e-16 ***
## score_ppu 2.100e-02 3.758e-04 55.88 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 125060 on 90211 degrees of freedom
## Residual deviance: 16489 on 90202 degrees of freedom
## AIC: 16509
##
## Number of Fisher Scoring iterations: 10
Selanjutnya model dikenakan 2 data baru dalam melakukan prediksi, yaitu :
# Tes performa model Regresi Logistik
perform_lg <- predict(model_soshum_lg, newdata = soshum_train, type = "response")
# Mengubah hasil prediksi angka menjadi label
perform_lg <- ifelse(perform_lg >= 0.5 , "pass", "fail") %>%
as.factor()
# Cek hasil prediksi
head(perform_lg)
## 1 2 3 4 5 6
## fail pass fail fail fail fail
## Levels: fail pass
# Prediksi model ke data test
predict_lg <- predict(model_soshum_lg, newdata = soshum_test, type = "response")
# Mengubah hasil prediksi angka menjadi label
predict_lg <- ifelse(predict_lg >= 0.5 , "pass", "fail") %>%
as.factor()
# Cek hasil prediksi
head(predict_lg)
## 1 2 3 4 5 6
## fail fail fail pass fail pass
## Levels: fail pass
Dari peluang angka yang dihasilkan kita bisa mendapatkan label atau kategori dari setiap prediksi. Threshold
yang digunakan pada prediksi yaitu 0.5 (jika peluang > 0.5 maka dianggap pass dan jika dibawah 0.5 maka dianggap fail).
Tidak hanya digunakan untuk keperluan prediksi, model regresi logistik dapat diinterpretasikan secara redaktif. Informasi tersebut sangatlah penting untuk medapatkan insight baru.
## (Intercept) score_eko score_geo score_sej score_sos score_mat
## 2.286050e-50 1.019862e+00 1.020322e+00 1.021890e+00 1.021072e+00 1.023768e+00
## score_kmb score_kpu score_kua score_ppu
## 1.019556e+00 1.020646e+00 1.022608e+00 1.021224e+00
Odds yang dihasilkan pada model dapat memberikan informasi baru bahwa setiap prediktor yang berupa mata ujian pada UTBK memiliki peranan yang sama pentingnya untuk memperoleh kelulusan peserta. Hal ini ditunjukkan dengan seragamnya nilai Odds pada setiap prediktor.
Model K-Nearest Neighbour (KNN) memiliki konsep pendekatan berdasarkan tetangga atau data lain yang berdekatan. Model ini digunakan ketika semua prediktor memiliki tipe data numerik. Oleh karena itu diperlukan teknik scaling
terlebih dahulu guna menyamakan skala prediktor yang hendak digunakan guna membangun model KNN.
# Scaling Data Train
train_x <- soshum_train %>%
select(-pass_university) %>%
scale(center = TRUE, scale = TRUE) # scaling prediktor
# Menyimpan target variabel
train_y <- soshum_train$pass_university
## score_eko score_geo score_sej score_sos score_mat score_kmb score_kpu score_kua
## 547.5222 546.8087 540.3747 542.2732 530.4849 552.0984 539.3494 520.9364
## score_ppu
## 530.5984
# Menyimpan model KNN
model_soshum_knn <- knn3(x = train_x,
y = train_y,
k = sqrt(nrow(train_x)) %>% round()
)
# Cek performa model KNN
perform_knn <- predict(model_soshum_knn, newdata = train_x, type = "class")
head(perform_knn)
## [1] fail pass fail fail fail fail
## Levels: fail pass
# Prediksi model ke data test
predict_knn <- predict(model_soshum_knn, newdata = test_x, type = "class")
head(predict_knn)
## [1] fail fail fail pass 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.
## Confusion Matrix and Statistics
##
## Reference
## Prediction fail pass
## fail 43435 0
## pass 1671 3852
##
## Accuracy : 0.9659
## 95% CI : (0.9642, 0.9675)
## No Information Rate : 0.9213
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.8035
##
## Mcnemar's Test P-Value : < 2.2e-16
##
## Sensitivity : 0.9630
## Specificity : 1.0000
## Pos Pred Value : 1.0000
## Neg Pred Value : 0.6974
## Prevalence : 0.9213
## Detection Rate : 0.8872
## Detection Prevalence : 0.8872
## Balanced Accuracy : 0.9815
##
## 'Positive' Class : fail
##
# Cek performa prediksi model Regresi Logistik
confusionMatrix(predict_lg, soshum_test$pass_university, positive = "fail")
## Confusion Matrix and Statistics
##
## Reference
## Prediction fail pass
## fail 10763 0
## pass 423 1054
##
## Accuracy : 0.9654
## 95% CI : (0.9621, 0.9686)
## No Information Rate : 0.9139
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.8142
##
## Mcnemar's Test P-Value : < 2.2e-16
##
## Sensitivity : 0.9622
## Specificity : 1.0000
## Pos Pred Value : 1.0000
## Neg Pred Value : 0.7136
## Prevalence : 0.9139
## Detection Rate : 0.8793
## Detection Prevalence : 0.8793
## Balanced Accuracy : 0.9811
##
## 'Positive' Class : fail
##
Resume dari model Regresi Logistik dapat dilihat pada data berikut:
# Resume model Regresi Logistik
resume_lg <- data.frame(Prediksi = c("Data Train", "Data Test"),
Akurasi = c(0.9659, 0.9654),
Recall = c(0.9630, 0.9622))
resume_lg
## Confusion Matrix and Statistics
##
## Reference
## Prediction fail pass
## fail 44837 1258
## pass 269 2594
##
## Accuracy : 0.9688
## 95% CI : (0.9672, 0.9703)
## No Information Rate : 0.9213
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.7562
##
## Mcnemar's Test P-Value : < 2.2e-16
##
## Sensitivity : 0.9940
## Specificity : 0.6734
## Pos Pred Value : 0.9727
## Neg Pred Value : 0.9060
## Prevalence : 0.9213
## Detection Rate : 0.9158
## Detection Prevalence : 0.9415
## Balanced Accuracy : 0.8337
##
## 'Positive' Class : fail
##
# Cek keakuratan prediksi model KNN
knn_conf <- confusionMatrix(predict_knn, test_y, positive = "fail")
knn_conf
## Confusion Matrix and Statistics
##
## Reference
## Prediction fail pass
## fail 11113 349
## pass 73 705
##
## Accuracy : 0.9655
## 95% CI : (0.9621, 0.9687)
## No Information Rate : 0.9139
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.7515
##
## Mcnemar's Test P-Value : < 2.2e-16
##
## Sensitivity : 0.9935
## Specificity : 0.6689
## Pos Pred Value : 0.9696
## Neg Pred Value : 0.9062
## Prevalence : 0.9139
## Detection Rate : 0.9079
## Detection Prevalence : 0.9364
## Balanced Accuracy : 0.8312
##
## 'Positive' Class : fail
##
Resume dari model KNN dapat dilihat pada data berikut:
# Resume model KNN
resume_knn <- data.frame(Prediksi = c("Data Train", "Data Test"),
Akurasi = c(0.9688, 0.9655),
Recall = c(0.9940, 0.9935))
resume_knn
Berikut merupakan hasil keakuratan prediksi yang didapatkan dari kedua model.
# Resume perbandingan dua model di data test
resume <- data.frame(Metode = c("Regresi Logistik", "KNN"),
Akurasi = c(0.9654, 0.9655),
Recall = c(0.9622, 0.9935))
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.
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.