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_Completo <- rbind(
  TDF_GDP,
  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
28871503534.3929 279059973287.749 153965738411.07 1789 8.99 1789 19893 9 100
279059973287.749 529248443041.106 404154208164.43 505 2.54 2294 18104 12 91
529248443041.106 779436912794.462 654342677917.78 194 0.98 2488 17599 13 88
779436912794.462 1029625382547.82 904531147671.14 4 0.02 2492 17405 13 87
1279813852301.18 1530002322054.53 1404908087177.85 3141 15.79 5633 17401 28 87
2030379261561.24 2280567731314.6 2155473496437.92 101 0.51 5734 14260 29 72
2530756201067.96 2780944670821.31 2655850435944.64 3957 19.89 9691 14159 49 71
2780944670821.31 3031133140574.67 2906038905697.99 9661 48.56 19352 10202 97 51
3531510080081.38 3781698549834.74 3656604314958.06 541 2.72 19893 541 100 3
Total 19893 100.00
Autor: Grupo 3

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 con ajuste para cerrar exactamente en 100%
TDF_Histo_GDP$Ni_asc <- cumsum(TDF_Histo_GDP$ni)
TDF_Histo_GDP$Ni_dsc <- rev(cumsum(rev(TDF_Histo_GDP$ni)))

# Calcular acumuladas porcentuales basándonos directamente en las frecuencias absolutas
# para evitar que el redondeo decimal sume 100.01%
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)

# 5. Crear fila de totales
TDF_Histo_GDP_Completo <- rbind(
  TDF_Histo_GDP,
  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 500000000000 250000000000 2033 10.22 2033 19893 10.22 100
500000000000 1000000000000 750000000000 459 2.31 2492 17860 12.53 89.78
1000000000000 1500000000000 1250000000000 3141 15.79 5633 17401 28.32 87.47
2000000000000 2500000000000 2250000000000 101 0.51 5734 14260 28.82 71.68
2500000000000 3000000000000 2750000000000 13618 68.46 19352 14159 97.28 71.18
3500000000000 4000000000000 3750000000000 541 2.72 19893 541 100 2.72
Total 19893 100.00
Autor: Grupo 3

5. Gráficas

5.1 Histograma (ni)

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

barplot(
  TDF_Histo_GDP$ni,
  col = "salmon",
  main = "Gráfica Nº1: Distribución de frecuencias de GDP en el estudio de 
  la calidad de agua en Europa (1991-2017)",
  xlab = "GDP",
  ylab = "Cantidad",
  space = 0,
  names.arg = round(TDF_Histo_GDP$Mc, 2)
)

5.2 Histograma General (ni)

# ===========================================================
# Histograma con relación a la totalidad de los datos
# ===========================================================
barplot(
  TDF_Histo_GDP$ni,
  col = "lightsalmon2",
  main = "Gráfica Nº2: Distribución de frecuencias de GDP en el estudio 
  de la calidad de agua en Europa (1991-2017)",
  xlab = "GDP",
  ylab = "Cantidad",
  space = 0,
  ylim = c(0, 20000),
  names.arg = round(TDF_Histo_GDP$Mc, 2)
)

5.3 Histograma Porcentual (hi)

# ======================================
# Histograma porcentual que genera RStudio
# ======================================
barplot(
  TDF_Histo_GDP$hi,
  col = "salmon",
  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 = "GDP",
  ylab = "Porcentaje (%)",
  space = 0,
  names.arg = round(TDF_Histo_GDP$Mc, 2)
)

5.4 Histograma Porcentual General (hi)

# ===========================================================
# Histograma porcentual con relación a la totalidad 
# ===========================================================
barplot(
  TDF_Histo_GDP$hi,
  space = 0,
  col = "lightsalmon2",
  main = "Gráfica Nº4: Distribución porcentual general de GDP en el estudio 
  de la calidad de agua en Europa (1991-2017)",
  xlab = "GDP",
  ylab = "Porcentaje (%)",
  names.arg = TDF_Histo_GDP$Mc,
  ylim = c(0, 100)
)

5.5 Polígono de frecuencias (hi)

bp <- barplot(
  TDF_Histo_GDP$hi,
  col = "salmon",
  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 = "GDP",
  ylab = "Porcentaje (%)",
  space = 0,
  names.arg = round(TDF_Histo_GDP$Mc, 2),
  ylim = c(0, max(TDF_Histo_GDP$hi) * 1.2)
)

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

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

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
# =========================
# 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. Alinear frecuencias absolutas acumuladas agregando el inicio/fin en 0
ni_asc_plot <- c(0, TDF_Histo_GDP$Ni_asc)
ni_dsc_plot <- c(TDF_Histo_GDP$Ni_dsc, 0)

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

# 4. Superponer Ojiva Ascendente (Verde)
lines(
  eje_x, ni_asc_plot,
  col = "orange3",
  type = "o",
  lwd = 2,
  pch = 16
)

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

5.8 Ojiva ascendente y descendente (Hi)

# =========================
# OJIVAS PORCENTUALES
# =========================
# 1. Alinear porcentajes acumulados agregando el inicio/fin en 0
hi_asc_plot <- c(0, TDF_Histo_GDP$Hi_asc)
hi_dsc_plot <- c(TDF_Histo_GDP$Hi_dsc, 0)

# 2. Graficar Ojiva Porcentual Ascendente (Verde)
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 
  de agua en Europa (1991-2017)",
  xlab = "GDP",
  ylab = "Porcentaje acumulado (%)",
  ylim = c(0, 100)
)

# 3. Superponer Ojiva Porcentual Descendente (Rojo)
lines(
  eje_x, hi_dsc_plot,
  type = "o",
  col = "goldenrod2",
  pch = 17,
  lwd = 2
)

grid()

legend(
  "right",
  legend = c("Ojiva Ascendente (%)", "Ojiva Descendente (%)"),
  col = c("lightsalmon2", "goldenrod2"),
  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(GDP)$out
n_atipicos <- length(atipicos)

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

# Moda basada en Intervalo Modal (Correcto para datos continuos)
fila_modal <- which.max(TDF_Histo_GDP$ni)
moda_intervalar <- paste0(
  "[", round(TDF_Histo_GDP$LimInf[fila_modal], 2), 
  " ; ", round(TDF_Histo_GDP$LimSup[fila_modal], 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("[", round(min(GDP), 2), " ; ", round(max(GDP), 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 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 X Me Mo V Sd Cv As K Valores_Atipicos
GDP [28871503534.39 ; 3781698549834.74] 2286782518655 2806036371234 [2500000000000 ; 3000000000000] 868305804208280478746840 931829278467 40.75 -1.23 0.34 0
Autor: Grupo 3

7. Conclusión

La variable GDP fluctúa en un rango de [0.29; 3.78] billones), y sus valores muestran una fuerte concentración con una mediana de 2.81 billones. El conjunto de datos posee una dispersión moderada con una desviación estándar de (0.93 billones), lo que equivale a un coeficiente de variación del 40.75%, representando una variabilidad moderadamente alta. Los valores presentan una asimetría negativa As = -1.23, indicando una concentración de los datos hacia valores mayores a la media (un sesgo hacia la izquierda), y una curtosis de K = 0.34, lo que evidencia una distribución ligeramente leptocúrtica (levemente apuntada). Cabe destacar que, bajo el criterio estadístico del diagrama de caja, no se identificaron valores atípicos en esta variable.