Pendahuluan

Latar Belakang

Analisis regresi logistik biner merupakan instrumen statistika yang krusial dalam memodelkan hubungan antara satu atau lebih variabel independen dengan variabel dependen yang bersifat biner. Berbeda dengan regresi linier yang memprediksi nilai kontinu, metode ini memanfaatkan fungsi logit untuk mengestimasi probabilitas kejadian suatu peristiwa, seperti sukses atau gagal, yang sangat relevan dalam domain kedokteran, sosial, hingga pemasaran. Salah satu keunggulan utama model ini adalah kemampuannya dalam mengatasi kendala heteroskedastisitas serta asumsi normalitas yang sering kali menjadi hambatan pada analisis linier standar, sehingga memungkinkan penarikan kesimpulan yang lebih kokoh pada data kategorikal.

Seiring dengan kemajuan teknologi komputasi, implementasi regresi logistik biner kini menjadi jauh lebih efisien melalui pemanfaatan perangkat lunak seperti R, Python, dll. Bagi mahasiswa statistika, penguasaan alat-alat ini bukan sekadar kebutuhan akademis, melainkan keterampilan praktis esensial untuk menjawab tantangan di dunia industri dan riset ilmiah. Oleh karena itu, laporan praktikum komputasi statistika ini akan mengulas secara komprehensif mengenai prosedur analisis, pengujian asumsi, hingga teknik interpretasi hasil guna menghasilkan pemodelan probabilitas yang valid dan aplikatif.

Sumber Data

Deskripsi Dataset

Dataset yang digunakan merupakan sekumpulan data sintetis yang dipreparasi untuk menginvestigasi determinan keberhasilan akademik serta tingkat kelulusan peserta dalam program pendidikan teknis, seperti pelatihan pemrograman atau bootcamp. Instrumen ini mencakup 5.000 observasi yang terdistribusi ke dalam 16 variabel independen, mengintegrasikan dimensi kognitif, demografis, perilaku, dan lingkungan untuk memberikan gambaran holistik mengenai faktor-faktor yang memengaruhi performa pembelajar.

Penjelasan Variabel

Variabel-variabel dalam dataset ini diklasifikasikan menjadi variabel dependen (target) dan variabel independen (prediktor) sebagai berikut:

Jenis Variabel Nama Variabel Keterangan
Dependen status_lulus Kategori biner (0 atau 1) hasil akhir.
Independen jam_belajar Jumlah jam yang dihabiskan untuk belajar.
skor_pretest Skor yang diperoleh pada ujian awal.
pengalaman_coding Durasi atau tingkat pengalaman pemrograman.
skor_matematika Nilai kemampuan matematika individu.
kehadiran Persentase kehadiran dalam pembelajaran.
sertifikat_lain Kepemilikan sertifikat kompetensi (Ya/Tidak).
ikut_bootcamp Keikutsertaan program pelatihan (Ya/Tidak).
proyek_portofolio Jumlah proyek yang dikerjakan.
laptop_spek Kualitas spesifikasi laptop (1=Tinggi, 0=Standar).
usia Umur peserta dalam tahun.
motivasi Tingkat motivasi belajar.
konsentrasi Tingkat fokus saat belajar.
jam_tidur Durasi waktu istirahat harian.
akses_internet Ketersediaan akses internet yang memadai.
jarak_kampus Jarak tempuh ke lokasi kampus/tempat belajar.

Tinjauan Pustaka

Regresi Logistik

Regresi logistik biner adalah metode statistika untuk memodelkan hubungan antara satu variabel dependen biner (dua kategori, contoh: 0=tidak, 1=ya) dengan satu atau lebih variabel independen. Metode ini memprediksi probabilitas kejadian (0 hingga 1) menggunakan fungsi logit, bukan hubungan linier langsung.

Persamaan Regresi Logistik:

Regresi logistik biner digunakan untuk mengetahui hubungan antara suatu variabel independen yang berupa dua kategori atau berskala biner. Dua kategori yang digunakan berupa dua bilangan 0 dan 1. Model regresi logistik biner secara umum dinotasikan dengan variabel dependen \((x_1, x_2, x_3, \dots, x_k)\) adalah sebagai berikut:

