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
options(scipen = 999)

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
# ================================
# Extraemos y removemos valores nulos de GDP
GDP <- na.omit(datos$gdp)
GDP <- as.numeric(GDP)

3. Frecuencia

3.1 Rango

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

3.2 Uso de la Regla de Sturges

# Regla de Sturges
k <- 1 + (3.3 * log10(length(GDP)))
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(GDP >= Li[i] & GDP < Ls[i])
}

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

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

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

# ================================
# ELIMINAR INTERVALOS CON ni = 0
# ================================
TDF_GDP <- TDF_GDP[TDF_GDP$ni > 0, ]

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

4. Tabla de distribución de frecuencia

4.1 Tabla general con Sturges

TDF_GDP_Cientifico <- TDF_GDP

# Convertimos los límites y marca de clase a formato científico en texto limpio
TDF_GDP_Cientifico$Li <- formatC(TDF_GDP$Li, format = "e", digits = 2)
TDF_GDP_Cientifico$Ls <- formatC(TDF_GDP$Ls, format = "e", digits = 2)
TDF_GDP_Cientifico$MC <- formatC(TDF_GDP$MC, format = "e", digits = 2)

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

# ================================
# TABLA GT
# ================================
tabla_GDP <- TDF_GDP_Completo %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº1*"),
    subtitle = md("**Distribución de frecuencias de GDP 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_GDP
Tabla Nº1
Distribución de frecuencias de GDP en el estudio de la calidad de agua en Europa (1991-2017)
Li Ls MC ni hi Niasc Nidsc Hiasc Hidsc
2.89e+10 2.79e+11 1.54e+11 1789 8.99 1789 19893 9 100
2.79e+11 5.29e+11 4.04e+11 505 2.54 2294 18104 12 91
5.29e+11 7.79e+11 6.54e+11 194 0.98 2488 17599 13 88
7.79e+11 1.03e+12 9.05e+11 4 0.02 2492 17405 13 87
1.28e+12 1.53e+12 1.40e+12 3141 15.79 5633 17401 28 87
2.03e+12 2.28e+12 2.16e+12 101 0.51 5734 14260 29 72
2.53e+12 2.78e+12 2.66e+12 3957 19.89 9691 14159 49 71
2.78e+12 3.03e+12 2.91e+12 9661 48.56 19352 10202 97 51
3.53e+12 3.78e+12 3.66e+12 541 2.72 19893 541 100 3
Total 19893 100.00
Autor: Grupo 3
# Nota: Debido a la gran magnitud de los valores de la variable, los datos se presentan en notación científica para facilitar su visualización, comprensión y análisis.

4.2 Tabla Simplificada

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

# 1. Calcular el histograma 
histoP <- hist(
  GDP,
  breaks = 10,
  plot = FALSE 
)

# 2. Extraer datos del histograma para la tabla
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)

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

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

# 4. Recalcular frecuencias acumuladas
TDF_Histo_GDP$Ni_asc <- cumsum(TDF_Histo_GDP$ni)
TDF_Histo_GDP$Ni_dsc <- rev(cumsum(rev(TDF_Histo_GDP$ni)))
TDF_Histo_GDP$Hi_asc <- round((TDF_Histo_GDP$Ni_asc / sum(TDF_Histo_GDP$ni)) * 100, 2)
TDF_Histo_GDP$Hi_dsc <- round((TDF_Histo_GDP$Ni_dsc / sum(TDF_Histo_GDP$ni)) * 100, 2)

# Convertir límites a notación científica en texto limpio
TDF_Histo_GDP_Cientifico <- TDF_Histo_GDP
TDF_Histo_GDP_Cientifico$LimInf <- formatC(TDF_Histo_GDP$LimInf, format = "e", digits = 2)
TDF_Histo_GDP_Cientifico$LimSup <- formatC(TDF_Histo_GDP$LimSup, format = "e", digits = 2)
TDF_Histo_GDP_Cientifico$Mc <- formatC(TDF_Histo_GDP$Mc, format = "e", digits = 2)

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

