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
# -------------------------
Migraciones <- round(df$netMigration_2011_2018)

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

3. Tabla de distribución de frecuencias

3.1 Tabla de frecuencias

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

# Renombrar columnas
colnames(tabla_freq) <- c(
  "Migraciones",
  "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(
  Migraciones = "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 migración neta en el estudio de la calidad de agua en Europa (2011-2017)**"
    )
  ) %>%
  cols_label(
    Migraciones = "Migración",
    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 = Migraciones == "TOTAL"
    )
  ) %>%
  opt_row_striping()

tabla_gt
Tabla N°1
Distribución de frecuencias de la migración neta en el estudio de la calidad de agua en Europa (2011-2017)
Migración ni hi (%) Ni ↑ Hi ↑ (%) Ni ↓ Hi ↓ (%)
-83750 117 0.59 117 0.59 19893 100
-58473 1 0.01 118 0.59 19776 99.41
-40055 3141 15.79 3259 16.38 19775 99.41
-38765 228 1.15 3487 17.53 16634 83.62
-21250 35 0.18 3522 17.7 16406 82.47
-19689 82 0.41 3604 18.12 16371 82.3
-9812 19 0.10 3623 18.21 16289 81.88
-6059 322 1.62 3945 19.83 16270 81.79
775 44 0.22 3989 20.05 15948 80.17
6195 129 0.65 4118 20.7 15904 79.95
12176 15 0.08 4133 20.78 15775 79.3
14471 5 0.03 4138 20.8 15760 79.22
17836 4 0.02 4142 20.82 15755 79.2
18927 355 1.78 4497 22.61 15751 79.18
21257 479 2.41 4976 25.01 15396 77.39
22769 3 0.02 4979 25.03 14917 74.99
22855 82 0.41 5061 25.44 14914 74.97
45227 27 0.14 5088 25.58 14832 74.56
56745 171 0.86 5259 26.44 14805 74.42
62334 261 1.31 5520 27.75 14634 73.56
74021 91 0.46 5611 28.21 14373 72.25
75808 9661 48.56 15272 76.77 14282 71.79
82158 22 0.11 15294 76.88 4621 23.23
297760 101 0.51 15395 77.39 4599 23.12
325435 3957 19.89 19352 97.28 4498 22.61
582211 541 2.72 19893 100 541 2.72
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(Migraciones)))

# 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
tabla_freq_resumida_resumida$Ni_asc <- cumsum(tabla_freq_resumida_resumida$ni)
tabla_freq_resumida_resumida$Hi_asc <- round(cumsum(tabla_freq_resumida_resumida$hi), 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(rev(cumsum(rev(tabla_freq_resumida_resumida$hi))), 2)

# -------------------------
# Agregar fila TOTAL
# -------------------------
fila_total_resumida <- data.frame(
  Migraciones = "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 migración neta en el estudio de la calidad del agua en Europa (2011-2017)**"
    )
  ) %>%
  cols_label(
    Migraciones = "Migración",
    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 = Migraciones == "TOTAL"
    )
  ) %>%
  opt_row_striping()

tabla_gt_resumida
Tabla N°2
Distribución resumida de frecuencias de la migración neta en el estudio de la calidad del agua en Europa (2011-2017)
Migración ni hi (%) Ni ↑ Hi ↑ (%) Ni ↓ Hi ↓ (%)
-40055 3141 16.43 3141 16.43 19116 100
-38765 228 1.19 3369 17.62 15975 83.57
-6059 322 1.68 3691 19.3 15747 82.38
18927 355 1.86 4046 21.16 15425 80.7
21257 479 2.51 4525 23.67 15070 78.84
56745 171 0.89 4696 24.56 14591 76.33
62334 261 1.37 4957 25.93 14420 75.44
75808 9661 50.54 14618 76.47 14159 74.07
325435 3957 20.70 18575 97.17 4498 23.53
582211 541 2.83 19116 100 541 2.83
TOTAL 19116 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 migración neta 
  en el estudio de la calidad de agua en Europa (2011-2017)",
  xlab = "Migración neta",
  ylab = "Cantidad",
  col = "skyblue",
  ylim = c(0, max(tabla_freq_resumida_resumida$ni) * 1.1),
  names.arg = tabla_freq_resumida_resumida$Migraciones,
  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 migración neta 
  en el estudio de la calidad de agua en Europa (2011-2017)",
  xlab = "Migración neta",
  ylab = "Cantidad",
  col = "lightgreen",
  ylim = c(0, 20000),
  names.arg = tabla_freq_resumida_resumida$Migraciones,
  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 migración neta 
  en el estudio de la calidad de agua en Europa (2011-2017)",
  xlab = "Migración neta",
  ylab = "Porcentaje",
  col = "skyblue",
  ylim = c(0, max(tabla_freq_resumida_resumida$hi) * 1.1),
  names.arg = tabla_freq_resumida_resumida$Migraciones,
  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 migración
  neta en el estudio de la calidad de agua en Europa (2011-2017)",
  xlab = "Migración neta",
  ylab = "Porcentaje",
  col = "lightgreen",
  ylim = c(0, 100),
  names.arg = tabla_freq_resumida_resumida$Migraciones,
  las = 2,
  cex.names = 0.8
)

4.5 Diagrama de Caja

# =========================
# DIAGRAMA DE CAJA
# =========================
options(scipen = 999)

boxplot(
  Migraciones,
  horizontal = TRUE,
  col = "orange",
  main = "Gráfica N°5: Distribución de la migración neta
  en el estudio de la calidad de agua en Europa (2011-2017)",
  xlab = "Migración neta"
)

points(
  mean(Migraciones),
  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_resumida)

# Ojiva descendente (Cambiado a type = "p")
plot(
  x_pos,
  tabla_freq_resumida_resumida$Ni_dsc,
  main = "Gráfica N°6: Ojiva ascendente y descendente de la migración\nneta en el estudio de la calidad de agua en Europa (2011-2017)",
  xlab = "Migración neta",
  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 (Se usa points para graficar 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$Migraciones,
  las = 2,
  cex.axis = 0.8
)

# Leyenda (Modificada para que solo muestre puntos sin líneas)
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 (Cambiado a type = "p")
plot(
  x_pos,
  tabla_freq_resumida_resumida$Hi_dsc,
  main = "Gráfica N°7: Ojiva ascendente y descendente de la migración\nneta en el estudio de la calidad de agua en Europa (2011-2017)",
  xlab = "Migración neta",
  ylab = "Porcentaje",
  type = "p",
  pch = 19,
  col = "red",
  cex = 1.5,
  xaxt = "n",
  ylim = c(0, 100)
)

# Ojiva ascendente (Se usa points para graficar 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$Migraciones,
  las = 2,
  cex.axis = 0.8
)

# Leyenda (Modificada para que solo muestre puntos sin líneas)
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(Migraciones), 2)

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

# Mediana
mediana <- median(Migraciones)

5.2 Dispersión

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

# Rango
rango <- max(Migraciones) - min(Migraciones)

# Varianza
varianza <- var(Migraciones)

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

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

5.3 Asimetría

# =========================
# MEDIDAS DE FORMA
# =========================
n <- length(Migraciones)

# Asimetría utilizando la fórmula de Fisher (e1071)
asimetria <- skewness(Migraciones, type = 2)

# Curtosis utilizando la fórmula de Fisher (e1071)
curtosis <- kurtosis(Migraciones, type = 2)

# =========================
# VALORES ATÍPICOS
# =========================
Q1 <- quantile(Migraciones, 0.25)
Q3 <- quantile(Migraciones, 0.75)
RIQ <- Q3 - Q1

LI <- Q1 - 1.5 * RIQ
LS <- Q3 + 1.5 * RIQ

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

mensaje_atipicos <- length(atipicos)

5.4 Tabla de indicadores

# =========================
# TABLA RESUMEN DE INDICADORES
# =========================
tabla_indicadores <- data.frame(
  Variable = "Migración neta",
  Rango = paste0("[", min(Migraciones), " ; ", max(Migraciones), "]"),
  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 == "Migración neta"
)

tabla_indicadores_gt <- tabla_indicadores %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°3**"),
    subtitle = md(
      "**Indicadores estadísticos de la migración neta en el estudio de la calidad de agua en Europa (2011-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
    )
  )

tabla_indicadores_gt
Tabla N°3
Indicadores estadísticos de la migración neta en el estudio de la calidad de agua en Europa (2011-2017)
Variable Rango X Me Mo V Sd Cv As K Valores_Atipicos
Migración neta [-83750 ; 582211] 114206.7 75808 75808 20933020816 144682.5 126.68 1.29 1.16 4716
Autor: Grupo 3

6. conclusiones

La variable Migración neta fluctúa en un rango de -83,750 a 582,211, y sus valores giran en torno a una mediana de 75808, con una desviación estándar de 144,682.5. Dado que el coeficiente de variación es de 12668, se trata de un conjunto de valores extremadamente heterogéneo con una alta dispersión. Los datos presentan una asimetría positiva (1.29), lo que indica que los valores se acumulan de manera pronunciada en la parte baja de la variable. Con una curtosis de 1.16 y la presencia de 4,716 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 (2011-2017).