Business Understanding

Pendidikan merupakan salah satu faktor penting dalam meningkatkan kualitas sumber daya manusia. Oleh karena itu, diperlukan analisis untuk mengetahui faktor-faktor yang mempengaruhi performa dan kelulusan siswa.

Pada penelitian ini dilakukan analisis terhadap data performa siswa menggunakan metode Decision Tree. Metode ini dipilih karena mampu melakukan klasifikasi data dengan baik serta menghasilkan visualisasi pohon keputusan yang mudah dipahami.

Tujuan dari penelitian ini adalah untuk memprediksi status kelulusan siswa berdasarkan beberapa faktor akademik dan kondisi siswa, seperti waktu belajar, jumlah ketidakhadiran, nilai sebelumnya, dan faktor pendukung lainnya.

Data Understanding

Memanggil Library

library(rpart)
library(rpart.plot)
## Warning: package 'rpart.plot' was built under R version 4.5.3
library(DT)
## Warning: package 'DT' was built under R version 4.5.1

Membaca Dataset

data <- read.csv("C:\\Users\\H P\\Downloads\\student_data.csv")

Menampilkan Sebagian Dataset

Pada tahap ini hanya ditampilkan beberapa data awal untuk memahami isi dataset.

datatable(
  head(data, 10),
  options = list(
    scrollX = TRUE,
    pageLength = 5
  ),
  caption = "10 Data Awal Student Performance Dataset"
)

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

Nama Variabel

names(data)
##  [1] "school"     "sex"        "age"        "address"    "famsize"   
##  [6] "Pstatus"    "Medu"       "Fedu"       "Mjob"       "Fjob"      
## [11] "reason"     "guardian"   "traveltime" "studytime"  "failures"  
## [16] "schoolsup"  "famsup"     "paid"       "activities" "nursery"   
## [21] "higher"     "internet"   "romantic"   "famrel"     "freetime"  
## [26] "goout"      "Dalc"       "Walc"       "health"     "absences"  
## [31] "G1"         "G2"         "G3"

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

Dimensi Dataset

dim(data)
## [1] 395  33

Data Preparation

Tahap preparation data dilakukan untuk membersihkan dan menyiapkan data sebelum proses modeling serta melakukan format ulamg pada struktur data yang ingin di analisis. ## 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 siswa (G3).

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

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

Memilih Variabel yang Digunakan

Variabel yang digunakan dipilih berdasarkan faktor yang berhubungan dengan performa akademik siswa dan untuk menghindari penggunaan variabel yang kurang berkontribusi terhadap model.

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

Menampilkan Data Setelah Preparation

datatable(
  head(data_model, 10),
  options = list(
    scrollX = TRUE,
    pageLength = 5
  ),
  caption = "Data Setelah Preparation"
)

Mengubah Variabel Kategorik Menjadi Faktor

data_model$higher <- as.factor(
  data_model$higher
)

data_model$internet <- as.factor(
  data_model$internet
)

Struktur Data Setelah Preprocessing

str(data_model)
## 'data.frame':    395 obs. of  8 variables:
##  $ studytime: int  2 2 2 3 2 2 2 2 2 2 ...
##  $ failures : int  0 0 3 0 0 0 0 0 0 0 ...
##  $ 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 ...
##  $ higher   : Factor w/ 2 levels "no","yes": 2 2 2 2 2 2 2 2 2 2 ...
##  $ internet : Factor w/ 2 levels "no","yes": 1 2 2 2 1 2 2 1 2 2 ...
##  $ Status   : Factor w/ 2 levels "Lulus","Tidak Lulus": 2 2 1 1 1 1 1 2 1 1 ...

Pembangunan Model

Membuat Model Decision Tree

model <- rpart(
  Status ~ studytime +
           failures +
           absences +
           G1 +
           G2 +
           higher +
           internet,
  
  data = data_model,
  method = "class"
)

model
## n= 395 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 395 130 Lulus (0.67088608 0.32911392)  
##    2) G2>=9.5 249   8 Lulus (0.96787149 0.03212851) *
##    3) G2< 9.5 146  24 Tidak Lulus (0.16438356 0.83561644)  
##      6) G2>=7.5 82  24 Tidak Lulus (0.29268293 0.70731707)  
##       12) absences< 10.5 65  23 Tidak Lulus (0.35384615 0.64615385)  
##         24) G1>=7.5 52  22 Tidak Lulus (0.42307692 0.57692308)  
##           48) G2>=8.5 32  15 Lulus (0.53125000 0.46875000)  
##             96) G1< 9.5 19   6 Lulus (0.68421053 0.31578947) *
##             97) G1>=9.5 13   4 Tidak Lulus (0.30769231 0.69230769) *
##           49) G2< 8.5 20   5 Tidak Lulus (0.25000000 0.75000000) *
##         25) G1< 7.5 13   1 Tidak Lulus (0.07692308 0.92307692) *
##       13) absences>=10.5 17   1 Tidak Lulus (0.05882353 0.94117647) *
##      7) G2< 7.5 64   0 Tidak Lulus (0.00000000 1.00000000) *

Visualisasi Decision Tree

