Ejercicio preparcial
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
Los datos están disponibles en: https://drive.google.com/file/d/1GxFJXvaJJiLIa_XH3DPaFE5UDzcds9Yn/view?usp=sharing
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:
- Determine el número óptimo de grupos
- Represente en un grafico bidimensional los grupos (mostrando los nombres de los municipios), use componentes principales para reducir las x’s a 2 componentes.
Lectura de datos en R
# Cargar las librerías necesarias
library(tidyverse)
library(cluster)
library(factoextra)
library(FactoMineR)
# Cargar el archivo RData
load("C:/Users/User/Desktop/documents_rstudio/ciclo_6/serv_municipales.RData")
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
Preparación de los datos
Se selecciona únicamente las variables X (las variables explicativas) para el análisis, por lo que se excluye cualquier columna que no sea relevante (como nombres o identificadores)
# Seleccionar las variables X
X1 <- serv_municipales %>% select(-Municipio) # Ajusta 'municipio' según la columna identificadora
print(X1)## # A tibble: 108 × 7
## ID x1 x2 x3 x4 x5 x6
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 79.4 80 87.5 67.5 67.5 47.5
## 2 2 75 78.1 71.9 68.8 68.8 37.5
## 3 3 71.9 78.9 89.5 82.5 82.5 50.9
## 4 4 70.6 68.7 76.2 57.5 57.5 48.8
## 5 5 61.8 82.4 76.5 76.5 76.5 41.2
## 6 6 64.4 82.7 76.9 80.8 80.8 48.1
## 7 7 65.6 82.5 75 67.5 67.5 58.8
## 8 8 42.1 67.3 56.6 56.3 56.3 25.7
## 9 9 64.4 76.3 77.5 53.7 53.7 30
## 10 10 64.5 79.7 73.9 73.9 73.9 29.0
## # ℹ 98 more rows
Determinación del número óptimo de grupos
# Método de la silueta
fviz_nbclust(X1, kmeans, method = "silhouette") +
labs(title = "Metodo de la Silueta")El método de la silueta evalúa la calidad de los clústeres creados basándose en cómo de compactos y separados están, es decir que mide qué tan cerca están los puntos dentro de un clúster entre sí, en comparación con los puntos en otros clústeres.
Para este ejercicio se ha tomado la técnica de la silueta porque es más robusto que el método del codo ya que evalúa tanto la cohesión como la separación de los clústeres. Al observar el gráfico el índice de silueta alcanza su valor máximo en k=2, por lo que sería el número óptimo de grupo.
Aplicación del algoritmo K-medias
# Ajuste del modelo K-medias con k óptimo
k <- 2 # Cambia este valor por el número óptimo obtenido
km_result <- kmeans(X1, centers = k, nstart = 25)
# Agregar los grupos al dataset original
serv_municipales <- serv_municipales %>%
mutate(cluster = factor(km_result$cluster))
print(serv_municipales)## # A tibble: 108 × 9
## ID Municipio x1 x2 x3 x4 x5 x6 cluster
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <fct>
## 1 1 ATIQUIZAYA 79.4 80 87.5 67.5 67.5 47.5 1
## 2 2 EL CARMEN 75 78.1 71.9 68.8 68.8 37.5 1
## 3 3 ALEGRIA 71.9 78.9 89.5 82.5 82.5 50.9 1
## 4 4 SAN JULIAN 70.6 68.7 76.2 57.5 57.5 48.8 1
## 5 5 TEJUTLA 61.8 82.4 76.5 76.5 76.5 41.2 1
## 6 6 PASAQUINA 64.4 82.7 76.9 80.8 80.8 48.1 1
## 7 7 JUAYUA 65.6 82.5 75 67.5 67.5 58.8 1
## 8 8 SAN SALVADOR 42.1 67.3 56.6 56.3 56.3 25.7 1
## 9 9 SAN PABLO TACACHICO 64.4 76.3 77.5 53.7 53.7 30 1
## 10 10 TEPECOYO 64.5 79.7 73.9 73.9 73.9 29.0 1
## # ℹ 98 more rows
Análisis de componentes principales
pca_result <- PCA(X1, graph = FALSE)
# Coordenadas de las dos primeras componentes principales
pca_coords <- as.data.frame(pca_result$ind$coord[, 1:2])
# Agregar los municipios y grupos
pca_coords <- cbind(pca_coords, municipio = serv_municipales$Municipio,
cluster = serv_municipales$cluster)
print(pca_coords)## Dim.1 Dim.2 municipio cluster
## 1 4.21848048 8.891289e-02 ATIQUIZAYA 1
## 2 3.47582031 3.083538e-01 EL CARMEN 1
## 3 4.83495716 -1.115545e-01 ALEGRIA 1
## 4 2.93162493 -5.559963e-01 SAN JULIAN 1
## 5 3.81388030 8.893708e-02 TEJUTLA 1
## 6 4.24499948 -2.804010e-01 PASAQUINA 1
## 7 3.80942768 -1.079249e+00 JUAYUA 1
## 8 1.08324715 7.871149e-02 SAN SALVADOR 1
## 9 2.35563567 6.887314e-01 SAN PABLO TACACHICO 1
## 10 3.28375670 8.350504e-01 TEPECOYO 1
## 11 4.28422682 -7.347730e-01 ANTIGUO CUSCATLAN 1
## 12 1.83264951 -5.495892e-01 SAN VICENTE 1
## 13 3.76666939 -1.046025e+00 CIUDAD ARCE 1
## 14 2.81602317 -4.481581e-05 EL PAISNAL 1
## 15 2.20311566 -1.616700e+00 SAN RAFAEL CEDROS 1
## 16 2.01063809 -1.719924e+00 AYUTUXTEPEQUE 1
## 17 1.39056680 2.561875e-02 SAN FRANCISCO GOTERA 1
## 18 1.30828260 -1.531519e-01 SANTIAGO NONUALCO 1
## 19 1.34943324 -1.432982e+00 SANTA ROSA DE LIMA 1
## 20 1.79078799 -7.690808e-01 SANTA MARIA OSTUMA 1
## 21 1.43323430 -4.852331e-01 CIUDAD BARRIOS 1
## 22 2.50616650 -7.985213e-01 CHINAMECA 1
## 23 2.44717353 -1.126700e+00 NUEVA CONCEPCION 1
## 24 1.27124683 1.018107e+00 JUJUTLA 1
## 25 1.23717542 4.182728e-01 ZACATECOLUCA 1
## 26 3.07917010 8.972520e-01 EL ROSARIO 1
## 27 3.71356391 2.959702e-02 NEJAPA 1
## 28 0.43365220 6.831143e-01 NUEVA GUADALUPE 1
## 29 3.07065294 1.931084e+00 ARMENIA 1
## 30 0.22336094 -4.565776e-01 HUIZUCAR 1
## 31 1.95558752 6.520026e-01 SANTA CRUZ MICHAPA 1
## 32 2.36620893 -2.438454e-01 SUCHITOTO 1
## 33 1.97820050 -1.415836e+00 SAN PEDRO MASAHUAT 1
## 34 0.06795951 -1.769697e-01 SAN JUAN NONUALCO 1
## 35 0.88816916 -6.154937e-01 APASTEPEQUE 1
## 36 -0.22164852 7.514392e-01 CORINTO 1
## 37 1.76952174 -3.094890e-01 SAN LUIS TALPA 1
## 38 0.18701032 1.187904e+00 ANAMOROS 1
## 39 -1.07399969 1.654755e-01 BERLIN 1
## 40 -0.87977551 2.806718e-01 EL TRANSITO 1
## 41 0.95697006 1.050193e+00 LA LIBERTAD 1
## 42 1.00088426 -2.287805e-01 PANCHIMALCO 1
## 43 0.66152917 4.334808e-01 MONCAGUA 1
## 44 1.33249695 1.538275e-01 COJUTEPEQUE 1
## 45 2.55080527 1.037471e+00 SAN PEDRO PERULAPAN 1
## 46 0.54558066 2.773417e-01 TEXISTEPEQUE 1
## 47 0.08398236 4.371576e-01 SAN JOSE VILLANUEVA 1
## 48 -0.45003852 4.870844e-01 CHIRILAGUA 1
## 49 -1.17784580 -7.465101e-01 ILOPANGO 2
## 50 0.12318435 7.271858e-01 TONACATEPEQUE 1
## 51 0.20859903 4.708865e-01 TECOLUCA 1
## 52 1.44934282 1.263346e+00 SAN BARTOLOME PERULAPIA 1
## 53 -2.23791199 6.996948e-01 SENSUNTEPEQUE 2
## 54 0.16434570 5.299250e-01 SANTA ELENA 1
## 55 0.45912462 -1.619429e-01 IZALCO 1
## 56 0.46548848 -1.410768e+00 AHUACHAPAN 1
## 57 0.65122164 -2.164788e-01 CHALATENANGO 1
## 58 0.37971150 1.319032e+00 SAN SEBASTIAN 1
## 59 -0.05511091 -5.149601e-03 SAN MIGUEL 1
## 60 -0.17480584 5.621308e-01 CONCHAGUA 2
## 61 -2.50606539 -1.219854e+00 EL CONGO 2
## 62 -0.39407158 -7.262705e-01 LOLOTIQUE 2
## 63 0.52854494 -2.786929e-01 CANDELARIA DE LA FRONTERA 1
## 64 -0.33154537 8.841211e-01 LISLIQUE 2
## 65 -1.31553108 -3.898219e-01 USULUTAN 2
## 66 -0.67952905 2.465998e-01 ZARAGOZA 2
## 67 -0.14135409 1.116479e-01 METAPAN 2
## 68 1.11881309 2.313585e-01 SANTA TECLA 1
## 69 -1.17593828 -4.014262e-01 SOYAPANGO 2
## 70 1.27262607 1.023484e+00 CALUCO 1
## 71 -2.75443747 -1.078945e+00 SAN ANTONIO DEL MONTE 2
## 72 0.34677599 -1.602704e+00 SONSONATE 2
## 73 -1.24962306 1.463188e+00 SAN ALEJO 2
## 74 0.10902910 1.790591e-01 ILOBASCO 2
## 75 -0.34689124 -6.784629e-01 SANTIAGO TEXACUANGOS 2
## 76 -1.81429478 5.204072e-02 SANTIAGO DE MARIA 2
## 77 -1.86514971 1.313588e+00 NAHUIZALCO 2
## 78 -1.03983679 2.791219e-01 COLON 2
## 79 0.58844240 9.493232e-01 SANTO TOMAS 2
## 80 -1.23529887 9.664532e-01 COATEPEQUE 2
## 81 -1.59020192 -1.202140e+00 GUAYMANGO 2
## 82 -3.68760498 -5.716199e-01 SAN MARTIN 2
## 83 -1.10795100 -1.044307e-01 COMASAGUA 2
## 84 -1.52616409 -2.436972e-01 TAMANIQUE 2
## 85 -0.78308646 -6.274143e-01 APOPA 2
## 86 -2.39131683 4.000350e-02 DELGADO 2
## 87 -1.62490164 1.011975e+00 JUCUAPA 2
## 88 -2.21010227 -2.349707e-01 ACAJUTLA 2
## 89 -2.57610772 4.288981e-01 TACUBA 2
## 90 -3.18186938 -1.084764e-01 SAN LUIS DE LA HERRADURA 2
## 91 -1.78302053 9.670574e-01 OLOCUILTA 2
## 92 -3.57049219 2.535826e-01 PUERTO EL TRIUNFO 2
## 93 -3.85990861 1.103520e-02 JIQUILISCO 2
## 94 -2.32510989 -6.962887e-02 SAN MARCOS 2
## 95 -3.12167496 -2.466899e-01 QUEZALTEPEQUE 2
## 96 -2.32165663 3.724498e-01 MEJICANOS 2
## 97 -2.10987741 -9.765318e-01 AGUILARES 2
## 98 -3.76948796 -8.982304e-01 SAN SEBASTIAN SALITRILLO 2
## 99 -3.42446864 -4.031060e-01 SANTA ANA 2
## 100 -3.49479321 4.366667e-01 CUSCATANCINGO 2
## 101 -0.81224802 -6.691707e-01 GUAZAPA 2
## 102 -0.89206277 1.336033e+00 CHALCHUAPA 2
## 103 -1.95407188 -7.415206e-01 JUCUARAN 2
## 104 -3.57631362 1.730420e-02 SONZACATE 2
## 105 -3.33288749 6.610228e-01 SAN JUAN OPICO 2
## 106 -6.35886594 -3.221081e-01 TALNIQUE 2
## 107 -3.88310963 3.876894e-01 LA UNION 2
## 108 -6.03971675 -9.580166e-01 SAN FRANCISCO MENENDEZ 2
Gráfico bidimensional
# Gráfica de los grupos con ggplot2
ggplot(pca_coords, aes(Dim.1, Dim.2, color = cluster)) +
# Agregar los puntos
geom_point(size = 4, alpha = 0.7) +
# Ajuste de las etiquetas de los municipios con ggrepel para evitar solapamientos
ggrepel::geom_text_repel(aes(label = municipio),
size = 3,
box.padding = 0.3,
point.padding = 0.2,
max.overlaps = 20) +
# Uso de un tema claro y limpio
theme_minimal(base_size = 14) +
# Personalización de los títulos y las etiquetas
labs(title = "Grupos de Municipios (K-medias)",
x = "Componente Principal 1",
y = "Componente Principal 2",
color = "Grupo") +
# Mejoramiento de la paleta de colores
scale_color_brewer(palette = "Set2") +
# Ajuste del rango de los ejes para dar más espacio entre los puntos
scale_x_continuous(expand = expansion(mult = 0.1)) +
scale_y_continuous(expand = expansion(mult = 0.1))## Warning: ggrepel: 2 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps