Se esta preparando un estudio sobre la calidad de los servicios municipales en El Salvador, para ello se ha realizado una encuesta a una muestra de 108 municipios, y se obtuvo información para las siguientes variables:
ID: Identificador corto para el municipio (1~108) Municipio: Nombres de los municipios x1: % de Negocios que consideran que la municipalidad presta servicios de mantenimiento de calles de buena calidad x2: % de Negocios que consideran que la municipalidad presta servicios de recolección de desechos sólidos de buena calidad x3: % de Negocios que consideran que la municipalidad presta servicios de alumbrado público de buena calidad x4: % que consideran que la municipalidad presta servicios de aseo y limpieza de la calle frente a las instalaciones de sus negocios de buena calidad x5: % de Negocios que indican que la lámpara de la calle que está ubicada frente a su local no funciona o no existe x6: % de Negocios que indican que la municipalidad regula de una manera apropiada las actividades del comercio informal
load("C:/Users/Administrator/Downloads/Ejercicio_Pre_Examen_Final.RData")
Usando la información de las x’s, realice un Análisis de Conglomerados, usando la técnica de K-medias para generar los grupos:
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.4.1
## Warning: package 'readr' was built under R version 4.4.1
## Warning: package 'dplyr' was built under R version 4.4.1
## ── 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.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── 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)
## Warning: package 'factoextra' was built under R version 4.4.2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(ggrepel)
## Warning: package 'ggrepel' was built under R version 4.4.2
head(serv_municipales)
## # 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
summary(serv_municipales)
## ID Municipio x1 x2
## Min. : 1.00 Length:108 Min. : 0.9804 Min. :16.25
## 1st Qu.: 27.75 Class :character 1st Qu.:28.7500 1st Qu.:54.44
## Median : 54.50 Mode :character Median :42.9000 Median :62.50
## Mean : 54.50 Mean :42.0254 Mean :61.99
## 3rd Qu.: 81.25 3rd Qu.:53.9062 3rd Qu.:72.71
## Max. :108.00 Max. :79.3750 Max. :92.50
## x3 x4 x5 x6
## Min. :11.76 Min. : 5.00 Min. : 5.00 Min. : 0.00
## 1st Qu.:48.44 1st Qu.:34.72 1st Qu.:34.72 1st Qu.:17.50
## Median :59.05 Median :47.70 Median :47.70 Median :26.88
## Mean :57.71 Mean :46.93 Mean :46.93 Mean :27.83
## 3rd Qu.:67.81 3rd Qu.:57.83 3rd Qu.:57.83 3rd Qu.:36.24
## Max. :89.47 Max. :82.46 Max. :82.46 Max. :60.00
print(serv_municipales)
## # A tibble: 108 × 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
## 7 7 JUAYUA 65.6 82.5 75 67.5 67.5 58.8
## 8 8 SAN SALVADOR 42.1 67.3 56.6 56.3 56.3 25.7
## 9 9 SAN PABLO TACACHICO 64.4 76.3 77.5 53.7 53.7 30
## 10 10 TEPECOYO 64.5 79.7 73.9 73.9 73.9 29.0
## # ℹ 98 more rows
# Seleccionar las variables para clustering y escalarlas
A_scaled <- serv_municipales %>% select(x1, x2, x3, x4, x5, x6) %>% scale()
# Método de la silueta
fviz_nbclust(A_scaled, kmeans, method = "silhouette") +
labs(title = "Método de la Silueta")
# Método del codo
fviz_nbclust(A_scaled, kmeans, method = "wss") +
labs(title = "Método del Codo")
Método del Codo: Busca el “codo” en el gráfico WSS, que muestra dónde la reducción de la variación dentro de los grupos disminuye drásticamente. Ese es el número óptimo de clústeres.
Método de la Silueta: El número óptimo de clústeres será aquel que maximice la anchura de la silueta.
** Clustering con la tecnica de K-Medias
# Fijar número óptimo de clústeres
set.seed(123) # Para reproducibilidad
kmeans_result <- kmeans(A_scaled, centers = 3, nstart = 25)
# Agregar los grupos al dataset original
serv_municipales$cluster <- kmeans_result$cluster
# Ver el dataset con los grupos asignados
head(serv_municipales)
## # A tibble: 6 × 9
## ID Municipio x1 x2 x3 x4 x5 x6 cluster
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
## 1 1 ATIQUIZAYA 79.4 80 87.5 67.5 67.5 47.5 2
## 2 2 EL CARMEN 75 78.1 71.9 68.8 68.8 37.5 2
## 3 3 ALEGRIA 71.9 78.9 89.5 82.5 82.5 50.9 2
## 4 4 SAN JULIAN 70.6 68.7 76.2 57.5 57.5 48.8 2
## 5 5 TEJUTLA 61.8 82.4 76.5 76.5 76.5 41.2 2
## 6 6 PASAQUINA 64.4 82.7 76.9 80.8 80.8 48.1 2
** Grafico bidimensional de los Municipios.
# Realizar PCA y guardar las dos primeras componentes principales
pca_result <- prcomp(A_scaled, center = TRUE, scale. = TRUE)
# Crear un dataframe con las dos primeras componentes y los grupos
pca_data <- data.frame(
PC1 = pca_result$x[, 1],
PC2 = pca_result$x[, 2],
Municipio = serv_municipales$Municipio,
Cluster = as.factor(serv_municipales$cluster)
)
# Graficar los clústeres en el espacio PCA
library(ggplot2)
ggplot(pca_data, aes(x = PC1, y = PC2, color = Cluster, label = Municipio)) +
geom_point(size = 3, alpha = 0.8) +
geom_text_repel(size = 3) +
labs(title = "Grupos en espacio PCA",
x = "Componente Principal 1",
y = "Componente Principal 2") +
theme_minimal()
## Warning: ggrepel: 44 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps