title: “Accidentes de derramnes” author: “Johan” date: “2025-12-15” output: html_document # 1. LIBRERÍAS CLAVE library(ggplot2) library(gt) library(dplyr) # 2. CONFIGURACIÓN NOMBRE_ARCHIVO_SUBIDO <- “database.xlsx - Sheet1.csv” NOMBRE_VARIABLE <- “Liquid Recovery (Barrels)” # 3. RE-CARGA Y PREPARACIÓN DE DATOS # Asumiendo que “database.xlsx - Sheet1.csv” es el path correcto en tu entorno. database <- read.csv(NOMBRE_ARCHIVO_SUBIDO, header = TRUE, sep = “,”, dec = “.”) variable_original <- database[[NOMBRE_VARIABLE]] variable_original <- as.numeric(as.character(variable_original)) variable_original <- na.omit(variable_original) # ✅ AJUSTE CLAVE: Cálculo de límites y amplitud máxima (Sturges) LIMITE_INFERIOR <- min(variable_original) LIMITE_SUPERIOR <- max(variable_original) R_calculado <- LIMITE_SUPERIOR - LIMITE_INFERIOR n_total_original <- length(variable_original) # Regla de Sturges para calcular el número óptimo de clases (k) k <- ceiling(1 + 3.322 * log10(n_total_original)) AMPLITUD <- ceiling(R_calculado / k) unidad_medida <- “Barriles” # AJUSTE NECESARIO PARA LOG: Creamos variable_log (excluye valores <= 0) variable_log <- variable_original[variable_original > 0] # Datos filtrados para la tabla (Ahora es el rango completo) variable <- variable_original n_total <- length(variable) cat(paste0(“— ANÁLISIS COMPLETO (Rango Máximo) —”)) cat(paste0(“Rango:”, LIMITE_INFERIOR, ” - “, LIMITE_SUPERIOR,”“)) cat(paste0(”Número de Clases (k): “, k,”“)) cat(paste0(”Amplitud (A): “, AMPLITUD,”“)) cat(paste0(”Registros totales: “, n_total,”“)) # 4. CÁLCULO DE LA TABLA DE FRECUENCIAS (Ajustado a k y A nuevos) lim_inf <- seq(from = LIMITE_INFERIOR, by = AMPLITUD, length.out = k) lim_sup <- c(lim_inf[-1], LIMITE_SUPERIOR) # Ajuste el último límite superior para asegurar que el máximo esté incluido if (lim_sup[k] < LIMITE_SUPERIOR) { lim_sup[k] <- LIMITE_SUPERIOR } MC <- (lim_inf + lim_sup) / 2 ni <- numeric(k) for (i in 1:k) { if (i == k) { # El último intervalo es cerrado en ambos extremos ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i]) } else { # Intervalos normales son cerrados a la izquierda y abiertos a la derecha ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i]) } } hi <- round(ni / n_total, 3) suma_k_menos_1 <- sum(hi[1:(length(hi)-1)]) hi[length(hi)] <- round(1.000 - suma_k_menos_1, 3) Ni_asc <- cumsum(ni) 14/12/25, 23:54 proyecto Johan - Posit Cloud https://posit.cloud/content/11597974 1/3 Fi_asc <- cumsum(hi) Fi_asc[length(Fi_asc)] <- 1.000 Fi_asc <- round(Fi_asc, 3) Ni_desc <- rev(cumsum(rev(ni))) Fi_desc <- rev(cumsum(rev(hi))) Fi_desc[1] <- 1.000 Fi_desc <- round(Fi_desc, 3) tabla_frecuencia <- data.frame( Intervalo = paste0(round(lim_inf, 2),” - “, round(lim_sup, 2)), MC = round(MC, 2), ni = ni, hi = hi, Ni_desc = Ni_desc, Fi_desc = Fi_desc, Ni_asc = Ni_asc, Fi_asc = Fi_asc ) # 5. VISUALIZACIONES # 5.1 TABLA DE FRECUENCIAS (gt) tabla_gt <- tabla_frecuencia %>% gt() %>% cols_label( Intervalo = paste0(”Intervalo (“, NOMBRE_VARIABLE,”)“), MC =”Marca Clase”, ni = “Frec. Abs. (ni)”, hi = “Frec. Rel. (hi) - Suma 1.000”, Ni_asc = “Frec. Acum. (Ni)”, Fi_asc = “Frec. Rel. Acum. (Fi)” ) %>% fmt_number(columns = c(hi, Fi_asc), decimals = 3) %>% tab_header(title = paste0(“Tabla de Frecuencias:”, NOMBRE_VARIABLE, ” (Rango Completo: “, LIMITE_INFERIOR,”-“, LIMITE_SUPERIOR,”) - A=“, AMPLITUD)) %>% opt_table_lines() print(tabla_gt) # 5.3 OJIVAS COMBINADAS (ggplot2) data_ojiva_asc <- data.frame( Limite = c(lim_inf[1] - AMPLITUD, lim_sup), Ni = c(0, Ni_asc), Tipo =”Ascendente” ) data_ojiva_desc <- data.frame( Limite = lim_inf, Ni = Ni_desc, Tipo = “Descendente” ) data_ojiva_combinada <- bind_rows(data_ojiva_asc, data_ojiva_desc) ojiva_combinada_plot <- ggplot(data_ojiva_combinada, aes(x = Limite, y = Ni, color = Tipo)) + geom_point(size = 3) + geom_line(size = 1) + scale_color_manual(values = c(“Ascendente” = “#8FBC8F”, “Descendente” = “#778899”))+ labs( title = paste0(“Ojivas Combinadas:”, NOMBRE_VARIABLE), subtitle = “Frecuencias Absolutas Acumuladas (Ni)”, x = unidad_medida, y = “Frecuencia Acumulada”, color = “Tipo de Ojiva” ) + theme_minimal() + scale_x_continuous(breaks = round(lim_inf, 0)) + theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8), legend.position = “bottom”) print(ojiva_combinada_plot) # 5.4 DIAGRAMA DE CAJA (Box Plot) - ESCALA LOGARÍTMICA SIN LÍMITE boxplot_log_plot <- ggplot(data.frame(Variable = variable_log), aes(x = factor(1), y = Variable)) + 14/12/25, 23:54 proyecto Johan - Posit Cloud https://posit.cloud/content/11597974 2/3 geom_boxplot(fill = “#A0C4FF”, color = “#4682B4”, size = 0.8, width = 0.3, outlier.color = “red”, outlier.shape = 16, outlier.size = 2.5) + coord_flip() + scale_y_log10(breaks = c(1, 10, 100, 1000, 10000)) + labs(title = paste0(“Diagrama de Caja:”, NOMBRE_VARIABLE, ” (Escala Logarítmica, Rango Máximo)“), subtitle =”Rango calculado automáticamente. Los outliers se comprimen para mejor visualización.”, x = ““, y = paste0(NOMBRE_VARIABLE,” (Log10)“)) + theme_light() + theme(axis.text.y = element_blank(), axis.ticks.y = element_blank(), panel.background = element_rect(fill =”white”)) print(boxplot_log_plot) # —————————————————- # FIN DEL ANÁLISIS COMPLETO