# 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
# Data
data(PimaIndiansDiabetes)
df <- PimaIndiansDiabetes

# Split train-test
set.seed(42)
index <- createDataPartition(df$diabetes, p = 0.7, list = FALSE)
train <- df[index, ]
test <- df[-index, ]
# SVM
svm_model <- svm(diabetes ~ ., data = train, kernel = "radial")
svm_pred <- predict(svm_model, newdata = test)

# KNN
knn_pred <- knn(train = train[, -9], test = test[, -9],
                cl = train$diabetes, k = 5)

# Decision Tree
dt_model <- rpart(diabetes ~ ., data = train, method = "class")
dt_pred <- predict(dt_model, test, type = "class")
# Fungsi untuk ambil 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]
  )
}

svm_metrics <- get_conf_matrix(svm_pred, test$diabetes, "SVM")
knn_metrics <- get_conf_matrix(knn_pred, test$diabetes, "KNN")
dt_metrics  <- get_conf_matrix(dt_pred, test$diabetes, "Decision Tree")

all_metrics <- rbind(svm_metrics, knn_metrics, dt_metrics)
# Simpan hasil prediksi
results <- data.frame(
  Actual = test$diabetes,
  SVM = svm_pred,
  KNN = knn_pred,
  DecisionTree = dt_pred
)

# Set faktor
results$Actual <- factor(results$Actual, levels = c("neg", "pos"))
results$SVM <- factor(results$SVM, levels = c("neg", "pos"))
results$KNN <- factor(results$KNN, levels = c("neg", "pos"))
results$DecisionTree <- factor(results$DecisionTree, levels = c("neg", "pos"))

# Gunakan after_stat untuk versi ggplot2 terbaru
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("neg" = "blue", "pos" = "red"))
}

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)

`