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)

Rumusan Masalah

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

Pembuatan Model Naive bayes

1. Memuat Library dan Eksplorasi Data

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

2. Pembersihan dan Transformasi Data

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

3. Membagi Dataset ke Data Training dan Testing

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

4. Naive Bayes Classifier

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

5. Evaluasi Model

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

6. Interpretasi Hasil Evaluasi Model

Berikut adalah interpretasi dari confusion matrix dan metrik evaluasi model Naive Bayes:

Confusion Matrix (Ringkasan Klasifikasi)

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


Statistik Evaluasi

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

Kesimpulan 1:

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.

Studi Kasus: Prediksi Kelulusan Siswa Matematika

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

Kesimpulan 2:

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.