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
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)
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
set.seed(123)
index <- createDataPartition(data_norm$Kelulusan, p = 0.7, list = FALSE)
train <- data_norm[index, ]
test <- data_norm[-index, ]
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
##
Misalkan Seorang mahasiswa baru bernama Ana memiliki data sebagai berikut: IPK 3.51 SKS 135 Kehadiran 90% Lama Studi 3.5 tahun
# Mahasiswa baru
Mahasiswa_ana <- data.frame(
IPK = 3.51,
SKS = 135,
Kehadiran = 90,
LamaStudi = 3.5)
# 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])
# 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
# 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()