\[\pi(X) = \frac{\exp(\beta_0 + \beta_1 X)}{1 + \exp(\beta_0 + \beta_1 X)}\]

Dimana \(\pi(X)\) merupakan peluang sukses sebagai fungsi logistik dari \(X\) (berapapun nilai \(X\), fungsi ini akan bernilai 0 sampai 1). Kemudian dari bentuk logit regresi logistik dapat ditentukan pula Odds Ratio-nya sebagai berikut:

\[\frac{\pi(X)}{1 - \pi(X)} = \exp(\beta_0 + \beta_1 X_1 + \beta_2 X_2 + \dots + \beta_k X_k)\]

Kemudian bentuk tersebut ditransformasi dan didapat bentuk logit regresi logistik sebagai berikut:

\[g(X) = \ln\left(\frac{\pi(X)}{1 - \pi(X)}\right) = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \dots + \beta_k X_k\]

Dimana \(p\) adalah probabilitas terjadinya kejadian yang diinginkan, \(X_1, X_2, \dots, X_k\) adalah variabel independen, dan \(\beta_0, \beta_1, \dots, \beta_k\) adalah koefisien regresi.

Fungsi Aktivasi Sigmoid

Fungsi Sigmoid, atau sering disebut sebagai fungsi logistik, merupakan fungsi non-linear yang memetakan setiap nilai riil ke dalam rentang interval \((0, 1)\). Secara matematis, fungsi ini dinyatakan sebagai:

\[f(x) = \frac{1}{1 + e^{-x}}\] Di mana \(e\) adalah bilangan konstanta Euler (\(\approx 2.718\)). Karakteristik utama dari fungsi ini adalah kurvanya yang berbentuk huruf “S” (sigmoid), di mana nilai input yang sangat besar akan mendekati 1, dan nilai input yang sangat kecil (negatif) akan mendekati 0.

sumber : wikipedia.org

sumber : wikipedia.org

Asumsi Multikolinearitas

Asumsi multikolinearitas adalah persyaratan yang menyatakan bahwa variabel-variabel independen (bebas) tidak boleh memiliki korelasi linear yang sangat kuat satu sama lain. Pengujian Multikolinieritas bisa menggunakan nilai variance inflation factor (VIF). Asumsi multikolinieritas terpenuhi apabila nilai VIF < 10.

VIF (Variance Inflation Factor) adalah indikator yang paling umum digunakan untuk mendeteksi multikolinearitas. VIF mengukur seberapa besar varians dari koefisien regresi yang terestimasi meningkat (membengkak) dibandingkan jika variabel-variabel independen tidak saling berkorelasi.

Hipotesis:

\(H_0\): Tidak terjadi multikolinearitas antar variabel independen.

\(H_1\): Terjadi multikolinearitas antar variabel independen.

Statistik Uji:

\[VIF_i = \frac{1}{1 - R_i^2}\]

Nilai VIF Interpretasi
VIF = 1 Tidak ada korelasi sama sekali.
1 < VIF < 5 Korelasi sedang.
VIF > 5 Korelasi kuat.
VIF > 10 Multikolinearitas kuat.

Keputusan:

Jika nilai VIF < 10,00, maka \(H_0\) diterima: Model regresi bebas dari masalah multikolinearitas.

Jika terjadi multikolinearitas serius, maka variabel tersebut dikeluarkan dari dataframe.

Di mana \(R_i^2\) adalah koefisien determinasi yang diperoleh dengan meregresikan variabel independen ke-\(i\) terhadap semua variabel independen lainnya dalam model.

Uji Signifikansi Keseluruhan Model

Uji signifikansi bertujuan untuk menentukan apakah model yang dibuat—secara bersama-sama (simultan) maupun parsial—memiliki pengaruh nyata terhadap variabel dependen. Uji ini memastikan variabel independen dalam model layak dan signifikan untuk menjelaskan probabilitas kejadian.

Omnibus Test of Model Coefficients adalah uji statistik yang digunakan untuk menentukan apakah variabel independen yang dimasukkan ke dalam model secara kolektif memberikan kontribusi yang signifikan terhadap prediksi variabel dependen.

Hipotesis:

\(H_0 : \beta_1 = \beta_2 = \dots = \beta_p = 0\)

\(H_1 : \text{minimal ada satu } \beta_k \neq 0, k = 1, 2, \dots, p\)

dimana \(p\) merupakan jumlah variabel prediktor dalam model.

Statistik Uji:

\[G = -2 \sum O_{ij} \ln \left( \frac{O_{ij}}{E_{ij}} \right)\]

Keterangan:

  • \(O_{ij}\) : nilai observasi pada baris ke-\(i\) kolom ke-\(j\)

  • \(E_{ij}\) : nilai harapan pada baris ke-\(i\) kolom ke-\(j\)

Keputusan:

Keputusan akan tolak \(H_0\) apabila nilai statistik uji \(G > \chi^2_{\alpha, v}\) atau p-value statistik uji \(G < \alpha (0.05)\).

Uji Kelayakan Model

Kelayakan model pada uji regresi logistic atau Goodness of Fit dapat dilihat pada table Hosmer and Lemeshow Test.

Hipotesis:

\(H_0\): Tidak ada perbedaan signifikan antara model dengan observasi (Model Fit/Layak).

\(H_1\): Ada perbedaan signifikan antara model dengan observasi (Model Tidak Layak).

Statistik Uji: \[ C^* = \sum_{g=1}^{n} \frac{(O_g - E_g)^2}{E_g(1 - E_g/n_g)} \] Keterangan:

  • \(O_g\): Frekuensi observasi pada grup ke-\(g\).

  • \(E_g\): Frekuensi ekspektasi pada grup ke-\(g\).

  • \(n_g\): Jumlah subjek pada grup ke-\(g\).

Uji Parsial Parameter Model

Tujuan uji parsial adalah untuk mengetahui apakah variabel bebas secara parsial mempengaruhi variabel terikat secara signifikan

Uji parsial Wald adalah prosedur statistik yang digunakan dalam regresi logistik untuk menentukan apakah masing-masing variabel independen secara signifikan berkontribusi terhadap prediksi variabel dependen.

Hipotesis:

\(H_0: \beta_j = 0\) (Variabel independen ke-\(j\) tidak memiliki pengaruh signifikan terhadap variabel dependen).

\(H_1: \beta_j \neq 0\) (Variabel independen ke-\(j\) memiliki pengaruh signifikan terhadap variabel dependen).

Statistik Uji:

\[W = \left( \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \right)^2\]

Keterangan:

  • \(\hat{\beta}_j\): Estimasi koefisien untuk variabel ke-\(j\).

  • \(SE(\hat{\beta}_j)\): Standard Error (kesalahan baku) dari estimasi koefisien tersebut.

Statistik \(W\) mengikuti distribusi Chi-Square (\(\chi^2\)) dengan derajat bebas (df) = 1.

Keputusan:

Jika nilai p-value < 0,05 maka \(H_0\) ditolak. Variabel independen ke-\(j\) memiliki pengaruh signifikan terhadap variabel dependen.

Kode R

Library

packages <- c("dplyr", "caret", "car", "corrplot", "tidyr", "pscl", "generalhoslem", "ggplot2", "pROC")
installed_packages <- packages %in% rownames(installed.packages())
if(any(installed_packages == FALSE)) {install.packages(packages[!installed_packages], repos = "http://cran.us.r-project.org")}

library(dplyr)
library(caret)
library(car)
library(corrplot)
library(tidyr)
library(pscl)
library(generalhoslem)
library(ggplot2)
library(pROC)
Library Fungsi Utama Kegunaan Spesifik dalam Analisis
dplyr Manipulasi data (Data Wrangling) Digunakan untuk transformasi data, seperti melakukan filter, select, dan mutate kolom.
caret Classification and Regression Training Digunakan untuk proses data splitting (train-test), pembuatan confusion matrix, dan tuning model.
car Companion to Applied Regression Sangat penting untuk uji asumsi, terutama menghitung nilai VIF (Variance Inflation Factor) guna mendeteksi multikolinieritas.
corrplot Visualisasi matriks korelasi Memberikan representasi visual hubungan antar variabel independen untuk skrining awal multikolinieritas.
tidyr Pembersihan data (Data Tidying) Membantu merapikan struktur data agar sesuai dengan format yang dibutuhkan untuk pemodelan atau plotting.
pscl Political Science Computational Laboratory Digunakan untuk menghitung nilai Pseudo R-Squared (seperti McFadden) yang menunjukkan seberapa baik model menjelaskan data.
generalhoslem Goodness-of-Fit Tests Library khusus untuk melakukan Uji Hosmer-Lemeshow, yang memastikan model logistik sudah layak (fit) digunakan.
ggplot2 Data Visualization Standar utama untuk membuat grafik akademik yang estetik, seperti plot probabilitas atau visualisasi distribusi.
pROC Analisis Kurva ROC Digunakan untuk mengevaluasi performa klasifikasi model melalui kurva ROC dan perhitungan nilai AUC.

