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")
