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

# Frecuencia absoluta
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)

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

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

# ================================
# ELIMINAR INTERVALOS CON ni = 0 (Solo para Tabla 1)
# ================================
TDF_CWP_Filtrada <- TDF_CWP[TDF_CWP$ni > 0, ]

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

4. Tabla de distribución de frecuencia

TDF_CWP_Completo <- rbind(
  TDF_CWP_Filtrada,
  data.frame(
    Li = "Total",
    Ls = " ",
    MC = " ",
    ni = sum(TDF_CWP_Filtrada$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 de composición porcentual 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 de composición porcentual 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 59 100
1.1473 2.2947 1.72 3307 16.62 14970 8230 75 41
2.2947 3.442 2.87 665 3.34 15635 4923 79 25
3.442 4.5893 4.02 101 0.51 15736 4258 79 21
6.884 8.0313 7.46 4130 20.76 19866 4157 100 21
16.0627 17.21 16.64 27 0.14 19893 27 100 0
Total 19893 100.00
Autor: Grupo 3

5. Gráficas

5.1 Histograma (ni)

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

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

5.2 Histograma General (ni)

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

barplot(
  TDF_CWP_Filtrada$ni,
  col = "limegreen",
  main = "Gráfica Nº2: Distribución de frecuencias de composición \nporcentual 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),
  names.arg = round(TDF_CWP_Filtrada$MC, 2)
)

5.3 Histograma Porcentual (hi)

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

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

5.4 Histograma Porcentual General (hi)

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

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

5.5 Polígono de frecuencias (hi)

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

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

# Etiquetas de porcentaje
text(
  bp,
  TDF_CWP_Filtrada$hi,
  labels = round(TDF_CWP_Filtrada$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 de composición porcentual de madera \nen 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
# =========================

# 1. Preparar vectores con "anclajes" para frecuencias absolutas
eje_x_asc <- c(min(as.numeric(TDF_CWP_Filtrada$Li)), as.numeric(TDF_CWP_Filtrada$Ls))
y_asc_ni  <- c(0, TDF_CWP_Filtrada$Niasc)

eje_x_dsc <- c(as.numeric(TDF_CWP_Filtrada$Li), max(as.numeric(TDF_CWP_Filtrada$Ls)))
y_dsc_ni  <- c(TDF_CWP_Filtrada$Nidsc, 0)

# 2. Graficar Ojiva Descendente (primero, para definir el eje X desde 0)
plot(
  eje_x_dsc,
  y_dsc_ni,
  main = "Gráfica Nº7: Ojiva ascendente y descendente de composición \nporcentual de madera en el estudio de la calidad de \nagua en Europa (1991-2017)",
  xlab = "Porcentaje de madera (%)",
  ylab = "Cantidad",
  col = "red",
  type = "o",
  lwd = 2,
  xlim = c(0, max(eje_x_asc)), # Evita que se recorte el inicio en 0
  ylim = c(0, max(y_dsc_ni))
)

# 3. Superponer Ojiva Ascendente
lines(
  eje_x_asc,
  y_asc_ni,
  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)

# =========================
# OJIVAS PORCENTUALES
# =========================
# 1. Preparar vectores con "anclajes" para porcentajes
y_asc_hi  <- c(0, TDF_CWP_Filtrada$Hiasc)
y_dsc_hi  <- c(TDF_CWP_Filtrada$Hidsc, 0)

# 2. Graficar Ojiva Descendente
plot(
  eje_x_dsc,
  y_dsc_hi,
  type = "o",
  col = "red",
  pch = 17,
  lwd = 2,
  main = "Gráfica Nº8: Ojiva ascendente y descendente de composición \nporcentual de madera en el estudio de la calidad de \nagua en Europa (1991-2017)",
  xlab = "Porcentaje de madera (%)",
  ylab = "Porcentaje acumulado (%)",
  xlim = c(0, max(eje_x_asc)), # Asegura visualización completa
  ylim = c(0, 100)
)

# 3. Superponer Ojiva Ascendente
lines(
  eje_x_asc,
  y_asc_hi,
  type = "o",
  col = "limegreen",
  pch = 16,
  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
# =========================

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

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

# Moda basada en el Intervalo Modal de la Tabla de Frecuencias Activa
fila_modal <- which.max(TDF_CWP_Filtrada$ni)
moda_intervalar <- paste0(
  "[", round(as.numeric(TDF_CWP_Filtrada$Li[fila_modal]), 2), 
  " ; ", round(as.numeric(TDF_CWP_Filtrada$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
# =========================
tabla_indicadores <- data.frame(
  Variable = "Composición Madera (%)",
  Rango = paste0("[", round(min(CWP), 2), " ; ", round(max(CWP), 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 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 composición porcentual 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
Composición Madera (%) [0 ; 17.21] 2.07 0 [0 ; 1.15] 9.08 3.01 145.56 1.28 0.35 4157
Autor: Grupo 3

7. Conclusión

La variable Composición Porcentual de Madera fluctúa en un rango de [0; 17.21], y sus valores giran en torno a una mediana de 0, con una desviación estándar de 3.01, lo que representa un conjunto de datos con una variabilidad extremadamente alta CV = 145.56%. Los valores presentan una asimetría positiva As = 1.28, indicando una fuerte concentración de los datos hacia valores menores a la media, y una curtosis de K = 0.35, lo que evidencia una distribución ligeramente leptocúrtica. Cabe destacar la identificación de 4,157 valores atípicos; esta inmensa cantidad de anomalías y la altísima dispersión relativa señalan una marcada heterogeneidad dentro del monitoreo de la calidad del agua en Europa (1991–2017).