1. Buat Data Siswa (Tanpa Label Awal)

set.seed(123)
data_siswa <- data.frame(
  Nama = paste0("Siswa_", 1:35),
  Nilai_UAS = c(90, 77, 68, 83, 92, 55, 80, 78, 85, 73,
                88, 81, 79, 76, 84, 89, 91, 87, 86, 70,
                90, 83, 82, 78, 77, 93, 84, 88, 81, 85,
                76, 80, 87, 79, 90),
  Nilai_Tugas = c(85, 88, 72, 95, 91, 60, 73, 76, 88, 78,
                  83, 79, 82, 74, 85, 80, 93, 77, 81, 75,
                  90, 78, 75, 79, 76, 87, 84, 92, 80, 88,
                  71, 86, 89, 90, 91),
  Kehadiran = c(18, 17, 19, 16, 19, 12, 17, 15, 20, 16,
                19, 18, 16, 15, 20, 19, 20, 18, 17, 20,
                18, 19, 18, 16, 15, 20, 19, 20, 18, 17,
                16, 19, 20, 19, 18)
)

2. Buat Label Kelulusan Berdasarkan Aturan

data_siswa$Lulus <- ifelse(
  data_siswa$Nilai_UAS > 75 &
  data_siswa$Nilai_Tugas > 70 &
  data_siswa$Kehadiran >= 15, "Lulus", "Tidak"
)
data_siswa$Lulus <- as.factor(data_siswa$Lulus)

3. Normalisasi Fitur

normalize <- function(x) {(x - min(x)) / (max(x) - min(x))}
data_norm <- as.data.frame(lapply(data_siswa[, 2:4], normalize))
data_norm$Lulus <- data_siswa$Lulus

4. Training Neural Network

library(nnet)
## Warning: package 'nnet' was built under R version 4.4.3
set.seed(123)
model <- nnet(Lulus ~ ., data = data_norm, size = 3, decay = 0.01, maxit = 200)
## # weights:  16
## initial  value 28.641984 
## iter  10 value 8.076062
## iter  20 value 3.995427
## iter  30 value 3.878243
## iter  40 value 3.673393
## iter  50 value 3.613051
## iter  60 value 3.600568
## iter  70 value 3.599887
## iter  80 value 3.598719
## iter  90 value 3.595773
## iter 100 value 3.595366
## iter 110 value 3.595355
## iter 120 value 3.595350
## final  value 3.595350 
## converged

6. Visualisasi Model

library(NeuralNetTools)
## Warning: package 'NeuralNetTools' was built under R version 4.4.3
plotnet(model)

7. Prediksi dan Gabungkan ke Data Asli

prediksi <- predict(model, data_norm[, 1:3], type = "class")
data_siswa$Prediksi_Kelulusan <- prediksi

7. Evaluasi dengan confusion matrix

library(caret)
## Warning: package 'caret' was built under R version 4.4.3
## Loading required package: ggplot2
## Loading required package: lattice
prediksi_factor <- factor(prediksi, levels = levels(data_siswa$Lulus))
conf_matrix <- confusionMatrix(prediksi_factor, data_siswa$Lulus)
print(conf_matrix)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction Lulus Tidak
##      Lulus    31     1
##      Tidak     0     3
##                                           
##                Accuracy : 0.9714          
##                  95% CI : (0.8508, 0.9993)
##     No Information Rate : 0.8857          
##     P-Value [Acc > NIR] : 0.07887         
##                                           
##                   Kappa : 0.8416          
##                                           
##  Mcnemar's Test P-Value : 1.00000         
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.7500          
##          Pos Pred Value : 0.9688          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.8857          
##          Detection Rate : 0.8857          
##    Detection Prevalence : 0.9143          
##       Balanced Accuracy : 0.8750          
##                                           
##        'Positive' Class : Lulus           
## 

8. Tabel hasil prediksi

tabel_hasil <- data_siswa[, c("Nama", "Nilai_UAS", "Nilai_Tugas", "Kehadiran", "Prediksi_Kelulusan")]
print("TABEL INPUT & OUTPUT:")
## [1] "TABEL INPUT & OUTPUT:"
print(tabel_hasil)
##        Nama Nilai_UAS Nilai_Tugas Kehadiran Prediksi_Kelulusan
## 1   Siswa_1        90          85        18              Lulus
## 2   Siswa_2        77          88        17              Lulus
## 3   Siswa_3        68          72        19              Tidak
## 4   Siswa_4        83          95        16              Lulus
## 5   Siswa_5        92          91        19              Lulus
## 6   Siswa_6        55          60        12              Tidak
## 7   Siswa_7        80          73        17              Lulus
## 8   Siswa_8        78          76        15              Lulus
## 9   Siswa_9        85          88        20              Lulus
## 10 Siswa_10        73          78        16              Lulus
## 11 Siswa_11        88          83        19              Lulus
## 12 Siswa_12        81          79        18              Lulus
## 13 Siswa_13        79          82        16              Lulus
## 14 Siswa_14        76          74        15              Lulus
## 15 Siswa_15        84          85        20              Lulus
## 16 Siswa_16        89          80        19              Lulus
## 17 Siswa_17        91          93        20              Lulus
## 18 Siswa_18        87          77        18              Lulus
## 19 Siswa_19        86          81        17              Lulus
## 20 Siswa_20        70          75        20              Tidak
## 21 Siswa_21        90          90        18              Lulus
## 22 Siswa_22        83          78        19              Lulus
## 23 Siswa_23        82          75        18              Lulus
## 24 Siswa_24        78          79        16              Lulus
## 25 Siswa_25        77          76        15              Lulus
## 26 Siswa_26        93          87        20              Lulus
## 27 Siswa_27        84          84        19              Lulus
## 28 Siswa_28        88          92        20              Lulus
## 29 Siswa_29        81          80        18              Lulus
## 30 Siswa_30        85          88        17              Lulus
## 31 Siswa_31        76          71        16              Lulus
## 32 Siswa_32        80          86        19              Lulus
## 33 Siswa_33        87          89        20              Lulus
## 34 Siswa_34        79          90        19              Lulus
## 35 Siswa_35        90          91        18              Lulus

9. Hitung akurasi manual

akurasi <- sum(data_siswa$Lulus == data_siswa$Prediksi_Kelulusan) / nrow(data_siswa) * 100
cat("\nAkurasi Model Neural Network:", round(akurasi, 2), "%\n")
## 
## Akurasi Model Neural Network: 97.14 %