library(class)
library(caret)
## Warning: package 'caret' was built under R version 4.4.3
## Loading required package: ggplot2
## Loading required package: lattice
library(ggplot2)
library(dplyr)
## 
## 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(readr)
## Warning: package 'readr' was built under R version 4.4.3

Dataset Kelulusan mahasiswa

set.seed(42)
n <- 200
data_mahasiswa <- data.frame(
  IPK = round(runif(n, 2.0, 4.0), 2),
  SKS = sample(110:150, n, replace = TRUE),
  Kehadiran = sample(60:100, n, replace = TRUE),
  LamaStudi = sample(3:7, n, replace = TRUE)
)

# Menentukan label kelulusan
data_mahasiswa$Kelulusan <- ifelse(
  data_mahasiswa$IPK >= 3 & 
  data_mahasiswa$SKS >= 130 & 
  data_mahasiswa$Kehadiran >= 80 & 
  data_mahasiswa$LamaStudi <= 4,
  "Tepat Waktu", "Tidak"
)

# Ubah ke faktor
data_mahasiswa$Kelulusan <- as.factor(data_mahasiswa$Kelulusan)

Normalisasi data

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

data_norm <- as.data.frame(lapply(data_mahasiswa[, 1:4], normalize))
data_norm$Kelulusan <- data_mahasiswa$Kelulusan

Split data train

set.seed(123)
index <- createDataPartition(data_norm$Kelulusan, p = 0.7, list = FALSE)
train <- data_norm[index, ]
test <- data_norm[-index, ]

Latihan model K-NN dan Evaluasi

pred_knn <- knn(train = train[, 1:4],
                test = test[, 1:4],
                cl = train$Kelulusan,
                k = 5)
confusionMatrix(pred_knn, test$Kelulusan)
## Confusion Matrix and Statistics
## 
##              Reference
## Prediction    Tepat Waktu Tidak
##   Tepat Waktu           0     0
##   Tidak                 3    56
##                                           
##                Accuracy : 0.9492          
##                  95% CI : (0.8585, 0.9894)
##     No Information Rate : 0.9492          
##     P-Value [Acc > NIR] : 0.6473          
##                                           
##                   Kappa : 0               
##                                           
##  Mcnemar's Test P-Value : 0.2482          
##                                           
##             Sensitivity : 0.00000         
##             Specificity : 1.00000         
##          Pos Pred Value :     NaN         
##          Neg Pred Value : 0.94915         
##              Prevalence : 0.05085         
##          Detection Rate : 0.00000         
##    Detection Prevalence : 0.00000         
##       Balanced Accuracy : 0.50000         
##                                           
##        'Positive' Class : Tepat Waktu     
## 

Prediksi kasus Seorang mahasiswa

Misalkan Seorang mahasiswa baru bernama Ana memiliki data sebagai berikut: IPK 3.51 SKS 135 Kehadiran 90% Lama Studi 3.5 tahun

Data Mahasiswa

# Mahasiswa baru
Mahasiswa_ana <- data.frame(
  IPK = 3.51,
  SKS = 135,
  Kehadiran = 90,
  LamaStudi = 3.5)

Normasisasi data

# Ambil data training awal untuk skala
min_vals <- apply(data_mahasiswa [, 1:4], 2, min)
max_vals <- apply(data_mahasiswa[, 1:4], 2, max)

# Fungsi normalisasi spesifik
normalize_custom <- function(x, min_x, max_x) {
  (x - min_x) / (max_x - min_x)
}

# Normalisasi data mahasiswa baru
mahasiswa_baru_norm <- as.data.frame(
  t(mapply(normalize_custom,
           x = Mahasiswa_ana,
           min_x = min_vals,
           max_x = max_vals))
)
colnames(mahasiswa_baru_norm) <- colnames(train[, 1:4])  

Prediksi

# Lakukan prediksi mahasiswa baru
prediksi_mahasiswa_baru <- knn(train = train[, 1:4],
                               test = mahasiswa_baru_norm,
                               cl = train$Kelulusan,
                               k = 5)

cat("Prediksi mahasiwa ana kuliah:", as.character(prediksi_mahasiswa_baru), "\n")
## Prediksi mahasiwa ana kuliah: Tepat Waktu

Visualisasi data

# Tambahkan label prediksi ke data mahasiswa baru
Mahasiswa_ana$Kelulusan <- as.character(prediksi_mahasiswa_baru)
Mahasiswa_ana$Status <- "Mahasiswa Ana"

# Tandai semua data lama
data_plot <- data_mahasiswa
data_plot$Status <- "Data Lama"

# Gabungkan data lama dan data mahasiswa baru
data_plot <- rbind(data_plot, Mahasiswa_ana)

# Visualisasi
library(ggplot2)

ggplot(data_plot, aes(x = IPK, y = SKS, color = Kelulusan, shape = Status)) +
  geom_point(size = 3, alpha = 0.8) +
  labs(title = "Visualisasi Mahasiswa Baru dalam Dataset",
       x = "IPK",
       y = "SKS") +
  scale_shape_manual(values = c(16, 17)) +  # 16: bulat, 17: segitiga
  theme_minimal()