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