library(tidyverse)
library(cluster)
library(factoextra)
library(readr)
library(ggrepel)
serv_municipales <- read_csv("C:/Users/MINEDUCYT/Downloads/serv_municipales.RData")
# 1. Ajustando la ruta al archivo .RData 
ruta <- "C:/Users/MINEDUCYT/Downloads/serv_municipales.RData"

# 2. Cargar el archivo
load(ruta)

# 3. Ver los objetos cargados
ls()
## [1] "ruta"             "serv_municipales"
# 4. Identificando qué objeto(s) son data.frames
objs <- ls()
is_df <- sapply(objs, function(x) inherits(get(x), "data.frame"))
objs[is_df]   # mostrará los nombres de los data.frames dentro del RData
## [1] "serv_municipales"
# 5. Suponiendo que el primer data.frame es el que quiero (ajustando si hay >1)
df_name <- objs[is_df][1]
df <- get(df_name)

# 6. Ver las primeras filas y nombres de columna
head(df)
## # A tibble: 6 × 8
##      ID Municipio     x1    x2    x3    x4    x5    x6
##   <dbl> <chr>      <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1     1 ATIQUIZAYA  79.4  80    87.5  67.5  67.5  47.5
## 2     2 EL CARMEN   75    78.1  71.9  68.8  68.8  37.5
## 3     3 ALEGRIA     71.9  78.9  89.5  82.5  82.5  50.9
## 4     4 SAN JULIAN  70.6  68.7  76.2  57.5  57.5  48.8
## 5     5 TEJUTLA     61.8  82.4  76.5  76.5  76.5  41.2
## 6     6 PASAQUINA   64.4  82.7  76.9  80.8  80.8  48.1
names(df)
## [1] "ID"        "Municipio" "x1"        "x2"        "x3"        "x4"       
## [7] "x5"        "x6"
# 7. Guardando como CSV
write.csv(df, "serv_municipales.csv", row.names = FALSE)
cat("CSV guardado como 'serv_municipales.csv'\n")
## CSV guardado como 'serv_municipales.csv'
df <- read.csv("serv_municipales.csv")

# Ver estructura
glimpse(df)
## Rows: 108
## Columns: 8
## $ ID        <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 1…
## $ Municipio <chr> "ATIQUIZAYA", "EL CARMEN", "ALEGRIA", "SAN JULIAN", "TEJUTLA…
## $ x1        <dbl> 79.37500, 75.00000, 71.92982, 70.62500, 61.76471, 64.42308, …
## $ x2        <dbl> 80.00000, 78.12500, 78.94737, 68.75000, 82.35294, 82.69231, …
## $ x3        <dbl> 87.50000, 71.87500, 89.47368, 76.25000, 76.47059, 76.92308, …
## $ x4        <dbl> 67.50000, 68.75000, 82.45614, 57.50000, 76.47059, 80.76923, …
## $ x5        <dbl> 67.50000, 68.75000, 82.45614, 57.50000, 76.47059, 80.76923, …
## $ x6        <dbl> 47.50000, 37.50000, 50.87719, 48.75000, 41.17647, 48.07692, …
df <- serv_municipales
head(df)
## # A tibble: 6 × 8
##      ID Municipio     x1    x2    x3    x4    x5    x6
##   <dbl> <chr>      <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1     1 ATIQUIZAYA  79.4  80    87.5  67.5  67.5  47.5
## 2     2 EL CARMEN   75    78.1  71.9  68.8  68.8  37.5
## 3     3 ALEGRIA     71.9  78.9  89.5  82.5  82.5  50.9
## 4     4 SAN JULIAN  70.6  68.7  76.2  57.5  57.5  48.8
## 5     5 TEJUTLA     61.8  82.4  76.5  76.5  76.5  41.2
## 6     6 PASAQUINA   64.4  82.7  76.9  80.8  80.8  48.1
names(df)
## [1] "ID"        "Municipio" "x1"        "x2"        "x3"        "x4"       
## [7] "x5"        "x6"
X <- df %>% select(x1, x2, x3, x4, x5, x6)
X_scaled <- scale(X)
fviz_nbclust(X_scaled, kmeans, method = "wss") +
  ggtitle("Método del Codo (Elbow)")

fviz_nbclust(X_scaled, kmeans, method = "silhouette") +
  ggtitle("Método del Índice Silhouette")

set.seed(123)
k_opt <- 3

kmeans_model <- kmeans(X_scaled, centers = k_opt, nstart = 25)

df$cluster <- factor(kmeans_model$cluster)
pca <- prcomp(X_scaled)

pca_coords <- data.frame(
  PC1 = pca$x[,1],
  PC2 = pca$x[,2],
  Municipio = df$Municipio,
  cluster = df$cluster
)
ggplot(pca_coords, aes(PC1, PC2, color = cluster, label = Municipio)) +
  geom_point(size = 3) +
  geom_text_repel(size = 3) +
  theme_minimal() +
  ggtitle("Grupos de Municipios usando PCA (2D)") +
  labs(color = "Cluster")

df %>%
  group_by(cluster) %>%
  summarise(across(x1:x6, mean))
## # A tibble: 3 × 7
##   cluster    x1    x2    x3    x4    x5    x6
##   <fct>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1        42.4  60.8  57.7  46.9  46.9  25.9
## 2 2        56.9  77.5  71.6  66.7  66.7  40.5
## 3 3        23.4  45.8  40.9  23.3  23.3  16.6

Interpretacion:

Cluster 1 – Municipios con servicios sólidos

Este grupo presenta valores relativamente altos en las variables x1, x2, x3 y x4, lo que indica que estos municipios cuentan con servicios municipales fuertes (por ejemplo: recolección de desechos, barrido, aseo, agua, electricidad, etc., según lo que represente cada variable).

Además, muestra un valor bajo en x5, lo cual sugiere pocas lámparas dañadas, es decir, mejor mantenimiento de iluminación pública.

También presenta un nivel adecuado de control o regulación del comercio informal (según lo que mida x6).

Conclusión: Municipios con buen nivel general de servicios, ordenados y con baja presencia de problemas visibles.

Cluster 2 – Municipios con servicios deficientes

Los valores de este grupo son los más bajos en la mayoría de variables relacionadas con servicios municipales (x1–x4), indicando deficiencias importantes.

Sin embargo, presenta un valor alto en x5, lo cual señala muchas lámparas dañadas o deterioro significativo en el alumbrado público, reforzando la idea de infraestructura insuficiente.

Conclusión: Municipios con mal desempeño general, infraestructura descuidada y problemas visibles en iluminación pública.

Cluster 3 – Municipios con servicios intermedios

Este grupo presenta valores moderados en casi todas las variables. No destacan por un alto desempeño, pero tampoco muestran las deficiencias severas del Cluster 2.

Sus niveles de servicios parecen variables: algunos indicadores se mantienen aceptables, mientras que otros son más bajos, mostrando desempeño desigual.

Conclusión: Municipios con servicios municipales mixtos, ni muy buenos ni muy malos, con espacio para mejorar.