Analítica de datos aplicada a estudios sobre desarrollo

Introducción a las técnicas multivariantes no supervisadas

Proceso de analítica

Wickham, H. y otros (2023)

MÉTODOS MULTIVARIANTES

Modelos de analítica

ANÁLISIS DE COMPONENTES PRINCIPALES

Objetivo general

Método para reducir la dimensionalidad de los datos conservando la mayor cantidad de información. El método se debe usar cuando las variables son cuantitativas y existe presencia de correlación

Objetivos específicos

  • Visualizar patrones: Sirve para visualizar la estructura de los datos y detectar patrones emergentes.

  • Construir de índices sintéticos: Las variables originales se resumen en un conjunto menor de componentes principales que contienen información de todas las variables.

  • Identificar factores clave: Identifica los factores principales que explican los cambios relacionados con el tema de interés.

  • Identificar grupos: Ayuda a identificar grupos de individuos que comparten características similares.

¿Cómo funciona la técnica?

Componentes principales

Reproducir la matriz original usando menos dimensiones

Problema de optimización

Enfoque de Hotelling (1933) vs Pearson (1901)


Teorema de la factorización - SDV

Reproducir la matriz original con menos dimensiones.


Esquema de las componentes


Resumen

Interpretación en el espacio de las componentes

Interpretación en el espacio de las componentes

Ejemplo

El conjunto de datos RESUMEN.sav contiene un preprocesamiento obtenido de la GEIH del DANE a nivel departamental para algunas variables de interés.


library(pacman)
p_load(tidyverse, janitor,
       FactoMineR, factoextra, Factoshiny, 
       skimr, corrplot, psych, gt, gtsummary, haven)

url <- "https://github.com/jgbabativam/AnaDatos/raw/main/datos/RESUMEN.sav"
datos <- read_sav(url) |> as_factor()


Use el comando glimpse() y skim() para explorar el conjunto de datos.

Preparación del conjunto de datos


datos <- datos |> 
         column_to_rownames(var = "DPTO")


Observe que el conjunto de los datos está conformado únicamente por variables cuantitativas.

Analice los resultados

res <- PCA(datos, scale.unit = T, graph = F)
fviz_screeplot(res, addlabels = TRUE, ylim = c(0, 60))

Primer plano factorial para las variables

fviz_pca_var(res, 
             col.var="contrib",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE)

Primer plano factorial para los individuos

fviz_pca_ind(res, col.ind = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE)

Biplot

fviz_pca_biplot(res, repel = TRUE, col.ind = "blue", col.var = "red")

Construcción de índices sintéticos


Tenga en cuenta que:

\[\mathbf{Y} = \mathbf{XV}\]


De manera que la matriz \(\mathbf{V}\) son los ponderadores de las variables en la matriz \(\mathbf{X}\), con lo cual \(\mathbf{Y}\) es un índice que resume la información contenida en las variables originales.

Complementos

  • Explore el peso de las variables mediante la función PCA(datos) del paquete FactoMineR.

  • Construya un índice a partir de la primera componente principal

  • Use la función Factoshiny(datos) y ajuste los parámetros del modelo.

Examen 2



Vea las condiciones del examen 2 en Bloque Neón y en GitHub

Lea atentamente las instrucciones del mismo, tenga en cuenta que los ejercicios propuestos no son para entregar en un formato tipo taller, sino que le deben servir como recurso para generar el documento solicitado.

Exposición final




Lea atentamente las siguientes instrucciones y observe el siguiente vídeo (asegúrese de dar clic en la ventana externa):


ANÁLISIS DE CORRESPONDENCIAS

Análisis de correspondencias


El PCA se usa para tratar variables cuantitativas que tienen algún grado de asociación lineal. De otra parte, el análisis de correspondencias es un método que surge de las tablas de contingencia y permite estudiar las relaciones entre variables cualitativas. Este análisis permite:

  • Identificar patrones de asociación entre variables categóricas.
  • Hacer una reducción de la dimensionalidad.
  • Observar la proximidad entre individuos y entre variables.
  • Hacer un pre-procesamiento para el análisis de clúster.

Estructura del conjunto de datos


Funcionamiento del análisis de correspondencias


Generación de tablas de contingencia

Al realizar la operación \(\mathbf{X}^T\mathbf{X}\) se llega a la matriz que concatena todas las tablas de contingencia entre pares de variables, denominada matriz de Burt

Proyección sobre el espacio factorial

Ejemplo

El conjunto de datos corresp.sav contiene 50 respuestas de una encuesta.


library(pacman)
p_load(tidyverse, janitor, patchwork,
       FactoMineR, factoextra, Factoshiny, 
       skimr, corrplot, psych, gt, gtsummary, haven)

url <- "https://github.com/jgbabativam/AnaDatos/raw/main/datos/corresp.sav"
datos <- read_sav(url) |> as_factor()

Use glimpse() y skim() para explorar el conjunto de datos.

Preparación de los datos


datos <- datos |> 
         column_to_rownames(var = "encuesta")


  • Analice la asociación entre las variables cualitativas.

  • Explore la contribución y el coseno al cuadrado usando MCA(datos) del paquete FactoMineR.

Analice los resultados

res <- MCA(datos, graph = F)
fviz_screeplot(res, addlabels = TRUE, ylim = c(0, 40))

Análisis de las contribuciones

corrplot(res$var$contrib, is.corr=FALSE, tl.col = "black")

Análisis de los cosenos

corrplot(res$var$cos2, is.corr=FALSE, tl.col = "black")

Primer plano factorial

fviz_mca_var(res, repel = TRUE, col.var = "blue")

ESTUDIO DE CASO

Ambiente político

El ambiente político en el momento electoral es decisivo, identificar patrones y asociaciones en las opiniones resulta clave en las estrategias que se deben seguir durante la campaña. Considere el siguiente conjunto de datos obtenido de una muestra aleatoria de 300 personas y construya el perfil de los candidatos a partir de un análisis de correspondencias.

library(pacman)
p_load(tidyverse, janitor,
       FactoMineR, factoextra, Factoshiny, 
       skimr, corrplot, psych, gt, gtsummary, haven)

url <- "https://github.com/jgbabativam/AnaDatos/raw/main/datos/df_clase.sav"
clase <- read_sav(url) 

Explore el conjunto de datos con glimpse(as_factor(clase)) y compare con el cuestionario

Ordenar y transformar

Fuente: tidyexplain

Ordenar y transformar

Una forma de trabajar el conjunto de los datos es transformarlo a un formato largo:

df <- clase |> 
      pivot_longer(cols = starts_with("P21"), names_to = "P21", values_to = "respuesta")

Observe que hay respuestas múltiples en algunos atributos.

head(df |> filter(as.numeric(respuesta)>10))
# A tibble: 6 × 6
     id GENERO        REDAD        RESTRATO  P21    respuesta
  <dbl> <dbl+lbl>     <dbl+lbl>    <dbl+lbl> <chr>  <dbl+lbl>
1     1 1 [Masculino] 3 [35 - 44]  2 [Medio] P21_20      46  
2     2 1 [Masculino] 1 [18 a 24]  2 [Medio] P21_7       57  
3     2 1 [Masculino] 1 [18 a 24]  2 [Medio] P21_20      26  
4     4 1 [Masculino] 5 [55 o más] 2 [Medio] P21_13 1234567  
5     4 1 [Masculino] 5 [55 o más] 2 [Medio] P21_17      14  
6     4 1 [Masculino] 5 [55 o más] 2 [Medio] P21_19      14  

Ordenar y transformar

Separamos las respuestas en diferentes variables para poder tratarlas

longitud_maxima <- max(nchar(df$respuesta))
nombres_columnas <- paste0("respuesta_", 0:longitud_maxima)

df1 <- df |> 
       separate(respuesta, into = nombres_columnas, sep = "", fill = "right") |> 
       select(-respuesta_0)

Volvemos a reestructurar los datos para que cada persona quede solo con las respuestas que asignó en cada atributo

df_reest <- df1 |> 
            pivot_longer(cols = starts_with("respuesta_"),
                         names_to = "var", values_to = "candidato", values_drop_na = TRUE) |> 
            select(-var) 

Asignación de atributos

