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.
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.
Dataset yang digunakan adalah Student Performance Dataset.
Sumber dataset: https://archive.ics.uci.edu/dataset/320/student+performance
data <- read.csv("C:/Users/yolan/Downloads/student-mat.csv", sep = ";")
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
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 ...
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
| 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 |
Variabel:
famrel
freetime
-goout
Dalc
Walc
health
menggunakan skala 1–5, di mana semakin besar nilai menunjukkan tingkat yang lebih tinggi.
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.
Pada tahap preprocessing dilakukan:
pengecekan missing value
pemilihan variabel
pembuatan variabel target
dan pembagian data training serta testing.
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
Variabel target dibuat berdasarkan nilai akhir mahasiswa (G3).
data$Status <- ifelse(
data$G3 >= 10,
"Lulus",
"Tidak_Lulus"
)
data$Status <- as.factor(data$Status)
table(data$Status)
##
## Lulus Tidak_Lulus
## 265 130
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
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, ]
Metode yang digunakan adalah klasifikasi dengan algoritma Decision Tree.
library(rpart)
library(rpart.plot)
library(caret)
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) *
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
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
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.
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.
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.