En este documento empezaremos con los aspectos básicos de cómo usar la base de datos del Barómetro de las Américas de LAPOP para fines estadísticos. En primer lugar, veremos aspectos básicos de cómo describir una variable mediante una tabla de distribución de frecuencias y cómo graficar la variable. Para eso, vamos a usar el último informe regional “El pulso de la democracia”, disponible aquí, donde se presentan los principales hallazgos de la ronda 2018/19 del Barómetro de las Américas. Una de las secciones de este informe, reporta los datos sobre redes sociales y actitudes políticas. En esta sección, se presentan datos sobre el uso de internet y el uso de redes sociales, en general y por país. Con los datos del Barómetro de las Américas se puede saber el % de hogares con celulares, con internet, así como el % de personas que usa Whatsapp, Facebook o Twitter. En este documento vamos a reproducir estos resultados.

SOBRE LA BASE DE DATOS

Los datos que vamos a usar deben citarse de la siguiente manera: Fuente: Barómetro de las Américas por el Proyecto de Opinión Pública de América Latina (LAPOP), wwww.LapopSurveys.org. Pueden descargar los datos de manera libre aquí En este enlace, se pueden registrar o entrar como “Free User”. En el buscador, se puede ingresar el texto “merge”. Ahí se tendrá acceso a la base de datos completa “2004-2018 Grand Merge Free” en versión para STATA. Se descarga la base de datos en formato zip, la que se descomprime en formato .dta. Una vez descargada y guardada en el directorio de trabajo, se tiene que leer la base de datos como un objeto dataframe en R. En este documento se carga una base de datos recortada. Esta base de datos se encuentra alojada en el repositorio “materials_edu” de la cuenta de LAPOP en GitHub. Una vez cargada la base de datos, el reporte no incluye a EE.UU. y a Canadá, por lo que se usa el comando subset para filtrar las observaciones de estos países.

library(rio)
lapop18 <- import("https://raw.github.com/lapop-central/materials_edu/main/LAPOP_AB_Merge_2018_v1.0.sav")
lapop18 <- subset(lapop18, pais<=35)

Las variables con las que se trabajará son: SMEDIA1. ¿Tiene usted cuenta de Facebook?; SMEDIA4. ¿Tiene usted cuenta de Twitter?; SMEDIA7. ¿Tiene usted cuenta de Whatsapp?. Estas preguntas tienen como opciones: 1. Sí 2. No

Al momento de leer la base de datos en R, este programa importa las variables como “dbl+lbl” o como “num”. Estas variables se tienen que convertir a variables de tipo “factor” pues son variables categóricas, las que guardamos en nuevas variables.

lapop18$smedia1r = as.factor(lapop18$smedia1)
lapop18$smedia4r = as.factor(lapop18$smedia4)
lapop18$smedia7r = as.factor(lapop18$smedia7)

Y luego se tienen que etiquetar.

levels(lapop18$smedia1r) <- c("Sí", "No")
levels(lapop18$smedia4r) <- c("Sí", "No")
levels(lapop18$smedia7r) <- c("Sí", "No")

DESCRIBIR LAS VARIABLES

Con las variables listas, ahora procedemos a hacer las tablas generales. El comando table nos ayuda a describir la frecuencia absoluta de estas variables.

table(lapop18$smedia1r) #Facebook
## 
##    Sí    No 
## 15389 11573
table(lapop18$smedia4r) #Twitter
## 
##    Sí    No 
##  2363 24558
table(lapop18$smedia7r) #Whatsapp
## 
##    Sí    No 
## 17446  9569

Para obtener las frecuencias relativas, además, se puede usar el comando prop.table, que nos describirá los porcentajes por cada categoría de respuesta.

prop.table(table(lapop18$smedia1r))
## 
##        Sí        No 
## 0.5707663 0.4292337
prop.table(table(lapop18$smedia4r))
## 
##         Sí         No 
## 0.08777534 0.91222466
prop.table(table(lapop18$smedia7r))
## 
##        Sí        No 
## 0.6457894 0.3542106

Sin embargo, el comando prop.table nos devuelve demasiados decimales. En general preferimos trabajar con los porcentajes (por eso se multiplica x100) y con 1 decimal (se usa el comando round).

round(prop.table(table(lapop18$smedia1r)), 3)*100
## 
##   Sí   No 
## 57.1 42.9
round(prop.table(table(lapop18$smedia4r)), 3)*100
## 
##   Sí   No 
##  8.8 91.2
round(prop.table(table(lapop18$smedia7r)), 3)*100
## 
##   Sí   No 
## 64.6 35.4

No es práctico presentar 3 tablas cuando las variables tienen las mismas categorías de respuesta. Es mejor construir una sola tabla. Se puede guardar las tablas parciales y luego unirlas con el comando rbind, que une todas las filas de datos.

Facebook <- round(prop.table(table(lapop18$smedia1r)), 3)*100
Twitter <- round(prop.table(table(lapop18$smedia4r)), 3)*100
Whatsapp <- round(prop.table(table(lapop18$smedia7r)), 3)*100
tabla <- as.data.frame(rbind(Facebook, Twitter, Whatsapp))
tabla
##            Sí   No
## Facebook 57.1 42.9
## Twitter   8.8 91.2
## Whatsapp 64.6 35.4

Para tener una mejor presentación de la tabla, se puede usar el comando kable del paquete knitr.

library(knitr)
knitr::kable(tabla, format="markdown")
No
Facebook 57.1 42.9
Twitter 8.8 91.2
Whatsapp 64.6 35.4

CALCULAR LAS VARIABLES DE USUARIOS DE REDES SOCIALES

Tal como se describió en el documento de Manipulación (disponible aquí), se puede identificar a los usuarios de redes sociales mediante la combinación de dos variables. Se puede describir cada variable usando el comando table, que nos daría la frecuencia de observaciones por cada categoría de la variable “usuario”. El interés es saber la frecuencia relativa de usuarios y no usuarios, por lo que también se incluye el comando prop.table.

lapop18$fb_user <- ifelse(lapop18$smedia1==1 & lapop18$smedia2<=4, 1, 0)
prop.table(table(lapop18$fb_user))
## 
##        0        1 
## 0.438289 0.561711
lapop18$tw_user <- ifelse(lapop18$smedia4==1 & lapop18$smedia5<=4, 1, 0)
prop.table(table(lapop18$tw_user))
## 
##          0          1 
## 0.92056769 0.07943231
lapop18$wa_user <- ifelse(lapop18$smedia7==1 & lapop18$smedia8<=4, 1, 0)
prop.table(table(lapop18$wa_user))
## 
##         0         1 
## 0.3576561 0.6423439

DESCRIBIR LAS VARIABLES TOMANDO EN CUENTA EL EFECTO DE DISEÑO

Los resultados presentados no son exactamente iguales a los del reporte pues LAPOP incluye el efecto del diseño muestral en sus cálculos. Según esta sintaxis, se encuentra que el 57.1% de entrevistados reporta ser usuario de Facebook, cuando en el reporte aparece 56.2%. Lo mismo con Twitter, que aquí se calcula en 8.8% y en el reporte 7.9%; y con Whatsapp que aquí aparece con 64.6% y en el reporte con 64.4%. Como se indicó en el documento sobre el uso de los factores de expansión usando los datos del Barómetro de las Américas (disponible aquí), hay varias maneras de reproducir los resultados incorporando el efecto de diseño. Para reproducir los datos exactamente se tiene que incluir este efecto de diseño en R mediante el paquete survey, aunque hay algunos comandos que permiten la ponderación, como el comando freq del paquete descr, que permite incluir “weight1500” como factor de expansión. Aquí usamos ese comando y guardamos la tabla en un objeto (“fc”, “tw” y “wa”). Luego se editan los nombres de las columnas y se agrupa todos los datos en un dataframe, usando el comando cbind para juntar las columnas desde las 3 tablas. Luego, este dataframe se usará para reproducir el gráfico circular con los porcentajes exactos a los del reporte. Para esto, se elimina las filas de NA y de Total que no se requieren y se agrega una columna con las opciones de respuesta.

library(descr)
fc <- descr::freq(lapop18$fb_user, lapop18$weight1500, plot=F)
colnames(fc) <- c("freq_fc", "per_fc", "vper_fc")
tw <- descr::freq(lapop18$tw_user, lapop18$weight1500, plot=F)
colnames(tw) <- c("freq_tw", "per_tw", "vper_tw")
wa <- descr::freq(lapop18$wa_user, lapop18$weight1500, plot=F)
colnames(wa) <- c("freq_wa", "per_wa", "vper_wa")
tablaweight <- as.data.frame(cbind(fc, tw, wa))
tablaweight <- tablaweight[-c(3:4),]
tablaweight$rpta <- c("No", "Sí")
tablaweight
##    freq_fc   per_fc  vper_fc   freq_tw    per_tw   vper_tw   freq_wa   per_wa
## 0 11336.69 41.98776 43.77052 23819.375 88.219907 92.023002  9251.708 34.26558
## 1 14563.60 53.93926 56.22948  2064.778  7.647328  7.976998 16713.689 61.90255
##    vper_wa rpta
## 0 35.63091   No
## 1 64.36909   Sí

GRAFICAR LAS VARIABLES

En la página 54 del reporte se observa que se reportan estos datos en forma gráfica, mediante un gráfico de sectores. Se puede reproducir ese gráfico usando el comando pie que es parte de la sintaxis básica de R.

pie(table(lapop18$smedia1r))

Para tener más opciones gráficas, podemos usar el paquete ggplot para reproducir el gráfico circular. En este ejemplo, se ha usado el comando subset nuevamente, pero dentro de ggplot para que el comando (internamente) trabaje con la variable pero sin los valores perdidos. La sintaxis !is.na() elimina los valores perdidos de una variable. Si se hubiera usado data=lapop el gráfico hubiera incluido un gran sector correspondiente a la proporción de NA. Si se hubiera usado !is.na() fuera de ggplot creando una nueva variable se hubieran eliminado todas las observaciones con valores perdidos, lo que disminuiría el N, afectando futuros cálculos.

