Objetivo

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.

Librerías

#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

1) Cargar datos

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

2) Limpiar

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

3) Preparar matriz para clustering

X <- as.data.frame(des$Promedio)
colnames(X) <- "Promedio"

Xs <- as.matrix(X)  

4) Elegir K: metodo del codo

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)

5) K-means con K=3

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

6) Ordenar etiquetas por nivel de desempleo (Alto/Medio/Bajo)

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

7) Tablas de resultados

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

8) Visualizaciones

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

10) Conclusión

  • Alto desempleo: estados en Nivel = Alto.
  • Medio desempleo: estados en Nivel = Medio.
  • Bajo desempleo: estados en Nivel = Bajo.

Nota: La segmentación se basa en K-means con K = 3 sobre el promedio anual de desempleo por estado.

LS0tDQp0aXRsZTogIkNsdXN0ZXJpbmcgZGUgZGVzZW1wbGVvIHBvciBlc3RhZG8gKE3DqXhpY28pIg0KYXV0aG9yOiAiS2FyaW5hIEl2ZXRoIEFycmFzIEFyYWdvbiAtIEEwMTU2NzAwOSINCmRhdGU6ICIxOS0wOC0yNSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdGhlbWU6IHlldGkNCi0tLQ0KDQohW10oaHR0cHM6Ly9jZXNlY29uc3VsdG9yZXMuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE4LzA1L2Rlc2VtcGxlby5qcGcpDQoNCiMgT2JqZXRpdm8NCkFncnVwYXIgbG9zIGVzdGFkb3MgZGUgTcOpeGljbyBzZWfDum4gKipzdSBuaXZlbCBkZSBkZXNlbXBsZW8qKiBlbiB0cmVzIGdydXBvczogKipBbHRvKiosICoqTWVkaW8qKiB5ICoqQmFqbyoqLg0KDQoqKkZ1ZW50ZSBkZSBkYXRvczoqKiBTb24gdGFzYXMgdHJpbWVzdHJhbGVzIHBvciBlc3RhZG8uDQoNCiMgTGlicmVyw61hcw0KYGBge3J9DQojaW5zdGFsbC5wYWNrYWdlcyhjKCJ0aWR5dmVyc2UiLCJjbHVzdGVyIiwiZmFjdG9leHRyYSIpLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGNsdXN0ZXIpDQpsaWJyYXJ5KGZhY3RvZXh0cmEpDQpgYGANCg0KIyAxKSBDYXJnYXIgZGF0b3MNCmBgYHtyfQ0KcnV0YV9jc3YgPC0gIkM6XFxVc2Vyc1xcSWIgQXJhXFxEb3dubG9hZHNcXFIgUmF1bFxcMjAyNGRlc2VtcGxlbzE5LTA4LTI1LmNzdiINCg0KZGVzIDwtIHJlYWQuY3N2KHJ1dGFfY3N2LCBmaWxlRW5jb2RpbmcgPSAiTGF0aW4xIiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQ0KDQpnbGltcHNlKGRlcykNCmhlYWQoZGVzKQ0KYGBgDQoNCiMgMikgTGltcGlhcg0KYGBge3J9DQpjb2xzX3RyaW0gPC0gYygiTWFyem8iLCJKdW5pbyIsIlNlcHRpZW1icmUiLCJEaWNpZW1icmUiKQ0KDQpkZXMgPC0gZGVzICU+JQ0KICBtdXRhdGUoYWNyb3NzKGFsbF9vZihjb2xzX3RyaW0pLCB+IGFzLm51bWVyaWMoLikpKQ0KDQpkZXMgPC0gZGVzICU+JSANCiAgbXV0YXRlKFByb21lZGlvID0gcm93TWVhbnMoYWNyb3NzKGFsbF9vZihjb2xzX3RyaW0pKSwgbmEucm0gPSBUUlVFKSkNCg0Kc3VtbWFyeShkZXMkUHJvbWVkaW8pDQpgYGANCg0KIyAzKSBQcmVwYXJhciBtYXRyaXogcGFyYSBjbHVzdGVyaW5nDQpgYGB7cn0NClggPC0gYXMuZGF0YS5mcmFtZShkZXMkUHJvbWVkaW8pDQpjb2xuYW1lcyhYKSA8LSAiUHJvbWVkaW8iDQoNClhzIDwtIGFzLm1hdHJpeChYKSAgDQpgYGANCg0KIyA0KSBFbGVnaXIgSzogbWV0b2RvIGRlbCBjb2RvDQpgYGB7ciwgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9NX0NCnNldC5zZWVkKDEyMykNCndjc3MgPC0gc2FwcGx5KDE6MTAsIGZ1bmN0aW9uKGspew0KICBrbSA8LSBrbWVhbnMoWHMsIGNlbnRlcnMgPSBrLCBuc3RhcnQgPSAyNSkNCiAga20kdG90LndpdGhpbnNzDQp9KQ0KDQpwbG90KDE6MTAsIHdjc3MsIHR5cGUgPSAiYiIsIHBjaCA9IDE5LA0KICAgICB4bGFiID0gIk7Dum1lcm8gZGUgY2x1c3RlcnMgKGspIiwgeWxhYiA9ICJXQ1NTIHRvdGFsIiwNCiAgICAgbWFpbiA9ICJNZXRvZG8gZGVsIGNvZG8iKQ0KYWJsaW5lKHYgPSAzLCBsdHkgPSAyKQ0KYGBgDQoNCiMgNSkgSy1tZWFucyBjb24gSz0zDQpgYGB7cn0NCnNldC5zZWVkKDEyMykNCmttMyA8LSBrbWVhbnMoWHMsIGNlbnRlcnMgPSAzLCBuc3RhcnQgPSA1MCwgaXRlci5tYXggPSAxMDApDQoNCmttMw0Ka20zJGNlbnRlcnMNCmBgYA0KDQojIDYpIE9yZGVuYXIgZXRpcXVldGFzIHBvciBuaXZlbCBkZSBkZXNlbXBsZW8gKEFsdG8vTWVkaW8vQmFqbykNCmBgYHtyfQ0Kb3JkIDwtIG9yZGVyKGFzLm51bWVyaWMoa20zJGNlbnRlcnMpKQ0KZXRpcXVldGFzIDwtIGMoIkJham8iLCJNZWRpbyIsIkFsdG8iKQ0KbWFwYSA8LSBzZXROYW1lcyhldGlxdWV0YXMsIG9yZCkgIA0KDQpjbHVzdGVyX25pdmVsIDwtIGV0aXF1ZXRhc1tyYW5rKGFzLm51bWVyaWMoa20zJGNlbnRlcnMpLCB0aWVzLm1ldGhvZCA9ICJmaXJzdCIpW2ttMyRjbHVzdGVyXV0NCg0KcmVzIDwtIGRlcyAlPiUNCiAgbXV0YXRlKENsdXN0ZXJOdW0gPSBrbTMkY2x1c3RlciwNCiAgICAgICAgIE5pdmVsID0gY2x1c3Rlcl9uaXZlbCkNCmhlYWQocmVzKQ0KYGBgDQoNCiMgNykgVGFibGFzIGRlIHJlc3VsdGFkb3MNCmBgYHtyfQ0KcmVzdW1lbiA8LSByZXMgJT4lIA0KICBncm91cF9ieShOaXZlbCkgJT4lIA0KICBzdW1tYXJpc2UoRXN0YWRvcyA9IG4oKSwNCiAgICAgICAgICAgIFByb21lZGlvX21pbiA9IG1pbihQcm9tZWRpbywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIFByb21lZGlvX21heCA9IG1heChQcm9tZWRpbywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIFByb21lZGlvX21lZGlhbmEgPSBtZWRpYW4oUHJvbWVkaW8sIG5hLnJtID0gVFJVRSkpICU+JQ0KICBhcnJhbmdlKG1hdGNoKE5pdmVsLCBjKCJBbHRvIiwiTWVkaW8iLCJCYWpvIikpKQ0KDQpyZXN1bWVuDQoNCnJhbmtpbmcgPC0gcmVzICU+JSANCiAgYXJyYW5nZShkZXNjKFByb21lZGlvKSkgJT4lIA0KICBzZWxlY3QoRXN0YWRvLCBQcm9tZWRpbywgTml2ZWwpDQpoZWFkKHJhbmtpbmcsIDEwKQ0KYGBgDQoNCiMgOCkgVmlzdWFsaXphY2lvbmVzDQpgYGB7ciwgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9NX0NCmdncGxvdChyZXMsIGFlcyh4ID0gcmVvcmRlcihFc3RhZG8sIFByb21lZGlvKSwgeSA9IFByb21lZGlvLCBmaWxsID0gTml2ZWwpKSArDQogIGdlb21fY29sKCkgKw0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKHggPSAiRXN0YWRvIiwgeSA9ICJUYXNhIGRlIGRlc2VtcGxlbyBwcm9tZWRpbyAoJSkiLA0KICAgICAgIHRpdGxlID0gIlByb21lZGlvIGRlIGRlc2VtcGxlbyBwb3IgZXN0YWRvICgyMDI0KSIsDQogICAgICAgc3VidGl0bGUgPSAiQWdydXBhY2nDs24gZW4gMyBuaXZlbGVzOiBBbHRvLCBNZWRpbywgQmFqbyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KYGBge3IsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTV9DQpnZ3Bsb3QocmVzLCBhZXMoeCA9IFByb21lZGlvLCBmaWxsID0gTml2ZWwpKSArDQogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNCkgKw0KICBsYWJzKHggPSAiUHJvbWVkaW8gZGUgZGVzZW1wbGVvICglKSIsIHkgPSAiRGVuc2lkYWQiLA0KICAgICAgIHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgcHJvbWVkaW9zIHBvciBuaXZlbCBkZSBkZXNlbXBsZW8iKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMgMTApIENvbmNsdXNpw7NuDQotICoqQWx0byBkZXNlbXBsZW86KiogZXN0YWRvcyBlbiAqTml2ZWwgPSBBbHRvKi4NCi0gKipNZWRpbyBkZXNlbXBsZW86KiogZXN0YWRvcyBlbiAqTml2ZWwgPSBNZWRpbyouDQotICoqQmFqbyBkZXNlbXBsZW86KiogZXN0YWRvcyBlbiAqTml2ZWwgPSBCYWpvKi4NCg0KTm90YTogTGEgc2VnbWVudGFjacOzbiBzZSBiYXNhIGVuIEstbWVhbnMgY29uICoqSyA9IDMqKiBzb2JyZSBlbCAqKnByb21lZGlvIGFudWFsKiogZGUgZGVzZW1wbGVvIHBvciBlc3RhZG8u