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:

  1. Determine el número óptimo de grupos

  1. 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
X<-serv_municipales

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