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
# ================================

# ================================
# VARIABLE CUANTITATIVA CONTINUA
# ================================
CWP <- na.omit(datos$composition_wood_percent)
CWP <- as.numeric(CWP)

3. Frecuencia

3.1 Rango

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

3.2 Uso de la Regla de Sturges

# Regla de Sturges
k <- 1 + (3.3 * log10(length(CWP)))
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

ni <- numeric(length(Li))

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

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

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

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

# Calcular acumuladas sobre todos los intervalos originales
TDF_CWP$Niasc <- cumsum(TDF_CWP$ni)
TDF_CWP$Nidsc <- rev(cumsum(rev(TDF_CWP$ni)))
TDF_CWP$Hiasc <- round(cumsum(TDF_CWP$hi), 2)
TDF_CWP$Hidsc <- round(rev(cumsum(rev(TDF_CWP$hi))), 2)

4. Tabla de distribución de frecuencia

4.1 Tabla general con Sturges

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

# Generar Tabla 1 con gt
tabla_CWP <- TDF_CWP_Completo %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº1*"),
    subtitle = md("**Distribución de frecuencias del porcentaje de madera 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_CWP
Tabla Nº1
Distribución de frecuencias del porcentaje de madera en el estudio de la calidad de agua en Europa (1991-2017)
Li Ls MC ni hi Niasc Nidsc Hiasc Hidsc
0 1.1473 0.57 11663 58.63 11663 19893 58.63 100
1.1473 2.2947 1.72 3307 16.62 14970 8230 75.25 41.37
2.2947 3.442 2.87 665 3.34 15635 4923 78.59 24.75
3.442 4.5893 4.02 101 0.51 15736 4258 79.1 21.41
4.5893 5.7367 5.16 0 0.00 15736 4157 79.1 20.9
5.7367 6.884 6.31 0 0.00 15736 4157 79.1 20.9
6.884 8.0313 7.46 4130 20.76 19866 4157 99.86 20.9
8.0313 9.1787 8.61 0 0.00 19866 27 99.86 0.14
9.1787 10.326 9.75 0 0.00 19866 27 99.86 0.14
10.326 11.4733 10.9 0 0.00 19866 27 99.86 0.14
11.4733 12.6207 12.05 0 0.00 19866 27 99.86 0.14
12.6207 13.768 13.19 0 0.00 19866 27 99.86 0.14
13.768 14.9153 14.34 0 0.00 19866 27 99.86 0.14
14.9153 16.0627 15.49 0 0.00 19866 27 99.86 0.14
16.0627 17.21 16.64 27 0.14 19893 27 100 0.14
Total 19893 100.00
Autor: Grupo 3

4.2 Tabla Simplificada

# =========================================================
# TABLA SIMPLIFICADA (Basada en el Histograma)
# =========================================================

histo_CWP_simp <- hist(
  CWP,
  breaks = 10, 
  plot = FALSE
)

# 2. Extraer los límites y marcas de clase del histograma
Li_simp <- histo_CWP_simp$breaks[1:(length(histo_CWP_simp$breaks) - 1)]
Ls_simp <- histo_CWP_simp$breaks[2:length(histo_CWP_simp$breaks)]
MC_simp <- round((Li_simp + Ls_simp) / 2, 2)
ni_simp <- histo_CWP_simp$counts
hi_simp <- round((ni_simp / sum(ni_simp)) * 100, 2)

# 3. Crear el data frame base simplificado
TDF_CWP_Simp_Base <- data.frame(
  Li = round(Li_simp, 4),
  Ls = round(Ls_simp, 4),
  MC = MC_simp,
  ni = ni_simp,
  hi = hi_simp
)

# 4. Calcular frecuencias acumuladas para la tabla simplificada
TDF_CWP_Simp_Base$Niasc <- cumsum(TDF_CWP_Simp_Base$ni)
TDF_CWP_Simp_Base$Nidsc <- rev(cumsum(rev(TDF_CWP_Simp_Base$ni)))
TDF_CWP_Simp_Base$Hiasc <- round(cumsum(TDF_CWP_Simp_Base$hi), 2)
TDF_CWP_Simp_Base$Hidsc <- round(rev(cumsum(rev(TDF_CWP_Simp_Base$hi))), 2)

# 5. Agregar la fila de totales
TDF_CWP_Simplificada_Completa <- rbind(
  TDF_CWP_Simp_Base,
  data.frame(
    Li = "Total",
    Ls = " ",
    MC = " ",
    ni = sum(TDF_CWP_Simp_Base$ni),
    hi = 100,
    Niasc = " ",
    Nidsc = " ",
    Hiasc = " ",
    Hidsc = " "
  )
)

# 6. Generar la Tabla Simplificada con 'gt'
tabla_CWP_simplificada <- TDF_CWP_Simplificada_Completa %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº2*"),
    subtitle = md("**Distribución de frecuencias simplificada del porcentaje de madera 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_CWP_simplificada
Tabla Nº2
Distribución de frecuencias simplificada del porcentaje de madera en el estudio de la calidad de agua en Europa (1991-2017)
Li Ls MC ni hi Niasc Nidsc Hiasc Hidsc
0 2 1 14970 75.25 14970 19893 75.25 100
2 4 3 766 3.85 15736 4923 79.1 24.75
4 6 5 0 0.00 15736 4157 79.1 20.9
6 8 7 4130 20.76 19866 4157 99.86 20.9
8 10 9 0 0.00 19866 27 99.86 0.14
10 12 11 0 0.00 19866 27 99.86 0.14
12 14 13 0 0.00 19866 27 99.86 0.14
14 16 15 0 0.00 19866 27 99.86 0.14
16 18 17 27 0.14 19893 27 100 0.14
Total 19893 100.00
Autor: Grupo 3

5. Gráficas

5.1 Histograma (ni)

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

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

puntos_corte_cwp <- c(Li_simp, tail(Ls_simp, 1))

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

5.2 Histograma General (ni)

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

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

puntos_corte_cwp <- c(Li_simp, tail(Ls_simp, 1))

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

5.3 Histograma Porcentual (hi)

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

bp <- barplot(
  TDF_CWP_Simp_Base$hi,
  col = "forestgreen",
  main = "Gráfica Nº3: Distribución porcentual de frecuencias del porcentaje de 
  madera en el estudio de la calidad de \nagua en Europa (1991-2017)",
  xlab = "Porcentaje de madera (%)",
  ylab = "Porcentaje (%)",
  space = 0,
  ylim = c(0, max(TDF_CWP_Simp_Base$hi) * 1.2),
  xaxt = "n" 
)


puntos_corte_cwp <- c(Li_simp, tail(Ls_simp, 1))

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

5.4 Histograma Porcentual General (hi)

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

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

puntos_corte_cwp <- c(Li_simp, tail(Ls_simp, 1))

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

5.5 Polígono de frecuencias (hi)

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

puntos_corte_cwp <- c(Li_simp, tail(Ls_simp, 1))

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

# 4. Polígono de frecuencia superpuesto 
lines(
  bp,
  TDF_CWP_Simp_Base$hi,
  type = "o",
  pch = 16,
  lwd = 2,
  col = "darkred"
)

# 5. Etiquetas de porcentaje en los puntos
text(
  bp,
  TDF_CWP_Simp_Base$hi,
  labels = round(TDF_CWP_Simp_Base$hi, 2),
  pos = 3,
  cex = 0.8,
  col = "black"
)

5.6 Boxplot

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

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

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

5.7 Ojiva ascendente y descendente (Ni)

# =========================
# OJIVAS CANTIDAD
# =========================

eje_x_asc <- c(min(TDF_CWP_Simp_Base$Li), TDF_CWP_Simp_Base$Ls)
y_asc_ni  <- c(0, TDF_CWP_Simp_Base$Niasc)

eje_x_dsc <- c(TDF_CWP_Simp_Base$Li, max(TDF_CWP_Simp_Base$Ls))
y_dsc_ni  <- c(TDF_CWP_Simp_Base$Nidsc, 0)

plot(
  eje_x_dsc,
  y_dsc_ni,
  main = "Gráfica Nº7: Ojiva ascendente y descendente del porcentaje de madera 
  en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Porcentaje de madera (%)",
  ylab = "Frecuencia acumulada",
  col = "red",
  type = "o",
  pch = 16,
  lwd = 2,
  xlim = c(min(eje_x_asc), max(eje_x_dsc)),
  ylim = c(0, max(y_dsc_ni))
)

# 3. Superponer Ojiva Ascendente
lines(
  eje_x_asc,
  y_asc_ni,
  col = "forestgreen",
  type = "o",
  pch = 16,
  lwd = 2
)

# 4. Leyenda
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)

# =========================
# OJIVAS PORCENTUALES
# =========================

eje_x_asc_p <- c(min(TDF_CWP_Simp_Base$Li), TDF_CWP_Simp_Base$Ls)
y_asc_hi    <- c(0, TDF_CWP_Simp_Base$Hiasc)

eje_x_dsc_p <- c(TDF_CWP_Simp_Base$Li, max(TDF_CWP_Simp_Base$Ls))
y_dsc_hi    <- c(TDF_CWP_Simp_Base$Hidsc, 0)

# 2. Graficar Ojiva Descendente
plot(
  eje_x_dsc_p,
  y_dsc_hi,
  type = "o",
  col = "red",
  pch = 17,
  lwd = 2,
  main = "Gráfica Nº8: Ojiva ascendente y descendente del porcentaje de madera 
  en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Porcentaje de madera (%)",
  ylab = "Porcentaje acumulado (%)",
  xlim = c(min(eje_x_asc_p), max(eje_x_dsc_p)), 
  ylim = c(0, 100)
)

# 3. Superponer Ojiva Ascendente
lines(
  eje_x_asc_p,
  y_asc_hi,
  type = "o",
  col = "limegreen",
  pch = 16,
  lwd = 2
)

grid()

# 4. Leyenda
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
# =========================

# Obtener valores atípicos según el criterio del boxplot
atipicos <- boxplot.stats(CWP)$out
n_atipicos <- length(atipicos)

# Rango de los valores atípicos y su conteo
if (n_atipicos > 0) {
  rango_atipicos <- paste0("[", round(min(atipicos), 2), " ; ", round(max(atipicos), 2), "] (Valores: ", n_atipicos, ")")
} else {
  rango_atipicos <- "No presenta valores atípicos"
}

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

# Moda basada en el Intervalo Modal 
fila_modal <- which.max(TDF_CWP_Simp_Base$ni)
moda_intervalar <- paste0(
  "[", round(as.numeric(TDF_CWP_Simp_Base$Li[fila_modal]), 2), 
  " ; ", round(as.numeric(TDF_CWP_Simp_Base$Ls[fila_modal]), 2), "]"
)

6.2 Dispersión

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

6.3 Asimetría

library(e1071)

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

6.4 Tabla de Indicadores

# =========================
# TABLA RESUMEN FINAL
# =========================
rango_simplificado <- paste0("[", min(TDF_CWP_Simp_Base$Li), " ; ", max(TDF_CWP_Simp_Base$Ls), "]")

tabla_indicadores <- data.frame(
  Variable = "Porcentaje de Madera (%)",
  Rango = rango_simplificado,
  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 de madera 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 de madera en el estudio de la calidad de agua en Europa (1991-2017)
Variable Rango X Me Mo V Sd Cv As K Valores_Atipicos
Porcentaje de Madera (%) [0 ; 18] 2.07 0 [0 ; 2] 9.08 3.01 145.56 1.28 0.35 [7.6 ; 17.21] (Valores: 4157)
Autor: Grupo 3

7. Conclusión

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