Overview

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.

Dataset didapatkan dari Kaggle.

Library dan Setup

library(readxl) #Untuk read data excel
library(tidyverse) #Untuk data pre-processing
library(caret) #Untuk pembentukan model KNN, confusion matrix dan sampling

Data Pre-Processing

# Membaca data
soshum <- read_xlsx("UTBKClass.xlsx", sheet = "Soshum")

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.

# Cek missing value
anyNA(soshum)
## [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"
# Cek kesiapan data
prop.table(table(soshum_train$pass_university))
## 
##       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.

Model Regresi Logistik

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

# 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.

# Model fitting
model_soshum_lg <- step(model_lg, direction = "both")
## 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.

# Hasil model fitting
summary(model_soshum_lg)
## 
## 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 :

  1. Data train untuk cek performa model.
  2. Data test untuk memprediksi data baru.
# 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).

Interpretasi Model

Tidak hanya digunakan untuk keperluan prediksi, model regresi logistik dapat diinterpretasikan secara redaktif. Informasi tersebut sangatlah penting untuk medapatkan insight baru.

# Interpretasi dari Odds
exp(model_soshum_lg$coefficients)
##  (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 KNN

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.

Z-Score Scaling

# 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
# rata-rata dari data train
attr(train_x, "scaled:center")
## 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
# Scaling Data Test
test_x <- soshum_test %>% 
  select(-pass_university) %>%
  scale(center = attr(train_x, "scaled:center"),
        scale = attr(train_x, "scaled:scale")
        )

# Menyimpan target variabel
test_y <- soshum_test$pass_university

Membuat Model KNN

# 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

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.

Performa Model Regresi Logistik

# Cek performa model
confusionMatrix(perform_lg, soshum_train$pass_university, positive = "fail")
## 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

Performa Model KNN

# Cek performa model
confusionMatrix(perform_knn, train_y, positive = "fail")
## 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

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("Regresi Logistik", "KNN"),
                     Akurasi = c(0.9654, 0.9655),
                     Recall = c(0.9622, 0.9935))
resume

Beberapa hal yang dapat diinterpretasikan diantaranya yaitu :

  1. Akurasi prediksi kedua model relatif sama di angka 96.5 %.
  2. Sensitivitas / Recall pada model KNN lebih tinggi sebesar 99.3 % dibanding model Regresi Logistik yang hanya memiliki Sensitivitas / Recall sebesar 96.2 %. Hal ini sangat penting guna menghindari adanya kelulusan semu (false nagative) pada peserta UTBK.
  3. Meskipun memiliki Sensitivitas / Recall yang lebih tinggi, model KNN tidak dapat diinterpretasikan secara redaktif dan hanya dapat digunakan guna kepentingan prediksi.
  4. Berdasarkan model Regresi Logistik terdapat interpretasi yang penting, yaitu semua prediktor yang merupakan mata ujian pada UTBK memiliki peran yang sama pentingnya terhadap kelulusan peserta. Hal ini ditunjukan dengan seragamnya nilai odds dari setiap prediktor model yaitu di kisaran 1.02.

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.

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.