library(readxl)
library(DT)
Departamentos <- read_excel("Departamentos.xlsx", sheet = "Hoja3")
DT::datatable(Departamentos)
library(raster)
colombia_pais <- getData(name = "GADM", country = "COL", level = 0)
class(colombia_pais)
## [1] "SpatialPolygonsDataFrame"
## attr(,"package")
## [1] "sp"
colombia_depto <- getData(name = "GADM", country = "COL", level = 1)
#plot(colombia_depto)
colombia_depto2 <- readRDS("gadm36_COL_1_sp.rds")
#plot(colombia_depto2)
library(sf)
library(rgeos)
prueba <- st_as_sf(colombia_depto2)
head(prueba, 5)
## Simple feature collection with 5 features and 10 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -77.149 ymin: -4.228429 xmax: -69.36835 ymax: 11.10792
## CRS:           +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0
##    GID_0   NAME_0   GID_1    NAME_1 VARNAME_1 NL_NAME_1       TYPE_1
## 1    COL Colombia COL.1_1  Amazonas      <NA>      <NA>    Comisaría
## 12   COL Colombia COL.2_1 Antioquia      <NA>      <NA> Departamento
## 23   COL Colombia COL.3_1    Arauca      <NA>      <NA>  Intendencia
## 27   COL Colombia COL.4_1 Atlántico      <NA>      <NA> Departamento
## 28   COL Colombia COL.5_1   Bolívar      <NA>      <NA> Departamento
##      ENGTYPE_1 CC_1 HASC_1                       geometry
## 1  Commissiary <NA>  CO.AM MULTIPOLYGON (((-69.43138 -...
## 12  Department <NA>  CO.AN MULTIPOLYGON (((-76.99986 8...
## 23  Intendancy <NA>  CO.AR MULTIPOLYGON (((-69.92316 6...
## 27  Department <NA>  CO.AT MULTIPOLYGON (((-74.8816 10...
## 28  Department <NA>  CO.BL MULTIPOLYGON (((-75.79681 1...
Departamentos$Departamennto
##  [1] "Amazonas"                 "Antioquia"               
##  [3] "Arauca"                   "Atlántico"               
##  [5] "Bolívar"                  "Boyacá"                  
##  [7] "Caldas"                   "Caquetá"                 
##  [9] "Casanare"                 "Cauca"                   
## [11] "Cesar"                    "Chocó"                   
## [13] "Córdoba"                  "Cundinamarca"            
## [15] "Guainía"                  "Guaviare"                
## [17] "Huila"                    "La Guajira"              
## [19] "Magdalena"                "Meta"                    
## [21] "Nariño"                   "Norte de Santander"      
## [23] "Putumayo"                 "Quindío"                 
## [25] "Risaralda"                "San Andrés y Providencia"
## [27] "Santander"                "Sucre"                   
## [29] "Tolima"                   "Valle del Cauca"         
## [31] "Vaupés"                   "Vichada"
library(scales)
library(ggplot2)
library(dplyr)
prueba %>% 
  rename(Departamennto = NAME_1) %>% 
  left_join(y = Departamentos, by = "Departamennto") %>% 
  ggplot(mapping = aes(fill =`IDH 2020`)) +
  geom_sf(color = "white") +
  scale_fill_viridis_c(
    trans = "log10",
    breaks = trans_breaks(trans = "log10",
                          inv = function(x) round(10 ^ x, digits = 1))
  ) +
  theme_void()

library(scales)
prueba %>% 
  rename(Departamennto = NAME_1) %>% 
  left_join(y = Departamentos, by = "Departamennto") %>% 
  ggplot(mapping = aes(fill =`Tasa Homicidio 2016`)) +
  geom_sf(color = "white") +
  scale_fill_viridis_c(
    trans = "log10",
    breaks = trans_breaks(trans = "log10",
                          inv = function(x) round(10 ^ x, digits = 1))
  ) +
  theme_void()

Cluster- K means

