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

# Asegurar que se maneje numéricamente
CCP <- as.numeric(CCP)

3. Frecuencia

3.1 Rango

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

3.2 Uso de la Regla de Sturges

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

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

3.3 Límites de clase

# Límites de clase continuos sin saltos
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(CCP >= Li[i] & CCP < Ls[i])
}

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

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

# Crear tabla base continua (conservando los intervalos con ni = 0)
TDF_CCP <- data.frame(
  Li, Ls, MC, ni, hi
)

# Calcular frecuencias acumuladas continuas
TDF_CCP$Niasc <- cumsum(TDF_CCP$ni)
TDF_CCP$Nidsc <- rev(cumsum(rev(TDF_CCP$ni)))
TDF_CCP$Hiasc <- round((TDF_CCP$Niasc / sum(TDF_CCP$ni)) * 100, 2)
TDF_CCP$Hidsc <- round((TDF_CCP$Nidsc / sum(TDF_CCP$ni)) * 100, 2)

# Ajuste fino de extremos al 100% exacto
TDF_CCP$Hiasc[nrow(TDF_CCP)] <- 100.00
TDF_CCP$Hidsc[1] <- 100.00

4. Tabla de distribución de frecuencia

4.1 Tabla general con Sturges

# Fila Total
TDF_CCP_Completo <- rbind(
  TDF_CCP,
  data.frame(
    Li = "Total",
    Ls = " ",
    MC = " ",
    ni = sum(TDF_CCP$ni),
    hi = 100.00,
    Niasc = " ",
    Nidsc = " ",
    Hiasc = " ",
    Hidsc = " "
  )
)

# Generar Tabla GT
tabla_CCP <- TDF_CCP_Completo %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº1*"),
    subtitle = md("**Distribución de frecuencias de composición porcentual de cartón y papel en el estudio de la calidad de agua en Europa (1991-2017)**")
  ) %>%
  cols_label(
    Li = "Li",
    Ls = "Ls",
    MC = "MC",
    ni = "ni",
    hi = "hi (%)",
    Niasc = "Ni ↑",
    Nidsc = "Ni ↓",
    Hiasc = "Hi ↑ (%)",
    Hidsc = "Hi ↓ (%)"
  ) %>%
  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_CCP
Tabla Nº1
Distribución de frecuencias de composición porcentual de cartón y papel en el estudio de la calidad de agua en Europa (1991-2017)
Li Ls MC ni hi (%) Ni ↑ Ni ↓ Hi ↑ (%) Hi ↓ (%)
5 7.1887 6.09 87 0.44 87 19893 0.44 100
7.1887 9.3773 8.28 479 2.41 566 19806 2.85 99.56
9.3773 11.566 10.47 346 1.74 912 19327 4.58 97.15
11.566 13.7547 12.66 246 1.24 1158 18981 5.82 95.42
13.7547 15.9433 14.85 3463 17.41 4621 18735 23.23 94.18
15.9433 18.132 17.04 0 0.00 4621 15272 23.23 76.77
18.132 20.3207 19.23 14007 70.41 18628 15272 93.64 76.77
20.3207 22.5093 21.41 4 0.02 18632 1265 93.66 6.36
22.5093 24.698 23.6 661 3.32 19293 1261 96.98 6.34
24.698 26.8867 25.79 74 0.37 19367 600 97.36 3.02
26.8867 29.0753 27.98 0 0.00 19367 526 97.36 2.64
29.0753 31.264 30.17 0 0.00 19367 526 97.36 2.64
31.264 33.4527 32.36 0 0.00 19367 526 97.36 2.64
33.4527 35.6413 34.55 0 0.00 19367 526 97.36 2.64
35.6413 37.83 36.74 526 2.64 19893 526 100 2.64
Total 19893 100.00
Autor: Grupo 3

4.2 Tabla Simplificada

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

# 1. Calcular el histograma para extraer intervalos continuos
histoP <- hist(
  CCP,
  breaks = 10,
  plot = FALSE 
)

# 2. Extraer límites continuos
Limites <- histoP$breaks
LimInf <- Limites[1:(length(Limites) - 1)]
LimSup <- Limites[2:length(Limites)]
Mc <- round(histoP$mids, 2)
ni <- histoP$counts
hi <- round((ni / sum(ni)) * 100, 2)

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

