Sesión : Visualización de datos

Taller de Investigación: Política Cuantitativa “CUANTIPOL” - UNMSM

Author

Asesor: Joel Belsasar Ccallocunto @luccemhu a20196510@pucp.edu.pe

Published

November 4, 2023

Descarguemos e importemos la data:

El Barómetro de las Américas es el proyecto más conocido de LAPOP. Este estudio es un estudio comparativo científicamente de valores y comportamientos democráticos que cubre todos los países independientes de América del Norte, Central y del Sur, así como un número significativo de países del Caribe. El trabajo de LAPOP en el Barómetro de las Américas incluye el diseño de encuestas, el diseño de muestras, la prueba previa cualitativa e iterativa de nuevos módulos, la auditoría de datos, el análisis y la elaboración de informes.

Utilizaremos la siguiente data del 2021 de Vanderbilt University para utilizar las principales funciones dentro de Tidyverse y las más útiles para nuestro trabajo en el taller.

Instalamos y corremos los paquetes y librerías que utilizaremos:

pacman::p_load(haven, # Import foreign statistical formats 
               janitor, # Tools for examining and cleaning dirty data
               plotly, #  Interactive web-based graph
               ggplot2, # To map variables to aesthetics
               tidyverse, # Packages and tools for the R programming
               cowplot, # Comparar gráficas
               ggridges # Gráfico de densidad de crestas
               )
  • Importamos desde Github:
df_lapop <- read_dta("https://github.com/Taller-UNMSM-CUANTIPOL-2023/Visualizacion-de-datos/raw/main/documentos/PER_2021_LAPOP.dta") |> 
  clean_names() # Takes and returns a data.frame clean

#names(df_lapop) # Nombre de las variables del df
#str(df_lapop) # Estructura del df, tipo de variables
#class(df_lapop) # Tipo del vector

ggplot2

  • Este paquete sirve para crear gráficos basados en la data seleccionada. También se le puede indicar una serie de parámetros como el color y tipo de letra, los títulos de los gráficos y más características que se indican con los comando.

Recordemos:

Tipos de variables

En las sesiones previas hemos estudiado estos tipos de variables:

TIPO
   **DESCRIPCIÓN**
Variables nominales
  • Género: Hombre=1, Mujer=2

  • Religión: Católico=1, Evangélico=2, Otro=3

  • Región: Lima=1, Arequipa=2, La Libertad =3

  • Partido: Perú Libre = 1, APP = 2, PPC = 3

Variables ordinales
  • Educación: Analf=0, Prim=1, Sec=2, Tec=3, Univ=4, Post=5

  • Importancia de religión en su vida: Nada importante=1, Poco importante=2, Algo importante=3, Muy importante=4

  • Nivel de satisfacción con la democracia: Muy instafisfecho=1, Insatisfecho=2, Satisfecho=3, Muy satisfecho=4

Variables continuas Estatura, peso, ingreso mensual, extensión, PBI per cápita, % de participación electoral.
Variables discretas Número de hijos, edad, número de revocatorias, número de postas médicas, población.

En ese sentido, debemos crear gráficos según el tipo de variables de interés:

Algo más: factores

  • En R, las variables nominales se denominan factores, las variables ordinales como factores ordinales/ordenados , es decir, pueden.

  • Por otro lado, las variables continuas y discretas como num. En algunos casos, se puede encontrar lectura de variables como int (interger), que también son variables numéricas.

Variable categórica nominal: jc15a & q1tb

JC15A. ¿Cree usted que cuando el país enfrenta momentos muy difíciles, se justifica que el presidente del país cierre el Congreso y gobierne sin Congreso?

#str(df_lapop$jc15a)
#table(df_lapop$jc15a) # 1: 640, 2: 821
#sum(is.na(df_lapop$jc15a)) # Advertimos NA's: 1577

df_congre <- df_lapop |> 
  filter(!is.na(jc15a)) |> # Borramos NA's de la columna 
  mutate(disolucion_c = as.factor(jc15a)) |> 
  mutate(disolucion_c = factor(disolucion_c, levels = levels(disolucion_c), 
                               labels = c("Si","No")))

Subseteamos solo la variable y la sobreescribiremos en la misma data:

df_congre <- df_congre |> 
  group_by(disolucion_c) |> 
  count() |>
  ungroup() |>
  mutate(pcnt = n / sum(n)) |> # Creamos una columna de proporción
  arrange(pcnt) |> # Oderna ascendentemente
  mutate(etiquetas = scales::percent(pcnt)) # Otra columna con el porcentaje

Recordemos…

  • usamos el pipe operator |> como un “conector”, es útil pensarlo como un ” y luego”.

  • creamos un dataframe llamado “df”,Agrupamos los datos por la variable “sex”;

  • Contamos la frecuencia de las categorias de sex, es decir, Hombre-Mujer en esta base de datos;

  • Desgrupamos la data para que no afecté el siguiente paso;

  • Usamos mutate para crear la variable pcnt en la cual vamos a dividir n(cantidad de observaciones en cada categoría)/ la suma total de observaciones de la muestra;

  • ordenamos la variable creada de menor a mayor;

  • creamos otra variable llamada etiqueta en donde generamos los porcentajes de cada categoria según la cantidad de observaciones en cada una.

bp = ggplot(df_congre, aes(x = reorder(disolucion_c, n), y = n,
                           fill = disolucion_c)) +
  geom_bar(stat = "identity") + # Data precalculada (transformación estadistica)
  scale_fill_brewer(palette = "Paired") + # Color de las barras
    coord_flip() + 
    labs(x = "", y = "Cantidad de entrevistadxs", 
         title = "Entrevistadxs según si justifica el cierre del congreso", 
         subtitle = "", caption = "LAPOP, PERU 2021", 
         fill = "¿Disolución del Congreso?") + # Leyenda
    theme(plot.title = element_text(hjust = 0.8)) + # Centrar Título
    theme(panel.background = element_rect(fill = "white", colour = "white"))  +
    geom_text(aes(label = etiquetas), vjust = 1.5, color = "Black", size = 5)
#bp
ggplotly(bp)

Entrevistados según la justificación del cierre del congreso.

Q1TB. Para fines estadísticos, ¿me podría por favor decir cuál es su género?

#str(df_lapop$q1tb)
#table(df_lapop$q1tb) # 1: 1617, 2: 1418, 3: 3    

# Eliminando casos perdidos:
sum(is.na(df_lapop$q1tb)) # NA's: 0
[1] 0
df_sex <- df_lapop |> 
  filter(!is.na(q1tb)) |> # Borramos NA's de la columna 
  mutate(sex = as.factor(q1tb)) |> 
  mutate(sex = factor(sex, levels = levels(sex), 
                               labels = c("Hombre","Mujer", "Otro")))

# Guardemos también en la data principal:
df_lapop <- df_lapop |> 
  filter(!is.na(q1tb)) |> # Borramos NA's de la columna 
  mutate(sex = as.factor(q1tb)) |> 
  mutate(sex = factor(sex, levels = levels(sex), 
                               labels = c("Hombre","Mujer", "Otro")))
df_pc <- df_sex |>
  group_by(sex) |>
  count() |>
  ungroup() |>
  mutate(pcnt = n / sum(n)) |>
  arrange(pcnt) |>
  mutate(etiquetas = scales::percent(pcnt)) 

GRAFICO DE SECTORES (PIE CHART)

pc = ggplot(df_pc, aes(x = "", y = pcnt, fill = sex)) +
  geom_col(width = 1, color = "white") + # Para los bordes
  geom_label(aes(label = etiquetas), position = position_stack(vjust = 0.5),
             show.legend = FALSE) +
  coord_polar("y", start = 0) + # Para convertir la barra en circulo
  theme_void() + # Borra todo lo que esta alrededor del grafico 
  guides(fill = guide_legend(title = "sexo")) +
  scale_fill_brewer(palette = "Paired") + # Color del gráfico
    labs(x = "", y = "Cantidad de encuestadxs", 
         title = "Encuestadxs según sexo", 
         subtitle = "", caption = "LAPOP, PERU 2021", 
         fill = "¿Disolución del Congreso?")
# Agregamos el título
#pc
pc2 <- plot_ly(df_pc,
             labels = ~ sex,
             values = ~ pcnt,
             type = 'pie')

pc2 <- pc2 |> 
  layout(title = 'Grafico Dinámico Pie',
                 xaxis = list(showgrid = FALSE,
                              zeroline = FALSE,
                              showticklabels = FALSE),
                 yaxis = list(showgrid = FALSE,
                              zeroline = FALSE,
                              showticklabels = FALSE))
pc2

Variable Categórica ordinal: m1

M1. Hablando en general acerca del gobierno actual, ¿diría usted que el trabajo que está realizando el Presidente Francisco Sagasti es…?:

  • Percepción respecto a la labor del presidente Vizcarra…
