Taller R para Ciencias Sociales - Sesión 1

Flacso - México

Author

Elvira-Torres & Gomez-Santiago

Published

October 15, 2023

Sesión 1 - Introducción a R y descripción con proporciones

En esta sesión se introducirá el siguiente contenido:

  1. Comandos básicos de R (directorio, cargado de base de datos, características de los datos, visualización).
  2. Manipulación de datos (manejo de objetos, modificación y creación de variables).
  3. Resúmenes estadísticos de los datos.
  4. Manipulación de variables categóricas (factor) y proporciones en categorías (% éxitos).
  5. Tablas de frecuencias relativas.
  6. Gráficos de barras.

El siguiente comando se utiliza para limpiar todo el ambiente de trabajo:

rm(list = ls())

El comando ‘setwd()’ se utiliza para establecer una ruta al directorio deseado, asegurate de tener la base de datos a utilizar en la carpeta que definas como directorio de trabajo

setwd("D:/GERARDO/Documents/Escritorio/tidyverso/tidyverso")

Activamos librerías necesarias con ‘library()’:

library(tidyverse)
library(readxl)

Cargamos la base al ambiente desde un archivo excel (formato .xlsx) con ‘read_excel()’ del paquete ‘readxl’:

# data (cargar la base)

base <- read_excel(path = "sesion1.xlsx", #path= tiene el nombre del archivo y su extensión 
                   sheet = 3) #sheet= es la hoja del archivo deseada

A continuación se presenta un listado de comandos para visualizar nuestra base de datos, es una buena practica antes de empezar a utilizar los datos:

#Visualización de datos

names(base) #nombres de las columnas
str(base) #descripción de las características de las columnas
glimpse(base) #primeras filas para cada columna de la base de datos
head(base) #primeras filas de la base de datos
tail(base,15) #últimas filas de la base de datos
summary(base) #resumen estadístico de los datos
print(base) #muestra la base de datos (similar a 'head()')
view(base) #despliega una pestaña nueva en el ambiente con la base de datos

Tratamos nuestras variables que deberían ser categóricas para convertirlas a tipo factor, que en R corresponden a categorías (y no a valores de texto character o valores numericos numeric) y le asignamos etiquetas a cada valor, en este caso particular convertiremos las variables concurrencia, yuxtaposición y año.

#treatfactor

#Convertrir variables a factor en R base

base$concurrentep <- as.factor(base$concurrentep)
base$yux <- as.factor(base$yux)
base$año <- as.factor(base$año)

#Características del factor: levels (etiquetas)

sapply(X = c(base[4],base[6]), FUN = levels)  # la función 'sapply()' toma una lista de valores de un vector seleccionado (X)
                                              # y les aplica una función (FUN) 

# Cambio de etiquetas
# RTips: El número de categorias de la variable debe ser igual al numero de etiquetas a aplicar

levels(base$yux) <- c("Coincidente", "Yuxtapuesto")  
levels(base$concurrentep) <- c("No concurrente", "Concurrente")
levels(base$año) <- c("2018", "2021")
sapply(base[4:6], levels)

Proporciones (% de éxitos)

Partimos de una pregunta de investigación:

¿Los estados con elecciones locales concurrentes tienen mayor probabilidad de ser coincidentes?

Para responder a esta pregunta realizamos una descripción de los datos con la ayuda de tablas de frecuencia relativa de éxitos.
A continuación se presenta una alternativa para la modificación de las variables necesarias para generar las tablas de doble entrada.

Con la función mutate() -de la librería ‘tidyverse’- es otra alternativa para modificar o crear nuevas variables de cero o a partir de los valores de otra. En este caso se crea una nueva variable categórica partiendo de una factor.

#mutate
#Crear variables con tidyverse

base <- base %>% 
  mutate(resultado = factor(yux,                                    # Variable de la cual se parte
                            levels=c("Coincidente", "Yuxtapuesto"), # Etiquetas de la variable original
                            labels=c("Ganó", "Perdió")))            # Etiquetas de la nueva variable

Visualizamos los datos a través de una tabla con la función ‘table()’ y le añadimos margenes con ‘addmargins()’ -una función del paquete ‘stats’ que viene por defecto con la paqueterpia de R-:

