File size: 1,960 Bytes
1162e72 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
library(jsonlite)
library(dplyr)
library(fmsb)
# === 1. Baca file JSON ===
data <- fromJSON("summary.json", simplifyVector = FALSE)
# === 2. Ambil final_results ===
final_results <- data$final_results
# === 3. Ubah ke data frame ===
df_final <- lapply(names(final_results), function(model_name) {
metric <- final_results[[model_name]]
data.frame(
model = model_name,
accuracy = metric$accuracy,
precision = metric$precision,
recall = metric$recall,
f1 = metric$f1,
total_vulnerable = metric$total_vulnerable %||% NA,
percentage = metric$percentage %||% NA,
is_vulnerable = as.numeric(metric$is_vulnerable %||% NA),
train_time_sec = metric$train_time_sec %||% NA
)
}) %>% bind_rows()
print("=== FINAL RESULTS DATA ===")
print(df_final)
# === 4. Normalisasi semua nilai ke skala 0–1 (biar proporsional di radar chart) ===
norm_df <- df_final
num_cols <- sapply(norm_df, is.numeric)
norm_df[num_cols] <- lapply(norm_df[num_cols], function(x) {
rng <- range(x, na.rm = TRUE)
if (rng[1] == rng[2]) rep(1, length(x)) else (x - rng[1]) / (rng[2] - rng[1])
})
# === 5. Siapkan data radar chart ===
radar_data <- norm_df %>% select(-model)
rownames(radar_data) <- df_final$model
max_val <- rep(1, ncol(radar_data))
min_val <- rep(0, ncol(radar_data))
radar_plot_data <- rbind(max_val, min_val, radar_data)
# === 6. Plot radar chart ===
colors <- c("red", "blue", "green", "orange", "purple")
par(mfrow = c(1, 1), mar = c(2, 2, 4, 2))
radarchart(
radar_plot_data,
axistype = 1,
pcol = colors,
plwd = 3,
plty = 1,
cglcol = "grey",
cglty = 1,
axislabcol = "grey30",
caxislabels = seq(0, 1, 0.2),
cglwd = 0.8,
vlcex = 0.8,
title = "Final Results – Model Comparison (All Metrics Normalized)"
)
legend(
"bottomright",
legend = rownames(radar_data),
col = colors,
lty = 1,
lwd = 3,
bty = "n",
cex = 0.8
)
|