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)

1. Leer datos

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

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

# -------------------------
# Extraer variable
# -------------------------

Densidad <- df$PopulationDensity

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

# Mantener únicamente el rango de estudio
Densidad <- Densidad[
  Densidad >= 14.5 &
  Densidad <= 500
]

# Redondear a valores enteros
Densidad <- round(Densidad)

3. Tabla de distribución de frecuencias

3.1 Tabla de frecuencias

# -------------------------
# Número de intervalos (Regla de Sturges)
# -------------------------

k <- ceiling(1 + 3.322 * log10(length(Densidad)))

# Amplitud del intervalo
A <- ceiling((max(Densidad) - min(Densidad)) / k)

# Límites de los intervalos
limites <- seq(
  from = min(Densidad),
  by = A,
  length.out = k + 1
)

# Ajustar el último límite
limites[length(limites)] <- max(Densidad)

# Clasificar observaciones
intervalos <- cut(
  Densidad,
  breaks = limites,
  include.lowest = TRUE,
  right = FALSE
)

# -------------------------
# Tabla de frecuencias
# -------------------------

tabla_freq <- as.data.frame(
  table(intervalos)
)

colnames(tabla_freq) <- c(
  "Intervalo",
  "ni"
)

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

# Frecuencias acumuladas ascendentes
tabla_freq$Ni_asc <- cumsum(tabla_freq$ni)
tabla_freq$Hi_asc <- round(cumsum(tabla_freq$hi),2)

# Frecuencias acumuladas descendentes
tabla_freq$Ni_dsc <- rev(cumsum(rev(tabla_freq$ni)))
tabla_freq$Hi_dsc <- round(rev(cumsum(rev(tabla_freq$hi))),2)

# -------------------------
# Agregar fila TOTAL
# -------------------------

fila_total <- data.frame(
  Intervalo = "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 del agua en Europa**"
    )
  ) %>%
  cols_label(
    Intervalo = "Intervalo",
    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 = Intervalo == "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 del agua en Europa
Intervalo ni hi (%) Ni ↑ Hi ↑ (%) Ni ↓ Hi ↓ (%)
[15,38) 635 3.19 635 3.19 19889 100
[38,61) 233 1.17 868 4.36 19254 96.81
[61,84) 517 2.60 1385 6.96 19021 95.64
[84,107) 3258 16.38 4643 23.34 18504 93.04
[107,130) 9788 49.21 14431 72.55 15246 76.66
[130,153) 561 2.82 14992 75.37 5458 27.45
[153,176) 0 0.00 14992 75.37 4897 24.63
[176,199) 0 0.00 14992 75.37 4897 24.63
[199,222) 123 0.62 15115 75.99 4897 24.63
[222,245) 541 2.72 15656 78.71 4774 24.01
[245,268) 15 0.08 15671 78.79 4233 21.29
[268,291) 3957 19.90 19628 98.69 4218 21.21
[291,314) 0 0.00 19628 98.69 261 1.31
[314,337) 0 0.00 19628 98.69 261 1.31
[337,360) 0 0.00 19628 98.69 261 1.31
[360,377] 261 1.31 19889 100 261 1.31
TOTAL 19889 100.00

3.2 Tabla simplificada de frecuencias

# -------------------------
# Tabla resumida (10 categorías)
# -------------------------

tabla_freq_resumida <- tabla_freq %>%
  arrange(desc(ni)) %>%
  slice(1:10)

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

# Frecuencias acumuladas ascendentes
tabla_freq_resumida$Ni_asc <- cumsum(tabla_freq_resumida$ni)
tabla_freq_resumida$Hi_asc <- round(cumsum(tabla_freq_resumida$hi), 2)

# Frecuencias acumuladas descendentes
tabla_freq_resumida$Ni_dsc <- rev(cumsum(rev(tabla_freq_resumida$ni)))
tabla_freq_resumida$Hi_dsc <- round(rev(cumsum(rev(tabla_freq_resumida$hi))), 2)

# -------------------------
# Agregar fila TOTAL
# -------------------------

fila_total_resumida <- data.frame(
  Intervalo = "TOTAL",
  ni = sum(tabla_freq_resumida$ni),
  hi = 100,
  Ni_asc = "",
  Hi_asc = "",
  Ni_dsc = "",
  Hi_dsc = ""
)

tabla_final_resumida <- rbind(
  tabla_freq_resumida,
  fila_total_resumida
)

# -------------------------
# Tabla GT
# -------------------------

tabla_gt_resumida <- tabla_final_resumida %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°2**"),
    subtitle = md(
      "**Distribución resumida de frecuencias de la densidad de población en el estudio de la calidad del agua en Europa**"
    )
  ) %>%
  cols_label(
    Intervalo = "Intervalo",
    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 = Intervalo == "TOTAL"
    )
  ) %>%
  opt_row_striping()

tabla_gt_resumida
Tabla N°2
Distribución resumida de frecuencias de la densidad de población en el estudio de la calidad del agua en Europa
Intervalo ni hi (%) Ni ↑ Hi ↑ (%) Ni ↓ Hi ↓ (%)
[107,130) 9788 49.25 9788 49.25 19874 99.99
[268,291) 3957 19.91 13745 69.16 10086 50.74
[84,107) 3258 16.39 17003 85.55 6129 30.83
[15,38) 635 3.20 17638 88.75 2871 14.44
[130,153) 561 2.82 18199 91.57 2236 11.24
[222,245) 541 2.72 18740 94.29 1675 8.42
[61,84) 517 2.60 19257 96.89 1134 5.7
[360,377] 261 1.31 19518 98.2 617 3.1
[38,61) 233 1.17 19751 99.37 356 1.79
[199,222) 123 0.62 19874 99.99 123 0.62
TOTAL 19874 100.00
# ------------------------------------------------------------
# Nota:
# Con el propósito de mejorar la visualización e interpretación
# de las gráficas, se trabajará con una versión resumida de la
# tabla de frecuencias, considerando únicamente las 10 categorías
# con mayor frecuencia.
#
# Esta simplificación se utilizará exclusivamente para la
# elaboración de las gráficas. En cambio, los indicadores
# estadísticos, el análisis y las conclusiones se calcularán
# utilizando la totalidad de los datos de la variable.
# ------------------------------------------------------------

4 Gráficas

4.1 Histograma (ni)

barplot(
  tabla_freq_resumida$ni,
  main = "Gráfica N°1: Distribución de la densidad de población
en el estudio de la calidad del agua en Europa",
  xlab = "Intervalo de densidad de población",
  ylab = "Cantidad",
  col = "skyblue",
  ylim = c(0, max(tabla_freq_resumida$ni) * 1.1),
  names.arg = tabla_freq_resumida$Intervalo,
  las = 2,
  cex.names = 0.8
)

4.2 Histograma General (ni)

barplot(
  tabla_freq_resumida$ni,
  main = "Gráfica N°2: Distribución general de la densidad de población
en el estudio de la calidad del agua en Europa",
  xlab = "Intervalo de densidad de población",
  ylab = "Cantidad",
  col = "lightgreen",
  ylim = c(0, 20000),
  names.arg = tabla_freq_resumida$Intervalo,
  las = 2,
  cex.names = 0.8
)

4.3 Histograma (hi)

barplot(
  tabla_freq_resumida$hi,
  main = "Gráfica N°3: Distribución porcentual de la densidad de población
en el estudio de la calidad del agua en Europa",
  xlab = "Intervalo de densidad de población",
  ylab = "Porcentaje",
  col = "skyblue",
  ylim = c(0, max(tabla_freq_resumida$hi) * 1.1),
  names.arg = tabla_freq_resumida$Intervalo,
  las = 2,
  cex.names = 0.8
)

4.4 Histograma General (hi)

barplot(
  tabla_freq_resumida$hi,
  main = "Gráfica N°4: Distribución porcentual general de la densidad de población
en el estudio de la calidad del agua en Europa",
  xlab = "Intervalo de densidad de población",
  ylab = "Porcentaje",
  col = "lightgreen",
  ylim = c(0, 100),
  names.arg = tabla_freq_resumida$Intervalo,
  las = 2,
  cex.names = 0.8
)

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
en el estudio de la calidad del agua en Europa",
  xlab = "Densidad de población"
)

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

legend(
  "topright",
  legend = "Media",
  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)

# Ojiva descendente
plot(
  x_pos,
  tabla_freq_resumida$Ni_dsc,
  main = "Gráfica N°6: Ojiva ascendente y descendente de la densidad
de población en el estudio de la calidad del agua en Europa",
  xlab = "Intervalo de densidad de población",
  ylab = "Cantidad",
  type = "b",
  pch = 19,
  col = "orange",
  lwd = 2,
  xaxt = "n",
  ylim = c(0, max(tabla_freq_resumida$Ni_dsc) * 1.05)
)

# Ojiva ascendente
lines(
  x_pos,
  tabla_freq_resumida$Ni_asc,
  type = "b",
  pch = 19,
  col = "green",
  lwd = 2
)

# Etiquetas del eje X
axis(
  side = 1,
  at = x_pos,
  labels = tabla_freq_resumida$Intervalo,
  las = 2,
  cex.axis = 0.8
)

# Leyenda
legend(
  "topright",
  legend = c("Descendente", "Ascendente"),
  col = c("orange", "green"),
  lwd = 2,
  pch = 19
)

4.7 Ojivas ascendentes y descendentes (Hi)

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

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

# Ojiva descendente
plot(
  x_pos,
  tabla_freq_resumida$Hi_dsc,
  main = "Gráfica N°7: Ojiva ascendente y descendente de la densidad
de población en el estudio de la calidad del agua en Europa",
  xlab = "Intervalo de densidad de población",
  ylab = "Porcentaje",
  type = "b",
  pch = 19,
  col = "red",
  lwd = 2,
  xaxt = "n",
  ylim = c(0, 100)
)

# Ojiva ascendente
lines(
  x_pos,
  tabla_freq_resumida$Hi_asc,
  type = "b",
  pch = 19,
  col = "blue",
  lwd = 2
)

# Etiquetas del eje X
axis(
  side = 1,
  at = x_pos,
  labels = tabla_freq_resumida$Intervalo,
  las = 2,
  cex.axis = 0.8
)

# Leyenda
legend(
  "topright",
  legend = c("Descendente", "Ascendente"),
  col = c("red", "blue"),
  lwd = 2,
  pch = 19
)

5. Indicadores Estadísticos

5.1 Indicadores de Tendencia Central

# =========================
# INDICADORES ESTADÍSTICOS
# Variable: Densidad de población
# =========================

# =========================
# 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 <- median(Densidad)

5.2 Dispersión

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

# Rango
rango <- max(Densidad) - min(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
# =========================

n <- length(Densidad)

# Asimetría
asimetria <- sum((Densidad - media)^3) /
  ((n - 1) * desviacion^3)

# Curtosis
curtosis <- sum((Densidad - media)^4) /
  ((n - 1) * desviacion^4) - 3

# =========================
# VALORES ATÍPICOS
# =========================

Q1 <- quantile(Densidad, 0.25)

Q3 <- quantile(Densidad, 0.75)

RIQ <- Q3 - Q1

LI <- Q1 - 1.5 * RIQ

LS <- Q3 + 1.5 * RIQ

atipicos <- Densidad[
  Densidad < LI |
  Densidad > LS
]

if(length(atipicos) > 0){
  mensaje_atipicos <- length(atipicos)
}else{
  mensaje_atipicos <- 0
}

5.4 Tabla de indicadores

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

tabla_indicadores <- data.frame(
  Variable = "Densidad de población",
  Rango = paste0("[", min(Densidad), " ; ", max(Densidad), "]"),
  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 = mensaje_atipicos,
  stringsAsFactors = FALSE
)

fila <- which(
  tabla_indicadores$Variable ==
    "Densidad de población"
)

tabla_indicadores_gt <- tabla_indicadores %>%
  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 del agua en Europa**"
    )
  ) %>%
  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
    )
  )

tabla_indicadores_gt
Tabla N°3
Indicadores estadísticos de la densidad de población en el estudio de la calidad del agua en Europa
Variable Rango X Me Mo V Sd Cv As K Valores_Atipicos
Densidad de población [15 ; 377] 149.79 122 122 5761.15 75.9 50.67 0.98 -0.02 9540
Autor: Grupo 3

6. conclusiones

#La densidad de población presenta valores comprendidos entre 15 y 377 habitantes por km², con una media de 149.79 habitantes por km² y una desviación estándar de 75.90, lo que indica una variabilidad alta (Cv = 50.67%). Además, la distribución muestra una asimetría positiva (As = 0.98), evidenciando una mayor concentración de observaciones en densidades bajas y medias, con una cola hacia valores más altos, y se identificaron 9540 valores atípicos.