#tablemargins
# Tabla de contingencia de dos variables categóricas

table(base$concurrentep, base$resultado) #tabla de doble entrada sin totales
                
                 Ganó Perdió
  No concurrente    6     23
  Concurrente      16     19
tabla1 <- addmargins(table(base$concurrentep, base$resultado)) #tabla de doble entrada con totales
tabla1
                
                 Ganó Perdió Sum
  No concurrente    6     23  29
  Concurrente      16     19  35
  Sum              22     42  64
# Comprobamos el tipo de objeto de nuetsro objeto creado con 'addmargins()', en este caso es un objeto tabla ó matriz
class(tabla1)
[1] "table"  "matrix" "array" 

Otra alternativa para generar frecuencias es creando una tabla de datos a través del paquete ‘dplyr’:

#tibble (tidyverse)

tablatidy <- base %>% 
  group_by(concurrentep,resultado) %>%   # En 'group_by()' se especifican las dos variables categoricas de interes
  count() %>%                            # con la función 'count()' se cuentan los casos para cada categoria 'concurrente' y 'resultado'
  ungroup() %>%                          # Desagrupamos
  group_by(concurrentep) %>%             # Debemos agrupar por las categorias a comparar usando nuevamente 'group_by()'
  mutate(total=sum(n),                   # Con 'mutate()' creamos nuevas variables, una que contiene el total por categoria de 'concurrente'
         prop=n/sum(n))                  # y la proporción dentro de cada categoria de concurrente que gano la elección

tablatidy
# A tibble: 4 × 5
# Groups:   concurrentep [2]
  concurrentep   resultado     n total  prop
  <fct>          <fct>     <int> <int> <dbl>
1 No concurrente Ganó          6    29 0.207
2 No concurrente Perdió       23    29 0.793
3 Concurrente    Ganó         16    35 0.457
4 Concurrente    Perdió       19    35 0.543

La manera de obtener un elemento de interes de las tablas creadas, cambia en función del tipo de objeto creado, el objeto tabla1 creado con ‘addmargins()’, es tipo matriz, mientras el objeto tablatidy creado con ‘dplyr’, es de tipo dataframe.
A continuación se presenta la forma de obtener el total de Estados concurrentes usando tabla1 el cual requiere un conteo de los elementos por columna y usando tablatidy, el cual requiere nombrar la variable donde esta contenida dicha información.

Filtramos la tablatidy para obtener solo las filas con la información necesaria para una comparación de proporciones:

#Filtramos 

tablatidy2 <- tablatidy %>% 
  filter(resultado=="Ganó") # Adentro de la función 'filter()' siempre debe haber una condición lógica, en este caso
                            # los casos en que la variable 'resultado' toma el valor de "Ganó"

tablatidy2
# A tibble: 2 × 5
# Groups:   concurrentep [2]
  concurrentep   resultado     n total  prop
  <fct>          <fct>     <int> <int> <dbl>
1 No concurrente Ganó          6    29 0.207
2 Concurrente    Ganó         16    35 0.457

Las visualizaciones nos ayudan a tener una mejor idea del comportamiento de los fenomenos que estamos analizando, cuando comparamos proporciones una buena manera de visualzarlo es a través de gráficos de barras, a continuación se presentan dos alternativas para generar esas vsualizaciones

Opción 1: Un gráfico de barras -con R base- con la proporción de exitos en cada categoría:

barplot(tablatidy2$prop,
        names.arg = tablatidy2$concurrentep,
        xlab = "Calendario electoral",
        ylab = "proporción de éxitos",
        main = "Gráfico de proprociones por categoría",
        ylim = c(0, .6))

Opción 2: Mismo gráfico pero utilizando el paquete ‘ggplot2’

tablatidy2 %>% 
  ggplot(mapping = aes(x=concurrentep,y=prop))+
  geom_col()+
  geom_text(aes(label=round(prop,2)),nudge_y = .025)+
  labs(title = "Gráfico de proporciones por categoría",
       x="Calendario electoral",
       y= "proporción de éxitos",
       caption="Fuente: elaboración propia.")+
  scale_y_continuous(limits = c(0,.6),n.breaks = 6)+
  theme_bw()