1. Load Library

library(readxl)     # Untuk baca file Excel
## Warning: package 'readxl' was built under R version 4.4.3
library(nnet)       # Untuk neural network
## Warning: package 'nnet' was built under R version 4.4.3
library(NeuralNetTools) # Visualisasi jaringan
## Warning: package 'NeuralNetTools' was built under R version 4.4.3
library(caret)      # Untuk confusion matrix
## Warning: package 'caret' was built under R version 4.4.3
## Loading required package: ggplot2
## Loading required package: lattice
library(dplyr)      # Untuk manipulasi data
## Warning: package 'dplyr' was built under R version 4.4.3
## 
## 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(openxlsx)   # Untuk ekspor ke Excel (opsional)
## Warning: package 'openxlsx' was built under R version 4.4.3

2. Baca Data

data<-read_excel("C:/Yulia/semester 6/Data mining/Dataset Kelulusan Mahasiswa.xlsx")
View(data)

Tampilkan struktur data

str(data)
## tibble [500 × 5] (S3: tbl_df/tbl/data.frame)
##  $ Nama       : chr [1:500] "Kiki Ananda" "Putri Fauzi" "Mira Hidayat" "Mira Ananda" ...
##  $ Kehadiran  : num [1:500] 73 42 71 44 54 53 64 57 77 73 ...
##  $ Diskusi    : num [1:500] 99 83 61 88 92 71 59 60 100 62 ...
##  $ Nilai_Tugas: num [1:500] 91 53 87 62 67 92 86 84 99 84 ...
##  $ UAS        : num [1:500] 88 64 54 81 64 49 71 65 69 52 ...
head(data)
## # A tibble: 6 × 5
##   Nama          Kehadiran Diskusi Nilai_Tugas   UAS
##   <chr>             <dbl>   <dbl>       <dbl> <dbl>
## 1 Kiki Ananda          73      99          91    88
## 2 Putri Fauzi          42      83          53    64
## 3 Mira Hidayat         71      61          87    54
## 4 Mira Ananda          44      88          62    81
## 5 Mira Septiani        54      92          67    64
## 6 Eka Hidayat          53      71          92    49

3. Tambahkan Kolom Kelulusan

data <- data %>%
  mutate(
    Kelulusan = ifelse(
      Kehadiran >= 75 & 
      Diskusi > 50 & 
      Nilai_Tugas > 60 & 
      UAS > 60, 
      "Lulus", 
      "Tidak"
    )
  )

Ubah ke faktor

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

4. Normalisasi Data (0-1)

normalize <- function(x) {
  return ((x - min(x)) / (max(x) - min(x)))
}

data_norm <- as.data.frame(lapply(data[, c("Kehadiran", "Diskusi", "Nilai_Tugas", "UAS")], normalize))
data_norm$Kelulusan <- data$Kelulusan  # Tambahkan kolom Kelulusan

5. Bagi Data Training (80%) dan Testing (20%)

set.seed(123)  # Untuk reproduktibilitas
index <- createDataPartition(data_norm$Kelulusan, p = 0.8, list = FALSE)
data_train <- data_norm[index, ]
data_test <- data_norm[-index, ]

6. Latih Model Neural Network

model <- nnet(
  Kelulusan ~ ., 
  data = data_train, 
  size = 5,     # Jumlah neuron di hidden layer
  decay = 0.01, # Untuk regularisasi
  maxit = 1000  # Jumlah iterasi
)
## # weights:  31
## initial  value 343.769175 
## iter  10 value 166.909513
## iter  20 value 69.661866
## iter  30 value 36.450874
## iter  40 value 25.763655
## iter  50 value 24.741932
## iter  60 value 24.699383
## iter  70 value 24.685484
## iter  80 value 24.677084
## iter  90 value 24.670837
## iter 100 value 24.562346
## iter 110 value 24.338981
## iter 120 value 24.179883
## iter 130 value 24.153343
## iter 140 value 24.150635
## iter 150 value 24.149122
## final  value 24.149017 
## converged

Visualisasi jaringan

plotnet(model, alpha = 0.6)

7. Prediksi untuk SEMUA DATA (50 Mahasiswa)

prediksi_semua <- predict(model, data_norm[, -5], type = "class")

8. Buat Tabel Hasil Lengkap

hasil_akhir <- data.frame(
  Nama = data$Nama,                   # Kolom nama
  Kehadiran = data$Kehadiran,         # Data asli (belum dinormalisasi)
  Diskusi = data$Diskusi,
  Nilai_Tugas = data$Nilai_Tugas,
  UAS = data$UAS,
  Kelulusan_Aktual = data$Kelulusan,  # Label sebenarnya
  Kelulusan_Prediksi = as.factor(prediksi_semua)  # Hasil prediksi
)

Tampilkan 10 baris pertama

head(hasil_akhir, 10)
##              Nama Kehadiran Diskusi Nilai_Tugas UAS Kelulusan_Aktual
## 1     Kiki Ananda        73      99          91  88            Tidak
## 2     Putri Fauzi        42      83          53  64            Tidak
## 3    Mira Hidayat        71      61          87  54            Tidak
## 4     Mira Ananda        44      88          62  81            Tidak
## 5   Mira Septiani        54      92          67  64            Tidak
## 6     Eka Hidayat        53      71          92  49            Tidak
## 7     Umi Santoso        64      59          86  71            Tidak
## 8  Nina Syahputra        57      60          84  65            Tidak
## 9   Hana Septiani        77     100          99  69            Lulus
## 10 Nina Syahputra        73      62          84  52            Tidak
##    Kelulusan_Prediksi
## 1               Tidak
## 2               Tidak
## 3               Tidak
## 4               Tidak
## 5               Tidak
## 6               Tidak
## 7               Tidak
## 8               Tidak
## 9               Lulus
## 10              Tidak

Tampilkan semua data (50 mahasiswa)

View(hasil_akhir)

9. Evaluasi Model (Confusion Matrix untuk Data Testing)

prediksi_test <- predict(model, data_test[, -5], type = "class")
conf_mat <- confusionMatrix(as.factor(prediksi_test), data_test$Kelulusan)

Tampilkan hasil evaluasi

print(conf_mat)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction Lulus Tidak
##      Lulus    15     0
##      Tidak     0    84
##                                      
##                Accuracy : 1          
##                  95% CI : (0.9634, 1)
##     No Information Rate : 0.8485     
##     P-Value [Acc > NIR] : 8.625e-08  
##                                      
##                   Kappa : 1          
##                                      
##  Mcnemar's Test P-Value : NA         
##                                      
##             Sensitivity : 1.0000     
##             Specificity : 1.0000     
##          Pos Pred Value : 1.0000     
##          Neg Pred Value : 1.0000     
##              Prevalence : 0.1515     
##          Detection Rate : 0.1515     
##    Detection Prevalence : 0.1515     
##       Balanced Accuracy : 1.0000     
##                                      
##        'Positive' Class : Lulus      
## 

10. Ekspor Hasil ke Excel (Opsional)

write.xlsx(hasil_akhir, "Hasil_Prediksi_Kelulusan.xlsx")

Lihat pentingnya variabel

varImp(model)
##              Overall
## Kehadiran   24.55872
## Diskusi     24.76327
## Nilai_Tugas 31.48134
## UAS         19.19667

Bandingkan dengan kriteria manual

library(ggplot2)
ggplot(hasil_akhir, aes(x = Kehadiran, y = UAS, color = Kelulusan_Aktual)) +
  geom_point() +
  facet_wrap(~Kelulusan_Prediksi) +
  labs(title = "Perbandingan Aktual vs Prediksi")