0. Librerías

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

1. Leer datos

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

2. Extracción y depuración de la variable

# -------------------------
# Extraer variable y discretizar por redondeo
# -------------------------
if (!"PopulationDensity" %in% names(df)) {
  stop("La variable PopulationDensity no existe en el archivo.")
}

# Extraer variable
Densidad <- df$PopulationDensity

# Eliminar valores faltantes
Densidad <- na.omit(Densidad)

# Convertir a variable discreta por redondeo
Densidad <- round(Densidad)

3. Tabla de distribución de frecuencias

3.1 Tabla de frecuencias

# -------------------------
# Tabla de frecuencias
# -------------------------
tabla_freq <- as.data.frame(
  table(Densidad)
)

# Renombrar columnas
colnames(tabla_freq) <- c(
  "Densidad",
  "ni"
)

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

# Frecuencias acumuladas ascendentes (Corregido para dar exactamente 100)
tabla_freq$Ni_asc <- cumsum(tabla_freq$ni)
tabla_freq$Hi_asc <- round(
  (tabla_freq$Ni_asc / sum(tabla_freq$ni)) * 100, 
  2
)

# Frecuencias acumuladas descendentes (Corregido para dar exactamente 100)
tabla_freq$Ni_dsc <- rev(cumsum(rev(tabla_freq$ni)))
tabla_freq$Hi_dsc <- round(
  (tabla_freq$Ni_dsc / sum(tabla_freq$ni)) * 100, 
  2
)

# -------------------------
# Agregar fila de totales
# -------------------------
fila_total <- data.frame(
  Densidad = "TOTAL",
  ni = sum(tabla_freq$ni),
  hi = 100,
  Ni_asc = "",
  Hi_asc = "",
  Ni_dsc = "",
  Hi_dsc = ""
)

tabla_final <- rbind(
  tabla_freq,
  fila_total
)

# -------------------------
# Tabla GT
# -------------------------
tabla_gt <- tabla_final %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°1**"),
    subtitle = md(
      "**Distribución de frecuencias de la densidad de población en el estudio de la calidad de agua en Europa (1991-2017)**"
    )
  ) %>%
  cols_label(
    Densidad = "Densidad (hab/km²)",
    ni = "ni",
    hi = "hi (%)",
    Ni_asc = "Ni ↑",
    Hi_asc = "Hi ↑ (%)",
    Ni_dsc = "Ni ↓",
    Hi_dsc = "Hi ↓ (%)"
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(
      rows = Densidad == "TOTAL"
    )
  ) %>%
  opt_row_striping()

tabla_gt
Tabla N°1
Distribución de frecuencias de la densidad de población en el estudio de la calidad de agua en Europa (1991-2017)
Densidad (hab/km²) ni hi (%) Ni ↑ Hi ↑ (%) Ni ↓ Hi ↓ (%)
15 27 0.14 27 0.14 19893 100
18 355 1.78 382 1.92 19866 99.86
25 171 0.86 553 2.78 19511 98.08
31 82 0.41 635 3.19 19340 97.22
45 228 1.15 863 4.34 19258 96.81
47 5 0.03 868 4.36 19030 95.66
65 322 1.62 1190 5.98 19025 95.64
71 44 0.22 1234 6.2 18703 94.02
73 19 0.10 1253 6.3 18659 93.8
77 3 0.02 1256 6.31 18640 93.7
80 129 0.65 1385 6.96 18637 93.69
85 117 0.59 1502 7.55 18508 93.04
94 3141 15.79 4643 23.34 18391 92.45
107 91 0.46 4734 23.8 15250 76.66
112 35 0.18 4769 23.97 15159 76.2
122 9661 48.56 14430 72.54 15124 76.03
124 1 0.01 14431 72.54 5463 27.46
138 561 2.82 14992 75.36 5462 27.46
205 101 0.51 15093 75.87 4901 24.64
215 22 0.11 15115 75.98 4800 24.13
237 541 2.72 15656 78.7 4778 24.02
250 15 0.08 15671 78.78 4237 21.3
275 3957 19.89 19628 98.67 4222 21.22
377 261 1.31 19889 99.98 265 1.33
511 4 0.02 19893 100 4 0.02
TOTAL 19893 100.00

3.2 Tabla simplificada de frecuencias

# -------------------------
# Tabla resumida con intervalos personalizados
# -------------------------

limites_clases <- seq(0, 600, by = 75) 

# Agrupar la variable Densidad en los intervalos definidos
tabla_freq_resumida_resumida <- as.data.frame(
  table(cut(Densidad, breaks = limites_clases, include.lowest = TRUE, right = FALSE))
)

# Renombrar columnas
colnames(tabla_freq_resumida_resumida) <- c(
  "Densidad",
  "ni"
)

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

# Frecuencias acumuladas ascendentes 
tabla_freq_resumida_resumida$Ni_asc <- cumsum(tabla_freq_resumida_resumida$ni)
tabla_freq_resumida_resumida$Hi_asc <- round(
  (tabla_freq_resumida_resumida$Ni_asc / sum(tabla_freq_resumida_resumida$ni)) * 100, 
  2
)

# Frecuencias acumuladas descendentes 
tabla_freq_resumida_resumida$Ni_dsc <- rev(cumsum(rev(tabla_freq_resumida_resumida$ni)))
tabla_freq_resumida_resumida$Hi_dsc <- round(
  (tabla_freq_resumida_resumida$Ni_dsc / sum(tabla_freq_resumida_resumida$ni)) * 100, 
  2
)

# -------------------------
# Agregar fila TOTAL
# -------------------------
fila_total_resumida <- data.frame(
  Densidad = "TOTAL",
  ni = sum(tabla_freq_resumida_resumida$ni),
  hi = 100,
  Ni_asc = "",
  Hi_asc = "",
  Ni_dsc = "",
  Hi_dsc = ""
)

tabla_final_resumida <- rbind(
  tabla_freq_resumida_resumida,
  fila_total_resumida
)

# -------------------------
# Tabla GT
# -------------------------
tabla_gt_resumida <- tabla_final_resumida %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°2**"),
    subtitle = md(
      "**Distribución de frecuencias simplificada de la densidad de población en el estudio de la calidad del agua en Europa (1991-2017)**"
    )
  ) %>%
  cols_label(
    Densidad = "Densidad (hab/km²)",
    ni = "ni",
    hi = "hi (%)",
    Ni_asc = "Ni ↑",
    Hi_asc = "Hi ↑ (%)",
    Ni_dsc = "Ni ↓",
    Hi_dsc = "Hi ↓ (%)"
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(
      rows = Densidad == "TOTAL"
    )
  ) %>%
  opt_row_striping()

tabla_gt_resumida
Tabla N°2
Distribución de frecuencias simplificada de la densidad de población en el estudio de la calidad del agua en Europa (1991-2017)
Densidad (hab/km²) ni hi (%) Ni ↑ Hi ↑ (%) Ni ↓ Hi ↓ (%)
[0,75) 1253 6.30 1253 6.3 19893 100
[75,150) 13739 69.06 14992 75.36 18640 93.7
[150,225) 123 0.62 15115 75.98 4901 24.64
[225,300) 4513 22.69 19628 98.67 4778 24.02
[300,375) 0 0.00 19628 98.67 265 1.33
[375,450) 261 1.31 19889 99.98 265 1.33
[450,525) 4 0.02 19893 100 4 0.02
[525,600] 0 0.00 19893 100 0 0
TOTAL 19893 100.00

4 Gráficas

4.1 Diagrama de barras de cantidad

# ================================================
# Diagrama de barras de cantidad que genera RStudio
# ================================================
barplot(
  tabla_freq_resumida_resumida$ni,
  main = "Gráfica N°1: Distribución de la densidad de población\nen el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Densidad de población (hab/km²)",
  ylab = "Cantidad",
  col = "skyblue",
  ylim = c(0, max(tabla_freq_resumida_resumida$ni) * 1.1),
  names.arg = tabla_freq_resumida_resumida$Densidad,
  las = 2,
  cex.names = 0.7
)

4.2 Diagrama de barras de cantidad general