El método K-means clustering (MacQueen, 1967) agrupa las observaciones en K clusters distintos, donde el número K lo determina el analista antes de ejecutar del algoritmo. K-means clustering encuentra los K mejores clusters, entendiendo como mejor cluster aquel cuya varianza interna (intra-cluster variation) sea lo más pequeña posible. Se trata por lo tanto de un problema de optimización, en el que se reparten las observaciones en K clusters de forma que la suma de las varianzas internas de todos ellos sea lo menor posible. Para poder solucionar este problema es necesario definir un modo de cuantificar la varianza interna.

library(tidyverse)
library(factoextra)
library(cowplot)
library(ggpubr)
library(cluster)
summary(Departamentos)
##  Departamennto        Municipios       Superficie     Tasa Homicidio 2016
##  Length:32          Min.   :  2.00   Min.   :    52   Min.   : 2.37      
##  Class :character   1st Qu.: 12.75   1st Qu.: 21448   1st Qu.:17.18      
##  Mode  :character   Median : 26.50   Median : 24548   Median :22.39      
##                     Mean   : 34.41   Mean   : 35644   Mean   :24.08      
##                     3rd Qu.: 41.25   3rd Qu.: 48137   3rd Qu.:29.84      
##                     Max.   :125.00   Max.   :109665   Max.   :51.18      
##     IDH 2020        Población          Densidad        
##  Min.   :0.6390   Min.   :  43446   Min.   :   0.6014  
##  1st Qu.:0.7185   1st Qu.: 371168   1st Qu.:  11.2922  
##  Median :0.7485   Median :1028432   Median :  55.8553  
##  Mean   :0.7418   Mean   :1306771   Mean   : 135.6830  
##  3rd Qu.:0.7725   3rd Qu.:1512130   3rd Qu.:  87.8780  
##  Max.   :0.7910   Max.   :6407977   Max.   :1507.9423
dim(Departamentos)
## [1] 32  7

Escalar y centrar las variables: media=0 y sd= 1

dept <- scale(Departamentos[,-1], center = TRUE, scale = TRUE)
summary(dept)
##    Municipios        Superficie      Tasa Homicidio 2016    IDH 2020      
##  Min.   :-0.9476   Min.   :-1.2281   Min.   :-1.9362     Min.   :-2.8693  
##  1st Qu.:-0.6333   1st Qu.:-0.4898   1st Qu.:-0.6153     1st Qu.:-0.6493  
##  Median :-0.2312   Median :-0.3829   Median :-0.1509     Median : 0.1885  
##  Mean   : 0.0000   Mean   : 0.0000   Mean   : 0.0000     Mean   : 0.0000  
##  3rd Qu.: 0.2001   3rd Qu.: 0.4310   3rd Qu.: 0.5130     3rd Qu.: 0.8587  
##  Max.   : 2.6491   Max.   : 2.5540   Max.   : 2.4164     Max.   : 1.3753  
##    Población          Densidad      
##  Min.   :-0.9117   Min.   :-0.4586  
##  1st Qu.:-0.6752   1st Qu.:-0.4223  
##  Median :-0.2009   Median :-0.2710  
##  Mean   : 0.0000   Mean   : 0.0000  
##  3rd Qu.: 0.1482   3rd Qu.:-0.1623  
##  Max.   : 3.6812   Max.   : 4.6587
class(dept)
## [1] "matrix" "array"

Convertir en dataframe

dept <- as.data.frame(dept)
class(dept)
## [1] "data.frame"
rownames(dept)=Departamentos$Departamennto
head(dept,5)
##           Municipios Superficie Tasa Homicidio 2016    IDH 2020  Población
## Amazonas  -0.9475920  2.5539916          -0.1812183 -0.69113937 -0.8861345
## Antioquia  2.6490541  0.9649942           0.4135724  0.84472590  3.6812465
## Arauca    -0.8013868 -0.4080447           1.0805941 -0.04886844 -0.7476672
## Atlántico -0.3335304 -1.1256864          -0.1205800  1.23567342  0.8943796
## Bolívar    0.3097721 -0.3335168          -0.4202047  0.39792873  0.6240668
##             Densidad
## Amazonas  -0.4581942
## Antioquia -0.1186448
## Arauca    -0.4220488
## Atlántico  2.4025542
## Bolívar   -0.1768447

Una forma sencilla de estimar el número K óptimo de clusters cuando no se dispone de información adicional en la que basarse, es aplicar el algoritmo de K-means para un rango de valores de K e identificar aquel valor a partir del cual la reducción en la suma total de varianza intra-cluster deja de ser sustancial. A esta estrategia se la conoce como método del codo o elbow method (en los siguientes apartados se detallan otras opciones).

La función fviz_nbclust() automatiza este proceso y genera una representación de los resultados.````

library(factoextra)
fviz_nbclust(x = dept, FUNcluster = kmeans, method = "wss", k.max = 15, 
             diss = get_dist(dept, method = "euclidean"), nstart = 50)

calcular_totwithinss <- function(n_clusters, datos, iter.max=1000, nstart=50){
  # Esta función aplica el algoritmo kmeans y devuelve la suma total de
  # cuadrados internos.
  cluster_kmeans <- kmeans(centers = n_clusters, x = datos, iter.max = iter.max,
                           nstart = nstart)
  return(cluster_kmeans$tot.withinss)
}

Se aplica esta función con para diferentes valores de k

total_withinss <- map_dbl(.x = 1:15,
                          .f = calcular_totwithinss,
                          datos = dept)
total_withinss
##  [1] 186.00000 142.19660 109.10745  81.21214  65.84010  50.44256  39.61419
##  [8]  32.71640  27.47911  22.94661  19.12030  16.66752  14.03122  11.79437
## [15]  10.10218
data.frame(n_clusters = 1:15, suma_cuadrados_internos = total_withinss) %>%
  ggplot(aes(x = n_clusters, y = suma_cuadrados_internos)) +
  geom_line() +
  geom_point() +
  scale_x_continuous(breaks = 1:15) +
  labs(title = "Evolución de la suma total de cuadrados intra-cluster") +
  theme_bw()

set.seed(123)
km_clusters <- kmeans(x = dept, centers = 4, nstart = 32)

El paquete factoextra también permite obtener visualizaciones de las agrupaciones resultantes. Si el número de variables (dimensionalidad) es mayor de 2, automáticamente realiza un PCA y representa las dos primeras componentes principales.

Las funciones del paquete factoextra emplean el nombre de las filas del dataframe que contiene los datos como identificador de las observaciones. Esto permite añadir labels a los gráficos.

fviz_cluster(object = km_clusters, data = dept, show.clust.cent = TRUE,
             ellipse.type = "euclid", star.plot = TRUE, repel = TRUE) +
  labs(title = "Resultados clustering K-means") +
  theme_bw() +
  theme(legend.position = "none")
## Warning: ggrepel: 5 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

graficamos los cluster en funcion de Población y Tasa de Homicidio

depto = dept %>% mutate(cluster = km_clusters$cluster)

(g1=ggplot(depto, aes(x = depto$Población, y =depto$`Tasa Homicidio 2016`)) +
  geom_point(aes(color=as.factor(cluster)), size=10)+
  geom_text(aes(label = cluster), size = 5) +
  theme_bw() +
  theme(legend.position = "none")+
  labs(title = "Kmenas con k=4") 
)
## Warning: Use of `depto$Población` is discouraged. Use `Población` instead.
## Warning: Use of `depto$`Tasa Homicidio 2016`` is discouraged. Use `Tasa
## Homicidio 2016` instead.
## Warning: Use of `depto$Población` is discouraged. Use `Población` instead.
## Warning: Use of `depto$`Tasa Homicidio 2016`` is discouraged. Use `Tasa
## Homicidio 2016` instead.

## graficamos los cluster en funcion de Población y IDH

depto = dept %>% mutate(cluster = km_clusters$cluster)

(g1=ggplot(depto, aes(x = depto$Población, y =depto$`IDH 2020`)) +
  geom_point(aes(color=as.factor(cluster)), size=10)+
  geom_text(aes(label = cluster), size = 5) +
  theme_bw() +
  theme(legend.position = "none")+
  labs(title = "Kmenas con k=4") 
)
## Warning: Use of `depto$Población` is discouraged. Use `Población` instead.
## Warning: Use of `depto$`IDH 2020`` is discouraged. Use `IDH 2020` instead.
## Warning: Use of `depto$Población` is discouraged. Use `Población` instead.
## Warning: Use of `depto$`IDH 2020`` is discouraged. Use `IDH 2020` instead.

Biplot PCA y K-Means para medir representatividad

PCA

pca <- prcomp(dept, scale=TRUE)
df.pca <- pca$x

Cluster over the three first PCA dimensions

kc <- kmeans(df.pca[,1:3], 4)
fviz_pca_biplot(pca, label="var", habillage=as.factor(kc$cluster)) +
  labs(color=NULL) + ggtitle("") +
  theme(text = element_text(size = 15),
        panel.background = element_blank(), 
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        axis.line = element_line(colour = "black"),
        legend.key = element_rect(fill = "white"))

fviz_contrib(pca, "var")

get_pca_var(pca)$cos2
##                         Dim.1       Dim.2        Dim.3        Dim.4       Dim.5
## Municipios          0.4229866 0.386997441 1.068514e-01 0.0017555949 0.009445731
## Superficie          0.2875153 0.247107244 4.884011e-02 0.4086046122 0.005646191
## Tasa Homicidio 2016 0.1195426 0.003976955 8.299324e-01 0.0206337725 0.006696275
## IDH 2020            0.6498345 0.047487955 1.984310e-02 0.1210349401 0.149423553
## Población           0.6112874 0.226698574 1.110451e-06 0.0002733136 0.117443535
## Densidad            0.1697052 0.576676407 5.689687e-02 0.0939856687 0.083272601
##                           Dim.6
## Municipios          0.071963282
## Superficie          0.002286509
## Tasa Homicidio 2016 0.019217973
## IDH 2020            0.012375989
## Población           0.044296081
## Densidad            0.019463229
fviz_cos2(pca, choice = "ind", axes=1:2)

Cluster Jerarquias

  • Matriz de distancias euclídeas
mat_dist <- dist(x = dept, method = "euclidean")

Dendrogramas con linkage complete y average

hc_euclidea_complete <- hclust(d = mat_dist, method = "complete")
hc_euclidea_average  <- hclust(d = mat_dist, method = "average")
cor(x = mat_dist, cophenetic(hc_euclidea_complete))
## [1] 0.7662474
cor(x = mat_dist, cophenetic(hc_euclidea_average))
## [1] 0.8541854
library(factoextra)
set.seed(101)
hc_euclidea_completo <- hclust(d = dist(x = dept, method = "euclidean"),
                               method = "complete")
fviz_dend(x = hc_euclidea_completo, k = 4, cex = 0.6) +
  geom_hline(yintercept = 5.5, linetype = "dashed") +
  labs(title = "Herarchical clustering",
       subtitle = "Distancia euclídea, Lincage complete, K=4")
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.

fviz_cluster(object = list(data=dept, cluster=cutree(hc_euclidea_completo, k=4)),
             ellipse.type = "convex", repel = TRUE, show.clust.cent = FALSE,
             labelsize = 8)  +
  labs(title = "Hierarchical clustering + Proyección PCA",
       subtitle = "Distancia euclídea, Lincage complete, K=4") +
  theme_bw() +
  theme(legend.position = "bottom")
## Warning: ggrepel: 2 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

Análisis Factorial

Anális factorial exploratorio

El Análisis Factorial (AF) es un método multivariante que pretende expresar p variables observables como una combinación lineal de m variables hipotéticas o latentes, denominadas factores. Tiene una formulación parecida al Análisis de Componentes Principales, pero el modelo que relaciona variables y factores es diferente en AF. Si la matriz de correlaciones existe, las componentes principales también existen, mientras que el modelo factorial podrá ser aceptado o no mediante un test estadístico. Ejemplos en los que la variabilidad de las variables observables se puede resumir mediante unas variables latentes, que el AF identifica como factores, son:

La teoría clásica de la inteligencia supone que los test de inteligencia estaban relacionados por un factor general, llamado factor “g”de Spearman.

Pasos para efectuar un análisis factorial - Verificar que la matriz de datos sea factorizable - Extraer los Factores - Determinar el número correcto de factores - Rotar los factores - Interpretar los resultados

Paso 1:Calcular la matriz de correlación policorica

library(psych)
library(polycor)
#install.packages("ggcorrplot")
library(ggcorrplot)
Departamentos
## # A tibble: 32 x 7
##    Departamennto Municipios Superficie `Tasa Homicidio 201~ `IDH 2020` Población
##    <chr>              <dbl>      <dbl>                <dbl>      <dbl>     <dbl>
##  1 Amazonas               2     109665                22.0       0.717     78830
##  2 Antioquia            125      63612                28.7       0.772   6407977
##  3 Arauca                 7      23818                36.2       0.74     270708
##  4 Atlántico             23       3019                22.7       0.786   2546138
##  5 Bolívar               45      25978                19.4       0.756   2171558
##  6 Boyacá               123      23012                 8.37      0.76    1281979
##  7 Caldas                27       7888                21.7       0.778    993870
##  8 Caquetá               16      88965                29.4       0.717    496262
##  9 Casanare              19      44490                24.0       0.75     375258
## 10 Cauca                 41      29308                39.2       0.719   1416145
## # ... with 22 more rows, and 1 more variable: Densidad <dbl>
#bfi_s <- bfi[1:200,1:25] # subconjunto de datos
mat_cor <- hetcor(Departamentos[,c(-4,-7)])$correlations #matriz de correlación policorica
## data contain one or more character variables
## the values of which are ordered alphabetically
ggcorrplot(mat_cor,type="lower",hc.order = T)

det(mat_cor)
## [1] 0.3343161

Después de calcular la matriz de correlación, se puede verificar si la matriz de datos es factorizable por medio de la prueba de esfericidad de Bartlett, y la prueba de Kaiser-Meyer-Olkin.

Paso 1.1 Verificar que la matriz sea factorizable.

En este paso nos tenemos que preguntar si existe la suficiente correlación entre las variable para efectuar el análisis factorial.

Aplicamos la prueba de Bartlett que se utiliza para probar la hipótesis nula que afirma que las variables no están correlacionadas en la población.

cortest.bartlett(mat_cor)->p_esf
## Warning in cortest.bartlett(mat_cor): n not specified, 100 used
p_esf$p
## [1] 3.859706e-18

El valor p es casi 0, por lo que se se rechaza la hipotesis Ho, es decir la matriz de corrleación no es la matriz de identidad, es decir sus correlciones no son 0.

  • La otra prueba que podemos aplicar es el criterio de Kaiser-Meyer-Olkin. La prueba de Kaiser-Meyer-Olkin (KMO) es una medida de qué tan adecuados son sus datos para el análisis factorial . La prueba mide la adecuación del muestreo para cada variable en el modelo y para el modelo completo. La estadística es una medida de la proporción de varianza entre variables que podrían ser varianza común. Como referencia, Kaiser puso los siguientes valores en los resultados:

  • 0.00 a 0.49 inaceptable.

  • 0.50 a 0.59 miserable.

  • 0,60 a 0,69 mediocre.

  • 0.70 a 0.79 medio.

  • 0,80 a 0,89 meritorio.

  • 0.90 a 1.00 maravilloso.

KMO(mat_cor)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = mat_cor)
## Overall MSA =  0.62
## MSA for each item = 
## Departamennto    Municipios    Superficie      IDH 2020     Población 
##          0.66          0.60          0.61          0.72          0.59

Paso 2: Escoger un método para extraer los factores.

Los métodos disponibles son: Componentes principales, Mínimos cuadrados no ponderados, Mínimos cuadrados generalizados, Máxima verosimilitud, factorización de Ejes principales, factorización Alfa y factorización Imagen.

  • Análisis de componentes principales. Método para la extracción de factores utilizada para formar combinaciones lineales no correlacionadas de las variables observadas. El primer componente tiene la varianza máxima. Las componentes sucesivas explican progresivamente proporciones menores de la varianza y no están correlacionadas unas con otras. El análisis principal de las componentes se utiliza para obtener la solución factorial inicial. No se puede utilizar cuando una matriz de correlaciones es singular.

  • Método de mínimos cuadrados no ponderados. Método de extracción de factores que minimiza la suma de los cuadrados de las diferencias entre las matrices de correlación observada y reproducida, ignorando las diagonales.

  • Método de Mínimos cuadrados generalizados. Método de extracción de factores que minimiza la suma de los cuadrados de las diferencias entre las matrices de correlación observada y reproducida. Las correlaciones se ponderan por el inverso de su exclusividad, de manera que las variables que tengan un valor alto de exclusividad reciban una ponderación menor que aquéllas que tengan un valor bajo de exclusividad.

  • Método de máxima verosimilitud. Método de extracción factorial que proporciona las estimaciones de los parámetros que con mayor probabilidad ha producido la matriz de correlaciones observada, si la muestra procede de una distribución normal multivariada. Las correlaciones se ponderan por el inverso de la exclusividad de las variables, y se emplea un algoritmo iterativo.

  • Factorización de ejes principales. Método para la extracción de factores que parte de la matriz de correlaciones original con los cuadrados de los coeficientes de correlación múltiple insertados en la diagonal principal como estimaciones iniciales de las comunalidades. Las cargas factoriales resultantes se utilizan para estimar de nuevo las comunalidades que reemplazan a las estimaciones previas de comunalidad en la diagonal. Las iteraciones continúan hasta que el cambio en las comunalidades, de una iteración a la siguiente, satisfaga el criterio de convergencia para la extracción. Alfa.

  • Método de extracción factorial que considera a las variables incluidas en el análisis como una muestra del universo de las variables posibles. Este método maximiza el Alfa de Cronbach para los factores.

  • Factorización imagen. Método para la extracción de factores, desarrollado por Guttman y basado en la teoría de las imágenes. La parte común de una variable, llamada la imagen parcial, se define como su regresión lineal sobre las restantes variables, en lugar de ser una función de los factores hipotéticos.

Con la función fa() podemos utilizar los métodos siguientes.

  • minres: minimo residuo
  • mle: maxima verosimilitud
  • paf: método de ejes principales
  • alpah: alfa
  • minchi: minimos cuadrados
  • minrak : rango minimo
### prueba de dos modelos con tres factores
modelo1<-fa(mat_cor,
           nfactors = 3,
           rotate = "none",
           fm="mle") # modelo máxima verosimilitud

modelo2<-fa(mat_cor,
           nfactors = 3,
           rotate = "none",
           fm="minres") # modelo minimo residuo
######comparando las comunalidades
sort(modelo1$communality,decreasing = T)->c1
sort(modelo2$communality,decreasing = T)->c2
head(cbind(c1,c2))
##                       c1        c2
## Municipios    0.99215294 0.8465618
## Población     0.94015563 0.6952265
## Superficie    0.75149011 0.6385176
## IDH 2020      0.27775939 0.4916564
## Departamennto 0.08010965 0.1109033
####comparacion de las unicidades 
sort(modelo1$uniquenesses,decreasing = T)->u1
sort(modelo2$uniquenesses,decreasing = T)->u2
head(cbind(u1,u2))
##                        u1        u2
## Departamennto 0.919890354 0.8890967
## IDH 2020      0.722240608 0.5083436
## Superficie    0.248509895 0.3614824
## Población     0.059844366 0.3047735
## Municipios    0.007847064 0.1534382

Paso 3: Determinar el número de factores

Kaiser Criterion (Guttman, 1954): esta regla sugiere que se deben retener todos los factores que tengan un eigenvalue de 1.0 o mayor; con el razonamiento de que un factor no debe explicar menos que la varianza equivalente que hubiera explicado una sola de las variables incluidas en el análisis. La regla sin embargo no es estricta y debe analizarse en conjunto con otros criterios.

Análisis del Scree Plot (Cattell, 1966): este método complementa al anterior y se basa también el análisis de la magnitud de los eigenvalues pero a partir de la tendencia que se observa en el Scree Plot. Se procuran seleccionar un grupo reducido de factores que tengan eigenvalues significativamente superiores a los demás, para lo cual se identifica el punto de inflexión en la curva del scree plot (también referido como el codo por su semejanza con un brazo) a partir del cual la curva se transforma a una línea “plana” o relativamente recta. En el ejemplo que se presenta hay un claro punto de inflexión después de dos factores.