Import Data

data <- read.csv("dataset_regresi_logistik.csv")
rmarkdown::paged_table(head(data, 5))
summary_df <- as.data.frame.matrix(summary(data))
rmarkdown::paged_table(summary_df)

Plot Korelasi

cor_matrix <- cor(data)
corrplot(cor_matrix, method = "color", type = "upper", tl.cex = 0.9, title = "Plot Korelasi Variabel",  mar = c(0,0,1,0), addCoef.col = "black", number.cex = 0.5)

Analisis korelasi menunjukkan bahwa jam_belajar memiliki hubungan positif paling kuat terhadap status_lulus (\(r = 0.46\)), yang mengindikasikan bahwa intensitas belajar merupakan prediktor utama keberhasilan dalam dataset ini. Variabel pendukung lain seperti motivasi (\(r = 0.27\)) dan skor_pretest (\(r = 0.21\)) juga menunjukkan korelasi positif yang signifikan secara akademik, menegaskan bahwa kesiapan awal dan faktor psikologis berkontribusi pada probabilitas kelulusan.

Sebaliknya, jarak_kampus memiliki korelasi negatif (\(r = -0.12\)), yang menyiratkan bahwa hambatan geografis dapat sedikit menurunkan peluang keberhasilan peserta.

set.seed(123)

Train-Test Split

Data dibagi secara sistematis dengan proporsi 80% data latih dan 20% data uji melalui metode stratified random sampling.

train_index <- createDataPartition(data$status_lulus, p = 0.8, list = FALSE)
train_data <- data[train_index, ]
test_data  <- data[-train_index, ]

cat("Jumlah data Training:", nrow(train_data), "\n")
## Jumlah data Training: 4000
cat("Jumlah data Testing:", nrow(test_data), "\n")
## Jumlah data Testing: 1000

Model Awal

model_awal <- glm(status_lulus ~ ., data = train_data, family = binomial)

Menghitung VIF (Multikolinearitas)

vif_values <- car::vif(model_awal)
vif_table <- data.frame(Variabel = names(vif_values), Nilai_VIF = as.numeric(vif_values))
rmarkdown::paged_table(vif_table)
# Memilih variabel dengan VIF <= 10
vars_keep <- names(vif_values[vif_values <= 10])
print(matrix(c(vars_keep, rep("", (3 - length(vars_keep) %% 3) %% 3)), ncol = 3))
##      [,1]                [,2]                [,3]             
## [1,] "jam_belajar"       "proyek_portofolio" "jarak_kampus"   
## [2,] "skor_pretest"      "skor_matematika"   "konsentrasi"    
## [3,] "pengalaman_coding" "akses_internet"    "sertifikat_lain"
## [4,] "usia"              "motivasi"          "kehadiran"      
## [5,] "ikut_bootcamp"     "jam_tidur"         "laptop_spek"

Pada nilai analisis multikolinearitas diperoleh semua variabel independen memiliki nilai VIF < 10. Sehingga semua variabel masuk ke dalam model.

Uji Signifikansi Keseluruhan Model (Omnibus Test)

pR2(model_awal)
## fitting null model for pseudo-r2
##           llh       llhNull            G2      McFadden          r2ML 
## -1784.2898873 -2721.4902611  1874.4007476     0.3443703     0.3741222 
##          r2CU 
##     0.5031701
qchisq(0.95,15)
## [1] 24.99579

Berdasarkan hasil output Likelihood Ratio Test Statistic (G2) diperoleh sebesar 1874,4007476 dengan nilai chisquare tabel sebesar 24,99579. Dikarenakan nilai G2 lebih besar dibandingkan dengan nilai chisquare maka dapat diputuskan bahwa H0 ditolak. Sehingga dapat disimpulkan bahwa model signifikan atau minimal terdapat satu variabel yang berpengaruh terhadap terjadinya kejadian tak bebas (independen).

