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
library("e1071")

1. Leer Datos

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

2. Extracción y depuración de Variable

CGP <- na.omit(datos$composition_glass_percent)

3. Frecuencia

3.1 Rango

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

3.2 Uso de la regla de Sturges

# Regla de Sturges
k <- 1 + (3.3 * log10(length(CGP)))
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 Creación de columnas

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

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

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

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

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

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

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

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

4.Tabla de distribución de Frecuencia

4.1 Tabla generada con Sturges

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

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

library(gt)
library(dplyr)

tabla_CGP <- TDF_CGP_Completo %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº1*"),
    subtitle = md("**Distribución de los porcentajes de vidrio en los residuos sólidos 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_CGP
Tabla Nº1
Distribución de los porcentajes de vidrio en los residuos sólidos en el estudio de la calidad de agua en Europa(1991-2017)
Li Ls MC ni hi Niasc Nidsc Hiasc Hidsc
2.2 3.48 2.84 4697 23.61 4697 19893 24 100
3.48 4.76 4.12 83 0.42 4780 15196 24 76
4.76 6.04 5.4 657 3.30 5437 15113 27 76
6.04 7.32 6.68 126 0.63 5563 14456 28 73
7.32 8.6 7.96 3291 16.54 8854 14330 44 72
8.6 9.88 9.24 754 3.79 9608 11039 48 55
9.88 11.16 10.52 10203 51.29 19811 10285 100 52
20.12 21.4 20.76 82 0.41 19893 82 100 0
Total 19893 100.00
Autor: Grupo 3

4.2 Tabla Simplificada

#TABLA 2-----------------------------------------------------------
# =========================
# TABLA Nº2 (SIMPLIFICADA)
# =========================

# Crear 10 intervalos redondeados
cortes <- seq(
  floor(min(CGP)),
  ceiling(max(CGP)),
  length.out = 11
)

# Histograma sin dibujar
histoP <- hist(
  CGP,
  breaks = cortes,
  plot = FALSE
)

# Extraer información
LimInf <- histoP$breaks[-length(histoP$breaks)]
LimSup <- histoP$breaks[-1]
Mc <- round((LimInf + LimSup)/2, 1)

ni <- histoP$counts
hi <- round((ni/sum(ni))*100, 2)

# Crear tabla
TDF_Histo_CGP <- data.frame(
  LimInf,
  LimSup,
  Mc,
  ni,
  hi
)

# Eliminar intervalos vacíos
TDF_Histo_CGP <- subset(TDF_Histo_CGP, ni > 0)

# Recalcular acumuladas
TDF_Histo_CGP$Ni_asc <- cumsum(TDF_Histo_CGP$ni)
TDF_Histo_CGP$Ni_dsc <- rev(cumsum(rev(TDF_Histo_CGP$ni)))

TDF_Histo_CGP$Hi_asc <- round(cumsum(TDF_Histo_CGP$hi),2)
TDF_Histo_CGP$Hi_dsc <- round(rev(cumsum(rev(TDF_Histo_CGP$hi))),2)

# Agregar fila total
TDF_Histo_CGP_Completo <- rbind(
  TDF_Histo_CGP,
  data.frame(
    LimInf = "Total",
    LimSup = "",
    Mc = "",
    ni = sum(TDF_Histo_CGP$ni),
    hi = 100,
    Ni_asc = "",
    Ni_dsc = "",
    Hi_asc = "",
    Hi_dsc = ""
  )
)

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

library(gt)

tabla_Histo_CGP <- TDF_Histo_CGP_Completo %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº2*"),
    subtitle = md("**Distribución de los porcentajes de vidrio agrupados en los residuos sólidos 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_CGP
Tabla Nº2
Distribución de los porcentajes de vidrio agrupados en los residuos sólidos 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 ↓ (%)
2 4 3 4753 23.89 4753 19893 23.89 100.01
4 6 5 684 3.44 5437 15140 27.33 76.12
6 8 7 3373 16.96 8810 14456 44.29 72.68
8 10 9 11000 55.30 19810 11083 99.59 55.72
10 12 11 1 0.01 19811 83 99.6 0.42
20 22 21 82 0.41 19893 82 100.01 0.41
Total 19893 100.00
Autor: Grupo 3

5. Gráficas

5.1 Histograma

# =========================
# GRÁFICA Nº1
# HISTOGRAMA
# =========================

# Intervalos de la Tabla 1 (sin los intervalos con ni = 0)
cortes <- c(TDF_CGP$Li, max(TDF_CGP$Ls))

# Histograma
hist(
  CGP,
  breaks = cortes,
  col = "lightblue",
  border = "black",
  main = "Gráfica Nº1: Distribución de los porcentajes de vidrio en los residuos
                  sólidos en el estudio de la calidad 
                  de agua en Europa(1991-2017)",
  xlab = "Marca de clase",
  ylab = "Frecuencia",
  xaxt = "n"
)

# Mostrar las marcas de clase en lugar de los límites
axis(
  side = 1,
  at = TDF_CGP$MC,
  labels = round(TDF_CGP$MC, 1),
  las = 2,
  cex.axis = 0.8
)

grid()

5.2 Histograma General

# =========================
# GRÁFICA Nº2
# HISTOGRAMA BASADO EN TABLA 2
# =========================

# Histograma usando los mismos intervalos de la Tabla 2
hist(
  CGP,
  breaks = c(TDF_Histo_CGP$LimInf,
             max(TDF_Histo_CGP$LimSup)),
  col = "deepskyblue",
  border = "black",
  main = "Gráfica Nº2: Distribución de frecuencias agrupado
  de los porcentajes de vidrio en los residuos 
                  sólidos en el estudio de la calidad 
                  de agua en Europa(1991-2017)",
  xlab = "Marca de clase",
  ylab = "Frecuencia",
  xaxt = "n"
)

# Mostrar las marcas de clase en el eje X
axis(
  side = 1,
  at = TDF_Histo_CGP$Mc,
  labels = round(TDF_Histo_CGP$Mc, 1),
  las = 2,
  cex.axis = 0.8
)

grid()

5.3 Histograma de Frecuencias global

# =========================
# GRÁFICA Nº3
# Frecuencia Global
# =========================

barplot(
  TDF_Histo_CGP$ni,
  names.arg = TDF_Histo_CGP$Mc,
  col = "limegreen",
  border = "black",
  main = "Gráfica Nº3: Distribución de frecuencias de los porcentajes de vidrio en los residuos 
                  sólidos en el estudio de la calidad 
                  de agua en Europa(1991-2017)",
  xlab = "Marcas de clase",
  ylab = "Frecuencia absoluta",
  ylim = c(0, 20000)
)

grid()

5.4 Histograma de Frecuencia relativa

# =========================
# GRÁFICA Nº4
# Porcentaje Local
# =========================

barplot(
  TDF_Histo_CGP$hi,
  names.arg = TDF_Histo_CGP$Mc,
  col = "royalblue",
  border = "black",
  main = "Gráfica Nº4: Distribución de frecuencias relativas agrupado
  de los porcentajes de vidrio en los residuos 
                  sólidos en el estudio de la calidad 
                  de agua en Europa(1991-2017)",
  xlab = "Marcas de clase",
  ylab = "Porcentaje (%)",
  ylim = c(0, max(TDF_Histo_CGP$hi) * 1.15)
)

grid()

5.5 Histograma de Frecuencia global

# =========================
# GRÁFICA Nº5
# Porcentaje Global
# =========================

hi_global <- round((TDF_Histo_CGP$ni / 20000) * 100, 2)

barplot(
  hi_global,
  names.arg = round(TDF_Histo_CGP$Mc, 1),
  col = "navy",
  border = "black",
  main = "Gráfica Nº5: Distribución de frecuencias relativas agrupado
  de los porcentajes de vidrio en los residuos 
                  sólidos en el estudio de la calidad 
                  de agua en Europa(1991-2017)",
  xlab = "Marca de clase",
  ylab = "Porcentaje respecto al total (%)",
  ylim = c(0, 100)
)

grid()

5.5 Póligono de Frecuencia

# =========================
# HISTOGRAMA + POLÍGONO
# =========================

# Amplitud de clase
A <- TDF_Histo_CGP$Mc[2] - TDF_Histo_CGP$Mc[1]

# Histograma
hist(
  CGP,
  breaks = c(TDF_Histo_CGP$LimInf,
             max(TDF_Histo_CGP$LimSup)),
  freq = TRUE,
  col = "lightblue",
  border = "black",
  main = "Gráfica Nº6:Polígono de Frecuencias de los porcentajes de vidrio en los residuos 
                  sólidos en el estudio de la calidad 
                  de agua en Europa(1991-2017)",
  xlab = "Porcentaje de vidrio",
  ylab = "Frecuencia"
)
## Warning in plot.histogram(r, freq = freq1, col = col, border = border, angle =
## angle, : the AREAS in the plot are wrong -- rather use 'freq = FALSE'
# Puntos para cerrar el polígono
Mc_pol <- c(
  TDF_Histo_CGP$Mc[1] - A,
  TDF_Histo_CGP$Mc,
  TDF_Histo_CGP$Mc[length(TDF_Histo_CGP$Mc)] + A
)

ni_pol <- c(
  0,
  TDF_Histo_CGP$ni,
  0
)

# Polígono
lines(
  Mc_pol,
  ni_pol,
  type = "o",
  pch = 16,
  lwd = 3,
  col = "red"
)

grid()

5.5 Póligono de Frecuencia Relativa

# Posiciones de las barras
bp <- barplot(
  TDF_Histo_CGP$hi,
  names.arg = round(TDF_Histo_CGP$Mc, 1),
  col = "lightblue",
  border = "black",
  main = "Gráfica Nº7:Polígono de Frecuencias relativas de los porcentajes de vidrio en los residuos 
                  sólidos en el estudio de la calidad 
                  de agua en Europa(1991-2017)",
  xlab = "Marcas de clase",
  ylab = "Frecuencia relativa (%)",
  ylim = c(0, max(TDF_Histo_CGP$hi) * 1.15)
)

# Polígono cerrado
x_pol <- c(
  bp[1] - (bp[2] - bp[1]),  # punto inicial
  bp,
  bp[length(bp)] + (bp[length(bp)] - bp[length(bp)-1]) # punto final
)

y_pol <- c(
  0,
  TDF_Histo_CGP$hi,
  0
)

# Dibujar polígono
lines(
  x_pol,
  y_pol,
  type = "o",
  pch = 16,
  lwd = 3,
  col = "red"
)

grid()

legend(
  "topright",
  legend = c("Frecuencia relativa (%)"),
  col = "red",
  lwd = 3,
  pch = 16,
  bty = "n"
)

5.6 Bloxplot

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

boxplot(
  CGP,
  horizontal = TRUE,
  col = "lightblue",
  outline = TRUE,
  main = "Gráfica Nº8: Boxplot de los porcentajes de vidrio en los residuos 
                  sólidos en el estudio de la calidad 
                  de agua en Europa(1991-2017)"
)

# Media
points(
  mean(CGP),
  1,
  pch = 19,
  col = "red",
  cex = 1.5
)

legend(
  "topright",
  legend = c("Media", "Valores atípicos"),
  pch = c(19, 1),
  col = c("red", "black"),
  bty = "n"
)

5.7 Ojiva ascendente y descendente

# =========================
# OJIVAS
# =========================
par(mar = c(10,4,7,2))
plot(
  TDF_Histo_CGP$LimInf,
  TDF_Histo_CGP$Ni_dsc,
  main = "Gráfica Nº9: Ojiva ascendente y descendente de los porcentajes
  de vidrio en los residuos
  sólidos en el estudio de la calidad 
                  de agua en Europa(1991-2017)",
  xlab = "Porcentaje de vidrio (%)",
  ylab = "Cantidad",
  col = "red",
  type = "o",
  lwd = 2
)

lines(
  TDF_Histo_CGP$LimSup,
  TDF_Histo_CGP$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.8 Ojiva de Frecuencia relativa

# =========================
# OJIVAS PORCENTUALES
# =========================
par(mar = c(10,4,7,2))
plot(
  TDF_Histo_CGP$LimSup,
  TDF_Histo_CGP$Hi_asc,
  type = "o",
  col = "blue",
  pch = 16,
  lwd = 2,
  main = "Gráfica Nº10: Ojiva ascendente y descendente 
  de frecuencia relativa de los porcentajes 
  de vidrio en los residuos sólidos en el estudio de la calidad 
                  de agua en Europa(1991-2017)",
  xlab = "Porcentaje de vidrio",
  ylab = "Porcentaje acumulado (%)",
  ylim = c(0, 100)
)

# Ojiva Descendente
lines(
  TDF_Histo_CGP$LimInf,
  TDF_Histo_CGP$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 estadísticos

6.1 Indicadores de Tendencia Central

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

# Moda como intervalo
indice_moda <- which.max(TDF_Histo_CGP$ni)

moda <- paste0(
  "[",
  TDF_Histo_CGP$LimInf[indice_moda],
  " ; ",
  TDF_Histo_CGP$LimSup[indice_moda],
  "]"
)

6.2 Dispersión

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

6.3 Asimetría

# Asimetría 
asimetria <- round(
  mean((CGP - mean(CGP))^3) /
    sd(CGP)^3,
  2
)

# Curtosis 
curtosis <- round(
  mean((CGP - mean(CGP))^4) /
    sd(CGP)^4 - 3,
  2
)

6.4 Valores atipicos

atipicos <- boxplot.stats(CGP)$out
n_atipicos <- length(atipicos)

6.5 Tabla de indicadores

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

tabla_indicadores_gt <- tabla_indicadores %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº3*"),
    subtitle = md("**Indicadores estadísticos de porcentajes 
  de vidrio en los residuos sólidos 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 porcentajes de vidrio en los residuos sólidos en el estudio de la calidad de agua en Europa(1991-2017)
Variable Rango X Me Mo V Sd Cv As K Valores_Atipicos
composition_glass_percent [2.2 ; 21.4] 7.66 10 [8 ; 10] 10.75 3.28 42.82 -0.58 0.16 82
Autor: Grupo 3

7.Conclusión

#El comportamiento de la variable Porcentaje de vidrio en los residuos sólidos sigue la siguiente manera: fluctúa entre 2,2 % y 21,4 % y sus valores giran en torno a la media aritmética de 7,66 %, con una desviación estándar de 3,28 %, siendo un conjunto de datos moderadamente heterogéneo, ya que su coeficiente de variación es de 42,82 %. El conjunto de valores presenta una distribución leptocúrtica ligera (Curtosis = 0,16), lo que indica una concentración de datos alrededor del centro ligeramente superior a la de una distribución normal. Además, muestra una asimetría negativa moderada (Asimetría = -0,58), por lo que los valores tienden a concentrarse hacia la parte alta de la distribución, con una cola más extendida hacia los valores bajos. Finalmente, se identificaron 82 valores atípicos (N = 82), lo que evidencia la presencia de observaciones que se alejan del comportamiento general de los datos. Por todo lo anterior, la variable Porcentaje de vidrio en los residuos sólidos presenta una dispersión moderada en los valores registrados, reflejando diferencias en la composición de vidrio de los residuos sólidos incluidos en el conjunto de datos analizado.