Agrupar los estados de México según su nivel de desempleo en tres grupos: Alto, Medio y Bajo.
Fuente de datos: Son tasas trimestrales por estado.
#install.packages(c("tidyverse","cluster","factoextra"), dependencies = TRUE)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.2 ✔ tibble 3.3.0
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.1.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(cluster)
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
ruta_csv <- "C:\\Users\\Ib Ara\\Downloads\\R Raul\\2024desempleo19-08-25.csv"
des <- read.csv(ruta_csv, fileEncoding = "Latin1", stringsAsFactors = FALSE)
glimpse(des)
## Rows: 32
## Columns: 5
## $ Estado <chr> "Aguascalientes", "Baja California", "Baja California Sur",…
## $ Marzo <dbl> 3.00, 2.13, 2.22, 1.56, 4.17, 2.11, 1.70, 2.24, 3.97, 3.05,…
## $ Junio <dbl> 3.36, 2.74, 2.41, 2.00, 3.71, 2.11, 1.57, 2.53, 4.04, 2.81,…
## $ Septiembre <dbl> 4.23, 2.72, 2.52, 1.95, 4.15, 2.34, 1.97, 2.62, 3.96, 3.29,…
## $ Diciembre <dbl> 2.26, 2.46, 1.89, 1.90, 3.50, 2.23, 2.76, 2.12, 3.99, 3.06,…
head(des)
## Estado Marzo Junio Septiembre Diciembre
## 1 Aguascalientes 3.00 3.36 4.23 2.26
## 2 Baja California 2.13 2.74 2.72 2.46
## 3 Baja California Sur 2.22 2.41 2.52 1.89
## 4 Campeche 1.56 2.00 1.95 1.90
## 5 Coahuila de Zaragoza 4.17 3.71 4.15 3.50
## 6 Colima 2.11 2.11 2.34 2.23
cols_trim <- c("Marzo","Junio","Septiembre","Diciembre")
des <- des %>%
mutate(across(all_of(cols_trim), ~ as.numeric(.)))
des <- des %>%
mutate(Promedio = rowMeans(across(all_of(cols_trim)), na.rm = TRUE))
summary(des$Promedio)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.205 2.091 2.421 2.548 2.970 4.003
X <- as.data.frame(des$Promedio)
colnames(X) <- "Promedio"
Xs <- as.matrix(X)
set.seed(123)
wcss <- sapply(1:10, function(k){
km <- kmeans(Xs, centers = k, nstart = 25)
km$tot.withinss
})
plot(1:10, wcss, type = "b", pch = 19,
xlab = "Número de clusters (k)", ylab = "WCSS total",
main = "Metodo del codo")
abline(v = 3, lty = 2)
set.seed(123)
km3 <- kmeans(Xs, centers = 3, nstart = 50, iter.max = 100)
km3
## K-means clustering with 3 clusters of sizes 12, 4, 16
##
## Cluster means:
## Promedio
## 1 2.883333
## 2 3.832500
## 3 1.975469
##
## Clustering vector:
## [1] 1 1 3 3 2 3 3 3 2 1 1 3 3 3 2 3 3 3 1 3 3 1 1 1 3 1 2 1 1 3 3 1
##
## Within cluster sum of squares by cluster:
## [1] 0.8230542 0.1987125 1.6204527
## (between_SS / total_SS = 83.3 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
km3$centers
## Promedio
## 1 2.883333
## 2 3.832500
## 3 1.975469
ord <- order(as.numeric(km3$centers))
etiquetas <- c("Bajo","Medio","Alto")
mapa <- setNames(etiquetas, ord)
cluster_nivel <- etiquetas[rank(as.numeric(km3$centers), ties.method = "first")[km3$cluster]]
res <- des %>%
mutate(ClusterNum = km3$cluster,
Nivel = cluster_nivel)
head(res)
## Estado Marzo Junio Septiembre Diciembre Promedio ClusterNum
## 1 Aguascalientes 3.00 3.36 4.23 2.26 3.2125 1
## 2 Baja California 2.13 2.74 2.72 2.46 2.5125 1
## 3 Baja California Sur 2.22 2.41 2.52 1.89 2.2600 3
## 4 Campeche 1.56 2.00 1.95 1.90 1.8525 3
## 5 Coahuila de Zaragoza 4.17 3.71 4.15 3.50 3.8825 2
## 6 Colima 2.11 2.11 2.34 2.23 2.1975 3
## Nivel
## 1 Medio
## 2 Medio
## 3 Bajo
## 4 Bajo
## 5 Alto
## 6 Bajo
resumen <- res %>%
group_by(Nivel) %>%
summarise(Estados = n(),
Promedio_min = min(Promedio, na.rm = TRUE),
Promedio_max = max(Promedio, na.rm = TRUE),
Promedio_mediana = median(Promedio, na.rm = TRUE)) %>%
arrange(match(Nivel, c("Alto","Medio","Bajo")))
resumen
## # A tibble: 3 × 5
## Nivel Estados Promedio_min Promedio_max Promedio_mediana
## <chr> <int> <dbl> <dbl> <dbl>
## 1 Alto 4 3.46 4.00 3.94
## 2 Medio 12 2.46 3.22 2.93
## 3 Bajo 16 1.20 2.38 2.09
ranking <- res %>%
arrange(desc(Promedio)) %>%
select(Estado, Promedio, Nivel)
head(ranking, 10)
## Estado Promedio Nivel
## 1 Tabasco 4.0025 Alto
## 2 Ciudad de México 3.9900 Alto
## 3 Coahuila de Zaragoza 3.8825 Alto
## 4 México 3.4550 Alto
## 5 Tamaulipas 3.2175 Medio
## 6 Aguascalientes 3.2125 Medio
## 7 Sonora 3.1775 Medio
## 8 Durango 3.0525 Medio
## 9 Tlaxcala 2.9425 Medio
## 10 San Luis Potosí 2.9400 Medio
ggplot(res, aes(x = reorder(Estado, Promedio), y = Promedio, fill = Nivel)) +
geom_col() +
coord_flip() +
labs(x = "Estado", y = "Tasa de desempleo promedio (%)",
title = "Promedio de desempleo por estado (2024)",
subtitle = "Agrupación en 3 niveles: Alto, Medio, Bajo") +
theme_minimal()
ggplot(res, aes(x = Promedio, fill = Nivel)) +
geom_density(alpha = 0.4) +
labs(x = "Promedio de desempleo (%)", y = "Densidad",
title = "Distribución de promedios por nivel de desempleo") +
theme_minimal()
Nota: La segmentación se basa en K-means con K = 3 sobre el promedio anual de desempleo por estado.