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 )