#str(df_lapop$m1)
#table(df_lapop$m1) # 1: 640, 2: 821
#sum(is.na(df_lapop$m1)) # Advertimos NA's: 1577

df_pre <- df_lapop |> 
  filter(!is.na(m1)) |> # Borramos NA's de la columna 
  mutate(percepcion = as.factor(m1)) |> 
  mutate(percepcion = factor(percepcion, levels = levels(percepcion), 
                               labels = c("Muy bueno", "Bueno", "Regular", 
                                          "Malo", "Muy malo"), ordered = T))
#table(df_pre$percepcion)
#str(df_pre$percepcion)

Subseteamos solo la variable y la sobreescribiremos en la misma data:

df_pre <- df_pre |> 
  group_by(percepcion) |> 
  count() |>
  ungroup() |>
  mutate(pcnt = n / sum(n)) |> # Creamos una columna de proporción
  arrange(pcnt) |> # Oderna descendentemente
  mutate(etiquetas = scales::percent(pcnt)) # Otra columna con el porcentaje
#df_pre

Gráfica Pie: percepcion

Gráfica de barras: percepcion

bp2 = ggplot(df_pre, aes(x = reorder(percepcion, n), y = n,
                           fill = percepcion)) +
  geom_bar(stat = "identity") + # Data precalculada (transformación estadistica)
  scale_fill_brewer(palette = "Paired") + # Color de las barras
    coord_flip() + 
    labs(x = "Categorías", y = "Frecuencias", 
         title = "Entrevistadxs según su percepción de la labor del presidente", 
         subtitle = "", caption = "LAPOP, PERU 2021", 
         fill = "Nivel de percepción:") + # Leyenda
    theme(plot.title = element_text(hjust = 0.8)) + # Centrar Título
    theme(panel.background = element_rect(fill = "white", colour = "white"))  +
    geom_text(aes(label = etiquetas), vjust = 1.5, color = "Black", size = 5)
#bp2
ggplotly(bp2)
rownames(df_pre) = df_pre$n # Etiquetas 

Boxplot

#boxplot(df_pre$m1) # Boxplot basico de R

bp3 <- ggplot(df_pre, aes(x = "", y = reorder(percepcion, n), color = "")) +
  geom_boxplot(outlier.shape = NA) + 
  coord_flip() + # Volteamos el gráfico
  scale_fill_brewer(palette = "Paired") +
  theme(legend.position = "top", axis.text.y = element_blank(),
        panel.background = element_rect(fill = "white", 
                                        colour = "white")) + # Quitamos categorías
  geom_jitter(width = 0.5,
              colour = 2 ,
              shape = 17,
              size = 1) + # Agregamos los casos como puntos
  labs(title = "Percepción de satisfacción respecto a la labor del presidente Vizcarra", 
       x = "", y = "Percepción")
#bp3
ggplotly(bp3) # Boxplot dinámico

INTERPRETACION:

  • La mayoría de personas considera que la labor del expresidente Sagasti ha sido regular.
  • El 2.90% de las personas considera que la labor del expresidente Sagasti ha sido muy mala, mientras que el 3.79 considera que fue muy buena. En particular, el 50.27% de los encuestados, es decir, la mayoría considera que su labor fue regular.

Variable númerica (Continuas o discretas): confi_ins

Creación del indicador confianza en las instituciones en el Perú:

Definir qué es un sistema politico

qué significa confianza

Luego las personas que realizan las encuestas, a traves de una serie preguntas van a medir dicho concepto. ¿cómo resumir dichas preguntas en un numero? - Indice aditivo: sumar las variables.

Definimos las variables que conforman el indicador de confianza en las instituciones…

B13. ¿Hasta qué punto tiene confianza usted en el Congreso? 49

B21. ¿Hasta qué punto tiene confianza usted en los partidos políticos? 51

B32. ¿Hasta qué punto tiene usted confianza en su municipalidad? 52

B47A. ¿Hasta qué punto tiene usted confianza en las elecciones en este país? 54

df_lapop[, c(49, 51, 52, 54)] = lapply(df_lapop[, c(49, 51, 52, 54)], as.numeric) # Convertimos a v. númericas

# Visualizamos un resumen estadistico de cada variable:
df_lapop |>
  select(b13, b21, b32, b47a) |>
  summary()
      b13             b21             b32             b47a      
 Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
 1st Qu.:1.000   1st Qu.:1.000   1st Qu.:1.000   1st Qu.:2.000  
 Median :2.000   Median :2.000   Median :3.000   Median :4.000  
 Mean   :2.297   Mean   :2.214   Mean   :3.117   Mean   :3.616  
 3rd Qu.:3.000   3rd Qu.:3.000   3rd Qu.:4.000   3rd Qu.:5.000  
 Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.000  
 NA's   :2280    NA's   :2272    NA's   :1542    NA's   :1542   
