0.Librerías

# -------------------------
# Cargar 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

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

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

# ---------------------------------
# Verificar que la variable exista
# ---------------------------------
if (!"netMigration_2011_2018" %in% names(df)) {
  stop("La variable netMigration_2011_2018 no existe en el archivo.")
}

# -------------------------
# Extraer variable
# -------------------------
Migraciones <- round(df$netMigration_2011_2018)

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

3.Tabla de distribución de Frecuencias

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

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

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

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

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

# Redondear porcentajes
tabla_freq$hi <- round(tabla_freq$hi, 2)
tabla_freq$Hi_asc <- round(tabla_freq$Hi_asc, 2)
tabla_freq$Hi_dsc <- round(tabla_freq$Hi_dsc, 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)

# -------------------------
# Crear 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()

# Mostrar tabla
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.1 Tabla Simplificada

# =======================================
# TABLA SIMPLIFICADA CREAR 3 INTERVALOS
# =======================================

limites <- c(
  -85000,
  150000,
  350000,
  615000
)

etiquetas <- c(
  "-85,000 - 150,000",
  "150,000 - 350,000",
  "350,000 - 615,000"
)

Migraciones <- cut(
  df$netMigration_2011_2018,
  breaks = limites,
  labels = etiquetas,
  include.lowest = TRUE,
  right = TRUE
)
# -------------------------
# Tabla de frecuencias
# -------------------------
tabla_freq <- as.data.frame(table(Migraciones))

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)

# -------------------------
# Crear tabla para Viewer
# -------------------------
tabla_gt <- tabla_final %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°2**"),
    subtitle = md("**Distribución de frecuencias Agrupados de la migración neta 
                  en el estudio de la calidad de agua en Europa (2011-2017)**")
  ) %>%
  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°2
Distribución de frecuencias Agrupados de la migración neta en el estudio de la calidad de agua en Europa (2011-2017)
Intervalo ni hi (%) Ni ↑ Hi ↑ (%) Ni ↓ Hi ↓ (%)
-85,000 - 150,000 15294 76.88 15294 76.88 19893 100
150,000 - 350,000 4058 20.40 19352 97.28 4599 23.12
350,000 - 615,000 541 2.72 19893 100 541 2.72
Total 19893 100.00

4.Gráficos

4.1 Histograma (ni)

# -------------------------
# HISTOGRAMA 1 (ni)
# -------------------------

# Eliminar fila Total
datos_graf <- tabla_final[tabla_final$Intervalo != "Total", ]

# Convertir ni a numérico
datos_graf$ni <- as.numeric(as.character(datos_graf$ni))

# Identificar máximo
ni_max <- max(datos_graf$ni)

barplot(
  datos_graf$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",
  names.arg = datos_graf$Intervalo,
  las = 1,
  cex.names = 0.8
)

4.2 Histograma General (ni)

# -------------------------
# HISTOGRAMA 2 (ni)
# -------------------------

# Eliminar fila Total
datos_graf <- tabla_final[tabla_final$Intervalo != "Total", ]

# Convertir ni a numérico
datos_graf$ni <- as.numeric(as.character(datos_graf$ni))

barplot(
  datos_graf$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 = "skyblue",
  ylim = c(0, 20000),
  names.arg = datos_graf$Intervalo,
  las = 1,
  cex.names = 0.6
)

4.3 Histograma (hi)

# -------------------------
# HISTOGRAMA 3 (hi)
# -------------------------

barplot(datos_graf$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 = "lightgreen",
        names.arg = datos_graf$Intervalo,
        las = 1,
        cex.names = 0.6)

4.4 Histograma General (hi)

# -------------------------
# HISTOGRAMA 4 (hi)
# -------------------------

barplot(datos_graf$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-2018) ",
        xlab = "Migración neta",
        ylab = "Porcentaje %",
        col = "lightgreen",
        ylim = c(0, 100),
        names.arg = datos_graf$Intervalo,
        las = 1,
        cex.names = 0.6)

4.5 Boxplot

# =========================
# BOXPLOT
# =========================

options(scipen = 999)

# Variable numérica original
Migracion <- na.omit(df$netMigration_2011_2018)

boxplot(
  Migracion,
  horizontal = TRUE,
  col = "skyblue",
  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"
)

# Media
points(
  mean(Migracion),
  1,
  pch = 19,
  col = "red"
)

# Leyenda
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:length(datos_graf$Intervalo)

# Ojiva descendente
plot(x_pos,
     datos_graf$Ni_dsc,
     main = "Gráfica N°6: Ojiva ascendente y descendente de la migración neta 
     en el estudio de la calidad de agua en Europa (2011-2017)",
     xlab = "Migración neta",
     ylab = "Cantidad",
     col = "orange",
     type = "p",
     lwd = 3,
     xaxt = "n")

# Ojiva ascendente
lines(x_pos,
      datos_graf$Ni_asc,
      col = "green",
      type = "p",
      lwd = 3)

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

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

4.7 Ojivas ascendentes y descendentes (Hi)

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

# Posiciones en el eje X
x_pos <- 1:length(datos_graf$Intervalo)

# Ojiva descendente
plot(x_pos,
     datos_graf$Hi_dsc,
     main = "Gráfica N°7: Ojiva ascendente y descendente de la migración neta en 
     el estudio de la calidad de agua en Europa (2011-2017)",
     xlab = "Migración neta",
     ylab = "Porcentaje",
     col = "red",
     type = "p",
     lwd = 3,
     xaxt = "n")

# Ojiva ascendente
lines(x_pos,
      datos_graf$Hi_asc,
      col = "blue",
      type = "p",
      lwd = 3)

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

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

5. Indicadores Estadísticos

5.1 Indicadores de Tendencia Central

# =========================
# INDICADORES ESTADÍSTICOS
# Variable: Migración neta
# =========================

# Cargar librerías
library(dplyr)
library(gt)
library(e1071)

# =========================
# Cargar datos
# =========================

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

# =========================
# Verificar variable
# =========================

if (!"netMigration_2011_2018" %in% names(df)) {
  stop("La variable netMigration_2011_2018 no existe en el archivo.")
}

# =========================
# Variable discreta
# =========================

Migraciones <- round(df$netMigration_2011_2018)

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

# =========================
# 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
# =========================

# 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
# =========================

asimetria <- skewness(Migraciones, type = 2)

curtosis <- kurtosis(Migraciones)


# =========================
# 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
]

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

5.4 Tabla de indicadores

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

tabla_indicadores_migracion <- 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
)

# =========================
# TABLA GT
# =========================

fila_migracion <- which(
  tabla_indicadores_migracion$Variable == "Migración neta"
)

tabla_indicadores_migracion_gt <- tabla_indicadores_migracion %>%
  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_migracion
    )
  )

# Mostrar tabla
tabla_indicadores_migracion_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.Conclusión

# -------------------------
# Conclusión
# -------------------------

#La variable Migración neta fluctúa en un rango de [-83750 ; 582211], y sus valores giran en torno a una mediana de 75808, con una desviación estándar de 144682.5. Dado que el coeficiente de variación es de 126.68%, se trata de un conjunto de valores altamente heterogéneo con una marcada 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 distribución (hacia los flujos migratorios menores o negativos). Con una curtosis leptocúrtica de 1.16 y la presencia de 4716 valores atípicos, se observa una fuerte variabilidad y un alto apuntamiento en los registros centrales. Por lo anterior, el comportamiento de la migración neta muestra dinámicas demográficas muy dispares entre regiones, lo cual representa un factor de gran relevancia en el estudio de la calidad de agua en Europa (2011-2017).