CARGAR LOS DATOS Y LIBRERÍAS

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.2
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.2
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggrepel)
## Warning: package 'ggrepel' was built under R version 4.5.2
setwd("D:/Data") 
datos <- read.csv("derrames_globales_.csv", header = TRUE, sep = ";", dec =".")

1 Variable Ubicación

ubicacion <- datos$Ubicacion
ubicacion <- na.omit(ubicacion)
TDFubicacion <- table(ubicacion)
Tablaubicacion <- as.data.frame(TDFubicacion)

hi <- Tablaubicacion$Freq / sum(Tablaubicacion$Freq)
hi <- round(hi * 100, 2)
Tablaubicacion <- data.frame(Tablaubicacion, hi) 

Tablaubicacion$Continente <- NA

# Reglas para América
america <- c("USA", "US", "CA", "TX", "MI", "OH", "AK", "HI", 
             "Alaska", "Texas", "Ohio", "Michigan", "California", 
             "Louisiana", "NY", "MA")
Tablaubicacion$Continente[grep(paste(america, collapse="|"), 
Tablaubicacion$ubicacion, ignore.case = TRUE, useBytes = TRUE)] <- "América"

# Reglas para Europa
europa <- c("UK", "England", "France", "Germany", "Spain", "Italy")
Tablaubicacion$Continente[grep(paste(europa, collapse="|"),
Tablaubicacion$ubicacion, ignore.case = TRUE, useBytes = TRUE)] <- "Europa"

# Reglas para Asia
asia <- c("China", "India", "Japan", "Korea", "Saudi")
Tablaubicacion$Continente[grep(paste(asia, collapse="|"),
Tablaubicacion$ubicacion, ignore.case = TRUE, useBytes = TRUE)] <- "Asia"

# Reglas para Oceanía
oceania <- c("Australia", "New Zealand")
Tablaubicacion$Continente[grep(paste(oceania, collapse="|"),
Tablaubicacion$ubicacion, ignore.case = TRUE, useBytes = TRUE)] <- "Oceanía"

# Reglas para África
africa <- c("Nigeria", "South Africa")
Tablaubicacion$Continente[grep(paste(africa, collapse="|"),
Tablaubicacion$ubicacion, ignore.case = TRUE, useBytes = TRUE)] <- "África"

# Cualquier otro -> "Otros"
Tablaubicacion$Continente[is.na(Tablaubicacion$Continente)] <- "Otros"

### Generar tabla de frecuencias por continente
TDFcontinente <- table(Tablaubicacion$Continente)
TablaContinente <- as.data.frame(TDFcontinente)

# Porcentajes
TablaContinente$Porcentaje <- round(TablaContinente$Freq / sum(TablaContinente$Freq) * 100, 2)

1.1 Gráfica 1: Distribución de Ubicación por continentes

barplot(TDFcontinente,
        main = "Distribución por Continente",
        xlab = "Continente",
        ylab = "Cantidad",
        col = "darkblue",
        cex.main = 1.5,
        cex.lab = 1,
        cex.axis = 0.9,
        cex.names = 0.9)

1.2 Gráfica 2: Distribución de Ubicación por continentes

barplot(TDFcontinente, 
        main = "Distribución por Continente",
        xlab = "Continente",
        ylab = "Cantidad",
        col = "darkblue",
        cex.main = 1.5,    
        cex.lab = 1,   
        cex.axis = 0.7,
        cex.names = 0.7,
        ylim = c(0, sum(TDFcontinente)))

1.3 Gráfica 3: Distribución porcentual de Ubicación por continentes

barplot(TablaContinente$Porcentaje,
        main = "Distribución porcentual por Continente",
        xlab = "Continente",
        ylab = "Porcentaje (%)",
        col = "blue",
        names.arg = TablaContinente$Var1,
        cex.main = 1.5,
        cex.lab = 1,
        cex.axis = 0.8,
        cex.names = 0.9,
        ylim = c(0, 100))

1.4 Gráfica 4: Distribución de Ubicación por continentes (CIRCULAR)

datos_grafico <- TablaContinente %>%
  arrange(desc(Var1)) %>%
  mutate(
    posicion_label = cumsum(Porcentaje) - (0.5 * Porcentaje),
    etiqueta_texto = paste0(round(Porcentaje, 1), " %")
  )

mis_colores_profesionales <- c(
  "#A6CEE3", 
  "#1F78B4", 
  "#B2DF8A",  
  "#33A02C", 
  "#FB9A99", 
  "#E31A1C"  

)
ggplot(datos_grafico, aes(x = "", y = Porcentaje, fill = Var1)) +
  geom_col(width = 1, color = "white") +
  coord_polar("y", start = 0) +
  theme_void() +
  scale_fill_manual(values = mis_colores_profesionales, name = "Continentes") +
  geom_text_repel(
    aes(y = posicion_label, label = etiqueta_texto),
    size = 4.5,           
    nudge_x = 0.6,        
    show.legend = FALSE,  
    segment.size = 0.7,   
    segment.color = "grey50" 
  ) +
  
  ggtitle("Distribución porcentual por Continente") +
  theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"))

1.5 Indicadores

# MODA
moda_continente <- names(which.max(TDFcontinente))
moda_continente
## [1] "América"

1.6 Conclusión

La variable presenta una fuerte concentración en el continente América. Esto indica que la mayoría de los derrames registrados ocurren en esta región. Lo cual no es beneficioso para el continente.

2 Variable tipo de crudo

tipo <- datos$Tipo_de_crudo
tipo <- na.omit(tipo)
TDFtipo <- table(tipo)
Tablatipo <- as.data.frame(TDFtipo)

hitipo <- Tablatipo$Freq / sum(Tablatipo$Freq)
hitipo <- round(hitipo * 100, 2)
Tablatipo <- data.frame(Tablatipo, hitipo)

### AGRUPACIÓN DE TIPO DE CRUDO EN CATEGORÍAS MAYORES
Tablatipo$Categoria <- NA

# 1. CRUDO / OIL
crudo <- c("crude", "oil", "Crude Tall Oil", "VGO", "unk", "tar", "oiled birds")
Tablatipo$Categoria[grep(paste(crudo, collapse="|"), 
                         Tablatipo$tipo, ignore.case = TRUE)] <- "Crudo / Oil"

# 2. DIESEL
diesel <- c("diesel", "diseil", "diesel fuel", "Diesel, Fish")
Tablatipo$Categoria[grep(paste(diesel, collapse="|"),
                         Tablatipo$tipo, ignore.case = TRUE)] <- "Diesel"

# 3. FUEL OIL (BUNKER / IFO)
fueloil <- c("bunker", "fuel oil", "IFO", "IFO 380")
Tablatipo$Categoria[grep(paste(fueloil, collapse="|"),
                         Tablatipo$tipo, ignore.case = TRUE)] <- "Fuel Oil"

# 4. GAS / JET FUEL
gas <- c("gas fuel oil", "JP", "JP-5", "gasoline")
Tablatipo$Categoria[grep(paste(gas, collapse="|"),
                         Tablatipo$tipo, ignore.case = TRUE)] <- "Gasolina / Jet fuel"

# 5. ACEITES MINERALES
minerales <- c("mineral oil", "heating oil")
Tablatipo$Categoria[grep(paste(minerales, collapse="|"),
                         Tablatipo$tipo, ignore.case = TRUE)] <- "Mineral Oil"

# 6. OTROS
Tablatipo$Categoria[is.na(Tablatipo$Categoria)] <- "Otros"

### TABLA AGRUPADA
TDFcategoria <- table(Tablatipo$Categoria)
TablaCategoria <- as.data.frame(TDFcategoria)
TablaCategoria$Porcentaje <- round(TablaCategoria$Freq / sum(TablaCategoria$Freq) * 100, 2)

2.1 Gráfica 1: Distribución de Tipo de Crudo

par(mar = c(8, 4, 4, 2) + 0.1)
grafico2_1 <- barplot(TDFcategoria,
        main="Distribución del Tipo de Combustible",
        ylab="Cantidad", col="darkgreen", cex.main = 1.5, xaxt = "n")
text(x = grafico2_1, y = -max(TDFcategoria)*0.04, labels = names(TDFcategoria), srt = 45, adj = 1, xpd = TRUE, cex = 0.8)
mtext("Categoría de combustible", side = 1, line = 6)

2.2 Gráfica 2: Distribución de Tipo de Crudo

par(mar = c(8, 4, 4, 2) + 0.1)
grafico2_2 <- barplot(TDFcategoria,
        main="Distribución del Tipo de Combustible",
        ylab="Cantidad", col="darkgreen", cex.main = 1.5, 
        ylim = c(0, sum(TDFcategoria)), xaxt = "n")
text(x = grafico2_2, y = -sum(TDFcategoria)*0.04, labels = names(TDFcategoria), srt = 45, adj = 1, xpd = TRUE, cex = 0.8)
mtext("Categoría de combustible", side = 1, line = 6)

2.3 Gráfica 3: Distribución porcentual de Tipo de Crudo

par(mar = c(8, 4, 4, 2) + 0.1)
grafico2_3 <- barplot(TablaCategoria$Porcentaje,
        main="Distribución porcentual del Tipo de Combustible",
        ylab="Porcentaje (%)", col="darkgreen", cex.main = 1.5, 
        ylim = c(0, 100), xaxt = "n")
text(x = grafico2_3, y = -4, labels = TablaCategoria$Var1, srt = 45, adj = 1, xpd = TRUE, cex = 0.8)
mtext("Categoría de combustible", side = 1, line = 6)

2.4 Gráfica 4: Distribución de Tipo de Crudo (CIRCULAR)

datos_grafico_tipo <- TablaCategoria %>%
  arrange(desc(Var1)) %>%
  mutate(
    posicion_label = cumsum(Porcentaje) - (0.5 * Porcentaje),
    etiqueta_texto = paste0(round(Porcentaje, 1), " %")
  )

ggplot(datos_grafico_tipo, aes(x = "", y = Porcentaje, fill = Var1)) +
  geom_col(width = 1, color = "white") +
  coord_polar("y", start = 0) +
  theme_void() +
  scale_fill_manual(values = mis_colores_profesionales, name = "Categoría") +
  geom_text_repel(
    aes(y = posicion_label, label = etiqueta_texto),
    size = 4.5, nudge_x = 0.6, show.legend = FALSE, 
    segment.size = 0.7, segment.color = "grey50"
  ) +
  ggtitle("Distribución porcentual del Tipo de Combustible") +
  theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"))

2.5 Indicadores

# MODA - Tabla de frecuencias del tipo de crudo
TDFcategoria <- table(Tablatipo$Categoria)
moda_categoria <- names(which.max(TDFcategoria))
moda_categoria
## [1] "Crudo / Oil"

2.6 Conclusión

La variable presenta una gran cantidad de derrames de crudo/oil. Esto indica que los incidentes están asociados al manejo y transporte de crudo, lo cual no es beneficioso.

3 Variable Causa de derrame

causa <- datos$Causa_principal
causa <- na.omit(causa)
TDFcausa <- table(causa)
Tablacausa <- as.data.frame(TDFcausa)

hicausa <- Tablacausa$Freq / sum(Tablacausa$Freq)
hicausa <- round(hicausa * 100, 2)
Tablacausa <- data.frame(Tablacausa, hicausa)

### Crear vector categorizado
categoria <- rep("Otras", length(Tablacausa$causa))

categoria[grepl("corro|rotur|fuga|tuber|tanque|ducto|fall|defec|mal func", 
                Tablacausa$causa, ignore.case = TRUE)] <- "Fallas técnicas"
categoria[grepl("error|humano|operaci|maniobra|neglig", 
                Tablacausa$causa, ignore.case = TRUE)] <- "Factores humanos"
categoria[grepl("acciden|choque|colisi|impacto|embarc|naveg", 
                Tablacausa$causa, ignore.case = TRUE)] <- "Accidentes"
categoria[grepl("inund|torment|lluvia|terrem|sismo|clima|volcan", 
                Tablacausa$causa, ignore.case = TRUE)] <- "Eventos naturales"
categoria[grepl("vandal|sabota|robo|delincu", 
                Tablacausa$causa, ignore.case = TRUE)] <- "Actos externos"

### Crear tabla resumida con categorías
Tablacausa$Categoria <- categoria
TablaAgrupada <- aggregate(Freq ~ Categoria, data = Tablacausa, sum)
TablaAgrupada <- TablaAgrupada[order(-TablaAgrupada$Freq), ]

3.1 Gráfica 1: Distribución de Causa de Derrame

par(mar = c(8, 4, 4, 2) + 0.1)
grafico3_1 <- barplot(TablaAgrupada$Freq,
        col="darkgreen", main="Distribución de Causas del Derrame (Agrupadas)",
        ylab="Cantidad", cex.main = 1.5, xaxt = "n")
text(x = grafico3_1, y = -max(TablaAgrupada$Freq)*0.04, labels = TablaAgrupada$Categoria, srt = 45, adj = 1, xpd = TRUE, cex = 0.8)
mtext("Categoría", side = 1, line = 6)

3.2 Gráfica 2: Distribución de Causa de Derrame

par(mar = c(8, 4, 4, 2) + 0.1)
grafico3_2 <- barplot(TablaAgrupada$Freq,
        col = "darkgreen", main = "Distribución de Causas del Derrame",
        ylab = "Cantidad", cex.main = 1.5, 
        ylim = c(0, sum(TablaAgrupada$Freq)), xaxt = "n")
text(x = grafico3_2, y = -sum(TablaAgrupada$Freq)*0.04, labels = TablaAgrupada$Categoria, srt = 45, adj = 1, xpd = TRUE, cex = 0.8)
mtext("Categoría", side = 1, line = 6)

3.3 Gráfica 3: Distribución porcentual de Causa de Derrame

TablaAgrupada$Porcentaje <- round(TablaAgrupada$Freq / sum(TablaAgrupada$Freq) * 100, 2)
par(mar = c(8, 4, 4, 2) + 0.1)
grafico3_3 <- barplot(TablaAgrupada$Porcentaje,
        col="steelblue", main="Distribución porcentual de Causas (Agrupadas)",
        ylab="Porcentaje (%)", ylim=c(0,100), xaxt = "n")
text(x = grafico3_3, y = -4, labels = TablaAgrupada$Categoria, srt = 45, adj = 1, xpd = TRUE, cex = 0.8)
mtext("Categoría", side = 1, line = 6)

3.4 Gráfica 4: Distribución de Causa de Derrame (CIRCULAR)

datos_grafico_causa <- TablaAgrupada %>%
  arrange(desc(Categoria)) %>%
  mutate(
    posicion_label = cumsum(Porcentaje) - (0.5 * Porcentaje),
    etiqueta_texto = paste0(round(Porcentaje, 1), " %")
  )

ggplot(datos_grafico_causa, aes(x = "", y = Porcentaje, fill = Categoria)) +
  geom_col(width = 1, color = "white") +
  coord_polar("y", start = 0) +
  theme_void() +
  scale_fill_manual(values = mis_colores_profesionales, name = "Causas") +
  geom_text_repel(
    aes(y = posicion_label, label = etiqueta_texto),
    size = 4.5, nudge_x = 0.6, show.legend = FALSE, 
    segment.size = 0.7, segment.color = "grey50"
  ) +
  ggtitle("Distribución porcentual de Causas") +
  theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"))

3.5 Indicadores

# Moda de la causa del derrame (agrupada)
TDFcausaAgrupada <- table(Tablacausa$Categoria)
moda_causa_agrupada <- names(which.max(TDFcausaAgrupada))
moda_causa_agrupada
## [1] "Otras"
# Resultado esperado: "Otras"

3.6 Conclusión

La variable causa de derrame presenta una gran cantidad en otras, lo que indica que puede haber muchas causas de incidentes, lo cual no es beneficioso porque aumenta la incertidumbre.

4 Variable Amenaza de derrame

amenaza <- datos$Amenaza
amenaza <- na.omit(amenaza)
TDFamenaza <- table(amenaza)
Tablaamenaza <- as.data.frame(TDFamenaza)

