# Library
library(mlbench)
## Warning: package 'mlbench' was built under R version 4.4.3
library(e1071)
## Warning: package 'e1071' was built under R version 4.4.3
library(class)
library(rpart)
## Warning: package 'rpart' was built under R version 4.4.3
library(caret)
## Warning: package 'caret' was built under R version 4.4.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.4.3
## Loading required package: lattice
library(ggplot2)
library(gridExtra)
## Warning: package 'gridExtra' was built under R version 4.4.3
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:gridExtra':
##
## combine
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyr)
# Simulasi Data Baru
set.seed(123)
n <- 200
df <- data.frame(
Tekanan = rnorm(n, mean = 120, sd = 10),
Suhu = rnorm(n, mean = 650, sd = 20),
Waktu = rnorm(n, mean = 30, sd = 5),
Kadar_Zat = rnorm(n, mean = 2.5, sd = 0.3),
Konsentrasi = runif(n, min = 0.6, max = 0.9),
Ketebalan = rnorm(n, mean = 5.5, sd = 0.2),
Logam_Legasi = rnorm(n, mean = 8, sd = 0.5),
Usia_Mesin = sample(3:10, n, replace = TRUE),
Kualitas = sample(c("OK", "Defect"), n, replace = TRUE, prob = c(0.7, 0.3))
)
df$Kualitas <- as.factor(df$Kualitas)
# Split data
set.seed(42)
index <- createDataPartition(df$Kualitas, p = 0.7, list = FALSE)
train <- df[index, ]
test <- df[-index, ]
# Model 1: SVM
svm_model <- svm(Kualitas ~ ., data = train, kernel = "radial")
svm_pred <- predict(svm_model, newdata = test)
# Model 2: KNN (k = 5)
knn_pred <- knn(train = train[, -9], test = test[, -9],
cl = train$Kualitas, k = 5)
# Model 3: Decision Tree
dt_model <- rpart(Kualitas ~ ., data = train, method = "class")
dt_pred <- predict(dt_model, test, type = "class")
# Fungsi evaluasi metrik
get_conf_matrix <- function(pred, actual, model) {
cm <- confusionMatrix(pred, actual)
m <- cm$table
data.frame(
Model = model,
TN = m[1,1], FP = m[1,2],
FN = m[2,1], TP = m[2,2],
Akurasi = round(cm$overall["Accuracy"] * 100, 2)
)
}
svm_metrics <- get_conf_matrix(svm_pred, test$Kualitas, "SVM")
knn_metrics <- get_conf_matrix(knn_pred, test$Kualitas, "KNN")
dt_metrics <- get_conf_matrix(dt_pred, test$Kualitas, "Decision Tree")
all_metrics <- rbind(svm_metrics, knn_metrics, dt_metrics)
print(all_metrics)
## Model TN FP FN TP Akurasi
## Accuracy SVM 1 2 19 37 64.41
## Accuracy1 KNN 0 2 20 37 62.71
## Accuracy2 Decision Tree 7 9 13 30 62.71
# Simpan hasil prediksi
results <- data.frame(
Actual = test$Kualitas,
SVM = svm_pred,
KNN = knn_pred,
DecisionTree = dt_pred
)
# Pastikan faktor berurutan: OK = negatif, Defect = positif
results$Actual <- factor(results$Actual, levels = c("OK", "Defect"))
results$SVM <- factor(results$SVM, levels = c("OK", "Defect"))
results$KNN <- factor(results$KNN, levels = c("OK", "Defect"))
results$DecisionTree <- factor(results$DecisionTree, levels = c("OK", "Defect"))
# Fungsi visualisasi
plot_model <- function(method, title) {
ggplot(results, aes(x = Actual, fill = .data[[method]])) +
geom_bar(position = "dodge") +
geom_text(stat = "count", aes(label = after_stat(count)),
position = position_dodge(0.8), vjust = -0.5) +
labs(title = title, x = "Aktual", y = "Frekuensi") +
scale_fill_manual(values = c("OK" = "blue", "Defect" = "red"))
}
# Plot
svm_plot <- plot_model("SVM", "Prediksi SVM")
knn_plot <- plot_model("KNN", "Prediksi KNN (k = 5)")
dt_plot <- plot_model("DecisionTree", "Prediksi Decision Tree")
grid.arrange(svm_plot, knn_plot, dt_plot, ncol = 3)