# ===========================================================================
# Diagrama de barras de cantidad con relación a la totalidad de los datos
# ===========================================================================
barplot(
  tabla_freq_resumida_resumida$ni,
  main = "Gráfica N°2: Distribución general de la densidad de población\nen el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Densidad de población (hab/km²)",
  ylab = "Cantidad",
  col = "lightgreen",
  ylim = c(0, 20000),
  names.arg = tabla_freq_resumida_resumida$Densidad,
  las = 2,
  cex.names = 0.7
)

4.3 Diagrama de barras porcentual

# ===============================================
# Diagrama de barras porcentual que genera RStudio
# ===============================================
barplot(
  tabla_freq_resumida_resumida$hi,
  main = "Gráfica N°3: Distribución porcentual de la densidad de población\nen el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Densidad de población (hab/km²)",
  ylab = "Porcentaje",
  col = "skyblue",
  ylim = c(0, max(tabla_freq_resumida_resumida$hi) * 1.1),
  names.arg = tabla_freq_resumida_resumida$Densidad,
  las = 2,
  cex.names = 0.7
)

4.4 Diagrama de barras porcentual general

# ===========================================================
# Diagrama de barras porcentual con relación a la totalidad 
# ===========================================================
barplot(
  tabla_freq_resumida_resumida$hi,
  main = "Gráfica N°4: Distribución porcentual general de la densidad\nde población en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Densidad de población (hab/km²)",
  ylab = "Porcentaje",
  col = "lightgreen",
  ylim = c(0, 100),
  names.arg = tabla_freq_resumida_resumida$Densidad,
  las = 2,
  cex.names = 0.7
)

4.5 Diagrama de Caja

# =========================
# DIAGRAMA DE CAJA
# =========================
boxplot(
  Densidad,
  horizontal = TRUE,
  col = "orange",
  main = "Gráfica N°5: Distribución de la densidad de población\nen el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Densidad de población (hab/km²)"
)

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

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

4.6 Ojivas ascendentes y descendentes (Ni)

# ======================================
# OJIVAS ASCENDENTES Y DESCENDENTES (Ni)
# ======================================

# Posiciones en el eje X
x_pos <- 1:nrow(tabla_freq_resumida_resumida)

# Ojiva descendente 
plot(
  x_pos,
  tabla_freq_resumida_resumida$Ni_dsc,
  main = "Gráfica N°6: Ojiva ascendente y descendente de la densidad\nde población en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Densidad de población (hab/km²)",
  ylab = "Frecuencia acumulada",
  type = "o",      
  pch = 19,
  col = "orange",
  lwd = 2,          
  cex = 1.5,
  xaxt = "n",
  ylim = c(0, max(tabla_freq_resumida_resumida$Ni_dsc) * 1.05)
)

# Ojiva ascendente 
lines(
  x_pos,
  tabla_freq_resumida_resumida$Ni_asc,
  type = "o",     
  pch = 19,
  col = "green",
  lwd = 2,          
  cex = 1.5
)

# Etiquetas del eje X
axis(
  side = 1,
  at = x_pos,
  labels = tabla_freq_resumida_resumida$Densidad,
  las = 2,
  cex.axis = 0.7
)

# Leyenda 
legend(
  "topright",
  legend = c("Descendente", "Ascendente"),
  col = c("orange", "green"),
  pch = 19,
  pt.cex = 1.5,
  lty = 1,          # Muestra las líneas en la leyenda
  lwd = 2
)

4.7 Ojivas ascendentes y descendentes (Hi)

# ======================================
# OJIVAS ASCENDENTES Y DESCENDENTES (Hi)
# ======================================

# Posiciones en el eje X
x_pos <- 1:nrow(tabla_freq_resumida_resumida)

# Ojiva descendente 
plot(
  x_pos,
  tabla_freq_resumida_resumida$Hi_dsc,
  main = "Gráfica N°7: Ojiva ascendente y descendente de la densidad\nde población en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Densidad de población (hab/km²)",
  ylab = "Porcentaje acumulado (%)",
  type = "o",       
  pch = 19,
  col = "red",
  lwd = 2,        
  cex = 1.5,
  xaxt = "n",
  ylim = c(0, 100)
)