hiamenaza <- Tablaamenaza$Freq / sum(Tablaamenaza$Freq)
hiamenaza <- round(hiamenaza * 100, 2)
Tablaamenaza <- data.frame(Tablaamenaza, hiamenaza)

4.1 Gráfica 1: Distribución de Amenaza de Derrame

par(mar = c(4, 6, 4, 5) + 0.1)
barplot(TDFamenaza, 
        main = "Distribución de Amenaza de derrame",
        xlab = "Amenaza de derrame",
        ylab = "Cantidad",
        col = "red",
        cex.main = 1.5,    
        cex.lab = 1,   
        cex.axis = 0.7,
        cex.names = 0.7,
        ylim = c(0, max(TDFamenaza)))

4.2 Gráfica 2: Distribución de Amenaza de Derrame

barplot(TDFamenaza, 
        main = "Distribución de Amenaza de derrame",
        xlab = "Amenaza de derrame",
        ylab = "Cantidad",
        col = "darkred",
        cex.main = 1.5,    
        cex.lab = 1,   
        cex.axis = 0.7,
        cex.names = 0.7,
        ylim = c(0, sum(Tablaamenaza$Freq)))

4.3 Gráfica 3: Distribución de Amenaza de Derrame

barplot(Tablaamenaza$hiamenaza, 
        main = "Distribución de Amenaza de derrame",
        xlab = "Amenaza de derrame",
        ylab = "Porcentaje",
        col = "blue",
        names.arg = Tablaamenaza$amenaza,
        cex.main = 1.5,    
        cex.lab = 1,   
        cex.axis = 0.7,
        cex.names = 0.7,
        ylim = c(0, 100))

4.4 Gráfica 4: Distribución de Amenaza de Derrame (CIRCULAR)

datos_grafico_amenaza <- Tablaamenaza %>%
  arrange(desc(amenaza)) %>%
  mutate(
    posicion_label = cumsum(hiamenaza) - (0.5 * hiamenaza),
    etiqueta_texto = paste0(round(hiamenaza, 1), " %")
  )

ggplot(datos_grafico_amenaza, aes(x = "", y = hiamenaza, fill = amenaza)) +
  geom_col(width = 1, color = "white") +
  coord_polar("y", start = 0) +
  theme_void() +
  scale_fill_manual(values = mis_colores_profesionales, name = "Amenaza") +
  geom_text_repel(
    aes(y = posicion_label, label = etiqueta_texto),
    size = 4.5, nudge_x = 0.6, show.legend = FALSE, 
    segment.size = 0.7, segment.color = "grey50"
  ) +
  ggtitle("Distribución porcentual de Amenaza") +
  theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"))

4.5 Indicadores

# MODA
moda_amenaza <- names(which.max(TDFamenaza))
moda_amenaza
## [1] "Oil"

4.6 Conclusión

La variable amenaza de derrame presenta una gran frecuencia en Oil, lo que indica que este producto es el que mas afecta a la población, lo cual no es beneficioso.

5 Variable Etiqueta

etiquetas <- datos$Etiquetas
etiquetas <- na.omit(etiquetas)
TDFetiquetas <- table(etiquetas)
Tablaetiquetas <- as.data.frame(TDFetiquetas)

hietiquetas <- Tablaetiquetas$Freq / sum(Tablaetiquetas$Freq)
hietiquetas <- round(hietiquetas * 100, 2)
Tablaetiquetas <- data.frame(Tablaetiquetas, hietiquetas)

Tablaetiquetas$grupo_logico <- NA

# Definir listas de categorías
incidentes <- c("Collision", "Grounding", "Adrift", "Derelict")
estructuras <- c("Railcar", "Pipeline", "Wellhead")
fenomenos <- c("Hurricane", "Tsunami")
operaciones <- c("Mystery Substance", "Search + Rescue")

# Función para clasificar cada etiqueta
clasificar_etiqueta <- function(etiqueta) {
  componentes <- unlist(strsplit(etiqueta, "\\|")) # separa componentes
  if (any(componentes %in% incidentes)) {
    return("Incidentes Marítimos")
  } else if (any(componentes %in% estructuras)) {
    return("Objetos y Estructuras")
  } else if (any(componentes %in% fenomenos)) {
    return("Fenómenos Naturales")
  } else if (any(componentes %in% operaciones)) {
    return("Operaciones o Misterios")
  } else {
    return("Otros")
  }
}