Análisis paralelo (Horn, 1965): Esta regla suele complementar las anteriores cuando el numero de variables iniciales y factores resultantes es elevado. El procedimiento es basado en el principio de que los factores a extraer deben dar cuenta de mas varianza que la que es esperada de manera aleatoria. El procedimiento reordena las observaciones de manera aleatoria entre cada variable y los eigenvalues son recalculados a partir de esta nueva base de datos aleatoriamente ordenada. Los factores con eigenvalues mayores a los valores aleatorios son retenidos para interpretación.

scree(mat_cor)

fa.parallel(mat_cor,n.obs=200,fa="fa",fm="minres")
## Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
## The estimated weights for the factor scores are probably incorrect. Try a
## different factor score estimation method.

## Parallel analysis suggests that the number of factors =  2  and the number of components =  NA

Paso 4: Rotar la matriz

La obtención de la matriz factorial, no es mas que el primer paso del AF. Normalmente la matriz obtenida no define unos factores interpretables, Se han propuesto diferentes versiones sobre como transformar la matriz factorial a fin de obtener una estructura simple de los factores. Esencialmente se trata de conseguir que unas saturaciones sean altas a costa de otras, que serán bajas, para así destacar la influencia de los factores comunes sobre las variables observables. Existen dos formas básicas de realizar la Rotación de Factores , oblicuas y ortogonales. Se elige uno u otro procedimiento según que los factores rotados sigan siendo ortogonales o no. Señalar que en ambas rotaciones la comunalidad de cada variable no se modifica, esto es, la rotación no afecta a la bondad del ajuste de la solución factorial: aunque cambie la matriz factorial, las especificidades no cambian y, en consecuencia, las comunidades permanecen invariantes. Sin embargo, cambia la varianza explicada por cada factor, por tanto, los nuevos factores no están ordenados de acuerdo con la información que contienen, cuantificada mediante su varianza.

  • Varimax:Método de rotación ortogonal que minimiza el número de variables que tienen saturaciones altas en cada factor. Simplifica la interpretación de los factores.

  • Criterio Oblimin directo: Método para la rotación oblicua (no ortogonal). El método necesita un valor delta que servirá para ajustar los ejes en función de las saturaciones buscan una mejor aproximación, pero considerando que la varianza se distribuirá entre todos los factores.

  • Método quartimax: Método de rotación que minimiza el número de factores necesarios para explicar cada variable.

  • Método equamax:Método de rotación que es combinación del método varimax, que simplifica los factores, y el método quartimax, que simplifica las variables. Se minimiza tanto el número de variables que saturan alto en un factor como el número de factores necesarios para explicar una variable.

  • Rotación Promax: Rotación oblicua que permite que los factores estén correlacionados. Esta rotación se puede calcular más rápidamente que una rotación oblimin directa, por lo que es útil para conjuntos de datos grandes.

#library()
#Rotaciones
library(GPArotation)
rot<-c("none", "varimax", "quartimax","Promax")
bi_mod<-function(tipo){
  biplot.psych(fa(Departamentos[,-1],nfactors = 2,fm="minres",rotate = tipo),main =
                 paste("Biplot con rotación ",tipo),col=c(2,3,4),pch = c(21,18))  
}
sapply(rot,bi_mod)

## $none
## NULL
## 
## $varimax
## NULL
## 
## $quartimax
## NULL
## 
## $Promax
## NULL

Paso 5: La interpretación

para ayudar a la interpretación se puede hacer un gráfico de árbol.

modelo_varimax<-fa(mat_cor,nfactors = 2,rotate = "varimax",
              fa="minres")
fa.diagram(modelo_varimax)

print(modelo_varimax$loadings,cut=0)
## 
## Loadings:
##               MR1    MR2   
## Departamennto -0.258  0.203
## Municipios     0.799  0.110
## Superficie    -0.049 -0.714
## IDH 2020       0.384  0.422
## Población      0.867  0.180
## 
##                  MR1   MR2
## SS loadings    1.607 0.774
## Proportion Var 0.321 0.155
## Cumulative Var 0.321 0.476

El porcentaje de varianza acumulado de estos 3 factores es de 71%