# Ojiva ascendente 
lines(
  x_pos,
  tabla_freq_resumida_resumida$Hi_asc,
  type = "o",     
  pch = 19,
  col = "blue",
  lwd = 2,      
  cex = 1.5
)

# Etiquetas del eje X
axis(
  side = 1,
  at = x_pos,
  labels = tabla_freq_resumida_resumida$Densidad,
  las = 2,
  cex.axis = 0.7
)

# Leyenda 
legend(
  "topright",
  legend = c("Descendente", "Ascendente"),
  col = c("red", "blue"),
  pch = 19,
  pt.cex = 1.5,
  lty = 1,         
  lwd = 2
)

5. Indicadores Estadísticos

5.1 Indicadores de Tendencia Central

# ====================================
# MEDIDAS DE TENDENCIA CENTRAL
# ====================================

# Media
media <- round(mean(Densidad), 2)

# Moda
tabla_moda <- table(Densidad)
max_frecuencia <- max(tabla_moda)
moda <- names(tabla_moda)[tabla_moda == max_frecuencia]

# Mediana
mediana <- round(median(Densidad), 2)

5.2 Dispersión

# ====================================
# MEDIDAS DE DISPERSIÓN
# ====================================

# Rango
rango_min <- min(Densidad)
rango_max <- max(Densidad)

# Varianza
varianza <- var(Densidad)

# Desviación estándar
desviacion <- sd(Densidad)

# Coeficiente de variación
cv <- round((desviacion / media) * 100, 2)

5.3 Asimetría

# ====================================
# MEDIDAS DE FORMA
# ====================================
library(e1071)
asimetria <- skewness(Densidad, type = 2)
curtosis <- kurtosis(Densidad, type = 2)

# Detección de valores atípicos mediante el criterio del boxplot
atipicos_densidad <- boxplot.stats(Densidad)$out
n_atipicos_densidad <- length(atipicos_densidad)

if(n_atipicos_densidad > 0){
  rango_atipicos_densidad <- paste0("[", round(min(atipicos_densidad), 2), " ; ", round(max(atipicos_densidad), 2), "] (Valores: ", n_atipicos_densidad, ")")
} else {
  rango_atipicos_densidad <- "No presenta valores atípicos"
}

5.4 Tabla de indicadores

# ====================================
# TABLA RESUMEN DE INDICADORES
# ====================================
tabla_indicadores_densidad <- data.frame(
  Variable = "Densidad de población",
  Rango = paste0("[", rango_min, " ; ", rango_max, "]"),
  X = media,
  Me = mediana,
  Mo = paste(moda, collapse = ", "),
  V = round(varianza, 2),
  Sd = round(desviacion, 2),
  Cv = cv,
  As = round(asimetria, 2),
  K = round(curtosis, 2),
  Valores_Atipicos = rango_atipicos_densidad,
  stringsAsFactors = FALSE
)

fila_densidad <- which(
  tabla_indicadores_densidad$Variable == "Densidad de población"
)

tabla_indicadores_densidad_gt <- tabla_indicadores_densidad %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°3**"),
    subtitle = md(
      "**Indicadores estadísticos de la densidad de población 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.width = px(2),
    row.striping.include_table_body = TRUE
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(
      rows = fila_densidad
    )
  )

tabla_indicadores_densidad_gt
Tabla N°3
Indicadores estadísticos de la densidad de población en el estudio de la calidad de agua en Europa (1991-2017)
Variable Rango X Me Mo V Sd Cv As K Valores_Atipicos
Densidad de población [15 ; 511] 149.86 122 122 5786.22 76.07 50.76 0.99 0.05 [15 ; 511] (Valores: 9544)
Autor: Grupo 3

6. Conclusión

La variable Densidad de población fluctúa entre 15 y 511 hab/km², y sus valores giran en torno a una mediana de 122, con una desviación estándar de 76.07. Dado que el coeficiente de variación es de 50.76, 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 del intervalo 15 a 511 (9544 valores), resulta perjudicial para la gestión ambiental, ya que evidencia una presión antrópica altamente focalizada en ciertas zonas en los cuerpos hídricos de Europa.