# Aplicar la función a todas las filas (con conversión a carácter)
Tablaetiquetas$grupo_logico <- sapply(as.character(Tablaetiquetas$etiquetas), clasificar_etiqueta)

# Tabla de frecuencias con la nueva agrupación
grupo_etiquetas <- table(Tablaetiquetas$grupo_logico)

5.1 Gráfica 1: Distribución de Etiqueta

par(mar = c(8, 4, 4, 2) + 0.1)
grafico5_1 <- barplot(grupo_etiquetas, 
        main="Distribución de Etiqueta de Derrame",
        ylab="Cantidad", col="red", cex.main = 1.5, 
        ylim = c(0, max(grupo_etiquetas)+10), xaxt = "n")
text(x = grafico5_1, y = -max(grupo_etiquetas)*0.04, labels = names(grupo_etiquetas), srt = 45, adj = 1, xpd = TRUE, cex = 0.8)
mtext("Grupo de Derrame", side = 1, line = 6)

5.2 Gráfica 2: Distribución de Etiqueta

par(mar = c(8, 4, 4, 2) + 0.1)
grafico5_2 <- barplot(grupo_etiquetas, 
        main="Distribución de Etiqueta de derrame",
        ylab="Cantidad", col="darkred", cex.main = 1.5, 
        ylim=c(0,sum(grupo_etiquetas)), xaxt = "n")
text(x = grafico5_2, y = -sum(grupo_etiquetas)*0.04, labels = names(grupo_etiquetas), srt = 45, adj = 1, xpd = TRUE, cex = 0.8)
mtext("Etiqueta de derrame", side = 1, line = 6)

5.3 Gráfica 3: Distribución porcentual de Etiqueta

hi_grupo_etiquetas <- grupo_etiquetas / sum(grupo_etiquetas)
hi_grupo_etiquetas <- round(hi_grupo_etiquetas * 100, 2)
par(mar = c(8, 4, 4, 2) + 0.1)
grafico5_3 <- barplot(hi_grupo_etiquetas, 
        main="Distribución de Etiqueta de derrame",
        ylab="Porcentaje (%)", col="blue", cex.main = 1.5, 
        ylim=c(0,100), xaxt = "n")
text(x = grafico5_3, y = -4, labels = names(hi_grupo_etiquetas), srt = 45, adj = 1, xpd = TRUE, cex = 0.8)
mtext("Etiqueta de derrame", side = 1, line = 6)

5.4 Gráfica 4: Distribución de Etiqueta (CIRCULAR)

TablaGrupoEtiquetas <- as.data.frame(table(Tablaetiquetas$grupo_logico))
names(TablaGrupoEtiquetas) <- c("Grupo", "Freq")
TablaGrupoEtiquetas$Porcentaje <- round(TablaGrupoEtiquetas$Freq / sum(TablaGrupoEtiquetas$Freq) * 100, 2)

datos_grafico_etiqueta <- TablaGrupoEtiquetas %>%
  arrange(desc(Grupo)) %>%
  mutate(
    posicion_label = cumsum(Porcentaje) - (0.5 * Porcentaje),
    etiqueta_texto = paste0(round(Porcentaje, 1), " %")
  )

ggplot(datos_grafico_etiqueta, aes(x = "", y = Porcentaje, fill = Grupo)) +
  geom_col(width = 1, color = "white") +
  coord_polar("y", start = 0) +
  theme_void() +
  scale_fill_manual(values = mis_colores_profesionales, name = "Etiqueta") +
  geom_text_repel(
    aes(y = posicion_label, label = etiqueta_texto),
    size = 4.5, nudge_x = 0.6, show.legend = FALSE, 
    segment.size = 0.7, segment.color = "grey50"
  ) +
  ggtitle("Distribución porcentual de Etiqueta") +
  theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"))

## Indicadores

# MODA - Calcular la moda
moda <- names(grupo_etiquetas)[which.max(grupo_etiquetas)]
moda
## [1] "Incidentes Marítimos"

5.5 Conclusión

La variable etiqueta tiene la mayoría de los derrames en la clasificación incidentes marítimos, lo que indica que los accidentes en el mar son los más frecuentes provocando una crisis ecológica, lo cual no es beneficioso.

6 Variable Fuente de respuesta

fuente <- datos$Fuente_respuesta
fuente <- na.omit(fuente)
TDFfuente <- table(fuente)
Tablafuente <- as.data.frame(TDFfuente)

hifuente <- Tablafuente$Freq / sum(Tablafuente$Freq)
hifuente <- round(hifuente * 100, 2)
Tablafuente <- data.frame(Tablafuente, hifuente)

names(TDFfuente)[names(TDFfuente) == ""] <- "No Reportado"
Tablafuente$fuente[Tablafuente$fuente == ""] <- "No Reportado"
## Warning in `[<-.factor`(`*tmp*`, Tablafuente$fuente == "", value =
## structure(c(NA, : invalid factor level, NA generated
names(hifuente)[names(hifuente) == ""] <- "No Reportado"

6.1 Gráfica 1: Distribución de Fuente de Respuesta

par(mar = c(8, 4, 4, 2) + 0.1)
grafico6_1 <- barplot(TDFfuente, 
        main="Distribución de Fuente respuesta",
        ylab="Cantidad", col="red", cex.main = 1.5, 
        ylim = c(0, max(TDFfuente)), xaxt = "n")
text(x = grafico6_1, y = -max(TDFfuente)*0.04, labels = names(TDFfuente), srt = 45, adj = 1, xpd = TRUE, cex = 0.8)
mtext("Fuente respuesta", side = 1, line = 6)

6.2 Gráfica 2: Distribución de Fuente de Respuesta

par(mar = c(8, 4, 4, 2) + 0.1)
grafico6_2 <- barplot(TDFfuente, 
        main="Distribución de Fuente respuesta",
        ylab="Cantidad", col="darkred", cex.main = 1.5, 
        ylim=c(0,sum(TDFfuente)), xaxt = "n")
text(x = grafico6_2, y = -sum(TDFfuente)*0.04, labels = names(TDFfuente), srt = 45, adj = 1, xpd = TRUE, cex = 0.8)
mtext("Fuente respuesta", side = 1, line = 6)

6.3 Gráfica 3: Distribución porcentual de Fuente de Respuesta

par(mar = c(8, 4, 4, 2) + 0.1)
grafico6_3 <- barplot(hifuente, 
        main="Distribución de Fuente respuesta",
        ylab="Porcentaje (%)", col="blue", cex.main = 1.5, 
        ylim=c(0,100), xaxt = "n")
text(x = grafico6_3, y = -4, labels = names(TDFfuente), srt = 45, adj = 1, xpd = TRUE, cex = 0.8)

mtext("Fuente respuesta", side = 1, line = 6)

6.4 Gráfica 4: Distribución de Fuente de Respuesta (CIRCULAR)

datos_grafico_fuente <- Tablafuente %>%
  mutate(
    etiqueta_texto = paste0(round(hifuente, 1), " %")
  )

ggplot(datos_grafico_fuente, aes(x = "", y = hifuente, fill = fuente)) +
  geom_col(width = 1, color = "white") +
  coord_polar("y", start = 0) +
  theme_void() +
  scale_fill_manual(values = mis_colores_profesionales, name = "Fuente") +
  
  geom_text_repel(
    aes(label = etiqueta_texto),
    position = position_stack(vjust = 0.5), 
    size = 4.5, 
    show.legend = FALSE,
    segment.color = NA 
  ) +
  ggtitle("Distribución porcentual de Fuente") +
  theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"))

6.5 Indicadores

# MODA
moda_fuente <- names(TDFfuente)[which.max(TDFfuente)]
moda_fuente
## [1] "No Reportado"

6.6 Conclusión

La variable fuente de respuesta presenta una gran cantidad de datos en description, indicando que la mayoría de los derrames fueron gestionados o reportados por esta entidad. Lo cual es ligeramente beneficioso.

7 Variable estiqueta de actualización