# Recalcular acumuladas sobre la estructura secuencial continua
TDF_Histo_CCP$Ni_asc <- cumsum(TDF_Histo_CCP$ni)
TDF_Histo_CCP$Ni_dsc <- rev(cumsum(rev(TDF_Histo_CCP$ni)))
TDF_Histo_CCP$Hi_asc <- round((TDF_Histo_CCP$Ni_asc / sum(TDF_Histo_CCP$ni)) * 100, 2)
TDF_Histo_CCP$Hi_dsc <- round((TDF_Histo_CCP$Ni_dsc / sum(TDF_Histo_CCP$ni)) * 100, 2)

# Ajuste de extremos teóricos para evitar el 100.01% por redondeo
TDF_Histo_CCP$Hi_asc[nrow(TDF_Histo_CCP)] <- 100.00
TDF_Histo_CCP$Hi_dsc[1] <- 100.00

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

# 5. Generar Tabla GT
tabla_Histo_CCP <- TDF_Histo_CCP_Completo %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº2*"),
    subtitle = md("**Distribución simplificada de frecuencias de composición porcentual de cartón y papel en el estudio de la calidad de agua en Europa (1991-2017)**")
  ) %>%
  cols_label(
    LimInf = "Límite Inferior",
    LimSup = "Límite Superior",
    Mc = "Marca de Clase",
    ni = "ni",
    hi = "hi (%)",
    Ni_asc = "Ni ↑",
    Ni_dsc = "Ni ↓",
    Hi_asc = "Hi ↑ (%)",
    Hi_dsc = "Hi ↓ (%)"
  ) %>%
  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_CCP
Tabla Nº2
Distribución simplificada de frecuencias de composición porcentual de cartón y papel en el estudio de la calidad de agua en Europa (1991-2017)
Límite Inferior Límite Superior Marca de Clase ni hi (%) Ni ↑ Ni ↓ Hi ↑ (%) Hi ↓ (%)
5 10 7.5 566 2.85 566 19893 2.85 100
10 15 12.5 4055 20.38 4621 19327 23.23 97.15
15 20 17.5 14007 70.41 18628 15272 93.64 76.77
20 25 22.5 712 3.58 19340 1265 97.22 6.36
25 30 27.5 27 0.14 19367 553 97.36 2.78
30 35 32.5 0 0.00 19367 526 97.36 2.64
35 40 37.5 526 2.64 19893 526 100 2.64
Total 19893 100.00
Autor: Grupo 3

5. Gráficas

5.1 Histograma (ni)

hist(
  CCP,
  breaks = histoP$breaks,
  main = "Gráfica Nº1: Distribución de frecuencias de composición\nporcentual de cartón y papel en el estudio de la calidad de\nagua en Europa (1991-2017)",
  xlab = "Porcentaje de cartón y papel (%)",
  ylab = "Cantidad",
  col = "forestgreen",
  border = "black"
)

5.2 Histograma General (ni)

barplot(
  TDF_Histo_CCP$ni,
  col = "limegreen",
  main = "Gráfica Nº2: Distribución de frecuencias de composición\nporcentual de cartón y papel en el estudio de la calidad de\nagua en Europa (1991-2017)",
  xlab = "Porcentaje de cartón y papel (%)",
  ylab = "Cantidad",
  space = 0,
  names.arg = round(TDF_Histo_CCP$Mc, 2)
)

5.3 Histograma Porcentual (hi)

bp <- barplot(
  TDF_Histo_CCP$hi,
  col = "forestgreen",
  main = "Gráfica Nº3: Distribución porcentual de frecuencias de\ncomposición porcentual de cartón y papel en el estudio de la calidad de\nagua en Europa (1991-2017)",
  xlab = "Porcentaje de cartón y papel (%)",
  ylab = "Porcentaje (%)",
  space = 0,
  names.arg = round(TDF_Histo_CCP$Mc, 2)
)

5.4 Histograma Porcentual General (hi)

barplot(
  TDF_Histo_CCP$hi,
  space = 0,
  col = "limegreen",
  main = "Gráfica Nº4: Distribución porcentual de frecuencias de\ncomposición porcentual de cartón y papel en el estudio de la calidad de\nagua en Europa (1991-2017)",
  xlab = "Porcentaje de cartón y papel (%)",
  ylab = "Porcentaje (%)",
  names.arg = TDF_Histo_CCP$Mc,
  ylim = c(0, 100)
)

5.5 Polígono de frecuencias (hi)

bp <- barplot(
  TDF_Histo_CCP$hi,
  col = "darkseagreen3",
  main = "Gráfica Nº5: Polígono de frecuencia de la distribución porcentual\nde composición porcentual de cartón y papel en el estudio de la calidad de\nagua en Europa (1991-2017)",
  xlab = "Porcentaje de cartón y papel (%)",
  ylab = "Porcentaje (%)",
  space = 0,
  names.arg = round(TDF_Histo_CCP$Mc, 2),
  ylim = c(0, max(TDF_Histo_CCP$hi) * 1.2)
)

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

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

5.6 Boxplot

# =============================
# BOXPLOT CON VALORES ATÍPICOS
# =============================
boxplot(
  CCP,
  horizontal = TRUE,
  col = "forestgreen",
  main = "Gráfica Nº6: Diagrama de caja de composición porcentual de cartón y papel\nen el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Porcentaje de cartón y papel (%)"
)

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

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

5.7 Ojiva ascendente y descendente (Ni)

plot(
  TDF_Histo_CCP$LimInf,
  TDF_Histo_CCP$Ni_dsc,
  main = "Gráfica Nº7: Ojiva ascendente y descendente de composición\nporcentual de cartón y papel en el estudio de la calidad de\nagua en Europa (1991-2017)",
  xlab = "Porcentaje de cartón y papel (%)",
  ylab = "Cantidad",
  col = "red",
  type = "o",
  lwd = 2
)

lines(
  TDF_Histo_CCP$LimSup,
  TDF_Histo_CCP$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.8 Ojiva ascendente y descendente (Hi)

plot(
  TDF_Histo_CCP$LimSup,
  TDF_Histo_CCP$Hi_asc,
  type = "o",
  col = "limegreen",
  pch = 16,
  lwd = 2,
  main = "Gráfica Nº8: Ojiva ascendente y descendente de composición\nporcentual de cartón y papel en el estudio de la calidad de\nagua en Europa (1991-2017)",
  xlab = "Porcentaje de cartón y papel (%)",
  ylab = "Porcentaje acumulado (%)",
  ylim = c(0, 100)
)

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

grid()

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

6 Indicadores Estadísticos

6.1 Indicadores de Tendencia Central

# =========================
# INDICADORES ESTADISTICOS
# =========================
# Criterio del boxplot para atípicos
atipicos <- boxplot.stats(CCP)$out
n_atipicos <- length(atipicos)

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

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

6.2 Dispersión

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

6.3 Asimetría

library(e1071)

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

6.4 Tabla de Indicadores

tabla_indicadores <- data.frame(
  Variable = "Composición Cartón y Papel (%)",
  Rango = paste0("[", round(min(CCP), 2), " ; ", round(max(CCP), 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 porcentual de cartón y papel 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 porcentual de cartón y papel en el estudio de la calidad de agua en Europa (1991-2017)
Variable Rango X Me Mo V Sd Cv As K Valores_Atipicos
Composición Cartón y Papel (%) [5 ; 37.83] 18.9 20 [15 ; 20] 18.08 4.25 22.5 1.51 8.07 5882
Autor: Grupo 3

7. Conclusión

La variable Composición Porcentual de Cartón y Papel fluctúa en un rango de [5; 37.83], y sus valores giran en torno a una mediana de 20, con una desviación estándar de 4.25, lo que representa un conjunto de datos con una variabilidad alta CV = 22.5. Los valores presentan una asimetría positiva As = 1.51, indicando una concentración de los datos hacia valores menores a la media, y una curtosis de K = 8.07, lo que evidencia una distribución marcadamente leptocúrtica. Cabe destacar la identificación de 5,882 valores atípicos, la inmensa cantidad de valores atípicos y la desviación estándar señalan una heterogeneidad dentro del monitoreo de la calidad del agua en Europa (1991–2017).