rm(list = ls())
Taller R para Ciencias Sociales - Sesión 1
Flacso - México
Sesión 1 - Introducción a R y descripción con proporciones
En esta sesión se introducirá el siguiente contenido:
- Comandos básicos de R (directorio, cargado de base de datos, características de los datos, visualización).
- Manipulación de datos (manejo de objetos, modificación y creación de variables).
- Resúmenes estadísticos de los datos.
- Manipulación de variables categóricas (factor) y proporciones en categorías (% éxitos).
- Tablas de frecuencias relativas.
- Gráficos de barras.
El siguiente comando se utiliza para limpiar todo el ambiente de trabajo:
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)
<- read_excel(path = "sesion1.xlsx", #path= tiene el nombre del archivo y su extensión
base 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
$concurrentep <- as.factor(base$concurrentep)
base$yux <- as.factor(base$yux)
base$año <- as.factor(base$año)
base
#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
<- addmargins(table(base$concurrentep, base$resultado)) #tabla de doble entrada con totales
tabla1 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)
<- base %>%
tablatidy 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
<- tablatidy %>%
tablatidy2 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()