0. Librerías

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

1.Leer datos

# -------------------------
# Cargar datos
# -------------------------

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

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

# ================================
# VARIABLE CUANTITATIVA CONTINUA
# ================================

RMV <- na.omit(datos$resultMeanValue)
# Datos para gráficos
RMV_graf <- RMV[RMV >= 0.01]

3. Frecuencia

3.1 Rango

# Valores mínimo y máximo
minimo <- min(RMV)
maximo <- max(RMV)

3.2 Uso de la Regla de Sturges

# Regla de Sturges
k <- 1 + (3.3 * log10(length(RMV)))
k <- floor(k)
# Rango y amplitud
R <- maximo - minimo
A <- R / k

3.3 Límites de clase

# Límites de clase
Li <- round(seq(from = minimo, to = maximo - A, by = A), 4)
Ls <- round(seq(from = minimo + A, to = maximo, by = A), 4)

# Marca de clase
MC <- round((Li + Ls) / 2, 2)

3.4 Creación de columnas

# Frecuencia absoluta
ni <- numeric(length(Li))

for (i in 1:length(Li)) {
  ni[i] <- sum(RMV >= Li[i] & RMV < Ls[i])
}

# Incluir el valor máximo en el último intervalo
ni[length(Li)] <- sum(RMV >= Li[length(Li)] & RMV <= maximo)

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

# Crear tabla
TDF_RMV <- data.frame(
  Li, Ls, MC, ni, hi
)

# ================================
# ELIMINAR INTERVALOS CON ni = 0
# ================================

TDF_RMV <- TDF_RMV[TDF_RMV$ni > 0, ]

# Recalcular acumuladas
TDF_RMV$Niasc <- cumsum(TDF_RMV$ni)
TDF_RMV$Nidsc <- rev(cumsum(rev(TDF_RMV$ni)))
TDF_RMV$Hiasc <- round(cumsum(TDF_RMV$hi))
TDF_RMV$Hidsc <- round(rev(cumsum(rev(TDF_RMV$hi))))

4. Tabla de distribución de frecuencia

4.1 Tabla general con Sturges

TDF_RMV_Completo <- rbind(
  TDF_RMV,
  data.frame(
    Li = "Total",
    Ls = " ",
    MC = " ",
    ni = sum(TDF_RMV$ni),
    hi = 100,
    Niasc = " ",
    Nidsc = " ",
    Hiasc = " ",
    Hidsc = " "
  )
)

# ================================
# TABLA GT
# ================================

tabla_RMV <- TDF_RMV_Completo %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº1*"),
    subtitle = md("**Distribución de frecuencias del valor medio 
     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.color = "black",
    row.striping.include_table_body = TRUE
  )

tabla_RMV
Tabla Nº1
Distribución de frecuencias del valor medio en el estudio de la calidad de agua en Europa (1991-2017)
Li Ls MC ni hi Niasc Nidsc Hiasc Hidsc
0 940.5333 470.27 19948 99.74 19948 20000 100 100
940.5333 1881.0667 1410.8 43 0.22 19991 52 100 0
1881.0667 2821.6 2351.33 4 0.02 19995 9 100 0
2821.6 3762.1333 3291.87 2 0.01 19997 5 100 0
4702.6667 5643.2 5172.93 1 0.00 19998 3 100 0
10345.8667 11286.4 10816.13 1 0.00 19999 2 100 0
13167.4667 14108 13637.73 1 0.00 20000 1 100 0
Total 20000 100.00
Autor: Grupo 3

4.2 Tabla Simplificada

# =============================================
# TABLA SIMPLIFICADA (BASADA EN EL HISTOGRAMA)
# =============================================

# 1. Calcular el histograma 
histoP <- hist(
  log10(RMV_graf + 1),
  breaks = 8,
  plot = FALSE 
)

