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 (CYP)
# ====================================
CYP <- na.omit(datos$composition_yard_garden_green_waste_percent)

# Para gráficos y modelación
CYP_graf <- CYP[CYP >= 0.01]

3. Frecuencia

3.1 Rango

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

3.2 Uso de la Regla de Sturges

 # Regla de Sturges
k <- 1 + (3.3 * log10(length(CYP)))
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(CYP >= Li[i] & CYP < Ls[i])
}

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

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

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

# ================================
# ELIMINAR INTERVALOS CON ni = 0
# ================================
TDF_CYP <- TDF_CYP[TDF_CYP$ni > 0, ]

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

4. Tabla de distribución de frecuencia

4.1 Tabla general con Sturges

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

# ================================
# TABLA GT (MÉTODO STURGES)
# ================================
tabla_CYP <- TDF_CYP_Completo %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº1*"),
    subtitle = md("**Distribución de frecuencias del porcentaje de residuos verdes 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_CYP
Tabla Nº1
Distribución de frecuencias del porcentaje de residuos verdes en el estudio de la calidad de agua en Europa (1991-2017)
Li Ls MC ni hi Niasc Nidsc Hiasc Hidsc
0 2.0307 1.02 14881 74.81 14881 19893 75 100
2.0307 4.0613 3.05 3957 19.89 18838 5012 95 25
4.0613 6.092 5.08 280 1.41 19118 1055 96 5
6.092 8.1227 7.11 44 0.22 19162 775 96 4
10.1533 12.184 11.17 129 0.65 19291 731 97 4
14.2147 16.2453 15.23 198 1.00 19489 602 98 3
18.276 20.3067 19.29 322 1.62 19811 404 100 2
28.4293 30.46 29.44 82 0.41 19893 82 100 0
Total 19893 100.00
Autor: Grupo 3

4.2 Tabla Simplificada

# =========================================================
# TABLA SIMPLIFICADA CONTINUA (BASADA EN LE HISTOGRAMA)
# =========================================================

histoP <- hist(
  CYP,
  breaks = 10,
  plot = FALSE
)

# Extraer límites continuos directos del histograma
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)

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

TDF_Histo_CYP$Ni_asc <- cumsum(TDF_Histo_CYP$ni)
TDF_Histo_CYP$Ni_dsc <- rev(cumsum(rev(TDF_Histo_CYP$ni)))
TDF_Histo_CYP$Hi_asc <- round(cumsum(TDF_Histo_CYP$hi), 2)
TDF_Histo_CYP$Hi_dsc <- round(rev(cumsum(rev(TDF_Histo_CYP$hi))), 2)

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

# Generar Tabla Simplificada con 'gt'
tabla_Histo_CYP <- TDF_Histo_CYP_Completo %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº2*"),
    subtitle = md("**Distribución de frecuencias simplificada del porcentaje de   
                  residuos verdes 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_Histo_CYP
Tabla Nº2
Distribución de frecuencias simplificada del porcentaje de
residuos verdes 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 5 2.5 18838 94.70 18838 19893 94.7 100
5 10 7.5 324 1.63 19162 1055 96.33 5.3
10 15 12.5 156 0.78 19318 731 97.11 3.67
15 20 17.5 493 2.48 19811 575 99.59 2.89
20 25 22.5 0 0.00 19811 82 99.59 0.41
25 30 27.5 0 0.00 19811 82 99.59 0.41
30 35 32.5 82 0.41 19893 82 100 0.41
Total 19893 100.00
Autor: Grupo 3

5. Gráficas

5.1 Histograma (ni)

# =========================================
# Histograma generado por RStudio 
# =========================================

h <- hist(
  CYP,
  breaks = histoP$breaks,
  main = "Gráfica Nº1: Distribución de frecuencias del porcentaje de residuos 
  verdes en el estudio de la  calidad de agua en Europa (1991-2017)",
  xlab = "Porcentaje de residuos verdes (%)",
  ylab = "Cantidad",
  col = "aquamarine3",
  border = "black",
  xaxt = "n" 
)

axis(
  side = 1, 
  at = histoP$breaks, 
  labels = round(histoP$breaks, 2) 
)

5.2 Histograma General (ni)

# ===========================================================
# Histograma con relación a la totalidad de los datos
# ===========================================================

bp <- barplot(
  TDF_Histo_CYP$ni,
  col = "aquamarine2",
  main = "Gráfica Nº2: Distribución de frecuencias del porcentaje de residuos 
  verdes en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Porcentaje de residuos verdes (%)",
  ylab = "Cantidad",
  space = 0,
  ylim = c(0, 20000),
  xaxt = "n"
)

puntos_corte <- c(TDF_Histo_CYP$LimInf, tail(TDF_Histo_CYP$LimSup, 1))

axis(
  side = 1,
  at = seq_along(puntos_corte) - 1, 
  labels = round(puntos_corte, 2)
)

5.3 Histograma Porcentual (hi)

# ======================================
# Histograma porcentual que genera RStudio
# ======================================

bp <- barplot(
  TDF_Histo_CYP$hi,
  col = "aquamarine3",
  main = "Gráfica Nº3: Distribución porcentual de frecuencias del porcentaje de 
  residuos verdes en el estudio de la calidad 
  de agua en Europa (1991-2017)",
  xlab = "Porcentaje de residuos verdes (%)",
  ylab = "Porcentaje (%)",
  space = 0,
  xaxt = "n" 
)

puntos_corte <- c(TDF_Histo_CYP$LimInf, tail(TDF_Histo_CYP$LimSup, 1))

axis(
  side = 1,
  at = seq_along(puntos_corte) - 1,
  labels = round(puntos_corte, 2)
)

5.4 Histograma Porcentual General (hi)

# ===========================================================
# Histograma porcentual con relación a la totalidad 
# ===========================================================

bp <- barplot(
  TDF_Histo_CYP$hi,
  space = 0,
  col = "aquamarine2",
  main = "Gráfica Nº4: Distribución porcentual de frecuencias del porcentaje de 
  residuos verdes en el estudio de la calidad 
  de agua en Europa (1991-2017)",
  xlab = "Porcentaje de residuos verdes (%)",
  ylab = "Porcentaje (%)",
  ylim = c(0, 100),
  xaxt = "n" 
)

puntos_corte <- c(TDF_Histo_CYP$LimInf, tail(TDF_Histo_CYP$LimSup, 1))

axis(
  side = 1,
  at = seq_along(puntos_corte) - 1,
  labels = round(puntos_corte, 2)
)

5.5 Polígono de frecuencias (hi)

bp <- barplot(
  TDF_Histo_CYP$hi,
  col = "aquamarine3",
  main = "Gráfica Nº5: Polígono de frecuencia de la distribución porcentual del 
  porcentaje de residuos verdes en el estudio de la calidad 
  de agua en Europa (1991-2017)",
  xlab = "Porcentaje de residuos verdes (%)",
  ylab = "Porcentaje (%)",
  space = 0,
  ylim = c(0, max(TDF_Histo_CYP$hi) * 1.2),
  xaxt = "n" 
)

puntos_corte <- c(TDF_Histo_CYP$LimInf, tail(TDF_Histo_CYP$LimSup, 1))

axis(
  side = 1,
  at = seq_along(puntos_corte) - 1,
  labels = round(puntos_corte, 2)
)

# 4. Polígono superpuesto
lines(
  bp,
  TDF_Histo_CYP$hi,
  type = "o",
  pch = 16,
  lwd = 2,
  col = "black"
)

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

5.6 Boxplot

# =============================
# BOXPLOT CON VALORES ATÍPICOS
# =============================
boxplot(
  CYP,
  horizontal = TRUE,
  col = "forestgreen",
  main = "Gráfica Nº6: Diagrama de caja del porcentaje de residuos 
  verdes en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Porcentaje de residuos verdes (%)"
)

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

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

5.7 Ojiva ascendente y descendente (Ni)

eje_x <- c(TDF_Histo_CYP$LimInf, TDF_Histo_CYP$LimSup[length(TDF_Histo_CYP$LimSup)])

# Ascendente
ni_asc_plot <- c(0, TDF_Histo_CYP$Ni_asc)

# Descendente
ni_dsc_plot <- c(TDF_Histo_CYP$Ni_dsc, 0)

plot(
  eje_x, ni_dsc_plot,
  main = "Gráfica Nº7: Ojiva ascendente y descendente del porcentaje de 
  residuos verdes en el estudio de la calidad de 
  agua en Europa (1991-2017)",
  xlab = "Porcentaje de residuos verdes (%)",
  ylab = "Frecuencia acumulada",
  col = "lightblue3", 
  type = "o", 
  lwd = 2,
  pch = 16,
  ylim = c(0, max(ni_asc_plot))
)

# 4. Superponer Ojiva Ascendente 
lines(
  eje_x, ni_asc_plot,
  col = "black", 
  type = "o", 
  lwd = 2,
  pch = 16
)

# Leyenda
legend(
  "right", 
  legend = c("Ojiva descendente", "Ojiva ascendente"),
  col = c("lightblue3", "black"), 
  lty = 1, 
  pch = 16, 
  bty = "n"
)

5.8 Ojiva ascendente y descendente (Hi)

hi_asc_plot <- c(0, TDF_Histo_CYP$Hi_asc)

# Descendente
hi_dsc_plot <- c(TDF_Histo_CYP$Hi_dsc, 0)

plot(
  eje_x, hi_asc_plot,
  type = "o",
  col = "black",
  pch = 16,
  lwd = 2,
  main = "Gráfica Nº8: Ojiva porcentual ascendente y descendente del porcentaje 
  de residuos verdes en el estudio de la calidad de 
  agua en Europa (1991-2017)",
  xlab = "Porcentaje de residuos verdes (%)",
  ylab = "Porcentaje acumulado (%)",
  ylim = c(0, 100)
)

# 4. Superponer Ojiva Porcentual Descendente 
lines(
  eje_x, hi_dsc_plot,
  type = "o",
  col = "skyblue3",
  pch = 17,
  lwd = 2
)

grid()

# Leyenda
legend(
  "right",
  legend = c("Ojiva Ascendente (%)", "Ojiva Descendente (%)"),
  col = c("black", "skyblue3"),
  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
stats_bp <- boxplot.stats(CYP)
atipicos <- stats_bp$out
n_atipicos <- length(atipicos)

# Calcular el rango de los atípicos 
if (n_atipicos > 0) {
  rango_atipicos <- paste0("[", round(min(atipicos), 2), " ; ", round(max(atipicos), 2), "] (", n_atipicos, " valores)")
} else {
  rango_atipicos <- "Sin atípicos (0 valores)"
}

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

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

6.2 Dispersión

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

6.3 Asimetría

library(e1071)

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

6.4 Tabla de Indicadores

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

tabla_indicadores <- data.frame(
  Variable = "Residuos verdes (%)",
  Rango = paste0("[", round(head(TDF_Histo_CYP$LimInf, 1), 2), " ; ", round(tail(TDF_Histo_CYP$LimSup, 1), 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 = rango_atipicos
)

tabla_indicadores_gt <- tabla_indicadores %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº3*"),
    subtitle = md("**Indicadores estadísticos de la variable porcentaje
                  residuos verdes 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 porcentaje residuos verdes en el estudio de la calidad de agua en Europa (1991-2017)
Variable Rango X Me Mo V Sd Cv As K Valores_Atipicos
Residuos verdes (%) [0 ; 35] 1.3 0 [0 ; 5] 13.37 3.66 281.26 4.71 25.58 [12.14 ; 30.46] (731 valores)
Autor: Grupo 3

7. Conclusión

La variable porcentaje de residuos verdes (%) fluctúa entre 0 y 35, y sus valores giran en torno a una mediana de 0, con una desviación estándar de 3.66. Dado que el coeficiente de variación es de 281.26, 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 en el intervalo de 12.14 a 30.46 (731 valores), resulta perjudicial para la gestión ambiental, ya que evidencia una contaminación o concentración de residuos verdes extrema y focalizada en ciertos cuerpos hídricos de Europa.