0. Librerías

# -------------------------
# Cargar librerías
# -------------------------
library(dplyr)
## 
## 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(gt)
library(e1071)

1. Leer datos

# -------------------------
# Cargar datos
# -------------------------
df <- read.csv(
  "waterPollution.csv",
  sep = ",",
  stringsAsFactors = FALSE
)

2. Extracción y depuración de la variable

if (!"droughts_floods_temperature" %in% names(df)) {
  stop("La variable droughts_floods_temperature no existe en el archivo.")
}

# Extraer variable
Sequias <- df$droughts_floods_temperature

# Convertir a variable discreta
Sequias <- round(Sequias * 100)

# Eliminar valores faltantes
Sequias <- na.omit(Sequias)

3. Tabla de distribución de frecuencias

3.1 Tabla de frecuencias

# -------------------------
# Tabla de frecuencias general
# -------------------------
tabla_freq <- as.data.frame(table(Sequias))

# Renombrar columnas
colnames(tabla_freq) <- c("Sequias", "ni")

# Frecuencia relativa (hi)
tabla_freq$hi <- round(
  (tabla_freq$ni / sum(tabla_freq$ni)) * 100,
  2
)

# Frecuencias acumuladas ascendentes
tabla_freq$Ni_asc <- cumsum(tabla_freq$ni)
tabla_freq$Hi_asc <- round(
  (tabla_freq$Ni_asc / sum(tabla_freq$ni)) * 100, 
  2
)

# Frecuencias acumuladas descendentes
tabla_freq$Ni_dsc <- rev(cumsum(rev(tabla_freq$ni)))
tabla_freq$Hi_dsc <- round(
  (tabla_freq$Ni_dsc / sum(tabla_freq$ni)) * 100, 
  2
)

# -------------------------
# Agregar fila de totales
# -------------------------
fila_total <- data.frame(
  Sequias = "TOTAL",
  ni = sum(tabla_freq$ni),
  hi = 100,
  Ni_asc = "",
  Hi_asc = "",
  Ni_dsc = "",
  Hi_dsc = ""
)

tabla_final <- rbind(tabla_freq, fila_total)

# -------------------------
# Crear tabla gt
# -------------------------
tabla_gt <- tabla_final %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°1**"),
    subtitle = md("**Distribución de frecuencias de sequías en el estudio de la calidad de agua en Europa (1991-2017)**")
  ) %>%
  cols_label(
    Sequias = "Sequías",
    ni = "ni",
    hi = "hi (%)",
    Ni_asc = "Ni ↑",
    Hi_asc = "Hi ↑ (%)",
    Ni_dsc = "Ni ↓",
    Hi_dsc = "Hi ↓ (%)"
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(
      rows = Sequias == "TOTAL"
    )
  ) %>%
  opt_row_striping()

tabla_gt
Tabla N°1
Distribución de frecuencias de sequías en el estudio de la calidad de agua en Europa (1991-2017)
Sequías ni hi (%) Ni ↑ Hi ↑ (%) Ni ↓ Hi ↓ (%)
0 1318 6.63 1318 6.63 19893 100
1 10240 51.48 11558 58.1 18575 93.37
2 5 0.03 11563 58.13 8335 41.9
3 4499 22.62 16062 80.74 8330 41.87
4 91 0.46 16153 81.2 3831 19.26
8 117 0.59 16270 81.79 3740 18.8
16 479 2.41 16749 84.2 3623 18.21
27 3 0.02 16752 84.21 3144 15.8
73 3141 15.79 19893 100 3141 15.79
TOTAL 19893 100.00

3.2 Tabla simplificada de frecuencias

# -------------------------
# Tabla resumida con intervalos enteros
# -------------------------
# Usamos floor y ceiling con round para asegurar límites enteros sin decimales
min_v <- floor(min(Sequias))
max_v <- ceiling(max(Sequias))
limites_clases_seq <- round(seq(min_v, max_v, length.out = 7))