library(ggplot2) #librería especializada en gráficos
library(scales) #para formatear las etiquetas en porcentajes
ggplot(data=subset(lapop18, !is.na(smedia1r)), aes(x="", fill=smedia1r))+
  geom_bar(width=1)+
  coord_polar("y", start=0)

Sin embargo, para manipular mejor el gráfico es más fácil crear un nuevo dataframe con los datos agregados (frecuencia y %). Luego se usa ese nuevo dataframe para hacer el pie con ggplot. Un aspecto a resaltar es que en este caso se está usando el pipe %>%, que es una forma (un poco) diferente de escribir códigos en R. Una explicación simple de cómo se usa el pipe se puede encontrar aquí. Aquí nuevamente se trabaja con un subset de la base de lapop donde se elimina los valores perdidos de SMEDIA1 del cálculo de los %.

library(dplyr)
df <- subset(lapop18, !is.na(smedia1r)) %>%
      group_by(smedia1r) %>% 
      summarise(n = n()) %>%
      mutate(per=round(n/sum(n), 3)*100, lab.pos=cumsum(per)-0.5*per)
df
## # A tibble: 2 x 4
##   smedia1r     n   per lab.pos
##   <fct>    <int> <dbl>   <dbl>
## 1 Sí       15389  57.1    28.6
## 2 No       11573  42.9    78.6

También se puede usar la siguiente librería janitor y el comando tabyl para general la misma tabla.

library(janitor)
subset(lapop18, !is.na(smedia1r)) %>%
  tabyl(smedia1r)
##  smedia1r     n   percent
##        Sí 15389 0.5707663
##        No 11573 0.4292337

Una vez que tenemos la tabla, podemos usarla para trabajar el gráfico circular con ggplot. Nótese que, en este caso, los datos que se usan vienen del dataframe df (no lapop18). Este dataframe tiene una columna llamada “per” con los % respectivos que se grafican en el eje Y. Para hacer el gráfico circular, se parte del gráfico de barras (por eso geom_bar), que luego se pasa a coordenadas polares (por eso coord_polar). Finalmente, se agrega texto con los datos de los % y se etiqueta la leyenda con la variable respectiva.

ggplot(data=df, aes(x="", y=per, fill=smedia1r))+
  geom_bar(width=1, stat="identity")+
  geom_text(aes(label=paste(per, "%", sep="")), color="white", hjust=0.5, vjust=1)+
  coord_polar("y", start=0)+
  theme_void()+
  scale_fill_discrete(name="¿Usa Facebook?")

Si en lugar de un gráfico circular se quiere presentar un gráfico de barras. Con los datos del dataframe “lapop18” se puede utilizar el siguiente código:

ggplot(data=subset(lapop18, !is.na(smedia1r)), aes(x=smedia1r))+
  geom_bar(aes(y=..prop..*100, group=1), width=0.5)+
  labs(title="¿Qué tan frecuente se usan las redes sociales?", x="Usuario de Facebook", y="Porcentaje", caption="Barómetro de las Américas por LAPOP, 2018/19")+
  coord_cartesian(ylim=c(0, 60))

Pero, si queremos usar los datos agrupados del dataframe “df”, se puede hacer:

ggplot(df, aes(x=smedia1r, y=per))+
  geom_bar(stat="identity",  width=0.5)+
  geom_text(aes(label=paste(per, "%", sep="")), color="black", vjust=-0.5)+
  labs(title="¿Qué tan frecuente se usan las redes sociales", x="Usuario de Facebook", y="Porcentaje", caption="Barómetro de las Américas por LAPOP, 2018/19")+
  coord_cartesian(ylim=c(0, 60))

GRAFICOS CON LOS DATOS PONDERADOS

De la misma manera cómo se graficaron los datos de “df”, ahora se usan los datos de “tablaweight” para reproducir el gráfico circular con los porcentajes exactos como aparecen en el reporte. Se usa la columna “vper_fc” (porcentaje válido, sin considerar NA, de Facebook) del dataframe “tablaweight” y la columna “rpta” para las opciones “No” y “Sí” de la leyenda.

ggplot(data=tablaweight, aes(x="", y=vper_fc, fill=rpta))+
  geom_bar(width=1, stat="identity")+
  geom_text(aes(label=paste(round(vper_fc,1), "%", sep="")), color="white", hjust=0.5, vjust=1)+
  coord_polar("y", start=0)+
  theme_void()+
  scale_fill_discrete(name="¿Usa Facebook?")

RESUMEN

En este documento se ha trabajado con variables categóricas nominales, como si usa o no usa redes sociales. Se ha presentando las formas de cómo describir y graficar estas variables, mediante gráficos circulares y de barras, tanto tomando en cuenta como sin tomar en cuenta el factor de expansión.