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.
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.
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. |
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 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
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 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)\).
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\).
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.
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. |
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)
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)
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 <- glm(status_lulus ~ ., data = train_data, family = binomial)
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.
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).
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)
\[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
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.
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 (+) |
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
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_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)
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.