tabla_freq_resumida <- as.data.frame(
  table(cut(Sequias, breaks = limites_clases_seq, include.lowest = TRUE, right = FALSE))
)

# Renombrar columnas
colnames(tabla_freq_resumida) <- c("Sequias", "ni")

# Frecuencia relativa (hi)
tabla_freq_resumida$hi <- round(
  (tabla_freq_resumida$ni / sum(tabla_freq_resumida$ni)) * 100,
  2
)

# Frecuencias acumuladas ascendentes
tabla_freq_resumida$Ni_asc <- cumsum(tabla_freq_resumida$ni)
tabla_freq_resumida$Hi_asc <- round(
  (tabla_freq_resumida$Ni_asc / sum(tabla_freq_resumida$ni)) * 100, 
  2
)

# Frecuencias acumuladas descendentes
tabla_freq_resumida$Ni_dsc <- rev(cumsum(rev(tabla_freq_resumida$ni)))
tabla_freq_resumida$Hi_dsc <- round(
  (tabla_freq_resumida$Ni_dsc / sum(tabla_freq_resumida$ni)) * 100, 
  2
)

# -------------------------
# Agregar fila TOTAL
# -------------------------
fila_total_resumida <- data.frame(
  Sequias = "TOTAL",
  ni = sum(tabla_freq_resumida$ni),
  hi = 100,
  Ni_asc = "",
  Hi_asc = "",
  Ni_dsc = "",
  Hi_dsc = ""
)

tabla_final_resumida <- rbind(
  tabla_freq_resumida,
  fila_total_resumida
)

# -------------------------
# Tabla GT resumida
# -------------------------
tabla_gt_resumida <- tabla_final_resumida %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°2**"),
    subtitle = md(
      "**Distribución de frecuencias simplificada de sequías en el estudio de la calidad del agua en Europa (1991-2017)**"
    )
  ) %>%
  cols_label(
    Sequias = "Sequías",
    ni = "ni",
    hi = "hi (%)",
    Ni_asc = "Ni ↑",
    Hi_asc = "Hi ↑ (%)",
    Ni_dsc = "Ni ↓",
    Hi_dsc = "Hi ↓ (%)"
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(
      rows = Sequias == "TOTAL"
    )
  ) %>%
  opt_row_striping()

tabla_gt_resumida
Tabla N°2
Distribución de frecuencias simplificada de sequías en el estudio de la calidad del agua en Europa (1991-2017)
Sequías ni hi (%) Ni ↑ Hi ↑ (%) Ni ↓ Hi ↓ (%)
[0,12) 16270 81.79 16270 81.79 19893 100
[12,24) 479 2.41 16749 84.2 3623 18.21
[24,36) 3 0.02 16752 84.21 3144 15.8
[36,49) 0 0.00 16752 84.21 3141 15.79
[49,61) 0 0.00 16752 84.21 3141 15.79
[61,73] 3141 15.79 19893 100 3141 15.79
TOTAL 19893 100.00

4 Gráficas

4.1 Diagrama de barras de cantidad

# ================================================
# Diagrama de barras de cantidad que genera RStudio
# ================================================

barplot(tabla_freq_resumida$ni,
        main = "Gráfica N°1: Distribución de sequías en el estudio de la\ncalidad de agua en Europa (1991-2017)",
        xlab = "Sequías",
        ylab = "Cantidad",
        col = "skyblue",
        ylim = c(0, max(tabla_freq_resumida$ni) * 1.1),
        names.arg = tabla_freq_resumida$Sequias,
        las = 2,
        cex.names = 0.7)

4.2 Diagrama de barras de cantidad general

# ===========================================================================
# Diagrama de barras de cantidad con relación a la totalidad de los datos
# ===========================================================================

barplot(tabla_freq_resumida$ni,
        main = "Gráfica N°2: Distribución general de sequías en el estudio de\nla calidad de agua en Europa (1991-2017)",
        xlab = "Sequías",
        ylab = "Cantidad",
        col = "lightgreen",
        ylim = c(0, 20000),
        names.arg = tabla_freq_resumida$Sequias,
        las = 2,
        cex.names = 0.7)

4.3 Diagrama de barras porcentual

# ===============================================
# Diagrama de barras porcentual que genera RStudio
# ===============================================

barplot(tabla_freq_resumida$hi,
        main = "Gráfica N°3: Distribución porcentual de sequías en el estudio de\nla calidad de agua en Europa (1991-2017)",
        xlab = "Sequías",
        ylab = "Porcentaje",
        col = "skyblue",
        ylim = c(0, max(tabla_freq_resumida$hi) * 1.1),
        names.arg = tabla_freq_resumida$Sequias,
        las = 2,
        cex.names = 0.7)

4.4 Diagrama de barras porcentual general

# ===========================================================
# Diagrama de barras porcentual con relación a la totalidad 
# ===========================================================
barplot(tabla_freq_resumida$hi,
        main = "Gráfica N°4: Distribución porcentual general de sequías en el\nestudio de la calidad de agua en Europa (1991-2017)",
        xlab = "Sequías",
        ylab = "Porcentaje",
        col = "lightgreen",
        ylim = c(0, 100),
        names.arg = tabla_freq_resumida$Sequias,
        las = 2,
        cex.names = 0.7)

4.5 Diagrama de Caja

# =========================
# DIAGRAMA DE CAJA
# =========================

boxplot(
  Sequias,
  horizontal = TRUE,
  col = "orange",
  main = "Gráfica Nº5: Distribución de sequías en el estudio de\nla calidad de agua en Europa (1991-2017)",
  xlab = "Sequías"
)

points(
  mean(Sequias),
  1,
  pch = 19,
  col = "red"
)

legend(
  "topright",
  legend = "Media",
  pch = 19,
  col = "red"
)

4.6 Ojivas ascendentes y descendentes (Ni)

# ======================================
# OJIVAS ASCENDENTES Y DESCENDENTES (Ni)
# ======================================

x_pos <- 1:length(tabla_freq_resumida$Sequias)

plot(x_pos,
     tabla_freq_resumida$Ni_dsc,
     main = "Gráfica N°6: Ojiva ascendente y descendente de las sequías en el\nestudio de la calidad de agua en Europa (1991-2017)",
     xlab = "Sequías",
     ylab = "Frecuencia acumulada",
     col = "orange",
     type = "b",
     pch = 19,
     cex = 1.5,
     xaxt = "n",
     ylim = c(0, max(tabla_freq_resumida$Ni_dsc) * 1.05))

points(x_pos,
       tabla_freq_resumida$Ni_asc,
       col = "green",
       type = "b",
       pch = 19,
       cex = 1.5)

axis(side = 1,
     at = x_pos,
     labels = tabla_freq_resumida$Sequias,
     las = 2,
     cex.axis = 0.7)

legend("topright",
       legend = c("Descendente", "Ascendente"),
       col = c("orange", "green"),
       pch = 19,
       pt.cex = 1.5,
       lty = 1,
       lwd = 2)

4.7 Ojivas ascendentes y descendentes (Hi)

# =======================================
# OJIVAS ASCENDENTES Y DESCENDENTES (Hi)
# =======================================

x_pos <- 1:length(tabla_freq_resumida$Sequias)

plot(x_pos,
     tabla_freq_resumida$Hi_dsc,
     main = "Gráfica N°7: Ojiva ascendente y descendente de las sequías en el\nestudio de la calidad de agua en Europa (1991-2017)",
     xlab = "Sequías",
     ylab = "Porcentaje acumulado (%)",
     col = "red",
     type = "b",
     pch = 19,
     cex = 1.5,
     xaxt = "n",
     ylim = c(0, 100))

points(x_pos,
       tabla_freq_resumida$Hi_asc,
       col = "blue",
       type = "b",
       pch = 19,
       cex = 1.5)

axis(side = 1,
     at = x_pos,
     labels = tabla_freq_resumida$Sequias,
     las = 2,
     cex.axis = 0.7)

legend("topright",
       legend = c("Descendente", "Ascendente"),
       col = c("red", "blue"),
       pch = 19,
       pt.cex = 1.5,
       lty = 1,
       lwd = 2)

5. Indicadores Estadísticos

5.1 Indicadores de Tendencia Central

# =========================
# MEDIDAS DE TENDENCIA CENTRAL
# =========================

media <- round(mean(Sequias), 2)
mediana <- round(median(Sequias), 2)

tabla_moda <- table(Sequias)
max_frecuencia <- max(tabla_moda)
moda <- names(tabla_moda)[tabla_moda == max_frecuencia]

5.2 Dispersión

# =========================
# MEDIDAS DE DISPERSIÓN
# =========================

varianza <- var(Sequias)
desviacion <- sd(Sequias)
cv <- round((desviacion / media) * 100, 2)

5.3 Asimetría

# =========================
# MEDIDAS DE FORMA
# =========================

n <- length(Sequias)
asimetria <- sum((Sequias - media)^3) / ((n - 1) * desviacion^3)
curtosis <- sum((Sequias - media)^4) / ((n - 1) * desviacion^4) - 3

# Detección de valores atípicos con el criterio del boxplot
Q1 <- quantile(Sequias, 0.25)
Q3 <- quantile(Sequias, 0.75)
RIQ <- Q3 - Q1

LI <- Q1 - 1.5 * RIQ
LS <- Q3 + 1.5 * RIQ

atipicos_sequias <- Sequias[Sequias < LI | Sequias > LS]
n_atipicos_sequias <- length(atipicos_sequias)

if(n_atipicos_sequias > 0){
  rango_atipicos_sequias <- paste0("[", round(min(atipicos_sequias), 2), " ; ", round(max(atipicos_sequias), 2), "] (Valores: ", n_atipicos_sequias, ")")
} else {
  rango_atipicos_sequias <- "No existen"
}

5.4 Tabla de indicadores

# =========================
# TABLA RESUMEN
# =========================

tabla_indicadores_sequias <- data.frame(
  Variable = "Sequías",
  Rango = paste0("[", min(Sequias), " ; ", max(Sequias), "]"),
  X = media,
  Me = mediana,
  Mo = paste(moda, collapse = ", "),
  V = round(varianza, 2),
  Sd = round(desviacion, 2),
  Cv = cv,
  As = round(asimetria, 2),
  K = round(curtosis, 2),
  Valores_Atipicos = rango_atipicos_sequias,
  stringsAsFactors = FALSE
)

fila_sequias <- which(
  tabla_indicadores_sequias$Variable == "Sequías"
)

tabla_indicadores_sequias_gt <- tabla_indicadores_sequias %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°3**"),
    subtitle = md(
      "**Indicadores estadísticos de las sequías en el estudio de la calidad de agua en Europa (1991-2017)**"
    )
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 3")
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),
    row.striping.include_table_body = TRUE
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(
      rows = fila_sequias
    )
  )

tabla_indicadores_sequias_gt
Tabla N°3
Indicadores estadísticos de las sequías en el estudio de la calidad de agua en Europa (1991-2017)
Variable Rango X Me Mo V Sd Cv As K Valores_Atipicos
Sequías [0 ; 73] 13.17 1 1 677.16 26.02 197.59 1.84 1.45 [8 ; 73] (Valores: 3740)
Autor: Grupo 3

6. Conclusión

La variable sequías fluctúa entre 0 y 73, y sus valores giran en torno a una mediana de 1, con una desviación estándar de 26.02. Dado que el coeficiente de variación es de 197.59, se trata de un conjunto de valores extremadamente heterogéneo. Los datos presentan una asimetría positiva, lo que indica que los valores se acumulan de manera pronunciada en la parte baja de la variable. Con la presencia de valores atípicos del intervalo 8 a 73 (3740 valores), resulta perjudicial para la gestión ambiental, ya que evidencia eventos climáticos extremos y sequías altamente focalizadas ponen en riesgo la calidad ecológica de los cuerpos hídricos de Europa.