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