Sumber datset : https://www.kaggle.com/datasets/impapan/student-performance-data-set/data
Alternatif : https://www.kaggle.com/datasets/ishandutta/student-performance-data-set
link Drive RMarkdown dan Backup datasets: https://drive.google.com/drive/folders/1ne9RRozvbJMvxcXL_7OElJscbcBqYdSX
(dataset :student-mat.csv)
1. Dapatkah metode klasifikasi Naive Bayes digunakan untuk memprediksi kelulusan siswa dalam mata pelajaran Matematika berdasarkan data karakteristik siswa?
2. Bagaimana Jika model naive bayes tersebut diaplikasikan Uji coba pada satu kasus murid baru dengan karateristek yang sudah diketahui?
catatan: fitur yang digunakan sebagai prediktor : prediktor (sex, age, studytime, failures, schoolsup, famsup, absences, goout,freetime, Medu, Fedu, internet, romantic, higher, G1, G2).
Langkah pertama adalah memuat library-library yang diperlukan lalu memuat dataset student-mat.csv yang berisi data siswa pada mata pelajaran Matematika. Dataset ini memuat berbagai informasi demografis dan akademik siswa. Selanjutnya memahami struktur data dan membuat label target yang akan diprediksi, yaitu kelulusan siswa. Siswa dianggap lulus (Pass) jika nilai akhir (G3) ≥ 10, dan gagal (Fail) jika G3 < 10.
# Memuat library yang dibutuhkan
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(e1071)
library(ggplot2)
library(caret)
## Loading required package: lattice
# Memuat dataset
data <- read.csv("student-mat.csv", sep = ";")
# Lihat struktur data
# Buat label kelulusan
data <- data %>%
mutate(pass = ifelse(G3 >= 10, "Pass", "Fail"),
pass = as.factor(pass))
# Lihat distribusi kelulusan
table(data$pass)
##
## Fail Pass
## 130 265
summary(data)
## school sex age address
## Length:395 Length:395 Min. :15.0 Length:395
## Class :character Class :character 1st Qu.:16.0 Class :character
## Mode :character Mode :character Median :17.0 Mode :character
## Mean :16.7
## 3rd Qu.:18.0
## Max. :22.0
## famsize Pstatus Medu Fedu
## Length:395 Length:395 Min. :0.000 Min. :0.000
## Class :character Class :character 1st Qu.:2.000 1st Qu.:2.000
## Mode :character Mode :character Median :3.000 Median :2.000
## Mean :2.749 Mean :2.522
## 3rd Qu.:4.000 3rd Qu.:3.000
## Max. :4.000 Max. :4.000
## Mjob Fjob reason guardian
## Length:395 Length:395 Length:395 Length:395
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## traveltime studytime failures schoolsup
## Min. :1.000 Min. :1.000 Min. :0.0000 Length:395
## 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:0.0000 Class :character
## Median :1.000 Median :2.000 Median :0.0000 Mode :character
## Mean :1.448 Mean :2.035 Mean :0.3342
## 3rd Qu.:2.000 3rd Qu.:2.000 3rd Qu.:0.0000
## Max. :4.000 Max. :4.000 Max. :3.0000
## famsup paid activities nursery
## Length:395 Length:395 Length:395 Length:395
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## higher internet romantic famrel
## Length:395 Length:395 Length:395 Min. :1.000
## Class :character Class :character Class :character 1st Qu.:4.000
## Mode :character Mode :character Mode :character Median :4.000
## Mean :3.944
## 3rd Qu.:5.000
## Max. :5.000
## freetime goout Dalc Walc
## Min. :1.000 Min. :1.000 Min. :1.000 Min. :1.000
## 1st Qu.:3.000 1st Qu.:2.000 1st Qu.:1.000 1st Qu.:1.000
## Median :3.000 Median :3.000 Median :1.000 Median :2.000
## Mean :3.235 Mean :3.109 Mean :1.481 Mean :2.291
## 3rd Qu.:4.000 3rd Qu.:4.000 3rd Qu.:2.000 3rd Qu.:3.000
## Max. :5.000 Max. :5.000 Max. :5.000 Max. :5.000
## health absences G1 G2
## Min. :1.000 Min. : 0.000 Min. : 3.00 Min. : 0.00
## 1st Qu.:3.000 1st Qu.: 0.000 1st Qu.: 8.00 1st Qu.: 9.00
## Median :4.000 Median : 4.000 Median :11.00 Median :11.00
## Mean :3.554 Mean : 5.709 Mean :10.91 Mean :10.71
## 3rd Qu.:5.000 3rd Qu.: 8.000 3rd Qu.:13.00 3rd Qu.:13.00
## Max. :5.000 Max. :75.000 Max. :19.00 Max. :19.00
## G3 pass
## Min. : 0.00 Fail:130
## 1st Qu.: 8.00 Pass:265
## Median :11.00
## Mean :10.42
## 3rd Qu.:14.00
## Max. :20.00
karena tidak ada NA maka kita tidak perlu menggunakan mice untuk melanjutkan, tapi karena fiturnya banyak, kita pilih beberapa fitur relevan saja untuk menjadi prediktor (sex, age, studytime, failures, schoolsup, famsup, absences, goout,freetime, Medu, Fedu, internet, romantic, higher, G1, G2).
Naive Bayes bekerja optimal dengan data kategorikal. Oleh karena itu, langkah ini melakukan pemilihan fitur yang relevan dan diskretisasi (pengelompokan) variabel numerik menjadi kategori, seperti usia, absensi, dan nilai G1 dan G2. Kita memilih fitur yang secara logis berpotensi memengaruhi kelulusan, seperti jam belajar, dukungan keluarga, nilai sebelumnya, dll.
# Pilih fitur penting dan prediktif
data_selected <- data %>%
select(pass, sex, age, studytime, failures, schoolsup, famsup, absences, goout,freetime, Medu, Fedu, internet, romantic, higher, G1, G2)
# Ubah variabel kategorik menjadi faktor
data_selected <- data_selected %>%
mutate(across(c(sex, schoolsup, famsup, internet, romantic, higher), as.factor))
# Diskretisasi variabel numerik
data_selected$age_group <- cut(data_selected$age, breaks = c(14, 16, 18, 23),
labels = c("14-16", "17-18", "19-22"), right = FALSE)
data_selected$absence_level <- cut(data_selected$absences, breaks = c(-1, 5, 15, max(data$absences)),
labels = c("Low", "Medium", "High"))
data_selected$G1_level <- cut(data_selected$G1, breaks = c(-1, 9, 14, 20),
labels = c("Low", "Medium", "High"))
data_selected$G2_level <- cut(data_selected$G2, breaks = c(-1, 9, 14, 20),
labels = c("Low", "Medium", "High"))
# Hapus variabel asli
data_selected <- data_selected %>%
select(-age, -absences, -G1, -G2)
summary(data_selected)
## pass sex studytime failures schoolsup famsup
## Fail:130 F:208 Min. :1.000 Min. :0.0000 no :344 no :153
## Pass:265 M:187 1st Qu.:1.000 1st Qu.:0.0000 yes: 51 yes:242
## Median :2.000 Median :0.0000
## Mean :2.035 Mean :0.3342
## 3rd Qu.:2.000 3rd Qu.:0.0000
## Max. :4.000 Max. :3.0000
## goout freetime Medu Fedu internet
## Min. :1.000 Min. :1.000 Min. :0.000 Min. :0.000 no : 66
## 1st Qu.:2.000 1st Qu.:3.000 1st Qu.:2.000 1st Qu.:2.000 yes:329
## Median :3.000 Median :3.000 Median :3.000 Median :2.000
## Mean :3.109 Mean :3.235 Mean :2.749 Mean :2.522
## 3rd Qu.:4.000 3rd Qu.:4.000 3rd Qu.:4.000 3rd Qu.:3.000
## Max. :5.000 Max. :5.000 Max. :4.000 Max. :4.000
## romantic higher age_group absence_level G1_level G2_level
## no :263 no : 20 14-16: 82 Low :249 Low :142 Low :146
## yes:132 yes:375 17-18:202 Medium:113 Medium:188 Medium:182
## 19-22:111 High : 33 High : 65 High : 67
##
##
##
Data dibagi menjadi dua bagian: 70% untuk pelatihan model dan 30% untuk pengujian. Ini dilakukan agar kita dapat mengevaluasi performa model secara objektif.
set.seed(123)
trainIndex <- createDataPartition(data_selected$pass, p = 0.7, list = FALSE)
training_set <- data_selected[trainIndex, ]
testing_set <- data_selected[-trainIndex, ]
# Dimensi data training dan testing
dim(training_set)
## [1] 277 17
dim(testing_set)
## [1] 118 17
topredict_set<-testing_set[2:17] # Menghapus Target label (pass)
dim(topredict_set)
## [1] 118 16
summary(topredict_set)
## sex studytime failures schoolsup famsup goout
## F:59 Min. :1.000 Min. :0.0000 no :99 no :44 Min. :1.000
## M:59 1st Qu.:1.000 1st Qu.:0.0000 yes:19 yes:74 1st Qu.:2.000
## Median :2.000 Median :0.0000 Median :3.000
## Mean :1.975 Mean :0.3305 Mean :3.161
## 3rd Qu.:2.000 3rd Qu.:0.0000 3rd Qu.:4.000
## Max. :4.000 Max. :3.0000 Max. :5.000
## freetime Medu Fedu internet romantic higher
## Min. :1.000 Min. :0.000 Min. :0.000 no : 14 no :79 no : 8
## 1st Qu.:3.000 1st Qu.:2.000 1st Qu.:2.000 yes:104 yes:39 yes:110
## Median :3.000 Median :3.000 Median :3.000
## Mean :3.373 Mean :2.831 Mean :2.585
## 3rd Qu.:4.000 3rd Qu.:4.000 3rd Qu.:4.000
## Max. :5.000 Max. :4.000 Max. :4.000
## age_group absence_level G1_level G2_level
## 14-16:21 Low :71 Low :46 Low :44
## 17-18:67 Medium:34 Medium:54 Medium:53
## 19-22:30 High :13 High :18 High :21
##
##
##
Model Naive Bayes dibangun dengan menggunakan seluruh fitur yang telah dipilih dan ditransformasi. Model ini akan mempelajari hubungan antara fitur-fitur tersebut dengan status kelulusan siswa.
# Membuat model Naive Bayes
model_naive <- naiveBayes(pass ~ ., data = training_set)
# Prediksi
preds_naive <- predict(model_naive, newdata = topredict_set)
# Confusion Matrix
conf_matrix_naive <- table(preds_naive, testing_set$pass)
conf_matrix_naive
##
## preds_naive Fail Pass
## Fail 35 6
## Pass 4 73
Confusion matrix digunakan untuk melihat berapa banyak prediksi yang benar dan salah. Kita juga menggunakan fungsi confusionMatrix() dari caret untuk mendapatkan metrik evaluasi seperti akurasi, sensitivitas, dan spesifisitas.
confusionMatrix(conf_matrix_naive)
## Confusion Matrix and Statistics
##
##
## preds_naive Fail Pass
## Fail 35 6
## Pass 4 73
##
## Accuracy : 0.9153
## 95% CI : (0.8497, 0.9586)
## No Information Rate : 0.6695
## P-Value [Acc > NIR] : 2.806e-10
##
## Kappa : 0.811
##
## Mcnemar's Test P-Value : 0.7518
##
## Sensitivity : 0.8974
## Specificity : 0.9241
## Pos Pred Value : 0.8537
## Neg Pred Value : 0.9481
## Prevalence : 0.3305
## Detection Rate : 0.2966
## Detection Prevalence : 0.3475
## Balanced Accuracy : 0.9107
##
## 'Positive' Class : Fail
##
Berikut adalah interpretasi dari confusion matrix dan metrik evaluasi model Naive Bayes:
| Prediksi / Aktual | Fail (Gagal) | Pass (Lulus) |
|---|---|---|
| Fail | 35 (TP) | 6 (FP) |
| Pass | 4 (FN) | 73 (TN) |
Keterangan: - TP (True Positive): Gagal diprediksi gagal - FP (False Positive): Lulus diprediksi gagal - FN (False Negative): Gagal diprediksi lulus - TN (True Negative): Lulus diprediksi lulus
| Metrik | Nilai | Interpretasi |
|---|---|---|
| Accuracy | 91.53% | Proporsi prediksi yang benar dari total prediksi |
| Sensitivity (Recall) | 89.74% | Kemampuan model mendeteksi siswa yang gagal |
| Specificity | 92.41% | Kemampuan model mendeteksi siswa yang lulus |
| Precision (Fail) | 85.37% | Dari seluruh prediksi gagal, 85% memang benar-benar gagal |
| Negative Predictive Value | 94.81% | Dari seluruh prediksi lulus, 94.8% benar-benar lulus |
| Balanced Accuracy | 91.07% | Rata-rata akurasi masing-masing kelas (Pass & Fail) |
| Kappa | 0.811 | Tingkat kesepakatan model vs data aktual, dikoreksi untuk faktor kebetulan |
| P-Value [Acc > NIR] | 2.8e-10 | Akurasi model jauh lebih baik dari sekadar menebak kelas mayoritas |
| McNemar’s Test P-Value | 0.7518 | Tidak ada perbedaan signifikan antara kesalahan FP dan FN |
Model Naive Bayes berhasil memprediksi kelulusan siswa dengan
akurasi tinggi dan performa seimbang antara kelas
Pass dan Fail. Ini menunjukkan bahwa pendekatan ini
efektif untuk klasifikasi pada data pendidikan seperti
student-mat.csv.
Seorang siswi bernama Mia berusia 17 tahun saat ini sedang duduk di bangku akhir sekolah menengah atas. Ia dikenal sebagai siswi yang cukup rajin dan berasal dari keluarga yang mendukung pendidikannya. Mia memiliki waktu belajar sekitar 5–10 jam per minggu di rumah, tidak pernah mengalami kegagalan di mata pelajaran sebelumnya, dan hampir selalu hadir di kelas (hanya tercatat absen sebanyak 4 kali).
Orang tuanya pun sangat memperhatikan pendidikan: ibunya lulusan universitas, ayahnya lulusan SMA, dan keduanya mendukung Mia untuk melanjutkan pendidikan ke jenjang yang lebih tinggi. Selain itu, Mia tidak sedang berada dalam hubungan romantis, memiliki akses internet di rumah, serta cukup seimbang dalam membagi waktu antara bersosialisasi dan belajar.
Dari sisi akademik, Mia memperoleh nilai 13 pada ujian pertama dan 14 pada ujian kedua dalam mata pelajaran Matematika. Berdasarkan data tersebut, seorang guru penasaran apakah Mia berpeluang besar untuk lulus atau tidak dalam mata pelajaran Matematika.
# Buat data siswa baru
siswa_baru <- data.frame(
sex = factor("female", levels = levels(data_selected$sex)),
studytime = 2,
failures = 0,
schoolsup = factor("no", levels = levels(data_selected$schoolsup)),
famsup = factor("yes", levels = levels(data_selected$famsup)),
goout = 2,
freetime = 3,
Medu = 4,
Fedu = 3,
internet = factor("yes", levels = levels(data_selected$internet)),
romantic = factor("no", levels = levels(data_selected$romantic)),
higher = factor("yes", levels = levels(data_selected$higher)),
age_group = factor("17-18", levels = levels(data_selected$age_group)),
absence_level = factor("Low", levels = levels(data_selected$absence_level)),
G1_level = factor("Medium", levels = levels(data_selected$G1_level)),
G2_level = factor("Medium", levels = levels(data_selected$G2_level))
)
# Prediksi label kelas (Pass/Fail)
prediksi_siswa <- predict(model_naive, newdata = siswa_baru)
# Prediksi probabilitas untuk masing-masing kelas
probabilitas_siswa <- predict(model_naive, newdata = siswa_baru, type = "raw")
# Tampilkan hasil
prediksi_siswa
## [1] Pass
## Levels: Fail Pass
probabilitas_siswa
## Fail Pass
## [1,] 0.002839052 0.9971609
Dengan menggunakan model klasifikasi Naive Bayes yang telah dilatih menggunakan data historis siswa lain, prediksi dilakukan terhadap Mia. Hasilnya menunjukkan bahwa Mia diprediksi akan lulus (Pass) dengan probabilitas sebesar 99.72%, sedangkan probabilitas tidak lulus hanya 0.28%.
Hal ini menunjukkan bahwa berdasarkan karakteristik pribadi, dukungan keluarga, serta performa akademiknya sejauh ini, Mia memiliki peluang yang sangat tinggi untuk berhasil dalam mata pelajaran Matematika.