Uji Parsial Parameter Model

summary(model_awal)
## 
## Call:
## glm(formula = status_lulus ~ ., family = binomial, data = train_data)
## 
## Coefficients:
##                     Estimate Std. Error z value Pr(>|z|)    
## (Intercept)       -10.418643   0.627300 -16.609  < 2e-16 ***
## jam_belajar         0.160487   0.005806  27.643  < 2e-16 ***
## skor_pretest        0.047682   0.003013  15.823  < 2e-16 ***
## pengalaman_coding   0.027475   0.029300   0.938   0.3484    
## usia                0.010329   0.008058   1.282   0.1999    
## ikut_bootcamp       0.833905   0.084880   9.825  < 2e-16 ***
## proyek_portofolio  -0.033786   0.028854  -1.171   0.2416    
## skor_matematika     0.003768   0.003500   1.077   0.2816    
## akses_internet     -0.102906   0.102151  -1.007   0.3137    
## motivasi            0.323732   0.016069  20.146  < 2e-16 ***
## jam_tidur          -0.024626   0.040264  -0.612   0.5408    
## jarak_kampus       -0.052104   0.005163 -10.092  < 2e-16 ***
## konsentrasi         0.025181   0.014512   1.735   0.0827 .  
## sertifikat_lain    -0.002287   0.084943  -0.027   0.9785    
## kehadiran           0.017792   0.002908   6.117 9.52e-10 ***
## laptop_spek        -0.119533   0.090510  -1.321   0.1866    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5443.0  on 3999  degrees of freedom
## Residual deviance: 3568.6  on 3984  degrees of freedom
## AIC: 3600.6
## 
## Number of Fisher Scoring iterations: 5

Pada uji parsial diperoleh variabel dengan nilai p-value > 0,05 yaitu pengalaman_coding, usia, proyek_portofolio, skor_matematika, akses_internet, jam_tidur, konsentrasi, sertifikat_lain, dan laptop_spek. Maka variabel tersebut di keluarkan dari model karena tidak memiliki pengaruh nyata (signifikan) terhadap model.

model_2 <- glm(status_lulus ~ jam_belajar + skor_pretest + ikut_bootcamp + akses_internet + jarak_kampus + kehadiran, data = train_data, family = binomial)
summary(model_2)
## 
## Call:
## glm(formula = status_lulus ~ jam_belajar + skor_pretest + ikut_bootcamp + 
##     akses_internet + jarak_kampus + kehadiran, family = binomial, 
##     data = train_data)
## 
## Coefficients:
##                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)    -7.179737   0.355673 -20.186  < 2e-16 ***
## jam_belajar     0.137600   0.005094  27.012  < 2e-16 ***
## skor_pretest    0.040552   0.002738  14.809  < 2e-16 ***
## ikut_bootcamp   0.703779   0.078068   9.015  < 2e-16 ***
## akses_internet -0.015977   0.094462  -0.169    0.866    
## jarak_kampus   -0.041358   0.004735  -8.734  < 2e-16 ***
## kehadiran       0.015899   0.002689   5.913 3.36e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5443.0  on 3999  degrees of freedom
## Residual deviance: 4064.8  on 3993  degrees of freedom
## AIC: 4078.8
## 
## Number of Fisher Scoring iterations: 5

Pada uji parsial diperoleh variabel dengan nilai p-value > 0,05 yaitu akses internet. Maka variabel tersebut di keluarkan dari model karena tidak memiliki pengaruh nyata (signifikan) terhadap model.