# 2. Extraer datos del histograma para la tabla
Limites <- histoP$breaks
LimInf <- Limites[1:(length(Limites) - 1)]
LimSup <- Limites[2:length(Limites)]
Mc <- histoP$mids
ni <- histoP$counts
hi <- round((ni / sum(ni)) * 100, 2)

# 3. Crear el DataFrame base
TDF_Histo_RMV <- data.frame(
  LimInf,
  LimSup,
  Mc,
  ni,
  hi
)

# Eliminar intervalos vacíos
TDF_Histo_RMV <- TDF_Histo_RMV[TDF_Histo_RMV$ni > 0, ]

# Recalcular frecuencias acumuladas
TDF_Histo_RMV$Ni_asc <- cumsum(TDF_Histo_RMV$ni)
TDF_Histo_RMV$Ni_dsc <- rev(cumsum(rev(TDF_Histo_RMV$ni)))
TDF_Histo_RMV$Hi_asc <- round(cumsum(TDF_Histo_RMV$hi), 2)
TDF_Histo_RMV$Hi_dsc <- round(rev(cumsum(rev(TDF_Histo_RMV$hi))), 2)

# 4. Crear fila de totales
TDF_Histo_RMV_Completo <- rbind(
  TDF_Histo_RMV,
  data.frame(
    LimInf = "Total",
    LimSup = " ",
    Mc = " ",
    ni = sum(TDF_Histo_RMV$ni),
    hi = 100,
    Ni_asc = " ",
    Ni_dsc = " ",
    Hi_asc = " ",
    Hi_dsc = " "
  )
)

# 5. Generar y mostrar la Tabla con 'gt'
tabla_Histo_RMV <- TDF_Histo_RMV_Completo %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº2*"),
    subtitle = md("**Distribución de frecuencias del valor medio 
     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.color = "black",
    row.striping.include_table_body = TRUE
  )

# Imprimir la tabla 
tabla_Histo_RMV
Tabla Nº2
Distribución de frecuencias del valor medio en el estudio de la calidad de agua en Europa (1991-2017)
LimInf LimSup Mc ni hi Ni_asc Ni_dsc Hi_asc Hi_dsc
0 0.5 0.25 9115 48.22 9115 18904 48.22 99.99
0.5 1 0.75 4222 22.33 13337 9789 70.55 51.77
1 1.5 1.25 2341 12.38 15678 5567 82.93 29.44
1.5 2 1.75 1700 8.99 17378 3226 91.92 17.06
2 2.5 2.25 980 5.18 18358 1526 97.1 8.07
2.5 3 2.75 497 2.63 18855 546 99.73 2.89
3 3.5 3.25 45 0.24 18900 49 99.97 0.26
3.5 4 3.75 2 0.01 18902 4 99.98 0.02
4 4.5 4.25 2 0.01 18904 2 99.99 0.01
Total 18904 100.00
Autor: Grupo 3

5. Gráficas

5.1 Histograma (ni)

RMV_log <- log10(RMV + 1)

hist(
  log10(RMV_graf + 1),
  breaks = histoP$breaks,
  main = "Gráfica Nº1: Distribución de frecuencias del valor medio 
     en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Valor medio",
  ylab = "Cantidad",
  col = "deepskyblue",
  border = "black"
)

5.2 Histograma General (ni)

# Límites de clase obtenidos en la tabla
cortes <- c(TDF_RMV$Li, max(TDF_RMV$Ls))

barplot(
  TDF_Histo_RMV$ni,
  col = "lightskyblue1",
  main = "Gráfica Nº2: Distribución de frecuencias del valor medio 
     en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Valores medios",
  ylab = "Cantidad",
  space = 0,
  names.arg = round(TDF_Histo_RMV$Mc,2)
)

5.3 Histograma Porcentual (hi)

# =========================
# HISTOGRAMA Nº4: PORCENTUAL
# =========================

bp <- barplot(
  TDF_Histo_RMV$hi,
  col = "deepskyblue",
  main = "Gráfica Nº3: Distribución porcentual de frecuencias del valor medio 
     en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Valor medio",
  ylab = "Porcentaje (%)",
  space = 0,
  names.arg = round(TDF_Histo_RMV$Mc,2)
)

text(
  bp,
  TDF_Histo_RMV$hi,
  labels = round(TDF_Histo_RMV$hi,2),
  pos = 3,
  cex = 0.8
)

5.4 Histograma Porcentual General (hi)

# ==================================
# HISTOGRAMA Nº5 PORCENTUAL hi 
# ==================================

barplot(
  TDF_Histo_RMV$hi,
  space = 0,
  col = "lightskyblue1",
  main = "Gráfica Nº4: Distribución porcentual de frecuencias del valor medio 
     en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Valor Medio",
  ylab = "Porcentaje (%)",
  names.arg = TDF_Histo_RMV$Mc,
  ylim = c(0, 100)
)

5.4 Polígono de frecuencias (hi)

bp <- barplot(
  TDF_Histo_RMV$hi,
  col = "royalblue",
  main = "Gráfica Nº5: Polígono de frecuencia de la distribución porcentual del valor medio, en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Marcas de clase",
  ylab = "Porcentaje (%)",
  space = 0,
  names.arg = round(TDF_Histo_RMV$Mc, 2),
  ylim = c(0, max(TDF_Histo_RMV$hi) * 1.2)
)

# Polígono superpuesto
lines(
  bp,
  TDF_Histo_RMV$hi,
  type = "o",
  pch = 16,
  lwd = 2,
  col = "darkred"
)

# Etiquetas de texto
text(
  bp,
  TDF_Histo_RMV$hi,
  labels = round(TDF_Histo_RMV$hi, 2),
  pos = 3,
  cex = 0.8,
  col = "black"
)

5.6 Boxplot sin valores atípicos

# =============================
# BOXPLOT SIN VALORES ATÍPICOS
# =============================
boxplot(
  RMV,
  horizontal = TRUE,
  outline = FALSE,
  col = "forestgreen",
  main = "Gráfica Nº6: Diagrama de caja del Valor medio sin valores atipicos, en 
  el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Valores medios"
)

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

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

5.7 Boxplot con valores atípicos

# =============================
# BOXPLOT CON VALORES ATÍPICOS
# =============================

boxplot(
  RMV,
  horizontal = TRUE,
  col = "forestgreen",
  main = "Gráfica Nº7: Dagrama de caja del Valor Medio con valores atipicos, en el 
  estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Valor Medio (%)"
)

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

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

5.8 Ojiva ascendente y descendente (Ni)

# =========================
# OJIVAS Ni
# =========================

plot(
  TDF_Histo_RMV$LimInf,
  TDF_Histo_RMV$Ni_dsc,
  main = "Gráfica Nº8: Ojiva ascendente y descendente del Valor Medio, en el 
  estidio de la calidad de agua en Europa (1991-2017)",
  xlab = "Valor Medio (%)",
  ylab = "Cantidad",
  col = "red",
  type = "o",
  lwd = 2
)

lines(
  TDF_Histo_RMV$LimSup,
  TDF_Histo_RMV$Ni_asc,
  col = "forestgreen",
  type = "o",
  lwd = 2
)

legend(
  "right",
  legend = c(
    "Ojiva descendente",
    "Ojiva ascendente"
  ),
  col = c("red", "forestgreen"),
  pch = c(16, 16),
  lty = 1,
  bty = "n"
)

5.9 Ojiva ascendente y descendente (Hi)

# =========================
# OJIVAS PORCENTUALES
# =========================

plot(
  TDF_Histo_RMV$LimSup,
  TDF_Histo_RMV$Hi_asc,
  type = "o",
  col = "deepskyblue",
  pch = 16,
  lwd = 2,
  main = "Gráfica Nº9: Ojiva ascendente y descendente del Valor Medio, en el 
  estidio de la calidad de agua en Europa (1991-2017)",
  xlab = "Valor Medio (%)",
  ylab = "Porcentaje acumulado (%)",
  ylim = c(0, 100)
)

