Agrupamiento o clustering es una tecnica de aprendizaje
automatico no supervisado que agrupa datos en funcion de su
similitud.
Algunos usos típicos de esta técnica son:
library(data.table)
library(dplyr)
library(ggplot2)
library(tidyr)
library(purrr)
library(scales)
library(ggrepel)
ruta_csv <- "IDEFF_jul25.csv"
if (!file.exists(ruta_csv)) {
message("No encontré el archivo en 'ruta_csv'. Abre el diálogo y selecciona el CSV…")
ruta_csv <- file.choose()
}
df <- fread(ruta_csv, encoding = "UTF-8")
cat("Dimensiones:", nrow(df), "filas x", ncol(df), "columnas\n")
## Dimensiones: 13398 filas x 18 columnas
meses <- c("ENERO","FEBRERO","MARZO","ABRIL","MAYO","JUNIO",
"JULIO","AGOSTO","SEPTIEMBRE","OCTUBRE","NOVIEMBRE","DICIEMBRE")
for (m in meses) {
if (m %in% names(df)) df[[m]] <- suppressWarnings(as.numeric(df[[m]]))
}
cols_req <- c("YEAR", "ENTIDAD", "TIPO", "CONCEPTO", meses)
faltan <- setdiff(cols_req, names(df))
if (length(faltan) > 0) {
message("⚠️ Faltan columnas: ", paste(faltan, collapse = ", "))
} else {
message("✅ Columnas esperadas presentes.")
}
df_total <- df %>%
group_by(ENTIDAD) %>%
summarise(total = sum(across(all_of(meses), ~ .x), na.rm = TRUE), .groups = "drop")
set.seed(42)
km_inc <- kmeans(scale(df_total$total), centers = 3, nstart = 50)
tmp <- df_total %>%
mutate(cluster = km_inc$cluster) %>%
group_by(cluster) %>%
summarise(media = mean(total), .groups="drop") %>%
arrange(media) %>%
mutate(label = c("Baja","Media","Alta"))
map_labels <- setNames(tmp$label, tmp$cluster)
df_clusters_inc <- df_total %>%
mutate(nivel = factor(map_labels[as.character(km_inc$cluster)],
levels = c("Baja","Media","Alta"))) %>%
arrange(desc(total)) %>%
select(ENTIDAD, total, nivel)
print(df_clusters_inc)
## # A tibble: 33 × 3
## ENTIDAD total nivel
## <chr> <dbl> <fct>
## 1 CIUDAD DE MEXICO 196446 Alta
## 2 MEXICO 86285 Media
## 3 JALISCO 79893 Media
## 4 GUANAJUATO 72313 Media
## 5 BAJA CALIFORNIA 70965 Media
## 6 VERACRUZ 65096 Media
## 7 TAMAULIPAS 54131 Media
## 8 SONORA 51801 Media
## 9 PUEBLA 47702 Media
## 10 MICHOACAN 45245 Media
## # ℹ 23 more rows