Pendahuluan

Pada penelitian ini dilakukan analisis data menggunakan tahapan CRISP-DM (Cross Industry Standard Process for Data Mining). Dataset yang digunakan adalah Student Performance Dataset dari UCI Machine Learning Repository. Metode yang dipilih adalah klasifikasi menggunakan algoritma Decision Tree untuk memprediksi status kelulusan mahasiswa.

Business Understanding

Permasalahan pada studi kasus ini adalah bagaimana memprediksi status kelulusan mahasiswa berdasarkan beberapa faktor akademik seperti waktu belajar, jumlah kegagalan mata kuliah, absensi, dan nilai sebelumnya.

Tujuan analisis adalah membangun model klasifikasi yang mampu membantu pihak kampus mengidentifikasi mahasiswa yang berpotensi tidak lulus sehingga dapat diberikan perhatian lebih awal.

Data Understanding

Dataset yang digunakan adalah Student Performance Dataset.

Sumber dataset: https://archive.ics.uci.edu/dataset/320/student+performance

Membaca Dataset

data <- read.csv("C:/Users/yolan/Downloads/student-mat.csv", sep = ";")

Menampilkan 6 Data Pertama

head(data)
##   school sex age address famsize Pstatus Medu Fedu     Mjob     Fjob     reason
## 1     GP   F  18       U     GT3       A    4    4  at_home  teacher     course
## 2     GP   F  17       U     GT3       T    1    1  at_home    other     course
## 3     GP   F  15       U     LE3       T    1    1  at_home    other      other
## 4     GP   F  15       U     GT3       T    4    2   health services       home
## 5     GP   F  16       U     GT3       T    3    3    other    other       home
## 6     GP   M  16       U     LE3       T    4    3 services    other reputation
##   guardian traveltime studytime failures schoolsup famsup paid activities
## 1   mother          2         2        0       yes     no   no         no
## 2   father          1         2        0        no    yes   no         no
## 3   mother          1         2        3       yes     no  yes         no
## 4   mother          1         3        0        no    yes  yes        yes
## 5   father          1         2        0        no    yes  yes         no
## 6   mother          1         2        0        no    yes  yes        yes
##   nursery higher internet romantic famrel freetime goout Dalc Walc health
## 1     yes    yes       no       no      4        3     4    1    1      3
## 2      no    yes      yes       no      5        3     3    1    1      3
## 3     yes    yes      yes       no      4        3     2    2    3      3
## 4     yes    yes      yes      yes      3        2     2    1    1      5
## 5     yes    yes       no       no      4        3     2    1    2      5
## 6     yes    yes      yes       no      5        4     2    1    2      5
##   absences G1 G2 G3
## 1        6  5  6  6
## 2        4  5  5  6
## 3       10  7  8 10
## 4        2 15 14 15
## 5        4  6 10 10
## 6       10 15 15 15

Struktur Data