df_reest <- df_reest |> 
             separate(P21, c("pregunta", "item"), sep = "_") |> 
             mutate(item = factor(item, levels = 1:26,
                                  labels = c(
                                    'Representa la continuidad de Claudia',
                                    'Tendencia política de izquierda',
                                    'Garantiza mano dura en seguridad',
                                    'Tendencia política de derecha',
                                    'Representa a Petro en Bogotá',
                                    'Tiene las mejores propuestas',
                                    'Representa un peligro para Bogotá',
                                    'Es el candidato más respetuoso',
                                    'Es el más conciliador',
                                    'Garantiza políticas para proteger a las mujeres',
                                    'Garantiza que Bogotá va a avanzar',
                                    'Respeta y garantiza la diversidad en la ciudad',
                                    'Puede diseñar e implementar una verdadera política de seguridad',
                                    'Es el que más apoyo tiene de los empresarios',
                                    'Es el de mayor sensibilidad social',
                                    'Mejor persona',
                                    'Clientelista',
                                    'Tibio/sin posiciones',
                                    'Delfín',
                                    'Se ha destacado en los cargos que ha ocupado',
                                    'Mejor comunicador',
                                    'Más auténtico',
                                    'Es el candidato de Álvaro Uribe',
                                    'Es el candidato de Peñalosa',
                                    'Es el candidato de Germán Vargas Lleras',
                                    'Es el candidato de Rodolfo Hernández'
                                  ))) |> 
             mutate(candidato = factor(as.numeric(candidato), levels = 1:9, 
                                     labels = c('Carlos Fernando Galán',
                                                'Gustavo Bolívar',
                                                'Juan Daniel Oviedo',
                                                'Rodrigo Lara',
                                                'Diego Molano',
                                                'Jorge Enrique Robledo',
                                                'Jorge Luis Vargas',
                                                'Ninguno',
                                                'Ns/Nr'))) |> 
             mutate(GENERO = factor(GENERO, levels = 1:2, labels = c("Hombre", "Mujer")),
                    REDAD = factor(REDAD, levels = 1:5, labels = c("18 a 24",
                                                                   "25 a 34",
                                                                   "35 a 44",
                                                                   "45 a 54",
                                                                   "55 o más"))) |> 
              select(-pregunta)

Preparación de los datos

Con la estructura de los datos se puede construir la tabla de contingencia para aplicar un análisis de correspondencias simple

tabla <- df_reest |> 
         count(item, candidato) |> 
         pivot_wider(names_from = candidato, values_from = n) |> 
         column_to_rownames("item")

Análisis de los resultados

res <- CA(tabla, graph = F)
fviz_screeplot(res, addlabels = TRUE, ylim = c(0, 50))

Contribuciones de las columnas (candidatos)

corrplot(res$col$contrib, is.corr=FALSE, tl.col = "black")

Contribuciones de las filas (atributos)

corrplot(res$row$contrib, is.corr=FALSE, tl.col = "black")

Análisis de los cosenos para los candidatos

corrplot(res$col$cos2, is.corr=FALSE, tl.col = "black")

Análisis de los cosenos para los atributos

corrplot(res$row$cos2, is.corr=FALSE, tl.col = "black")

Perfil de los candidatos (Plano 1-2)

fviz_ca_col(res, repel = TRUE, col.col = "cos2", axes = c(1,2),
            gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
            select.col = list(cos2 = 0.5))

Posicionamiento de los atributos (Plano 1-2)

fviz_ca_row(res, repel = TRUE, col.row = "cos2", axes = c(1,2),
            gradient.cols = c("lightblue", "blue", "darkblue"),
            select.row = list(cos2 = 0.5))

Biplot de correspondencias

fviz_ca_biplot(res, axes = c(1,2),
               repel = TRUE, 
               select.col = list(cos2 = 0.5),
               select.row = list(cos2 = 0.5))

Análisis complementarios

  1. Haga un análisis que le permita encontrar las diferencias y similaridades entre los candidatos Galán, Oviedo, Molano y Vargas.
  2. ¿Cuáles son los aspectos que diferencian al candidato Lara frente a los candidatos Galán y Oviedo?.
  3. ¿Que modificación debe realizar si su objetivo se centra en encontrar los aspectos que diferencian al candidato Lara frente a los candidatos Molano y Vargas?.

GRACIAS!

Referencias

  • Husson, F., Lê, S., & Pagès, J. (2017). Exploratory multivariate analysis by example using R. CRC press.

  • Hair, J. F., Black, W. C., Babin, B. J., Anderson, R. E., & Tatham, R. L. (2006). Multivariate data analysis 6th Edition. https://doi.org/10.1201/9780367409913

  • Aldás Manzano, J., & Uriel Jiménez, E. (2017). Análisis multivariante aplicado con R. Ediciones Paraninfo, SA.