model_3 <- glm(status_lulus ~ jam_belajar + skor_pretest + ikut_bootcamp + jarak_kampus + kehadiran, data = train_data, family = binomial)
summary(model_3)
## 
## Call:
## glm(formula = status_lulus ~ jam_belajar + skor_pretest + ikut_bootcamp + 
##     jarak_kampus + kehadiran, family = binomial, data = train_data)
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   -7.192771   0.347295 -20.711  < 2e-16 ***
## jam_belajar    0.137594   0.005094  27.011  < 2e-16 ***
## skor_pretest   0.040557   0.002738  14.812  < 2e-16 ***
## ikut_bootcamp  0.704008   0.078056   9.019  < 2e-16 ***
## jarak_kampus  -0.041355   0.004735  -8.734  < 2e-16 ***
## kehadiran      0.015900   0.002689   5.913 3.35e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5443.0  on 3999  degrees of freedom
## Residual deviance: 4064.8  on 3994  degrees of freedom
## AIC: 4076.8
## 
## Number of Fisher Scoring iterations: 5

Semua variabel sudah memiliki pengaruh nyata terhadap model (p-value < 0,05)

Persamaan Akhir

\[P = \frac{1}{1 + e^{-(-7,1928 + 0,1376X_1 + 0,0406X_2 + 0,7040X_3 - 0,0414X_4 + 0,0159X_5)}}\] Keterangan:

  • Intercept (\(\beta_0 = -7,1928\)): Konstanta dasar model ketika semua variabel bebas bernilai nol.

  • \(X_1\): Jam Belajar

  • \(X_2\): Skor Pretest

  • \(X_3\): Ikut Bootcamp

  • \(X_4\): Jarak Kampus

  • \(X_5\): Kehadiran

Uji kelayakan Model (Uji Hosmer & Lemeshow)

logitgof(train_data$status_lulus,fitted(model_3))
## 
##  Hosmer and Lemeshow test (binary model)
## 
## data:  train_data$status_lulus, fitted(model_3)
## X-squared = 3.6968, df = 8, p-value = 0.8834

Berdasarkan hasil output RStudio diperoleh nilai p-value (0.8834) lebih besar dari alpha (0.05), maka H0 diterima. Sehingga dapat disimpulkan bahwa model yang terbentuk layak digunakan.

Odds Ratio

beta<-(coef(model_3))
OR_beta<-exp(beta)
cbind(beta,OR_beta)
##                      beta      OR_beta
## (Intercept)   -7.19277125 0.0007520022
## jam_belajar    0.13759419 1.1475097827
## skor_pretest   0.04055737 1.0413910487
## ikut_bootcamp  0.70400805 2.0218401314
## jarak_kampus  -0.04135500 0.9594884477
## kehadiran      0.01590047 1.0160275501
Variabel Odds Ratio (OR) Interpretasi Arah Pengaruh
Jam Belajar 1.147 Setiap tambahan 1 jam belajar, peluang lulus meningkat 14,7%. Positif (+)
Skor Pretest 1.041 Setiap kenaikan 1 poin skor pretest, peluang lulus meningkat 4,1%. Positif (+)
Ikut Bootcamp 2.021 Mengikuti bootcamp meningkatkan peluang lulus sebesar 2,02 kali lipat (naik 102,1%). Positif (+)
Jarak Kampus 0.959 Setiap kenaikan 1 satuan jarak, peluang lulus menurun sebesar 4,1%. Negatif (-)
Kehadiran 1.016 Setiap kenaikan 1% kehadiran, peluang lulus meningkat 1,6%. Positif (+)

Prediksi

Prediksi dan Classification Report

test_data$prob <- predict(model_3, newdata = test_data, type = "response")
test_data$prediksi <- ifelse(test_data$prob > 0.5, 1, 0)
test_data$status_lulus <- as.factor(test_data$status_lulus)
test_data$prediksi <- as.factor(test_data$prediksi)
hasil_evaluasi <- confusionMatrix(test_data$prediksi, test_data$status_lulus, positive = "1")
print(hasil_evaluasi)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0 284 108
##          1 152 456
##                                           
##                Accuracy : 0.74            
##                  95% CI : (0.7116, 0.7669)
##     No Information Rate : 0.564           
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.4652          
##                                           
##  Mcnemar's Test P-Value : 0.007659        
##                                           
##             Sensitivity : 0.8085          
##             Specificity : 0.6514          
##          Pos Pred Value : 0.7500          
##          Neg Pred Value : 0.7245          
##              Prevalence : 0.5640          
##          Detection Rate : 0.4560          
##    Detection Prevalence : 0.6080          
##       Balanced Accuracy : 0.7299          
##                                           
##        'Positive' Class : 1               
## 
prec_pos <- hasil_evaluasi$byClass['Pos Pred Value']
rec_pos  <- hasil_evaluasi$byClass['Sensitivity']
f1_pos   <- 2 * ((prec_pos * rec_pos) / (prec_pos + rec_pos))

prec_neg <- hasil_evaluasi$byClass['Neg Pred Value']
rec_neg  <- hasil_evaluasi$byClass['Specificity']
f1_neg   <- 2 * ((prec_neg * rec_neg) / (prec_neg + rec_neg))

macro_f1 <- (f1_pos + f1_neg) / 2

cat("F1-Score Kelas Positif (1):", round(f1_pos, 4), "\n")
## F1-Score Kelas Positif (1): 0.7782
cat("F1-Score Kelas Negatif (0):", round(f1_neg, 4), "\n")
## F1-Score Kelas Negatif (0): 0.686
cat("Macro F1-Score            :", round(macro_f1, 4), "\n")
## Macro F1-Score            : 0.7321

Confusion Matrix

cm <- confusionMatrix(test_data$prediksi, test_data$status_lulus)
cm_table <- as.data.frame(cm$table)

ggplot(data = cm_table, aes(x = Reference, y = Prediction, fill = Freq)) +
  geom_tile() +
  geom_text(aes(label = Freq), vcolor = "white", size = 8) +
  scale_fill_gradient(low = "#e3f2fd", high = "#1976d2") +
  labs(title = "",
       x = "Aktual",
       y = "Prediksi") +
  theme_minimal()
## Warning in geom_text(aes(label = Freq), vcolor = "white", size = 8): Ignoring
## unknown parameters: `vcolour`

  • True Positive: 456 mahasiswa diprediksi lulus, dan kenyataannya lulus.

  • True Negative: 284 mahasiswa diprediksi tidak lulus, dan kenyataannya tidak lulus.

  • False Positive: 152 mahasiswa diprediksi lulus, namun kenyataannya tidak lulus.

  • False Negative: 108 mahasiswa diprediksi tidak lulus, namun kenyataannya lulus.

ROC-AUC

roc_obj <- roc(test_data$status_lulus, test_data$prob)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
auc_score <- auc(roc_obj)
cat("Nilai AUC:", round(auc_score, 4), "\n")
## Nilai AUC: 0.8187
plot(roc_obj, 
     main = paste("ROC Curve (AUC =", round(auc_score, 4), ")"),
     col = "#1976d2", 
     lwd = 4, 
     print.auc = TRUE,      
     auc.polygon = TRUE,   
     auc.polygon.col = "#e3f2fd",
     grid = TRUE)

Kesimpulan

  • AUC-ROC: Model menunjukkan performa klasifikasi yang baik. dengan nilai Area Under the Curve sebesar 0,8187. Hal ini mengindikasikan bahwa model memiliki probabilitas sebesar 81,87% untuk membedakan secara tepat antara mahasiswa yang lulus dan yang tidak lulus.

  • Macro F1-score diperoleh 0,73 hasil metrik ini mengartikan bahwa model yang dibangun memiliki validitas internal yang cukup untuk digunakan sebagai instrumen prediksi. Perbedaan antara F1-Score kelas positif dan negatif menyarankan perlunya eksplorasi lebih lanjut pada variabel-variabel yang dapat lebih spesifik mencirikan mahasiswa yang berisiko tidak lulus guna meningkatkan presisi pada kelas tersebut.

  • Berdasarkan nilai odds ratio tertinggi, intervensi melalui program pelatihan intensif bootcamp (OR = 2,0218) memiliki kecenderungan untuk lulus 2,02 kali lebih besar dibandingkan dengan mahasiswa yang tidak mengikuti program tersebut, dengan asumsi variabel lain konstan. Maka mahasiswa bisa disarankan untuk mengikuti bootcamp untuk meningkatkan probabilita kelulusan

  • Berdasarkan nilai odds ratio terendah, Setiap penambahan satu satuan jarak (OR = 0,9595) dari kediaman ke kampus, kecenderungan kelulusan mahasiswa mengalami penurunan sebesar 4,05% (1 - 0,9595). Maka mahasiswa bisa disarankan untuk mencari kos yang lebih dekat dengan kampus untuk meningkatkan probabilita kelulusan.