str(data)
## 'data.frame':    395 obs. of  33 variables:
##  $ school    : chr  "GP" "GP" "GP" "GP" ...
##  $ sex       : chr  "F" "F" "F" "F" ...
##  $ age       : int  18 17 15 15 16 16 16 17 15 15 ...
##  $ address   : chr  "U" "U" "U" "U" ...
##  $ famsize   : chr  "GT3" "GT3" "LE3" "GT3" ...
##  $ Pstatus   : chr  "A" "T" "T" "T" ...
##  $ Medu      : int  4 1 1 4 3 4 2 4 3 3 ...
##  $ Fedu      : int  4 1 1 2 3 3 2 4 2 4 ...
##  $ Mjob      : chr  "at_home" "at_home" "at_home" "health" ...
##  $ Fjob      : chr  "teacher" "other" "other" "services" ...
##  $ reason    : chr  "course" "course" "other" "home" ...
##  $ guardian  : chr  "mother" "father" "mother" "mother" ...
##  $ traveltime: int  2 1 1 1 1 1 1 2 1 1 ...
##  $ studytime : int  2 2 2 3 2 2 2 2 2 2 ...
##  $ failures  : int  0 0 3 0 0 0 0 0 0 0 ...
##  $ schoolsup : chr  "yes" "no" "yes" "no" ...
##  $ famsup    : chr  "no" "yes" "no" "yes" ...
##  $ paid      : chr  "no" "no" "yes" "yes" ...
##  $ activities: chr  "no" "no" "no" "yes" ...
##  $ nursery   : chr  "yes" "no" "yes" "yes" ...
##  $ higher    : chr  "yes" "yes" "yes" "yes" ...
##  $ internet  : chr  "no" "yes" "yes" "yes" ...
##  $ romantic  : chr  "no" "no" "no" "yes" ...
##  $ famrel    : int  4 5 4 3 4 5 4 4 4 5 ...
##  $ freetime  : int  3 3 3 2 3 4 4 1 2 5 ...
##  $ goout     : int  4 3 2 2 2 2 4 4 2 1 ...
##  $ Dalc      : int  1 1 2 1 1 1 1 1 1 1 ...
##  $ Walc      : int  1 1 3 1 2 2 1 1 1 1 ...
##  $ health    : int  3 3 3 5 5 5 3 1 1 5 ...
##  $ absences  : int  6 4 10 2 4 10 0 6 0 0 ...
##  $ G1        : int  5 5 7 15 6 15 12 6 16 14 ...
##  $ G2        : int  6 5 8 14 10 15 12 5 18 15 ...
##  $ G3        : int  6 6 10 15 10 15 11 6 19 15 ...

Statistik Deskriptif

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       
##  Min.   : 0.00  
##  1st Qu.: 8.00  
##  Median :11.00  
##  Mean   :10.42  
##  3rd Qu.:14.00  
##  Max.   :20.00

Keterangan Variabel

Variabel Keterangan
school Sekolah siswa
sex Jenis kelamin siswa
age Usia siswa
address Jenis tempat tinggal siswa
famsize Ukuran keluarga
Pstatus Status orang tua
Medu Tingkat pendidikan ibu
Fedu Tingkat pendidikan ayah
Mjob Pekerjaan ibu
Fjob Pekerjaan ayah
reason Alasan memilih sekolah
guardian Wali utama siswa
traveltime Waktu perjalanan ke sekolah
studytime Waktu belajar siswa
failures Jumlah kegagalan mata pelajaran
schoolsup Dukungan pendidikan tambahan dari sekolah
famsup Dukungan pendidikan dari keluarga
paid Mengikuti kelas tambahan berbayar
activities Mengikuti kegiatan ekstrakurikuler
nursery Pernah mengikuti taman kanak-kanak
higher Keinginan melanjutkan pendidikan tinggi
internet Memiliki akses internet di rumah
romantic Memiliki hubungan romantis
famrel Kualitas hubungan keluarga
freetime Waktu luang setelah sekolah
goout Frekuensi keluar bersama teman
Dalc Konsumsi alkohol hari kerja
Walc Konsumsi alkohol akhir pekan
health Kondisi kesehatan siswa
absences Jumlah ketidakhadiran siswa
G1 Nilai semester pertama
G2 Nilai semester kedua
G3 Nilai akhir mahasiswa

Keterangan Tambahan

Tingkat Pendidikan Orang Tua (Medu dan Fedu)

  • 0 = Tidak sekolah
  • 1 = Pendidikan dasar
  • 2 = SMP
  • 3 = SMA
  • 4 = Perguruan tinggi

Waktu Perjalanan ke Sekolah (traveltime)

  • 1 = <15 menit
  • 2 = 15–30 menit
  • 3 = 30–60 menit
  • 4 = >60 menit

Waktu Belajar (studytime)

  • 1 = <2 jam
  • 2 = 2–5 jam
  • 3 = 5–10 jam
  • 4 = >10 jam

Skala Penilaian

Variabel:

  • famrel

  • freetime

-goout

  • Dalc

  • Walc

  • health

menggunakan skala 1–5, di mana semakin besar nilai menunjukkan tingkat yang lebih tinggi.