actualizacion <- datos$etiqueta_actualizacion
actualizacion <- na.omit(actualizacion)
TDFactualizacion <- table(actualizacion)
Tablaactualizacion <- as.data.frame(TDFactualizacion)

hiactualizacion <- Tablaactualizacion$Freq / sum(Tablaactualizacion$Freq)
hiactualizacion <- round(hiactualizacion * 100, 2)
Tablaactualizacion <- data.frame(Tablaactualizacion, hiactualizacion)

7.1 Gráfica 1: Distribución de Etiqueta de Actualización

wrap_labels <- function(x, len) {
  sapply(x, function(y) paste(strwrap(y, width = len), collapse = "\n"))
}
etiquetas_act_wrap <- wrap_labels(names(TDFactualizacion), 20)
etiquetas_act_porc_wrap <- wrap_labels(Tablaactualizacion$actualizacion, 20)
par(mar = c(10, 4, 4, 2) + 0.1) 
grafico7_1 <- barplot(TDFactualizacion, 
        main="Distribución de Etiqueta actualización",
        ylab="Cantidad", col="red", cex.main = 1.5, 
        ylim = c(0, max(TDFactualizacion)), xaxt = "n")
# Usamos las etiquetas nuevas (wrap) y bajamos un poco más la posición 'y'
text(x = grafico7_1, y = -max(TDFactualizacion)*0.06, labels = etiquetas_act_wrap, srt = 45, adj = 1, xpd = TRUE, cex = 0.7)
mtext("Etiqueta actualización", side = 1, line = 8)

7.2 Gráfica 2: Distribución de Etiqueta de Actualización

par(mar = c(10, 4, 4, 2) + 0.1)
grafico7_2 <- barplot(TDFactualizacion, 
        main="Distribución de Etiqueta actualización",
        ylab="Cantidad", col="darkred", cex.main = 1.5, 
        ylim=c(0,sum(TDFactualizacion)), xaxt = "n")
text(x = grafico7_2, y = -sum(TDFactualizacion)*0.06, labels = etiquetas_act_wrap, srt = 45, adj = 1, xpd = TRUE, cex = 0.7)
mtext("Etiqueta actualización", side = 1, line = 8)

7.3 Gráfica 3: Distribución porcentual de Etiqueta de Actualización

par(mar = c(10, 4, 4, 2) + 0.1)
grafico7_3 <- barplot(hiactualizacion, 
        main="Distribución de Etiqueta actualización",
        ylab="Porcentaje (%)", col="blue", cex.main = 1.5, 
        ylim=c(0,100), xaxt = "n")
text(x = grafico7_3, y = -6, labels = etiquetas_act_porc_wrap, srt = 45, adj = 1, xpd = TRUE, cex = 0.7)
mtext("Etiqueta actualización", side = 1, line = 8)

7.4 Gráfica 4: Distribución de Etiqueta de Actualización (CIRCULAR)

datos_grafico_act <- Tablaactualizacion %>%
  arrange(desc(actualizacion)) %>%
  mutate(
    posicion_label = cumsum(hiactualizacion) - (0.5 * hiactualizacion),
    etiqueta_texto = paste0(round(hiactualizacion, 1), " %")
  )

ggplot(datos_grafico_act, aes(x = "", y = hiactualizacion, fill = actualizacion)) +
  geom_col(width = 1, color = "white") +
  coord_polar("y", start = 0) +
  theme_void() +
  scale_fill_manual(values = mis_colores_profesionales, name = "Actualización") +
  geom_text_repel(
    aes(y = posicion_label, label = etiqueta_texto),
    size = 4.5, nudge_x = 0.6, show.legend = FALSE, 
    segment.size = 0.7, segment.color = "grey50"
  ) +
  ggtitle("Distribución porcentual de Actualización") +
  theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"))

7.5 Indicadores

moda_actualizacion <- names(TDFactualizacion)[which.max(TDFactualizacion)]
moda_actualizacion
## [1] "RA still unavailable"

7.6 Conclusión

La variable etiqueta de actualización presenta una gran cantidad de datos en “RA still unavailable”, indicando que la mayoría de eventos registrados no han sido remediados, lo cual no es nada beneficioso.