# Ojiva Descendente
lines(
  TDF_Histo_RMV$LimInf,
  TDF_Histo_RMV$Hi_dsc,
  type = "o",
  col = "red",
  pch = 17,
  lwd = 2
)

grid()

legend(
  "right",
  legend = c(
    "Ojiva Ascendente (%)",
    "Ojiva Descendente (%)"
  ),
  col = c("deepskyblue", "red"),
  pch = c(16, 17),
  lty = 1,
  bty = "n"
)

6 Indicadores Estadísticos

6.1 Indicadores de Tendencia Central

# =========================
# INDICADORES ESTADISTICOS
# =========================

# Obtener valores atípicos según el criterio del boxplot
atipicos <- boxplot.stats(RMV)$out

# Cantidad de valores atípicos
n_atipicos <- length(atipicos)

RMV <- na.omit(datos$resultMeanValue)
RMV <- as.numeric(RMV)
media <- round(mean(RMV), 2)
mediana <- round(median(RMV), 2)

# =========================
# MODA (INTERVALO MODAL)
# =========================

# Moda basada en Intervalo Modal de la Tabla Simplificada
fila_modal <- which.max(TDF_Histo_RMV$ni)
moda_intervalar <- paste0(
  "[", round(TDF_Histo_RMV$LimInf[fila_modal], 2), 
  " ; ", round(TDF_Histo_RMV$LimSup[fila_modal], 2), "]"
)

6.2 Dispersión

varianza <- var(RMV)
desv_est <- sd(RMV)
cv <- round((desv_est / media) * 100, 2)

6.3 Asimetría

library(e1071)

asimetria <- skewness(RMV, type = 2)
curtosis <- kurtosis(RMV)

6.4 Tabla de Indicadores

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

tabla_indicadores <- data.frame(
  Variable = "resultMeanValue",
  Rango = paste0("[", round(min(RMV), 2), " ; ", round(max(RMV), 2), "]"),
  X = media,
  Me = mediana,
  Mo = moda_intervalar,
  V = round(varianza, 2),
  Sd = round(desv_est, 2),
  Cv = cv,
  As = round(asimetria, 2),
  K = round(curtosis, 2),
  Valores_Atipicos = n_atipicos
)

tabla_indicadores_gt <- tabla_indicadores %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº3*"),
    subtitle = md("**Indicadores estadísticos de la variable valor medio en el estudio de la calidad de agua en Europa (1991-2017)**")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 3")
  )

tabla_indicadores_gt
Tabla Nº3
Indicadores estadísticos de la variable valor medio en el estudio de la calidad de agua en Europa (1991-2017)
Variable Rango X Me Mo V Sd Cv As K Valores_Atipicos
resultMeanValue [0 ; 14108] 34.44 2 [0 ; 0.5] 30500.26 174.64 507.09 41.57 2870.26 3346
Autor: Grupo 3

7. Conclusión

##============##
## CONCLUSION ##
##============##
# La variable Porcentaje de Residuos Orgánicos (%) fluctúa entre 12.78% y 62.3%, y sus valores giran en torno a una mediana de 32%, con una desviación estándar de 11.33%, lo que representa un conjunto de datos con variabilidad moderada (CV = 35.21%). Los valores presentan una asimetría positiva (As = 0.44), indicando una ligera concentración de datos hacia valores menores a la media, y una curtosis negativa (K = -0.06), lo que evidencia una distribución platicúrtica, es decir, más achatada o plana que la distribución normal. Cabe destacar la identificación de 9,434 valores atípicos, lo cual sugiere la presencia de casos excepcionales o extremos dentro del monitoreo de la calidad del agua en Europa (1991-2017) que requieren una revisión detallada. Por lo anterior, aunque la tendencia central es clara, la alta cantidad de valores atípicos señala una heterogeneidad significativa en los niveles de residuos orgánicos a lo largo del periodo y territorio estudiado.