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 (10 categorías con mayor frecuencia)
# -------------------------
tabla_freq_resumida_resumida <- tabla_freq %>%
  arrange(desc(ni)) %>%
  slice(1:10) %>%
  arrange(as.numeric(as.character(Densidad)))

# Re-calcular frecuencia relativa para estas categorías principales
tabla_freq_resumida_resumida$hi <- round(
  (tabla_freq_resumida_resumida$ni / sum(tabla_freq_resumida_resumida$ni)) * 100,
  2
)

# Frecuencias acumuladas ascendentes (Corregido para dar exactamente 100)
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 (Corregido para dar exactamente 100)
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 resumida de frecuencias 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 resumida de frecuencias 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 ↓ (%)
18 355 1.85 355 1.85 19198 100
25 171 0.89 526 2.74 18843 98.15
45 228 1.19 754 3.93 18672 97.26
65 322 1.68 1076 5.6 18444 96.07
94 3141 16.36 4217 21.97 18122 94.4
122 9661 50.32 13878 72.29 14981 78.03
138 561 2.92 14439 75.21 5320 27.71
237 541 2.82 14980 78.03 4759 24.79
275 3957 20.61 18937 98.64 4218 21.97
377 261 1.36 19198 100 261 1.36
TOTAL 19198 100.00

4 Gráficas

4.1 Histograma (ni)

# =========================
# HISTOGRAMA (ni)
# =========================
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.8
)

4.2 Histograma General (ni)

# =========================
# HISTOGRAMA GENERAL (ni)
# =========================
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.8
)

4.3 Histograma (hi)

# =========================
# HISTOGRAMA (hi)
# =========================
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.8
)

4.4 Histograma General (hi)

# =========================
# HISTOGRAMA GENERAL (hi)
# =========================
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.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\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 (Solo puntos)
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 = "Cantidad",
  type = "p",
  pch = 19,
  col = "orange",
  cex = 1.5,
  xaxt = "n",
  ylim = c(0, max(tabla_freq_resumida_resumida$Ni_dsc) * 1.05)
)

# Ojiva ascendente (Solo puntos)
points(
  x_pos,
  tabla_freq_resumida_resumida$Ni_asc,
  pch = 19,
  col = "green",
  cex = 1.5
)

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

# Leyenda (Modificada sin líneas que crucen los puntos)
legend(
  "topright",
  legend = c("Descendente", "Ascendente"),
  col = c("orange", "green"),
  pch = 19,
  pt.cex = 1.5,
  lty = 0
)

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 (Solo puntos)
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",
  type = "p",
  pch = 19,
  col = "red",
  cex = 1.5,
  xaxt = "n",
  ylim = c(0, 100)
)

# Ojiva ascendente (Solo puntos)
points(
  x_pos,
  tabla_freq_resumida_resumida$Hi_asc,
  pch = 19,
  col = "blue",
  cex = 1.5
)

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

# Leyenda (Modificada sin líneas que crucen los puntos)
legend(
  "topright",
  legend = c("Descendente", "Ascendente"),
  col = c("red", "blue"),
  pch = 19,
  pt.cex = 1.5,
  lty = 0
)

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 <- 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 utilizando Fisher (e1071)
asimetria <- skewness(Densidad, type = 2)

# Curtosis utilizando Fisher (e1071)
curtosis <- kurtosis(Densidad, type = 2)

# ====================================
# 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 DE INDICADORES
# ====================================
tabla_indicadores_densidad <- 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_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 9544
Autor: Grupo 3

6. Conclusiones

La variable Densidad de población fluctúa en un rango de 15 a 511, 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 con una alta dispersión. Los datos presentan una asimetría positiva (0.99), lo que indica que los valores se acumulan de manera pronunciada en la parte baja de la variable. Con una curtosis de 0.05 y la presencia de 9,544 valores atípicos, se observa una alta variabilidad en los registros es de tipo heterogéneo en el estudio de la calidad del agua en Europa (1991-2017).