Analizando variables sociodemograficas en Municipios de Cuyo
Consigna
En el link que sigue, encontrarán un artículo científico en el que se evalúan las características de los departamentos de las provincias de Cuyo, desde un punto de vista socioeconómico. Se usará para el analisis la misma base de datos utilizadas por los autores de paper.
El objetivo del presente trabajo es que:
Reproducir, en la medida de lo posible, los análisis estadísticos realizados por los autores
Realizar una crítica respecto de los análisis y de las decisiones tonadas por los autores para realizarlos.
Propuesta de alternativas a lo hecho por los autores.
Desarrollo
library(tidyverse)
library(cluster)
library(factoextra)
library(dplyr)
library(psych)
library(haven)Consigna 1. Reproducción del trabajo
2- Exploramos
## Rows: 71
## Columns: 45
## $ N_ORDEN <chr> "C7", "M1", "M15", "M3", "M4", "M7", "R17", "R2", "R3", "R5",…
## $ DEPART <chr> "CAPITAL", "CAPITAL", "S RAFAEL", "GOD CRUZ", "GUAYMALL", "LA…
## $ DEPTO <chr> "C049", "M007", "M105", "M021", "M028", "M049", "R126", "R014…
## $ PURBANA <dbl> 99.7, 100.0, 65.6, 100.0, 91.7, 94.9, 0.0, 97.9, 0.0, 84.4, 9…
## $ MIGINTPR <dbl> 13.9, 18.4, 7.4, 13.4, 14.2, 14.6, 8.7, 19.0, 9.5, 16.7, 6.2,…
## $ MIGLIMIT <dbl> 0.2, 4.0, 1.2, 2.4, 4.0, 3.4, 0.2, 0.3, 0.0, 0.2, 0.6, 0.6, 0…
## $ HOGNBI <dbl> 15.5, 9.7, 17.6, 9.6, 13.4, 17.3, 19.8, 17.1, 19.5, 24.4, 16.…
## $ VSINAGUA <dbl> 0.9, 5.1, 26.6, 0.6, 11.3, 12.2, 7.2, 2.6, 3.5, 14.7, 8.9, 6.…
## $ VSINELEC <dbl> 4.9, 0.6, 7.7, 0.4, 1.4, 2.2, 7.8, 6.7, 10.3, 16.7, 3.3, 2.9,…
## $ HSINGAS <dbl> 5.8, 0.6, 6.7, 0.5, 1.4, 2.2, 21.5, 5.5, 27.9, 21.5, 4.5, 4.0…
## $ CONDESAG <dbl> 46.4, 82.5, 15.0, 60.2, 32.8, 57.0, 0.0, 40.7, 0.1, 1.2, 1.2,…
## $ MORTINF <dbl> 35.1, 17.7, 22.4, 19.3, 18.1, 23.0, 30.3, 30.3, 13.0, 16.9, 5…
## $ MORTNEON <dbl> 27.1, 12.2, 15.5, 13.9, 11.9, 14.4, 20.2, 20.2, 2.6, 8.7, 34.…
## $ NACVIV20 <dbl> 17.8, 8.0, 14.8, 12.8, 11.5, 13.8, 10.7, 18.2, 17.9, 13.2, 15…
## $ SINCOBSA <dbl> 24.8, 29.8, 42.1, 52.1, 41.4, 43.6, 20.4, 26.2, 26.2, 36.1, 4…
## $ ESCMEDIO <dbl> 62.7, 68.0, 53.1, 64.4, 58.9, 53.0, 49.5, 58.7, 41.1, 57.6, 5…
## $ ANALFAB <dbl> 1.9, 1.6, 6.4, 1.9, 3.0, 3.1, 4.1, 2.6, 3.2, 3.8, 3.4, 3.0, 1…
## $ ASISHTPI <dbl> 15.3, 13.0, 31.4, 16.9, 23.2, 23.3, 19.2, 14.8, 17.3, 25.8, 2…
## $ PRPERHOG <dbl> 4.3, 3.3, 3.8, 3.9, 3.9, 4.1, 4.4, 4.3, 3.8, 4.1, 4.3, 4.2, 3…
## $ JEFMUJER <dbl> 26.4, 28.9, 18.8, 21.3, 18.9, 18.3, 20.2, 24.4, 25.7, 24.2, 1…
## $ VIVPREC <dbl> 3.9, 5.8, 5.9, 5.0, 5.7, 7.0, 6.3, 5.3, 2.6, 10.1, 9.0, 10.9,…
## $ IRRTENVI <dbl> 11.8, 15.2, 20.9, 15.0, 17.5, 18.8, 20.2, 15.5, 15.6, 14.0, 2…
## $ TASACTTO <dbl> 55.4, 54.6, 53.7, 54.2, 56.7, 57.7, 62.3, 58.3, 54.4, 57.7, 5…
## $ TASACTMU <dbl> 42.2, 41.3, 33.8, 37.0, 36.9, 37.6, 47.2, 44.0, 38.8, 41.8, 3…
## $ TASDESTO <dbl> 6.6, 5.2, 6.3, 6.5, 6.1, 6.5, 2.6, 4.8, 1.6, 5.8, 9.2, 7.1, 6…
## $ TASDESMU <dbl> 8.3, 5.9, 8.3, 9.4, 8.5, 9.5, 2.5, 6.6, 3.8, 7.4, 13.7, 9.5, …
## $ ASALPUBL <dbl> 39.5, 26.1, 17.1, 24.2, 17.1, 19.8, 50.8, 32.6, 46.7, 40.9, 2…
## $ CTAPROP <dbl> 17.4, 25.8, 25.1, 26.2, 27.2, 27.0, 16.0, 15.8, 18.8, 18.3, 2…
## $ PRECASAL <dbl> 20.3, 29.9, 34.9, 29.9, 37.2, 38.3, 16.6, 22.0, 25.9, 23.8, 3…
## $ FAC1_1 <dbl> -1.71962772, -1.30612857, -0.30485744, -1.39722778, -1.030000…
## $ FAC2_1 <dbl> -0.31685745, 0.49476898, -0.57918405, -0.23341815, 0.19090812…
## $ FAC3_1 <dbl> -1.19599872, -0.12633483, 0.37081113, 0.16172452, 0.90188825,…
## $ FAC4_1 <dbl> 0.95497155, -0.77827105, 0.25271348, -0.28774539, -0.27794023…
## $ FAC5_1 <dbl> -0.4895996, -3.8661439, -0.6455738, -1.6717679, -1.6326723, -…
## $ FAC6_1 <dbl> -0.37488382, 0.68258338, 0.36779595, 1.11595144, 0.50931927, …
## $ PCIA <chr> "CAT", "MZA", "MZA", "MZA", "MZA", "MZA", "RJA", "RJA", "RJA"…
## $ D1 <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, …
## $ D2 <dbl+lbl> 1, 2, 1, 1, 2, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, 2, …
## $ D3 <dbl+lbl> 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, …
## $ D4 <dbl+lbl> 2, 1, 2, 1, 1, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 2, …
## $ D5 <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 2, …
## $ QCL_1 <dbl> 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1…
## $ ESTRAT <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, …
## $ CLU11_1 <dbl> 2, 9, 10, 10, 10, 10, 1, 2, 1, 1, 7, 2, 8, 2, 1, 10, 6, 10, 1…
## $ FILT <dbl> 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, NA, 1, 1, 1, 1, 1, 1, 1…
3- Análisis factorial de las variables
# Análisis factorial de componentes principales
# Selección de las variables
cols_to_keep <- setdiff(4:29, which(names(data) == "HOGNBI"))
data_selected <- data[, cols_to_keep]
# Estandarización de los datos
data_selected <- scale(data_selected)
# Análisis factorial
pca_vista <- prcomp(data_selected)
# Resultados
a<-t(summary(pca_vista)$importance)
a## Standard deviation Proportion of Variance Cumulative Proportion
## PC1 2.6779841 0.28686 0.28686
## PC2 2.3893151 0.22835 0.51522
## PC3 1.8389415 0.13527 0.65049
## PC4 1.3660362 0.07464 0.72513
## PC5 1.1343204 0.05147 0.77659
## PC6 1.1003635 0.04843 0.82503
## PC7 0.9160115 0.03356 0.85859
## PC8 0.8014788 0.02569 0.88428
## PC9 0.7149442 0.02045 0.90473
## PC10 0.6872701 0.01889 0.92362
## PC11 0.6224689 0.01550 0.93912
## PC12 0.5350421 0.01145 0.95057
## PC13 0.5158141 0.01064 0.96122
## PC14 0.4812665 0.00926 0.97048
## PC15 0.4060375 0.00659 0.97708
## PC16 0.3488366 0.00487 0.98194
## PC17 0.3287762 0.00432 0.98627
## PC18 0.2910335 0.00339 0.98965
## PC19 0.2713261 0.00294 0.99260
## PC20 0.2135991 0.00182 0.99442
## PC21 0.2074894 0.00172 0.99615
## PC22 0.1975962 0.00156 0.99771
## PC23 0.1575915 0.00099 0.99870
## PC24 0.1403564 0.00079 0.99949
## PC25 0.1129606 0.00051 1.00000
Tal como indica el documento, el resumen del output del análisis factorial de componentes principales demuestra que las primeras 6 componentes acumulan el 82,5% de la varianza de los datos, mientras que las primeras 5 componentes acumulan el 77.7% de la varianza de los datos. Nos quedaremos con las 5 primeras componentes y veremos cuáles variables tienen mayor peso para las mismas
# utilizamos otra libreria para poder rotar
pca<-principal(data_selected, nfactors = 5, rotate = "varimax")
# peso de cada variable en cada componente
print(pca$Structure)##
## Loadings:
## RC1 RC2 RC3 RC4 RC5
## PURBANA -0.695 0.378 -0.152 0.412
## MIGINTPR -0.248 -0.600 -0.134 -0.161 0.331
## MIGLIMIT -0.107 -0.844
## VSINAGUA 0.870 -0.104
## VSINELEC 0.669 -0.373 0.454 0.144
## HSINGAS 0.635 -0.459 0.567
## CONDESAG -0.579 -0.469 0.183 0.178
## MORTINF 0.879 0.176
## MORTNEON -0.146 0.920 0.114
## NACVIV20 0.200 0.582 -0.412
## SINCOBSA 0.676 -0.224 0.613
## ESCMEDIO -0.906 0.141
## ANALFAB 0.856
## ASISHTPI 0.854 -0.111 -0.174 0.194
## PRPERHOG 0.204 0.373 0.218 -0.366 -0.404
## JEFMUJER -0.153 -0.506 0.601 0.341 0.338
## VIVPREC 0.739 0.290
## IRRTENVI 0.424 0.618 -0.174 -0.289 -0.252
## TASACTTO 0.324 -0.572 -0.136 0.538
## TASACTMU -0.660 0.199 0.601 0.108
## TASDESTO -0.340 0.847 -0.146 0.103
## TASDESMU -0.195 0.906 -0.138
## ASALPUBL -0.130 -0.507 0.727 -0.303
## CTAPROP 0.127 -0.134 0.344 0.761
## PRECASAL 0.200 0.459 -0.670 -0.258 0.267
##
## RC1 RC2 RC3 RC4 RC5
## SS loadings 6.429 4.470 3.525 3.084 1.907
## Proportion Var 0.257 0.179 0.141 0.123 0.076
## Cumulative Var 0.257 0.436 0.577 0.700 0.777
Las cargas factoriales son los coeficientes de correlación entre las variables originales y los componentes principales. Estas nos indican cuánto “pesa” cada variable original en cada componente principal. Valores más altos (positivos o negativos) indican una mayor importancia de esa variable en el componente. El rango va de -1 a 1.
Varianza explicada por los factores seleccionados después de la rotación:
RC1: 25.7% RC2: 17.9% RC3: 14.1% RC4: 12.3% RC5: 7.6%
Varianza acumulada explicada:
Hasta RC5: 77.7%
El análisis de componentes principales con rotación varimax permitió identificar, como expresamos anteriormente, 5 componentes principales que explican el 77.7% de la varianza total en los datos originales
4- Agrupamiento de municipios
# selecciono los valores obtenidos por el análisis factorial de las primeras 5 componentes
data_pca<-data.frame(pca$scores)# Agrupamiento en clusters
set.seed(123)
agrupamiento <- kmeans(data_pca, centers = 4, iter.max = 10)
# Añadir el resultado del clustering a los datos originiales
data$cluster <- as.factor(agrupamiento$cluster)
# Evaluar la asociación con el % de hogares con NBI
anova_res <- aov(HOGNBI ~ cluster, data = data)
summary(anova_res)## Df Sum Sq Mean Sq F value Pr(>F)
## cluster 3 5590 1863.3 21.09 0.000000000994 ***
## Residuals 67 5921 88.4
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Visualización
fviz_cluster(agrupamiento,
data = data_selected,
geom = "point",
ellipse.type = "norm",
ggtheme = theme_minimal()
)## RC1 RC2 RC3 RC4 RC5
## 1 0.55718929 0.6754694 -0.9472887 -0.3254229 -0.3481879
## 2 0.03923779 -0.6900750 0.6722492 -0.3582395 -0.1937678
## 3 -0.87575449 0.3909002 -0.1360285 0.5254872 0.5213686
## 4 2.61670414 -0.6576092 1.0855587 3.1938285 1.0778261
##
## 1 2 3 4
## CAT 0 11 3 2
## MZA 10 0 8 0
## RJA 0 16 2 0
## SJU 10 2 7 0
Consigna 2. Críticas del trabajo
El documento tiene un planteo consistente con el objetivo para abordar el problema, primero define una reducción de dimensionalidad para encontrar variables que correlacionen mejor entre ellas y luego realizando un agrupamiento de las unidades de análisis (municipios seleccionados) en clústers con un método de aprendizaje no supervisado lo cual es razonable ya que no parte de información previamente etiquetada.
Sin embargo algunas críticas pueden realizarse al documento.
1. En primer lugar no menciona las técnicas utilizadas para preprocesar los datos. En este sentido, no se menciona nada sobre el preprocesamiento los datos (potenciales NAs y su tratamiento, transformación (imputación, estandarización, codificación, división, etc) aunque podemos suponer que sí se ha realizado este paso ya que es crucial para cualquier método multivariado.
2El documento parte de la suposición de que se cumplen los supuestos necesarios para proceder con el análisis factorial.
3 Conceptualmente resulta confuso como se referien de Analisis Factorial y Analisis de Componentes Principales. Deberían abordar el desarrollo con mayor precision conceptual
4 Las justificaciones para excluir el sexto factor son sólidas y la cantidad de varianza explicada por los cinco factores retenidos es adecuada.
5 La selección de la cantidad de clústers se sustenta en los 5 “puntajes factoriales” identificados y a partir de los cuales se conformaron 4 estratos. Se podría haber realizado las pruebas de Kaiser-Meyer-Olkin (KMO) y el Test de Bartlett. El Test de Bartlett verifica si las correlaciones entre las variables son significativamente diferentes de cero. Un p-valor menor a 0.05 indica que el análisis factorial es apropiado. Por su parte el KMO mide la adecuación del muestreo para el análisis factorial. Un valor de KMO mayor a 0.6 es generalmente considerado adecuado.
Consigna 3. sugerencias al trabajo
Método de Estratificación: K-Medias
La elección del método de k-medias (k-means) para la estratificación en la ponencia es una decisión acertada debido a su simplicidad y eficiencia. Sin embargo, la determinación del número óptimo de clusters es un paso crucial que requiere un enfoque más riguroso para asegurar que los grupos resultantes sean representativos y significativos. En la ponencia, se seleccionaron cuatro clusters sin una justificación detallada, lo que podría llevar a una segmentación subóptima.
Para mejorar esta etapa del análisis, proponemos el uso del Método de la Silueta (Silhouette Method) para determinar el número óptimo de clusters. Esto proporcionará una base más sólida y objetiva para la selección del número de clusters, asegurando que los grupos identificados reflejen diferencias significativas y coherentes en los datos.
# Estandarización de las variables
columnas <- c("PURBANA", "MIGINTPR", "MIGLIMIT", "VSINAGUA", "VSINELEC", "HSINGAS", "CONDESAG", "MORTINF", "MORTNEON", "NACVIV20", "SINCOBSA", "ESCMEDIO", "ANALFAB", "ASISHTPI", "PRPERHOG", "JEFMUJER", "VIVPREC", "IRRTENVI", "TASACTTO", "TASACTMU", "TASDESTO", "TASDESMU", "ASALPUBL", "CTAPROP", "PRECASAL")
indicadores_std <- scale(data[, columnas])
KMO(indicadores_std)## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = indicadores_std)
## Overall MSA = 0.73
## MSA for each item =
## PURBANA MIGINTPR MIGLIMIT VSINAGUA VSINELEC HSINGAS CONDESAG MORTINF
## 0.78 0.63 0.74 0.83 0.79 0.84 0.81 0.56
## MORTNEON NACVIV20 SINCOBSA ESCMEDIO ANALFAB ASISHTPI PRPERHOG JEFMUJER
## 0.57 0.73 0.74 0.79 0.75 0.83 0.64 0.68
## VIVPREC IRRTENVI TASACTTO TASACTMU TASDESTO TASDESMU ASALPUBL CTAPROP
## 0.75 0.77 0.65 0.71 0.73 0.78 0.68 0.57
## PRECASAL
## 0.67
# Determinación del número óptimo de clusters utilizando el Método de la Silueta
set.seed(123)
silhouette_analysis <- fviz_nbclust(indicadores_std, kmeans, method = "silhouette") +
labs(subtitle = "Silhouette method")
print(silhouette_analysis)
La mayoría de las variables tienen un KMO aceptable (por encima de
0.60), lo que indica que son adecuadas para el análisis. Por su parte el
gráfico de Silhouette muestra 6 clusters.
set.seed(123)
kmeans_res <- kmeans(indicadores_std, centers = 6, nstart = 25)
# Añadir el resultado del clustering a los datos
data$cluster <- as.factor(kmeans_res$cluster)
# Visualización de los clusters
fviz_cluster(kmeans_res, data = indicadores_std, geom = "point", ellipse.type = "norm")# Validar los clusters mediante el ancho de silueta
silhouette_score <- silhouette(kmeans_res$cluster, dist(indicadores_std))
fviz_silhouette(silhouette_score)## cluster size ave.sil.width
## 1 1 4 0.11
## 2 2 25 0.23
## 3 3 12 0.28
## 4 4 15 0.15
## 5 5 14 0.25
## 6 6 1 0.00
# Evaluar la asociación con el % de hogares con NBI
anova_res <- aov(HOGNBI ~ cluster, data = data)
summary(anova_res)## Df Sum Sq Mean Sq F value Pr(>F)
## cluster 5 7102 1420.5 20.95 0.00000000000209 ***
## Residuals 65 4408 67.8
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Caracterización de cada cluster
cluster_summary <- data %>%
group_by(cluster) %>%
summarise(across(c(PURBANA, MIGINTPR, MIGLIMIT, VSINAGUA, VSINELEC, HSINGAS, CONDESAG, MORTINF, MORTNEON, NACVIV20, SINCOBSA, ESCMEDIO, ANALFAB, ASISHTPI, PRPERHOG, JEFMUJER, VIVPREC, IRRTENVI, TASACTTO, TASACTMU, TASDESTO, TASDESMU, ASALPUBL, CTAPROP, PRECASAL), mean))
print(cluster_summary)## # A tibble: 6 × 26
## cluster PURBANA MIGINTPR MIGLIMIT VSINAGUA VSINELEC HSINGAS CONDESAG MORTINF
## <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 7.02 18.8 0.1 58.4 63.1 71.5 1.2 28.0
## 2 2 29.1 11.0 0.224 23.3 25.9 44.0 1.70 19.0
## 3 3 45.5 4.47 0.808 38.0 14.3 21.5 3.18 10.2
## 4 4 93.8 12.3 1.29 5.66 4.52 6.93 27.4 27.8
## 5 5 54.5 11.0 2.19 30.6 8.65 9.79 15.2 23.3
## 6 6 0 3.2 0.1 48.9 72.7 84.8 0.5 49
## # ℹ 17 more variables: MORTNEON <dbl>, NACVIV20 <dbl>, SINCOBSA <dbl>,
## # ESCMEDIO <dbl>, ANALFAB <dbl>, ASISHTPI <dbl>, PRPERHOG <dbl>,
## # JEFMUJER <dbl>, VIVPREC <dbl>, IRRTENVI <dbl>, TASACTTO <dbl>,
## # TASACTMU <dbl>, TASDESTO <dbl>, TASDESMU <dbl>, ASALPUBL <dbl>,
## # CTAPROP <dbl>, PRECASAL <dbl>
El ancho promedio de silueta es 0.21, lo que indica una estructura de clústeres débil a moderada. Se muestran 6 clústeres, donde los clusters 2, 3 y 4 parecen tener los anchos de silueta más altos, sugiriendo que son más cohesivos y están bien separados.El cluster 6 pareceria ser un outlier.
Con respecto al ANOVA, el valor p es extremadamente bajo (2.09e-12), mucho menor que el nivel de significancia típico de 0.05. Este resultado es altamente significativo, lo que sugiere que hay diferencias muy significativas en el porcentaje de hogares con NBI entre los diferentes clústeres. Por su parte un alto valor F (20.95) también indica que hay más variabilidad entre los grupos (clústeres) que dentro de los grupos, lo cual es deseable en un análisis de clústeres.
##Conclusión
En general, los resultados sugieren que los datos son adecuados para el análisis de componentes principales, aunque hay margen de mejora.