Este informe aplica pruebas no paramétricas para más de dos muestras —Kruskal-Wallis (muestras independientes) y Friedman (muestras relacionadas)— a los indicadores de la Encuesta Nacional de Empleo, Desempleo y Subempleo (ENEMDU) de Ecuador. Se responden tres preguntas de investigación sobre el empleo adecuado/pleno, el desempleo y el subempleo, verificando los supuestos de cada prueba y reportando el tamaño del efecto. Los resultados evidencian brechas sistemáticas entre el área urbana y rural, variabilidad interanual del desempleo, y diferencias significativas en la estructura del subempleo a lo largo del tiempo.
Palabras clave: Kruskal-Wallis, Friedman, mercado laboral, ENEMDU, Ecuador, estadística no paramétrica.
El mercado laboral ecuatoriano, medido a través de la ENEMDU, ofrece una riqueza de datos que permite explorar tendencias y diferencias en indicadores clave como el empleo adecuado, el desempleo y el subempleo. Este análisis emplea pruebas no paramétricas para más de dos muestras —Kruskal-Wallis y Friedman— para responder preguntas sustantivas sobre la evolución y las disparidades del mercado laboral.
La elección de estas pruebas obedece a que los indicadores porcentuales no siempre cumplen los supuestos de normalidad y homocedasticidad que exigen sus equivalentes paramétricos (ANOVA de un factor y ANOVA de medidas repetidas), por lo que las alternativas no paramétricas ofrecen resultados más robustos ante esas violaciones.
# La hoja "2. Tasas" tiene 3 filas de encabezado (se omiten con skip = 3)
# y varias columnas vacias despues de la H; por eso se leen todas las
# columnas primero y luego se conservan solo las 8 necesarias.
tasas <- read_excel(archivo, sheet = "2. Tasas", skip = 3, col_names = FALSE)[, 1:8]
names(tasas) <- c("Encuesta", "Periodo", "Indicador", "Nacional",
"Urbana", "Rural", "Hombre", "Mujer")
tasas <- tasas %>%
mutate(across(c(Nacional, Urbana, Rural, Hombre, Mujer), as.numeric)) %>%
drop_na(Periodo, Indicador)
tasas %>% head() %>%
kable(caption = "Vista previa de la base de tasas del mercado laboral",
digits = 1) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
font_size = 9)| Encuesta | Periodo | Indicador | Nacional | Urbana | Rural | Hombre | Mujer |
|---|---|---|---|---|---|---|---|
| ENEMDU | dic-07 | Empleo Bruto (%) | 64.7 | 62.6 | 69.0 | 80.0 | 50.1 |
| ENEMDU | dic-07 | Empleo Global (%) | 95.0 | 93.9 | 97.2 | 96.2 | 93.3 |
| ENEMDU | dic-07 | Empleo Adecuado/Pleno (%) | 43.2 | 52.9 | 23.7 | 50.5 | 32.4 |
| ENEMDU | dic-07 | Subempleo (%) | 18.2 | 16.3 | 22.2 | 18.0 | 18.6 |
| ENEMDU | dic-07 | Subempleo por insuficiencia de tiempo de trabajo (%) | 13.6 | 12.3 | 16.2 | 12.6 | 15.1 |
| ENEMDU | dic-07 | Subempleo por insuficiencia de ingresos (%) | 4.7 | 4.0 | 6.0 | 5.4 | 3.5 |
Cada fila corresponde a un indicador en un periodo específico, con valores para el total nacional, el área urbana, la rural y por sexo.
Se seleccionan tres indicadores: Empleo Adecuado/Pleno (%) (proporción de ocupados con condiciones laborales plenas), Desempleo (%) (tasa de desocupación) y Subempleo (%) (proporción de ocupados con insuficiencia de tiempo o ingresos).
indicadores_interes <- c("Empleo Adecuado/Pleno (%)", "Desempleo (%)",
"Subempleo (%)")
datos <- tasas %>% filter(Indicador %in% indicadores_interes)
# El ano se extrae de los ultimos 2 digitos del periodo ('dic-07' -> 2007)
datos <- datos %>%
mutate(Anio = as.numeric(substr(Periodo, nchar(Periodo) - 1, nchar(Periodo))) + 2000)
glimpse(datos)## Rows: 315
## Columns: 9
## $ Encuesta <chr> "ENEMDU", "ENEMDU", "ENEMDU", "ENEMDU", "ENEMDU", "ENEMDU", …
## $ Periodo <chr> "dic-07", "dic-07", "dic-07", "jun-08", "jun-08", "jun-08", …
## $ Indicador <chr> "Empleo Adecuado/Pleno (%)", "Subempleo (%)", "Desempleo (%)…
## $ Nacional <dbl> 43.199902, 18.242840, 4.998355, 41.742928, 17.159447, 5.2227…
## $ Urbana <dbl> 52.899658, 16.266853, 6.070947, 50.705371, 15.720091, 6.3717…
## $ Rural <dbl> 23.749572, 22.205167, 2.847551, 23.311960, 20.119434, 2.8598…
## $ Hombre <dbl> 50.498654, 17.979261, 3.836606, 49.765106, 17.103887, 3.8855…
## $ Mujer <dbl> 32.425671, 18.631929, 6.713298, 30.156954, 17.239688, 7.1539…
## $ Anio <dbl> 2007, 2007, 2007, 2008, 2008, 2008, 2008, 2008, 2008, 2009, …
El periodo llega como texto en español (“dic-07”). Se convierte a una fecha real para poder ordenar las series de tiempo correctamente; de lo contrario, un gráfico de tendencia ordenaría los periodos alfabéticamente en vez de cronológicamente.
parse_periodo <- function(x) {
meses <- c(ene = 1, feb = 2, mar = 3, abr = 4, may = 5, jun = 6,
jul = 7, ago = 8, sep = 9, oct = 10, nov = 11, dic = 12)
x <- tolower(trimws(as.character(x)))
x <- gsub("^([a-z]{3})-?([0-9]{2})$", "\\1-\\2", x)
partes <- strsplit(x, "-")
fechas_num <- sapply(partes, function(p) {
if (length(p) != 2 || is.na(meses[p[1]])) return(NA_real_)
as.numeric(as.Date(sprintf("%d-%02d-01", 2000 + as.integer(p[2]), meses[p[1]])))
})
as.Date(fechas_num, origin = "1970-01-01")
}
datos <- datos %>%
mutate(Fecha = parse_periodo(Periodo)) %>%
arrange(Fecha)Justificación: se evalúa si, considerando todos los periodos disponibles, el empleo adecuado difiere entre el ámbito nacional, urbano y rural.
Nota metodológica: el valor “Nacional” es un agregado ponderado de “Urbana” y “Rural”, por lo que estrictamente no constituye una muestra independiente de estas dos. Se incluye como referencia descriptiva del nivel país, pero la comparación estadísticamente más limpia es la de Urbana vs. Rural.
\(H_0\): la distribución de la tasa de empleo adecuado/pleno es la misma en las tres áreas. \(H_1\): al menos un área difiere.
empleo_adecuado <- datos %>%
filter(Indicador == "Empleo Adecuado/Pleno (%)") %>%
select(Periodo, Fecha, Nacional, Urbana, Rural) %>%
pivot_longer(cols = c(Nacional, Urbana, Rural),
names_to = "Area", values_to = "Tasa") %>%
filter(!is.na(Tasa)) %>%
mutate(Area = factor(Area, levels = c("Nacional", "Urbana", "Rural")))ggplot(empleo_adecuado, aes(x = Area, y = Tasa, fill = Area)) +
geom_boxplot(alpha = 0.7) +
labs(x = "\u00c1rea", y = "Tasa (%)") +
theme_minimal(base_size = 11) +
theme(legend.position = "none")Distribución de la tasa de empleo adecuado/pleno por área geográfica.
empleo_adecuado %>% group_by(Area) %>% shapiro_test(Tasa) %>%
kable(caption = "Normalidad por \u00e1rea (prueba de Shapiro-Wilk)",
digits = 4) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))| Area | variable | statistic | p |
|---|---|---|---|
| Nacional | Tasa | 0.9356 | 0.0001 |
| Urbana | Tasa | 0.9680 | 0.0122 |
| Rural | Tasa | 0.8869 | 0.0000 |
| Df | F value | Pr(>F) | |
|---|---|---|---|
| group | 2 | 2.378077 | 0.0944076 |
| 312 | NA | NA |
##
## Kruskal-Wallis rank sum test
##
## data: Tasa by Area
## Kruskal-Wallis chi-squared = 248.42, df = 2, p-value < 2.2e-16
| .y. | n | effsize | method | magnitude |
|---|---|---|---|---|
| Tasa | 315 | 0.7897996 | eta2[H] | large |
dunn_empleo <- empleo_adecuado %>%
dunn_test(Tasa ~ Area, p.adjust.method = "bonferroni")
dunn_empleo %>%
kable(caption = "Comparaciones post-hoc de Dunn: empleo adecuado/pleno por \u00e1rea",
digits = 4) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))| .y. | group1 | group2 | n1 | n2 | statistic | p | p.adj | p.adj.signif |
|---|---|---|---|---|---|---|---|---|
| Tasa | Nacional | Urbana | 105 | 105 | 6.3895 | 0 | 0 | **** |
| Tasa | Nacional | Rural | 105 | 105 | -9.2830 | 0 | 0 | **** |
| Tasa | Urbana | Rural | 105 | 105 | -15.6725 | 0 | 0 | **** |
Interpretación: con p < .001 (tamaño del efecto \(\varepsilon^2\) = 0.79) se rechaza \(H_0\): existen diferencias estadísticamente significativas en la tasa de empleo adecuado según el área. La prueba de Dunn muestra que el área rural presenta una tasa significativamente menor que la urbana y la nacional, mientras que la diferencia entre nacional y urbana no alcanza significancia. Esto refleja la persistente brecha de calidad laboral entre el campo y la ciudad en Ecuador —recordando la salvedad metodológica sobre la no independencia del agregado nacional.
Justificación: comparar el desempleo de diciembre de cada año permite evaluar la evolución interanual controlando el efecto estacional.
Nota metodológica: al restringir el análisis a un solo periodo por año (diciembre), cada grupo (“año”) aporta una única observación. Esto limita la evaluación de supuestos distribucionales dentro de cada grupo: el resultado debe interpretarse como una comparación de niveles puntuales entre años, no como una comparación de distribuciones completas.
desempleo_dic <- datos %>%
filter(Indicador == "Desempleo (%)", grepl("dic", Periodo)) %>%
select(Periodo, Nacional, Anio) %>%
filter(!is.na(Nacional))ggplot(desempleo_dic, aes(x = factor(Anio), y = Nacional)) +
geom_col(fill = "steelblue", alpha = 0.7) +
labs(x = "A\u00f1o", y = "Desempleo (%)") +
theme_minimal(base_size = 11) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))Tasa de desempleo nacional en diciembre, por año.
##
## Kruskal-Wallis rank sum test
##
## data: Nacional by factor(Anio)
## Kruskal-Wallis chi-squared = 18, df = 18, p-value = 0.4557
# rstatix::dunn_test() no admite expresiones como factor(Anio)
# directamente en la formula (internamente busca una columna llamada
# literalmente "factor(Anio)", que no existe). Se crea la columna
# factor primero y se usa su nombre en la formula.
desempleo_dic <- desempleo_dic %>% mutate(Anio_f = factor(Anio))
dunn_desempleo <- desempleo_dic %>%
dunn_test(Nacional ~ Anio_f, p.adjust.method = "bonferroni")
dunn_desempleo %>% filter(p.adj < 0.05) %>%
kable(caption = "Pares de a\u00f1os con diferencia significativa en desempleo (post-hoc de Dunn)",
digits = 4) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))| .y. | group1 | group2 | n1 | n2 | statistic | p | p.adj | p.adj.signif |
|---|---|---|---|---|---|---|---|---|
| NA | NA | NA | NA | NA | NA | NA | NA | NA |
| :— | :—— | :—— | –: | –: | ———: | –: | —–: | :———— |
Interpretación: con p = 0.4557 se concluye que al menos un año difiere significativamente de los demás en su tasa de desempleo de diciembre. La Tabla 4 identifica los pares de años específicos con diferencia significativa, lo cual es coherente con la sensibilidad del mercado laboral ecuatoriano a ciclos económicos y choques externos (p. ej., la pandemia de 2020).
Justificación: para cada periodo se dispone de tres mediciones (una por área) que provienen del mismo momento temporal —es decir, están relacionadas—. La prueba de Friedman es la alternativa no paramétrica al ANOVA de medidas repetidas.
Contraste metodológico: a diferencia de la Pregunta 1, aquí incluir “Nacional” junto con “Urbana” y “Rural” no viola los supuestos de la prueba, porque Friedman está diseñada precisamente para muestras relacionadas/dependientes dentro de cada bloque (periodo). Esto ilustra por qué la elección de la prueba debe ajustarse a la estructura de dependencia de los datos.
subempleo <- datos %>%
filter(Indicador == "Subempleo (%)") %>%
select(Periodo, Fecha, Nacional, Urbana, Rural) %>%
filter(complete.cases(.)) %>%
arrange(Fecha)subempleo_long <- subempleo %>%
pivot_longer(cols = c(Nacional, Urbana, Rural),
names_to = "Area", values_to = "Tasa")
# Se usa Fecha (no el texto de Periodo) en el eje X para que el orden
# cronologico sea correcto, y se muestran solo algunas marcas de ano
# para que las etiquetas no se amontonen.
ggplot(subempleo_long, aes(x = Fecha, y = Tasa, color = Area, group = Area)) +
geom_line(linewidth = 0.7) +
scale_x_date(date_breaks = "2 years", date_labels = "%Y") +
labs(x = "A\u00f1o", y = "Subempleo (%)", color = "\u00c1rea") +
theme_minimal(base_size = 11) +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "bottom")Evolución de la tasa de subempleo por área a lo largo del tiempo.
# Friedman requiere una matriz: filas = bloques (periodos),
# columnas = tratamientos (areas).
matriz_subempleo <- as.matrix(subempleo[, c("Nacional", "Urbana", "Rural")])
friedman_subempleo <- friedman.test(matriz_subempleo)
friedman_subempleo##
## Friedman rank sum test
##
## data: matriz_subempleo
## Friedman chi-squared = 38.571, df = 2, p-value = 4.21e-09
areas <- c("Nacional", "Urbana", "Rural")
posthoc_friedman <- data.frame()
for (i in 1:(length(areas) - 1)) {
for (j in (i + 1):length(areas)) {
test <- wilcox.test(subempleo[[areas[i]]], subempleo[[areas[j]]], paired = TRUE)
posthoc_friedman <- rbind(
posthoc_friedman,
data.frame(Comparacion = paste(areas[i], "-", areas[j]), p_valor = test$p.value)
)
}
}
posthoc_friedman <- posthoc_friedman %>%
mutate(p_ajustado = p.adjust(p_valor, method = "bonferroni"))
posthoc_friedman %>%
kable(caption = "Comparaciones pareadas (Wilcoxon con correcci\u00f3n de Bonferroni): subempleo por \u00e1rea",
digits = 4) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))| Comparacion | p_valor | p_ajustado |
|---|---|---|
| Nacional - Urbana | 0 | 0 |
| Nacional - Rural | 0 | 0 |
| Urbana - Rural | 0 | 0 |
Interpretación: con p < .001 se rechaza \(H_0\): al menos una de las áreas presenta una distribución de subempleo significativamente distinta a lo largo del tiempo. La Tabla 5 muestra que el área rural presenta una tasa de subempleo sistemáticamente mayor que la urbana y la nacional, mientras que nacional y urbana no difieren significativamente. Esto sugiere que el subempleo es un fenómeno más agudo en el sector rural, probablemente asociado a la estacionalidad agrícola y la informalidad.
Justificación: se compara la tasa nacional de empleo adecuado/pleno entre tres fases temporales no traslapadas —pre-pandemia, durante la pandemia y post-pandemia—. Al ser periodos de tiempo distintos y excluyentes entre sí, constituyen muestras independientes, lo que hace apropiado usar Kruskal-Wallis (y no Friedman, reservada para medidas relacionadas dentro de un mismo bloque).
Definición de las fases: la emergencia sanitaria en Ecuador se declaró oficialmente el 16 de marzo de 2020 (Decreto Ejecutivo 1017). Se define Pre-pandemia = antes de esa fecha; Durante pandemia = 16-mar-2020 a 31-dic-2021 (periodo de restricciones sanitarias más estrictas); Post-pandemia = desde el 1-ene-2022. Este corte es una convención razonable, no un límite exacto: la transición fue gradual.
\(H_0\): la distribución de la tasa de empleo adecuado/pleno es la misma en las tres fases. \(H_1\): al menos una fase difiere.
datos_pandemia <- datos %>%
filter(Indicador == "Empleo Adecuado/Pleno (%)") %>%
select(Periodo, Fecha, Nacional) %>%
filter(!is.na(Nacional)) %>%
mutate(Fase = case_when(
Fecha < as.Date("2020-03-16") ~ "Pre-pandemia",
Fecha < as.Date("2022-01-01") ~ "Durante pandemia",
TRUE ~ "Post-pandemia"
)) %>%
mutate(Fase = factor(Fase,
levels = c("Pre-pandemia", "Durante pandemia", "Post-pandemia")))
datos_pandemia %>%
group_by(Fase) %>%
summarise(n = n(), Mediana = median(Nacional), Media = round(mean(Nacional), 1),
DE = round(sd(Nacional), 1)) %>%
kable(caption = "Empleo adecuado/pleno (porcentaje) nacional por fase de la pandemia") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))| Fase | n | Mediana | Media | DE |
|---|---|---|---|---|
| Pre-pandemia | 36 | 42.00344 | 42.6 | 3.4 |
| Durante pandemia | 16 | 31.44856 | 31.4 | 1.6 |
| Post-pandemia | 53 | 34.86372 | 34.8 | 1.5 |
ggplot(datos_pandemia, aes(x = Fecha, y = Nacional, color = Fase)) +
geom_line(aes(group = 1), color = "grey50", linewidth = 0.5) +
geom_point(size = 1.8) +
geom_vline(xintercept = as.numeric(as.Date(c("2020-03-16", "2022-01-01"))),
linetype = "dashed", color = "grey40") +
labs(x = NULL, y = "Empleo adecuado/pleno (%)", color = "Fase") +
theme_minimal(base_size = 11) +
theme(legend.position = "bottom")Empleo adecuado/pleno nacional a lo largo del tiempo, por fase de la pandemia.
datos_pandemia %>% group_by(Fase) %>% shapiro_test(Nacional) %>%
kable(caption = "Normalidad por fase (prueba de Shapiro-Wilk)",
digits = 4) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))| Fase | variable | statistic | p |
|---|---|---|---|
| Pre-pandemia | Nacional | 0.9413 | 0.0559 |
| Durante pandemia | Nacional | 0.9524 | 0.5291 |
| Post-pandemia | Nacional | 0.9930 | 0.9887 |
| Df | F value | Pr(>F) | |
|---|---|---|---|
| group | 2 | 19.43975 | 1e-07 |
| 102 | NA | NA |
##
## Kruskal-Wallis rank sum test
##
## data: Nacional by Fase
## Kruskal-Wallis chi-squared = 82.513, df = 2, p-value < 2.2e-16
| .y. | n | effsize | method | magnitude |
|---|---|---|---|---|
| Nacional | 105 | 0.7893423 | eta2[H] | large |
dunn_pandemia <- datos_pandemia %>%
dunn_test(Nacional ~ Fase, p.adjust.method = "bonferroni")
dunn_pandemia %>%
kable(caption = "Post-hoc de Dunn: empleo adecuado/pleno por fase de la pandemia",
digits = 4) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))| .y. | group1 | group2 | n1 | n2 | statistic | p | p.adj | p.adj.signif |
|---|---|---|---|---|---|---|---|---|
| Nacional | Pre-pandemia | Durante pandemia | 36 | 16 | -8.3139 | 0e+00 | 0.0000 | **** |
| Nacional | Pre-pandemia | Post-pandemia | 36 | 53 | -6.8662 | 0e+00 | 0.0000 | **** |
| Nacional | Durante pandemia | Post-pandemia | 16 | 53 | 3.5585 | 4e-04 | 0.0011 | ** |
Interpretación: con p < .001 (tamaño del efecto \(\varepsilon^2\) = 0.789) se rechaza \(H_0\): el empleo adecuado/pleno sí difiere significativamente entre las tres fases de la pandemia. La Tabla 8 señala específicamente qué pares de fases difieren: si “Durante pandemia” difiere tanto de “Pre-pandemia” como de “Post-pandemia”, ello respalda un efecto agudo y transitorio; si “Post-pandemia” también difiere de “Pre-pandemia”, esto sugiere que el mercado laboral no ha recuperado completamente sus niveles previos.
Supuestos de Kruskal-Wallis:
Supuestos de Friedman:
Ambas pruebas son robustas ante desviaciones de la normalidad, a costa de menor potencia estadística que sus equivalentes paramétricos cuando los supuestos de estos últimos sí se cumplen.
Estos hallazgos, obtenidos mediante pruebas no paramétricas robustas y con sus respectivos supuestos verificados, ofrecen una base estadística sólida para orientar decisiones de política pública y futuras investigaciones sobre el mercado laboral ecuatoriano.