# 6. Generar y mostrar la Tabla con 'gt'
tabla_Histo_GDP <- TDF_Histo_GDP_Completo %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº2*"),
    subtitle = md("**Distribución simplificada de frecuencias de GDP 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_Histo_GDP
Tabla Nº2
Distribución simplificada de frecuencias de GDP en el estudio de la calidad de agua en Europa (1991-2017)
LimInf LimSup Mc ni hi Ni_asc Ni_dsc Hi_asc Hi_dsc
0.00e+00 5.00e+11 2.50e+11 2033 10.22 2033 19893 10.22 100
5.00e+11 1.00e+12 7.50e+11 459 2.31 2492 17860 12.53 89.78
1.00e+12 1.50e+12 1.25e+12 3141 15.79 5633 17401 28.32 87.47
2.00e+12 2.50e+12 2.25e+12 101 0.51 5734 14260 28.82 71.68
2.50e+12 3.00e+12 2.75e+12 13618 68.46 19352 14159 97.28 71.18
3.50e+12 4.00e+12 3.75e+12 541 2.72 19893 541 100 2.72
Total 19893 100.00
Autor: Grupo 3
# Nota: Al igual que en la Tabla Nº1, debido a la gran magnitud de los valores de la variable, los datos se presentan en notación científica para facilitar su visualización, comprensión y análisis.

5. Gráficas

5.1 Histograma (ni)

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

par(mar = c(10, 4, 7, 2))

# 1. Unimos todos los límites inferiores 
limites_etiquetas_gdp <- c(TDF_Histo_GDP$LimInf, tail(TDF_Histo_GDP$LimSup, 1))
# 2. Convertimos esos límites a notación científica
limites_cientificos <- formatC(limites_etiquetas_gdp, format = "e", digits = 2)

bp <- barplot(
  TDF_Histo_GDP$ni,
  col = "salmon",
  border = "black",
  main = "Gráfica Nº1: Distribución de frecuencias de GDP en el estudio de \nla calidad de agua en Europa (1991-2017)",
  xlab = "", 
  ylab = "Cantidad",
  space = 0,
  xaxt = "n",
  ylim = c(0, max(TDF_Histo_GDP$ni) * 1.2)
)

axis(
  side = 1,
  at = 0:length(TDF_Histo_GDP$ni),
  labels = limites_cientificos,
  las = 2,
  cex.axis = 0.8
)

mtext("GDP", side = 1, line = 6.5, font = 2)

grid()

5.2 Histograma General (ni)

# ===========================================================
# Histograma con relación a la totalidad de los datos
# ===========================================================
par(mar = c(10, 4, 7, 2))

# 1. Unimos todos los límites inferiores 
limites_etiquetas_gdp2 <- c(TDF_Histo_GDP$LimInf, tail(TDF_Histo_GDP$LimSup, 1))

# 2. Convertimos esos límites a notación científica
limites_cientificos2 <- formatC(limites_etiquetas_gdp2, format = "e", digits = 2)

bp2 <- barplot(
  TDF_Histo_GDP$ni,
  col = "lightsalmon2",
  border = "black",
  main = "Gráfica Nº2: Distribución de frecuencias de GDP en el estudio \nde la calidad de agua en Europa (1991-2017)",
  xlab = "", 
  ylab = "Cantidad",
  space = 0,
  xaxt = "n",
  yaxt = "n",
  ylim = c(0, 20000)
)

axis(
  side = 2,
  at = seq(0, 20000, by = 5000),
  las = 1
)

axis(
  side = 1,
  at = 0:length(TDF_Histo_GDP$ni),
  labels = limites_cientificos2,
  las = 2,
  cex.axis = 0.8
)

mtext("GDP", side = 1, line = 6.5, font = 2)

grid(nx = NA, ny = NULL)

5.3 Histograma Porcentual (hi)

# ======================================
# Histograma porcentual que genera RStudio
# ======================================
par(mar = c(10, 4, 7, 2))

# 1. Unimos todos los límites inferiores 
limites_etiquetas_gdp3 <- c(TDF_Histo_GDP$LimInf, tail(TDF_Histo_GDP$LimSup, 1))

# 2. Convertimos esos límites a notación científica
limites_cientificos3 <- formatC(limites_etiquetas_gdp3, format = "e", digits = 2)

bp3 <- barplot(
  TDF_Histo_GDP$hi,
  col = "salmon",
  border = "black",
  main = "Gráfica Nº3: Distribución porcentual de frecuencias de GDP en el estudio 
  de la calidad de agua en Europa (1991-2017)",
  xlab = "", 
  ylab = "Porcentaje (%)",
  space = 0,
  xaxt = "n",
  ylim = c(0, max(TDF_Histo_GDP$hi) * 1.2)
)

axis(
  side = 1,
  at = 0:length(TDF_Histo_GDP$hi),
  labels = limites_cientificos3,
  las = 2,
  cex.axis = 0.8
)

mtext("GDP", side = 1, line = 6.5, font = 2)

grid()

5.4 Histograma Porcentual General (hi)

# ===========================================================
# Histograma porcentual con relación a la totalidad 
# ===========================================================
par(mar = c(10, 4, 7, 2))

# 1. Unimos todos los límites inferiores 
limites_etiquetas_gdp4 <- c(TDF_Histo_GDP$LimInf, tail(TDF_Histo_GDP$LimSup, 1))

# 2. Convertimos esos límites a notación científica
limites_cientificos4 <- formatC(limites_etiquetas_gdp4, format = "e", digits = 2)

bp4 <- barplot(
  TDF_Histo_GDP$hi,
  col = "lightsalmon2",
  border = "black",
  main = "Gráfica Nº4: Distribución porcentual general de GDP en el estudio \nde la calidad de agua en Europa (1991-2017)",
  xlab = "", 
  ylab = "Porcentaje (%)",
  space = 0,
  xaxt = "n",
  yaxt = "n",
  ylim = c(0, 100)
)

axis(
  side = 2,
  at = seq(0, 100, by = 20),
  las = 1
)

axis(
  side = 1,
  at = 0:length(TDF_Histo_GDP$hi),
  labels = limites_cientificos4,
  las = 2,
  cex.axis = 0.8
)

mtext("GDP", side = 1, line = 6.5, font = 2)

grid(nx = NA, ny = NULL)

5.5 Polígono de frecuencias (hi)

par(mar = c(10, 4, 7, 2))

# 1. Unimos todos los límites inferiores 
limites_etiquetas_gdp5 <- c(TDF_Histo_GDP$LimInf, tail(TDF_Histo_GDP$LimSup, 1))

# 2. Convertimos esos límites a notación científica
limites_cientificos5 <- formatC(limites_etiquetas_gdp5, format = "e", digits = 2)

bp <- barplot(
  TDF_Histo_GDP$hi,
  col = "salmon",
  border = "black",
  main = "Gráfica Nº5: Polígono de frecuencia de la distribución porcentual de 
  GDP en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "", 
  ylab = "Porcentaje (%)",
  space = 0,
  xaxt = "n",
  ylim = c(0, max(TDF_Histo_GDP$hi) * 1.2)
)

lines(
  bp,
  TDF_Histo_GDP$hi,
  type = "o",
  pch = 16,
  lwd = 2,
  col = "darkred"
)

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

# 6. Dibujamos el eje X 
axis(
  side = 1,
  at = 0:length(TDF_Histo_GDP$hi),
  labels = limites_cientificos5,
  las = 2,
  cex.axis = 0.8
)

mtext("GDP", side = 1, line = 6.5, font = 2)

grid()

5.6 Boxplot

# =============================
# BOXPLOT 
# =============================
boxplot(
  GDP,
  horizontal = TRUE,
  col = "coral1",
  main = "Gráfica Nº6: Diagrama de caja de GDP en el estudio de la calidad 
  de agua en Europa (1991-2017)",
  xlab = "GDP"
)

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

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

5.7 Ojiva ascendente y descendente (Ni)

# =========================
# OJIVAS Ni
# =========================
par(mar = c(10, 4, 7, 2))

# 1. Crear eje X con límites concatenados
eje_x <- c(TDF_Histo_GDP$LimInf, TDF_Histo_GDP$LimSup[length(TDF_Histo_GDP$LimSup)])

# 2. Convertir los límites a notación científica
limites_cientificos_ojiva <- formatC(eje_x, format = "e", digits = 2)

ni_asc_plot <- c(0, TDF_Histo_GDP$Ni_asc)
ni_dsc_plot <- c(TDF_Histo_GDP$Ni_dsc, 0)

# 4. Graficar Ojiva Descendente 
plot(
  eje_x, ni_dsc_plot,
  main = "Gráfica Nº7: Ojiva ascendente y descendente de GDP en el estudio \nde la calidad de agua en Europa (1991-2017)",
  xlab = "",
  ylab = "Frecuencia acumulada",
  col = "coral1",
  type = "o",
  lwd = 2,
  pch = 16,
  xaxt = "n",
  ylim = c(0, max(ni_asc_plot) * 1.1)
)

lines(
  eje_x, ni_asc_plot,
  col = "orange3",
  type = "o",
  lwd = 2,
  pch = 16
)

axis(
  side = 1,
  at = eje_x,
  labels = limites_cientificos_ojiva,
  las = 2,
  cex.axis = 0.8
)

mtext("GDP", side = 1, line = 6.5, font = 2)

legend(
  "topright",
  legend = c("Ojiva descendente", "Ojiva ascendente"),
  col = c("coral1", "orange3"),
  pch = 16,
  lty = 1,
  bty = "n"
)

grid()

5.8 Ojiva ascendente y descendente (Hi)

# =========================
# OJIVAS PORCENTUALES
# =========================
par(mar = c(10, 4, 7, 2))

# 1. Crear eje X con límites 
eje_x <- c(TDF_Histo_GDP$LimInf, TDF_Histo_GDP$LimSup[length(TDF_Histo_GDP$LimSup)])

# 2. Convertir los límites a notación científica
limites_cientificos_ojiva8 <- formatC(eje_x, format = "e", digits = 2)

hi_asc_plot <- c(0, TDF_Histo_GDP$Hi_asc)
hi_dsc_plot <- c(TDF_Histo_GDP$Hi_dsc, 0)

# 4. Graficar Ojiva Porcentual Ascendente 
plot(
  eje_x, hi_asc_plot,
  type = "o",
  col = "lightsalmon2",
  pch = 16,
  lwd = 2,
  main = "Gráfica Nº8: Ojivas porcentuales de GDP en el estudio de la calidad \nde agua en Europa (1991-2017)",
  xlab = "",
  ylab = "Porcentaje acumulado (%)",
  xaxt = "n",
  yaxt = "n",
  ylim = c(0, 100)
)

lines(
  eje_x, hi_dsc_plot,
  type = "o",
  col = "goldenrod2",
  pch = 17,
  lwd = 2
)

axis(
  side = 2,
  at = seq(0, 100, by = 20),
  las = 1
)

axis(
  side = 1,
  at = eje_x,
  labels = limites_cientificos_ojiva8,
  las = 2,
  cex.axis = 0.8
)

mtext("GDP", side = 1, line = 6.5, font = 2)

# 9. Agregar la leyenda
legend(
  "topright",
  legend = c("Ojiva Ascendente (%)", "Ojiva Descendente (%)"),
  col = c("lightsalmon2", "goldenrod2"),
  pch = c(16, 17),
  lty = 1,
  bty = "n"
)

grid(nx = NA, ny = NULL)

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(GDP)$out
n_atipicos <- length(atipicos)

# Calcular el rango de los valores atípicos con notación científica y la cantidad al lado
if (n_atipicos > 0) {
  rango_atipicos <- paste0(
    "[", formatC(min(atipicos), format = "e", digits = 2), 
    " ; ", formatC(max(atipicos), format = "e", digits = 2), "] (Valores: ", n_atipicos, ")"
  )
} else {
  rango_atipicos <- "No existen valores atípicos"
}

media <- mean(GDP)
mediana <- median(GDP)

# Moda basada en Intervalo Modal 
fila_modal <- which.max(TDF_Histo_GDP$ni)
moda_intervalar <- paste0(
  "[", formatC(TDF_Histo_GDP$LimInf[fila_modal], format = "e", digits = 2), 
  " ; ", formatC(TDF_Histo_GDP$LimSup[fila_modal], format = "e", digits = 2), "]"
)

6.2 Dispersión

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

6.3 Asimetría

library(e1071)

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

6.4 Tabla de Indicadores

# =========================
# TABLA RESUMEN FINAL
# =========================

tabla_indicadores <- data.frame(
  Variable = "GDP",
  Rango = paste0("[", formatC(min(GDP), format = "e", digits = 2), " ; ", formatC(max(GDP), format = "e", digits = 2), "]"),
  Media = formatC(media, format = "e", digits = 2),
  Mediana = formatC(mediana, format = "e", digits = 2),
  Moda = moda_intervalar,
  Varianza = formatC(varianza, format = "e", digits = 2),
  Desv_Est = formatC(desv_est, format = "e", digits = 2),
  CV_porc = paste0(cv, "%"),
  Asimetria = round(asimetria, 2),
  Curtosis = round(curtosis, 2),
  Atipicos_Rango = rango_atipicos
)

# Construcción de la tabla con el paquete gt
library(gt)

tabla_indicadores_gt <- tabla_indicadores %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº3*"),
    subtitle = md("**Indicadores estadísticos de la variable GDP 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 GDP en el estudio de la calidad de agua en Europa (1991-2017)
Variable Rango Media Mediana Moda Varianza Desv_Est CV_porc Asimetria Curtosis Atipicos_Rango
GDP [2.89e+10 ; 3.78e+12] 2.29e+12 2.81e+12 [2.50e+12 ; 3.00e+12] 8.68e+23 9.32e+11 40.75% -1.23 0.34 No existen valores atípicos
Autor: Grupo 3

7. Conclusión

La variable GDP fluctúa entre \(2.89\times 10^{10}\) y \(3.78\times 10^{12}\), y sus valores giran en torno a una mediana de \(2.81\times 10^{12}\), con una desviación estándar de \(9.32\times 10^{11}\). Dado que el coeficiente de variación es de 40.75%, se trata de un conjunto de valores homogéneo. Los datos presentan una asimetría negativa, lo que indica que los valores se acumulan de manera pronunciada en la parte alta de la variable. Con la ausencia de valores atípicos en el intervalo analizado, resulta favorable para la gestión económica y ambiental, ya que evidencia un comportamiento más estable y sin distorsiones extremas en los países de Europa evaluados durante dicho periodo.