0. librerias

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

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

2. Extracción de la variable

datos$Composition_other_percent 
## NULL
# ================================
# VARIABLE CUANTITATIVA CONTINUA
# ================================

COP <- na.omit(datos$composition_other_percent)

3. Frecuencia

3.1. Rango

# Valores mC-nimo y mC!ximo
minimo <- min(COP)
maximo <- max(COP)

3.2. Regla de Sturges

# Regla de Sturges
k <- 1 + (3.3 * log10(length(COP)))
k <- floor(k)

# Rango y amplitud
R <- maximo - minimo
A <- R / k

3.3. Limites 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. Creacion de columnas

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

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

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

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

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

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

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

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

4. Tabla de distribucion de frecuencia

4.1 Tabla con Sturges

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

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

library(gt)
library(dplyr)

tabla_COP <- TDF_COP_Completo %>%
  gt() %>%
  tab_header(
    title = md("Tabla Nº1"),
    subtitle = md("**Tabla de distribución de frecuencias
                  del Porcentaje de composición de otros residuos
                  en 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_COP
Tabla Nº1
Tabla de distribución de frecuencias del Porcentaje de composición de otros residuos en la calidad de agua en Europa (1991-2017
Li Ls MC ni hi Niasc Nidsc Hiasc Hidsc
0 2.9367 1.47 171 0.86 171 19893 1 100
8.81 11.7467 10.28 218 1.10 389 19722 2 99
11.7467 14.6833 13.21 3523 17.71 3912 19504 20 98
14.6833 17.62 16.15 709 3.56 4621 15981 23 80
17.62 20.5567 19.09 958 4.82 5579 15272 28 77
20.5567 23.4933 22.02 3 0.02 5582 14314 28 72
23.4933 26.43 24.96 9787 49.20 15369 14311 77 72
26.43 29.3667 27.9 4030 20.26 19399 4524 98 23
32.3033 35.24 33.77 5 0.03 19404 494 98 2
38.1767 41.1133 39.64 261 1.31 19665 489 99 2
41.1133 44.05 42.58 228 1.15 19893 228 100 1
Total 19893 100.00
Autor: Grupo 3

4.2. Tabla simplificada

histoP <- hist(
  COP,
  breaks = 8,
  main = "Gráfica Nº1: Distribución del Porcentaje 
                        de composición de otros residuos
                        en la calidad de agua en Europa (1991-2017)",
  xlab = "composición de otros residuos",
  ylab = "Cantidad",
  col = "blue"
)

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)

TDF_Histo_COP <- data.frame(
  LimInf,
  LimSup,
  Mc,
  ni,
  hi
)

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

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

# Fila total
TDF_Histo_COP_Completo <- rbind(
  TDF_Histo_COP,
  data.frame(
    LimInf = "Total",
    LimSup = " ",
    Mc = " ",
    ni = sum(TDF_Histo_COP$ni),
    hi = 100,
    Ni_asc = " ",
    Ni_dsc = " ",
    Hi_asc = " ",
    Hi_dsc = " "
  )
)

# Tabla GT
tabla_Histo_COP <- TDF_Histo_COP_Completo %>%
  gt() %>%
  tab_header(
    title = md("Tabla Nº2"),
    subtitle = md("*Tabla simplificada de la distribución del
                   Porcentaje de composición de otros residuos
                  en 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_COP
Tabla Nº2
Tabla simplificada de la distribución del Porcentaje de composición de otros residuos en 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 171 0.86 171 19893 0.86 100
5 10 7.5 82 0.41 253 19722 1.27 99.14
10 15 12.5 4138 20.80 4391 19640 22.07 98.73
15 20 17.5 1184 5.95 5575 15502 28.02 77.93
20 25 22.5 89 0.45 5664 14318 28.47 71.98
25 30 27.5 13735 69.04 19399 14229 97.51 71.53
30 35 32.5 5 0.03 19404 494 97.54 2.49
40 45 42.5 489 2.46 19893 489 100 2.46
Total 19893 100.00
Autor: Grupo 3

5. Gráficas

5.1 Histograma (ni)

hist(COP, breaks = 8,
     main = "Gráfica N°2: Distribución del Porcentaje 
                        de composición de otros residuos
                        en la calidad de agua en Europa (1991-2017)",
     xlab = "Porcentaje de composición de otros residuos",
     ylab = "Cantidad",
     ylim = c(0, max(ni)),
     col = "lightgreen")

5.2 Histograma general (ni)

hist(COP, breaks = 8,
     main = "Gráfica N°3: Distribución del Porcentaje 
                        de composición de otros residuos
                        en la calidad de agua en Europa (1991-2017)",
     xlab = "Porcentaje de composición de otros residuos",
     ylab = "Cantidad",
     ylim = c(0, 20000),
     col = "lightgreen")

5.3 Histograma porcentual (hi)

# 1. Guardamos las etiquetas y las convertimos a números
mis_etiquetas <- round(as.numeric(TDF_Histo_COP_Completo$Mc), 2)

# 2. Recortamos para que coincidan (8 y 8)
etiquetas_recortadas <- mis_etiquetas[1:length(TDF_Histo_COP$hi)]

# 3. Calculamos el límite del eje Y
max_y <- max(TDF_Histo_COP$hi, na.rm = TRUE) * 1.1

# 4. Graficamos con las barras juntas
barplot(
  TDF_Histo_COP$hi,
  names.arg = etiquetas_recortadas,
  space     = 0,                                 # <-- AQUÍ: Quita el espacio entre barras
  col       = "royalblue",
  main      = "Gráfica  N°4: Distribución del Porcentaje 
                        de composición de otros residuos
                        en la calidad de agua en Europa (1991-2017)",
  xlab      = "Composición de otros residuos",
  ylab      = "Porcentaje",
  ylim      = c(0, max_y),
  las       = 1
)

5.4 Histograma Porcentual General (hi)

# 1. Aseguramos que las marcas de clase sean numéricas y se redondeen a 2 decimales
etiquetas_m_clase <- round(as.numeric(TDF_Histo_COP$Mc), 2)

# 2. Dibujamos el gráfico con las barras juntas y el eje Y hasta 110 (100 * 1.1)
barplot(
  TDF_Histo_COP$hi,
  names.arg = etiquetas_m_clase,
  space     = 0,                                 # <-- Barras juntas
  border    = "white",                           # <-- Borde para que no se mezclen los bloques
  col       = "royalblue",
  main      = "Gráfica  N°5: Distribución porcentual
                        de la composición de otros residuos
                        en la calidad de agua en Europa (1991-2017)",
  xlab      = "composición de otros residuos",
  ylab      = "Porcentaje",
  ylim      = c(0, 110),                         # <-- Eje Y fijo sobre 100 (100 * 1.1)
  las       = 1
)

5.5 Polígono de frecuencias (hi)

# 1. Aseguramos que las marcas de clase sean numéricas para el eje X
marcas_clase <- round(as.numeric(TDF_Histo_COP$Mc), 2)

# 2. Creamos el gráfico de base (barras juntas basados en 'hi' y sobre 100)
# Guardamos el gráfico en una variable 'barras' para conocer las coordenadas exactas del centro de cada barra
barras <- barplot(
  TDF_Histo_COP$hi,
  names.arg = marcas_clase,
  space     = 0,                                 # Barras juntas
  border    = "lightgray",                       # Borde sutil para notar las divisiones
  col       = "lightgreen",
  main      = "Gráfica  N°6: Polígono de frecuencias del Porcentaje
  de la composición de otros 
  residuos en la calidad de agua en Europa (1991-2017)",
  xlab      = "composición de otros residuos",
  ylab      = "Porcentaje (%)",                  # Basado en tu 'hi'
  ylim      = c(0, 110),                         # Eje Y sobre 100 fijo
  las       = 1
)

# 3. Agregamos el Polígono de Frecuencias encima
# Usamos las coordenadas de 'barras' para el eje X y 'hi' para el eje Y
lines(
  x    = barras,              # Centros exactos de las barras
  y    = TDF_Histo_COP$hi,    # Tus frecuencias relativas
  type = "o",                 # "o" dibuja tanto las líneas como los puntos
  pch  = 16,                  # Punto relleno
  lwd  = 2,                   # Grosor de la línea
  col  = "black"              # Color del polígono
)

5.6 Polígono de frecuencias (ni)

# 1. Creamos el histograma y lo guardamos en una variable
histo_base <- hist(
  COP, 
  breaks = 8,
  main   = "Gráfica  N°7: Polígono de frecuencias de la
                          Distribución general en la composición 
                         de otros residuos
                        en la calidad de agua en Europa (1991-2017)",
  xlab   = "Porcentaje de composición de otros residuos",
  ylab   = "Cantidad",
  ylim   = c(0, 20000),      # Tu límite fijo de 20,000
  col    = "lightgreen",
  border = "black"
)

# 2. Agregamos el polígono de frecuencias encima usando los datos del histograma
lines(
  x    = histo_base$mids,    # R extrae automáticamente el centro de cada barra
  y    = histo_base$counts,  # R extrae automáticamente la altura (frecuencia)
  type = "o",                # "o" para dibujar líneas y puntos a la vez
  pch  = 16,                 # Puntos rellenos
  lwd  = 2,                  # Grosor de la línea
  col  = "black"             # Color del polígono
)

5.7 Boxplot

boxplot(
  COP,
  horizontal = TRUE,
  col = "pink",
  main = "Gráfica Nº8 Distribución de la composición de otros
         residuos (1991-2017)",
  xlab = "composición de otros residuos"
)

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

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

5.8 Ojiva ascendente y descendente (Ni)

plot(
  TDF_Histo_COP$LimInf,
  TDF_Histo_COP$Ni_dsc,
  main = "Gráfica Nº9: Ojiva ascendente y descendente
                        de la composición de otros residuos
                        en la calidad de agua en Europa (1991-2017)",
  xlab = "composición de otros residuos",
  ylab = "Cantidad",
  col = "red",
  type = "o",
  lwd = 2
)

lines(
  TDF_Histo_COP$LimSup,
  TDF_Histo_COP$Ni_asc,
  col = "green",
  type = "o",
  lwd = 2
)

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

5.9 Ojiva ascendente y descendente (Hi)

plot(
  TDF_Histo_COP$LimSup,
  TDF_Histo_COP$Hi_asc,
  type = "o",
  col = "blue",
  pch = 16,
  lwd = 2,
  main = "Gráfica Nº10 Ojivas ascendente y descendente
                        de la composición de otros residuos
                        en la calidad de agua en Europa (1991-2017)",
  xlab = "composición de otros residuos (%)",
  ylab = "Porcentaje acumulado (%)",
  ylim = c(0, 100)
)

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

grid()

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

6. Indicadores

library(e1071)
library(gt)
library(dplyr)

# 1. Limpieza de la variable
COP <- na.omit(datos$composition_food_organic_waste_percent) 
COP <- as.numeric(COP)

# 2. Cálculos estadísticos
atipicos   <- boxplot.stats(COP)$out
n_atipicos <- length(atipicos) 
media      <- round(mean(COP), 2)
mediana    <- round(median(COP), 2)

fila_modal <- which.max(TDF_Histo_COP$ni)
moda       <- paste0("[", round(TDF_Histo_COP$LimInf[fila_modal], 2), " ; ", round(TDF_Histo_COP$LimSup[fila_modal], 2), "]")

varianza   <- var(COP)
desv_est   <- sd(COP)
cv         <- round((desv_est / media) * 100, 2)
asimetria  <- skewness(COP, type = 2)
curtosis   <- kurtosis(COP, type = 2)

# 3. Estructura de la tabla para gt
tabla_indicadores <- data.frame(
  Variable         = "Porcentaje Residuos Organicos (COP)",
  Rango            = paste0("[", round(min(COP), 2), " ; ", round(max(COP), 2), "]"),
  X                = media,
  Me               = mediana,
  Mo               = moda,
  V                = round(varianza, 2),
  Sd               = round(desv_est, 2),
  Cv               = cv,
  As               = round(asimetria, 2),
  K                = round(curtosis, 2),
  Valores_Atipicos = n_atipicos
)

# 4. Renderizar y mostrar en el documento final
tabla_indicadores %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla NB:3**"),
    subtitle = md("*Indicadores estadisticos de la variable Porcentaje de composicion Residuos varios*")
  ) %>%
  tab_source_note(
    source_note = md("**Autor:** Grupo 3")
  )
Tabla NB:3
Indicadores estadisticos de la variable Porcentaje de composicion Residuos varios
Variable Rango X Me Mo V Sd Cv As K Valores_Atipicos
Porcentaje Residuos Organicos (COP) [12.78 ; 62.3] 32.17 32 [25 ; 30] 128.29 11.33 35.21 0.44 -0.06 9434
Autor: Grupo 3

7. conclusión

#El porcentaje de residuos orgánicos en Europa es altamente inestable y varía drásticamente según la región o el año, comportándose de forma heterogénea. Aunque en la mayoría de los casos los niveles se concentran de manera equilibrada alrededor de un eje central moderado, la presencia masiva de registros extremos demuestra que existen escenarios críticos donde la acumulación de estos residuos se dispara de forma anormal, rompiendo el patrón habitual del continente.