#df_lapop$confi_ins = df_lapop$b13 + df_lapop$b21 + df_lapop$b32 + df_lapop$b47a

df_lapop <- df_lapop |> 
  mutate(confi_ins = b13 + b21 + b32 + b47a)

summary(df_lapop$confi_ins)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
   4.00    7.00   10.00   11.12   15.00   27.00    2650 
df_lapop$confi_ins = ((df_lapop$confi_ins - 4) / 23) * 100
# Restamos el mínimo y divimos entre el máximo ya restado
# y finalmente se multiplica * 100: (Indice aditivo de 0 a 100)

df_lapop <- df_lapop |> 
  filter(!is.na(confi_ins)) # Eliminamos los NA's

#Resumen del indicador:
summary(df_lapop$confi_ins)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.00   13.04   26.09   30.94   47.83  100.00 

HISTOGRAMA: confi_ins

h <- ggplot(df_lapop, aes(x = confi_ins)) + 
  geom_histogram(breaks = seq(100), fill = "blue", 
                 alpha = 0.5, position = "identity") + 
  labs(title = "Confianza en la instituciones", y = "", x = "Index", 
         subtitle = "", caption = "LAPOP 2021") + 
  theme(plot.title = element_text(hjust = 0.5)) + 
  theme(panel.background = element_rect(fill = "white", colour = "white")) +
  geom_vline(aes(xintercept = mean(confi_ins, na.rm = T)), 
             color = "blue",
             linetype = "dashed",
             size = 1)
#h 
ggplotly(h)

BOXPLOT: confi_ins

bp2 <- ggplot(df_lapop, aes(x = "", y = confi_ins, color = "")) + 
  geom_boxplot(utlier.shape = NA) + 
  coord_flip() +
  theme(legend.position = "top", axis.text.y = element_blank(), 
        panel.background = element_rect(fill = "white", colour = "white")) + 
  geom_jitter(width = 0.2,
              color = 2,
              shape = 17,
              size = 1) + 
  labs(title = "El apoyo al sistema político según el sexo", x = "", y ="Index", 
       subtitle = "", caption = "@luccemhu") 
#bp2
ggplotly(bp2)

Y si agregamos… sex: q1tb?

  • Recordemos que guardamos esta variable en una nueva columna.

Violin Plot

  • Permite una comprensión de la propagación y la densidad de nuestros datos, pero hacerlo sin usar el resumen de cinco números.

  • Comparemoslo con el boxplot a traves de cowplot

p1 <- df_lapop |> # Boxplot
  ggplot(aes(x = sex , y = confi_ins, color = sex)) +
  geom_boxplot() +
  theme(legend.position = "bottom") + 
  geom_dotplot(binaxis = 'y',
               stackdir = 'center',
               dotsize = 0.5)


p2 <- df_lapop |> # Violin plot
  ggplot(aes(x = sex , y = confi_ins, color = sex)) +
  geom_violin()  +
  theme(legend.position = "bottom") + 
  geom_dotplot(binaxis = 'y',
               stackdir = 'center',
               dotsize = 0.5)

plot_grid(p1, p2) # Comparamos ambas gráficas

Ridgeline Plots: ggridges

  • Útil para la visualización compacta y la comparación de distribuciones.
p3 <- df_lapop |>
  ggplot(aes(x =  confi_ins, y =  sex, color = sex)) +
  geom_density_ridges(alpha = 0.5)
p3 

Ahora, compara los 3 gráficos en un solo plot:

  • Hint: cowplot

Bibliografía:

Ritchey, F. (2006). Estadística para las ciencias sociales. México: Mc Gray Hill Interamericana. Cap.3,4,5). http://metodos-avanzados.sociales.uba.ar/wp-content/uploads/sites/216/2021/07/Ritchey-2002_Teorica.pdf

De la puente, C. (2015). Estadística y Gráficos. Estadística aplicada a las Ciencias Sociales - Videotutoriales de enseñanza-aprendizaje. Diapositivas

Ballesteros, E. (2015). Estadística descriptiva univariante mediante el gráfico de caja y bigotes. Estadística aplicada a las Ciencias Sociales - Videotutoriales de enseñanza-aprendizaje. Diapositivas

Más recursos: