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 de composición porcentual 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 de composición porcentual 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 (MÁXIMO 10 FILAS)
# =========================================================

# Para asegurar que la tabla simplificada sea continua y tenga un máximo de 10 filas,
# forzamos exactamente 10 breaks en la función del 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
)

# Se mantienen todas las filas para asegurar continuidad absoluta de la variable en el estudio.
# Recalcular frecuencias acumuladas
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 continua de frecuencias de composición 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 continua de frecuencias de composición 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 
# =========================================

hist(
  CYP,
  breaks = histoP$breaks,
  main = "Gráfica Nº1: Distribución de frecuencias de composición porcentual 
  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"
)

5.2 Histograma General (ni)

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

barplot(
  TDF_Histo_CYP$ni,
  col = "aquamarine2",
  main = "Gráfica Nº2: Distribución de frecuencias de composición porcentual 
  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),
  names.arg = round(TDF_Histo_CYP$Mc, 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 de composición de 
  residuos verdes en el estudio de la calidad de 
  agua en Europa (1991-2017)",
  xlab = "Porcentaje de residuos verdes (%)",
  ylab = "Porcentaje (%)",
  space = 0,
  names.arg = round(TDF_Histo_CYP$Mc, 2)
)

5.4 Histograma Porcentual General (hi)

# ===========================================================
# Histograma porcentual con relación a la totalidad 
# ===========================================================
barplot(
  TDF_Histo_CYP$hi,
  space = 0,
  col = "aquamarine2",
  main = "Gráfica Nº4: Distribución porcentual de frecuencias de composición 
  de residuos verdes en el estudio de la calidad de 
  agua en Europa (1991-2017)",
  xlab = "Porcentaje de residuos verdes (%)",
  ylab = "Porcentaje (%)",
  names.arg = TDF_Histo_CYP$Mc,
  ylim = c(0, 100)
)

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 
  de composición de residuos verdes en el estudio de la calidad 
  de agua en Europa (1991-2017)",
  xlab = "Porcentaje de residuos verdes (%)",
  ylab = "Porcentaje (%)",
  space = 0,
  names.arg = round(TDF_Histo_CYP$Mc, 2),
  ylim = c(0, max(TDF_Histo_CYP$hi) * 1.2)
)

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

# 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 de composición porcentual 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)

# 1. Crear un único eje X con todos los límites (desde el primero hasta el último)
eje_x <- c(TDF_Histo_CYP$LimInf, TDF_Histo_CYP$LimSup[length(TDF_Histo_CYP$LimSup)])


# Ascendente: Empieza en 0 y sube acumulando ni
ni_asc_plot <- c(0, TDF_Histo_CYP$Ni_asc)

# Descendente: Empieza en el Total y baja hasta 0
ni_dsc_plot <- c(TDF_Histo_CYP$Ni_dsc, 0)

# 3. Graficar Ojiva Descendente (Rojo)
plot(
  eje_x, ni_dsc_plot,
  main = "Gráfica Nº7: Ojiva ascendente y descendente de composición porcentual
  de residuos verdes en el estudio de la calidad de 
  agua en Europa (1991-2017)",
  xlab = "Porcentaje de residuos verdes (%)",
  ylab = "Cantidad",
  col = "lightblue3", 
  type = "o", 
  lwd = 2,
  pch = 16,
  ylim = c(0, max(ni_asc_plot))
)

# 4. Superponer Ojiva Ascendente (Verde)
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)

# Ascendente: Empieza en 0% y sube hasta 100%
hi_asc_plot <- c(0, TDF_Histo_CYP$Hi_asc)

# Descendente: Empieza en 100% y baja hasta 0%
hi_dsc_plot <- c(TDF_Histo_CYP$Hi_dsc, 0)

# 3. Graficar Ojiva Porcentual Ascendente (Verde)
plot(
  eje_x, hi_asc_plot,
  type = "o",
  col = "black",
  pch = 16,
  lwd = 2,
  main = "Gráfica Nº8: Ojiva porcentual ascendente y descendente de composición 
  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 (Rojo)
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
atipicos <- boxplot.stats(CYP)$out
n_atipicos <- length(atipicos)

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

# Moda basada en Intervalo Modal de la Tabla Simplificada
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) # <- Corregido con "k"

6.4 Tabla de Indicadores

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

# Creación de la tabla resumen final
tabla_indicadores <- data.frame(
  Variable = "Residuos verdes (%)",
  Rango = paste0("[", round(min(CYP), 2), " ; ", round(max(CYP), 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 composición de 
                  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 composición de 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 ; 30.46] 1.3 0 [0 ; 5] 13.37 3.66 281.26 4.71 25.58 731
Autor: Grupo 3

7. Conclusión

La variable Composición Porcentual de Residuos de Jardín y Huerto fluctúa en un rango de [0; 30.46], y sus valores giran en torno a una mediana de 0, con una desviación estándar de 3.66, lo que representa un conjunto de datos con una variabilidad extremadamente alta CV = 281.26%. Los valores presentan una asimetría positiva bastante pronunciada As = 4.71, indicando una fuerte concentración de los datos hacia valores menores a la media (con una gran acumulación en el cero), y una curtosis de K = 25.58, lo que evidencia una distribución marcadamente leptocúrtica. Cabe destacar la identificación de 731 valores atípicos; esta presencia de datos atípicos, sumada al elevadísimo coeficiente de variación y la desviación estándar, señalan una alta heterogeneidad dentro del monitoreo de la calidad del agua en Europa (1991–2017).