Kriteria Kelulusan

Kriteria kelulusan menggunakan batas nilai 10 karena pada dataset Student Performance nilai akhir mahasiswa (G3) berada pada skala 0–20, di mana nilai 10 merupakan batas minimum kelulusan.

  • G3 ≥ 10 = Lulus
  • G3 < 10 = Tidak Lulus

Data Preparation

Pada tahap preprocessing dilakukan:

Mengecek Missing Value

colSums(is.na(data))
##     school        sex        age    address    famsize    Pstatus       Medu 
##          0          0          0          0          0          0          0 
##       Fedu       Mjob       Fjob     reason   guardian traveltime  studytime 
##          0          0          0          0          0          0          0 
##   failures  schoolsup     famsup       paid activities    nursery     higher 
##          0          0          0          0          0          0          0 
##   internet   romantic     famrel   freetime      goout       Dalc       Walc 
##          0          0          0          0          0          0          0 
##     health   absences         G1         G2         G3 
##          0          0          0          0          0

Membuat Variabel Target

Variabel target dibuat berdasarkan nilai akhir mahasiswa (G3).

  • G3 ≥ 10 = Lulus
  • G3 < 10 = Tidak Lulus
data$Status <- ifelse(
  data$G3 >= 10,
  "Lulus",
  "Tidak_Lulus"
)

data$Status <- as.factor(data$Status)

table(data$Status)
## 
##       Lulus Tidak_Lulus 
##         265         130

Memilih Variabel yang Digunakan

data_model <- data[, c(
  "studytime",
  "failures",
  "absences",
  "G1",
  "G2",
  "Status"
)]

head(data_model)
##   studytime failures absences G1 G2      Status
## 1         2        0        6  5  6 Tidak_Lulus
## 2         2        0        4  5  5 Tidak_Lulus
## 3         2        3       10  7  8       Lulus
## 4         3        0        2 15 14       Lulus
## 5         2        0        4  6 10       Lulus
## 6         2        0       10 15 15       Lulus

Membagi Data Training dan Testing

set.seed(123)

sample_index <- sample(
  1:nrow(data_model),
  0.7 * nrow(data_model)
)

train_data <- data_model[sample_index, ]
test_data <- data_model[-sample_index, ]

Modeling

Metode yang digunakan adalah klasifikasi dengan algoritma Decision Tree.

Memanggil Library

library(rpart)
library(rpart.plot)
library(caret)

Membuat Model Decision Tree

model <- rpart(
  Status ~ .,
  data = train_data,
  method = "class"
)

print(model)
## n= 276 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 276 82 Lulus (0.70289855 0.29710145)  
##    2) G2>=9.5 185  4 Lulus (0.97837838 0.02162162) *
##    3) G2< 9.5 91 13 Tidak_Lulus (0.14285714 0.85714286)  
##      6) G2>=8.5 31 11 Tidak_Lulus (0.35483871 0.64516129)  
##       12) absences< 11 23 11 Tidak_Lulus (0.47826087 0.52173913)  
##         24) absences>=5.5 9  3 Lulus (0.66666667 0.33333333) *
##         25) absences< 5.5 14  5 Tidak_Lulus (0.35714286 0.64285714) *
##       13) absences>=11 8  0 Tidak_Lulus (0.00000000 1.00000000) *
##      7) G2< 8.5 60  2 Tidak_Lulus (0.03333333 0.96666667) *

Visualisasi Decision Tree

rpart.plot(model)

Berdasarkan visualisasi Decision Tree di atas, diperoleh bahwa variabel G2 (nilai semester sebelumnya) menjadi root node atau akar pohon keputusan karena memiliki pengaruh terbesar dalam menentukan status kelulusan mahasiswa. Pohon keputusan menunjukkan bahwa jika nilai G2 ≥ 10, maka mahasiswa langsung diprediksi Lulus. Cabang ini mencakup sekitar 67% dari total data sehingga menunjukkan bahwa sebagian besar mahasiswa dengan nilai G2 tinggi memiliki kemungkinan besar untuk lulus.

Sebaliknya, jika nilai G2 < 10, maka model melanjutkan proses keputusan ke percabangan berikutnya. Pada kondisi ini, sebagian besar mahasiswa diprediksi Tidak_Lulus. Model kemudian mempertimbangkan variabel lain yaitu absences atau jumlah ketidakhadiran. Jika jumlah absensi terlalu tinggi, maka kemungkinan mahasiswa diprediksi tidak lulus menjadi lebih besar. Namun, pada beberapa kondisi tertentu mahasiswa masih dapat diprediksi lulus meskipun nilai G2 rendah apabila absensinya tidak terlalu banyak.

Secara keseluruhan, hasil Decision Tree menunjukkan bahwa nilai akademik sebelumnya (G2) merupakan faktor paling penting dalam menentukan kelulusan mahasiswa, diikuti oleh faktor absensi. Model ini membantu memahami pola data secara lebih mudah karena aturan keputusan divisualisasikan dalam bentuk pohon keputusan. # Prediction

Melakukan Prediksi Data Testing

prediksi <- predict(
  model,
  test_data,
  type = "class"
)

head(prediksi)
##           1           3           6           8          12          15 
## Tidak_Lulus Tidak_Lulus       Lulus Tidak_Lulus       Lulus       Lulus 
## Levels: Lulus Tidak_Lulus

Evaluation

Confusion Matrix

confusionMatrix(
  prediksi,
  test_data$Status
)
## Confusion Matrix and Statistics
## 
##              Reference
## Prediction    Lulus Tidak_Lulus
##   Lulus          61           6
##   Tidak_Lulus    10          42
##                                           
##                Accuracy : 0.8655          
##                  95% CI : (0.7909, 0.9212)
##     No Information Rate : 0.5966          
##     P-Value [Acc > NIR] : 1.345e-10       
##                                           
##                   Kappa : 0.7244          
##                                           
##  Mcnemar's Test P-Value : 0.4533          
##                                           
##             Sensitivity : 0.8592          
##             Specificity : 0.8750          
##          Pos Pred Value : 0.9104          
##          Neg Pred Value : 0.8077          
##              Prevalence : 0.5966          
##          Detection Rate : 0.5126          
##    Detection Prevalence : 0.5630          
##       Balanced Accuracy : 0.8671          
##                                           
##        'Positive' Class : Lulus           
## 

Hasil confusion matrix menunjukkan bahwa model Decision Tree mampu melakukan klasifikasi status kelulusan mahasiswa dengan cukup baik. Nilai accuracy yang tinggi menunjukkan bahwa model memiliki kemampuan prediksi yang baik terhadap data testing.

Interpretation

Berdasarkan hasil Decision Tree, diperoleh bahwa variabel nilai sebelumnya (G1 dan G2), jumlah kegagalan mata kuliah (failures), waktu belajar (studytime), dan absensi memiliki pengaruh terhadap status kelulusan mahasiswa. Mahasiswa dengan nilai sebelumnya tinggi cenderung diprediksi lulus, sedangkan mahasiswa dengan jumlah kegagalan yang tinggi memiliki kemungkinan lebih besar untuk tidak lulus.

Hasil evaluasi model menunjukkan bahwa metode klasifikasi Decision Tree mampu melakukan prediksi status kelulusan mahasiswa dengan cukup baik berdasarkan nilai accuracy pada confusion matrix.

Conclusion

Berdasarkan hasil analisis menggunakan tahapan CRISP-DM dan metode klasifikasi Decision Tree, model mampu memprediksi status kelulusan mahasiswa berdasarkan beberapa faktor akademik. Variabel yang paling berpengaruh dalam model adalah nilai akademik sebelumnya dan jumlah kegagalan mata kuliah. Hasil analisis ini dapat membantu pihak kampus dalam melakukan pemantauan akademik dan memberikan intervensi lebih awal kepada mahasiswa yang berisiko tidak lulus.