rpart.plot(
  model,
  
  type = 3,
  extra = 104,
  box.palette = "GnRd",
  shadow.col = "gray90",
  branch.lty = 1,
  cex = 0.9,
  fallen.leaves = TRUE,
  nn = FALSE,
  faclen = 0,
  
  main = "Visualisasi Decision Tree Prediksi Kelulusan"
)

Evaluasi dan Interpretasi Hasil

Melakukan Prediksi

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

head(prediksi)
##           1           2           3           4           5           6 
## Tidak Lulus Tidak Lulus Tidak Lulus       Lulus       Lulus       Lulus 
## Levels: Lulus Tidak Lulus

Confusion Matrix

conf_matrix <- table(
  Aktual = data_model$Status,
  Prediksi = prediksi
)

conf_matrix
##              Prediksi
## Aktual        Lulus Tidak Lulus
##   Lulus         254          11
##   Tidak Lulus    14         116

Menghitung Accuracy

accuracy <- mean(
  prediksi == data_model$Status
)

accuracy
## [1] 0.9367089

Interpretasi Hasil

erdasarkan hasil visualisasi Decision Tree dan nilai accuracy yang diperoleh, model mampu mengklasifikasikan status kelulusan siswa dengan cukup baik.

Hasil visualisasi menunjukkan bahwa variabel yang paling berpengaruh dalam menentukan status kelulusan siswa adalah nilai G2. Hal ini terlihat karena G2 berada pada root node atau percabangan pertama pada pohon keputusan. Kondisi tersebut menunjukkan bahwa nilai pada periode kedua memiliki hubungan yang sangat kuat terhadap hasil kelulusan akhir siswa.

Siswa dengan nilai G2 ≥ 10 cenderung langsung diklasifikasikan sebagai “Lulus”. Sebaliknya, siswa dengan nilai G2 < 10 memiliki kemungkinan lebih besar untuk dikategorikan “Tidak Lulus” dan akan dianalisis kembali menggunakan variabel lain seperti absensi dan nilai G1.

Selain G2, nilai akademik sebelumnya seperti G1 juga menjadi faktor penting dalam proses klasifikasi. Siswa dengan nilai G1 dan G2 yang tinggi cenderung diprediksi lulus, sedangkan siswa dengan nilai yang rendah memiliki peluang lebih besar untuk tidak lulus. Hal ini menunjukkan bahwa performa akademik sebelumnya dapat menjadi indikator utama dalam memprediksi hasil akhir siswa.

Variabel absensi juga memberikan insight penting, dimana siswa dengan tingkat ketidakhadiran yang tinggi cenderung memiliki performa akademik yang lebih rendah dibandingkan siswa dengan jumlah absensi yang sedikit. Pada beberapa cabang pohon keputusan terlihat bahwa jumlah absensi yang tinggi mengarah pada klasifikasi “Tidak Lulus”.

Selain itu, jumlah kegagalan (failures) turut memberikan pengaruh terhadap hasil klasifikasi. Siswa yang memiliki riwayat kegagalan lebih banyak cenderung memiliki peluang kelulusan yang lebih rendah.

Di sisi lain, waktu belajar (studytime) menunjukkan bahwa siswa yang memiliki waktu belajar lebih baik cenderung memperoleh hasil akademik yang lebih baik pula.

Secara keseluruhan, hasil analisis menunjukkan bahwa faktor akademik seperti nilai sebelumnya, jumlah kegagalan, dan absensi memiliki pengaruh yang lebih dominan dibandingkan faktor pendukung lainnya seperti akses internet atau keinginan melanjutkan pendidikan tinggi.

Kesimpulan

Berdasarkan hasil analisis yang telah dilakukan menggunakan metode Decision Tree, diperoleh bahwa model mampu melakukan klasifikasi status kelulusan siswa dengan cukup baik berdasarkan faktor akademik dan kondisi siswa. Metode Decision Tree dipilih karena mampu menghasilkan model klasifikasi yang mudah dipahami melalui bentuk visualisasi pohon keputusan.

Hasil analisis menunjukkan bahwa variabel akademik seperti nilai G1 dan G2 menjadi faktor yang paling dominan dalam menentukan status kelulusan siswa. Selain itu, variabel lain seperti jumlah kegagalan (failures), tingkat absensi, dan waktu belajar (studytime) juga memberikan pengaruh terhadap hasil klasifikasi. Siswa dengan nilai akademik yang tinggi, jumlah absensi yang rendah, dan waktu belajar yang lebih baik cenderung memiliki peluang lebih besar untuk lulus.

Visualisasi Decision Tree juga menunjukkan bahwa nilai G2 menjadi percabangan utama dalam proses pengambilan keputusan model. Hal ini mengindikasikan bahwa performa akademik pada periode sebelumnya memiliki hubungan yang kuat terhadap hasil akhir siswa.

Secara keseluruhan, metode Decision Tree dapat digunakan sebagai salah satu pendekatan untuk membantu memahami faktor-faktor yang mempengaruhi kelulusan siswa. Selain mampu memberikan hasil klasifikasi yang cukup baik, metode ini juga mudah diinterpretasikan sehingga dapat membantu dalam proses pengambilan keputusan maupun evaluasi performa akademik siswa.