En este documento vamos a seguir 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. En este caso vamos a trabajar con la frecuencia de uso de las redes sociales.
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 puede 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. Adicionalmente, el reporte con el que seguimos trabajando no incluye a EE.UU. y a Canadá. Se usa el comando subset para filtrar las observaciones de estos países.
library(haven)
lapop <- read_dta("/Users/Arturo/OneDrive - Vanderbilt/C LAPOP/Data/LAPOP_Merge_2004_2018.dta")
lapop <- subset(lapop, pais<=35)
En el documento 1 sobre estadística descriptiva, que se puede ver aquí, se trabajó con variables nominales, con opciones de respuesta dicotómica Sí/No. En este documento se va a trabajar con variables ordinales. De esta manera, se va a usar la variable SMEDIA2.¿Con qué frecuencia ve contenido en Facebook?, SMEDIA5.¿Con qué frecuencia ve contenido en Twitter? y SMEDIA8.¿Con qué frecuencia usa Whatsapp?. Estas variables tienen como opciones de respuesta:
De la misma manera que con las variables nominales, estas variables tienen que ser declaradas como “factor” en nuevas variables.
lapop$smedia2r = as.factor(lapop$smedia2)
lapop$smedia5r = as.factor(lapop$smedia5)
lapop$smedia8r = as.factor(lapop$smedia8)
Y luego se tienen que etiquetar. y generar las tablas descriptivas básicas
levels(lapop$smedia2r) <- c("Diariamente", "Algunas veces a la semana",
"Algunas veces al mes", "Algunas veces al año",
"Nunca")
levels(lapop$smedia5r) <- c("Diariamente", "Algunas veces a la semana",
"Algunas veces al mes", "Algunas veces al año",
"Nunca")
levels(lapop$smedia8r) <- c("Diariamente", "Algunas veces a la semana",
"Algunas veces al mes", "Algunas veces al año",
"Nunca")
table(lapop$smedia2r)
##
## Diariamente Algunas veces a la semana Algunas veces al mes
## 8633 4927 1286
## Algunas veces al año Nunca
## 282 231
table(lapop$smedia5r)
##
## Diariamente Algunas veces a la semana Algunas veces al mes
## 795 728 422
## Algunas veces al año Nunca
## 193 220
table(lapop$smedia8r)
##
## Diariamente Algunas veces a la semana Algunas veces al mes
## 14151 2646 495
## Algunas veces al año Nunca
## 50 87
Para producir las tablas con porcentajes, redondeados a un decimal.
round(prop.table(table(lapop$smedia2r)), 3)*100
##
## Diariamente Algunas veces a la semana Algunas veces al mes
## 56.2 32.1 8.4
## Algunas veces al año Nunca
## 1.8 1.5
round(prop.table(table(lapop$smedia5r)), 3)*100
##
## Diariamente Algunas veces a la semana Algunas veces al mes
## 33.7 30.9 17.9
## Algunas veces al año Nunca
## 8.2 9.3
round(prop.table(table(lapop$smedia8r)), 3)*100
##
## Diariamente Algunas veces a la semana Algunas veces al mes
## 81.2 15.2 2.8
## Algunas veces al año Nunca
## 0.3 0.5
Para presentar todos los datos en una tabla conjunta.
Facebook <- round(prop.table(table(lapop$smedia2r)), 3)*100
Twitter <- round(prop.table(table(lapop$smedia5r)), 3)*100
Whatsapp <- round(prop.table(table(lapop$smedia8r)), 3)*100
tabla <- as.data.frame(rbind(Facebook, Twitter, Whatsapp))
tabla
## Diariamente Algunas veces a la semana Algunas veces al mes
## Facebook 56.2 32.1 8.4
## Twitter 33.7 30.9 17.9
## Whatsapp 81.2 15.2 2.8
## Algunas veces al año Nunca
## Facebook 1.8 1.5
## Twitter 8.2 9.3
## Whatsapp 0.3 0.5
Para tener una mejor presentación de la tabla, se puede usar el comando kable del paquete knitr o el comando formattable del paquete del mismo nombre.
library(knitr)
kable(head(tabla), format="markdown", digits=1)
| Diariamente | Algunas veces a la semana | Algunas veces al mes | Algunas veces al año | Nunca | |
|---|---|---|---|---|---|
| 56.2 | 32.1 | 8.4 | 1.8 | 1.5 | |
| 33.7 | 30.9 | 17.9 | 8.2 | 9.3 | |
| 81.2 | 15.2 | 2.8 | 0.3 | 0.5 |
library(formattable)
formattable(tabla)
| Diariamente | Algunas veces a la semana | Algunas veces al mes | Algunas veces al año | Nunca | |
|---|---|---|---|---|---|
| 56.2 | 32.1 | 8.4 | 1.8 | 1.5 | |
| 33.7 | 30.9 | 17.9 | 8.2 | 9.3 | |
| 81.2 | 15.2 | 2.8 | 0.3 | 0.5 |
Para graficar, se replica el código usado en el documento anterior para hacer la tabla resumen y el gráfico de pie.
library(dplyr)
df <- lapop %>%
filter(!is.na(smedia2r)) %>%
group_by(smedia2r) %>%
summarise(n = n()) %>%
mutate(per=round(n/sum(n), 3)*100, lab.pos=cumsum(per)-0.5*per)
df
## # A tibble: 5 x 4
## smedia2r n per lab.pos
## <fct> <int> <dbl> <dbl>
## 1 Diariamente 8633 56.2 28.1
## 2 Algunas veces a la semana 4927 32.1 72.3
## 3 Algunas veces al mes 1286 8.4 92.5
## 4 Algunas veces al año 282 1.8 97.6
## 5 Nunca 231 1.5 99.2
library(ggplot2)
ggplot(data=df, aes(x="", y=per, fill=smedia2r))+
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="Frecuencia de uso de Facebook")
Y para replicar el gráfico de barras, se usa
ggplot(df, aes(x=smedia2r, 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="Frecuencia de uso", y="Porcentaje", caption="Barómetro de las Américas por LAPOP, 2018/19")+
coord_cartesian(ylim=c(0, 60))
Hasta aquí se ha replicado las tablas y gráficos que se usaron con las variables nominales, ahora usando variables ordinales.
En la página 55 del reporte “El pulso de la democracia” se presenta los porcentajes de uso de las redes sociales por país. Para replicar esta tabla primero se tiene que definir la variable “pais” y las variables de uso de redes sociales (smedia1, smedia4 y smedia7). Luego, en la página 56 se presenta un cuadro con el % de usuarios de redes sociales por características sociodemográficas, por ejemplo, urbano/rural, hombre, edad promedio, riqueza promedio y años de estudio. Empezaremos replicando el cuadro de uso de redes sociales por país, para lo cual, primero, se definen las variables y se etiquetan. Se presentan las tablas de distribución de frecuencias como paso preliminar para comprobar nuestras operaciones.
lapop$smedia1r = as.factor(lapop$smedia1)
lapop$smedia4r = as.factor(lapop$smedia4)
lapop$smedia7r = as.factor(lapop$smedia7)
levels(lapop$smedia1r) <- c("Sí", "No")
levels(lapop$smedia4r) <- c("Sí", "No")
levels(lapop$smedia7r) <- c("Sí", "No")
lapop$pais = as.factor(lapop$pais)
levels(lapop$pais) <- c("México", "Guatemala", "El Salvador", "Honduras",
"Nicaragua","Costa Rica", "Panamá", "Colombia",
"Ecuador", "Bolivia", "Perú", "Paraguay",
"Chile", "Uruguay", "Brasil", "Venezuela",
"Argentina", "Rep. Dom.", "Haití", "Jamaica",
"Guyana", "Trinidad y Tobago", "Belice", "Surinám",
"Bahamas", "Barbados", "Granada", "Santa Lucía",
"Dominica", "Antigua y Barbuda", "San Vicente y las Granadinas",
"San Cristobal y Nieves")
levels(lapop$pais)
## [1] "México" "Guatemala"
## [3] "El Salvador" "Honduras"
## [5] "Nicaragua" "Costa Rica"
## [7] "Panamá" "Colombia"
## [9] "Ecuador" "Bolivia"
## [11] "Perú" "Paraguay"
## [13] "Chile" "Uruguay"
## [15] "Brasil" "Venezuela"
## [17] "Argentina" "Rep. Dom."
## [19] "Haití" "Jamaica"
## [21] "Guyana" "Trinidad y Tobago"
## [23] "Belice" "Surinám"
## [25] "Bahamas" "Barbados"
## [27] "Granada" "Santa Lucía"
## [29] "Dominica" "Antigua y Barbuda"
## [31] "San Vicente y las Granadinas" "San Cristobal y Nieves"
table(lapop$pais) #País
##
## México Guatemala
## 12476 12395
## El Salvador Honduras
## 12488 12612
## Nicaragua Costa Rica
## 12607 12046
## Panamá Colombia
## 12455 12213
## Ecuador Bolivia
## 17991 21569
## Perú Paraguay
## 11668 9888
## Chile Uruguay
## 11414 10319
## Brasil Venezuela
## 11222 9068
## Argentina Rep. Dom.
## 8976 15047
## Haití Jamaica
## 10482 10629
## Guyana Trinidad y Tobago
## 10271 7212
## Belice Surinám
## 6101 7006
## Bahamas Barbados
## 3429 3828
## Granada Santa Lucía
## 1004 1019
## Dominica Antigua y Barbuda
## 1016 1017
## San Vicente y las Granadinas San Cristobal y Nieves
## 1008 0
table(lapop$smedia1r) #Facebook
##
## Sí No
## 15389 11573
table(lapop$smedia4r) #Twitter
##
## Sí No
## 2363 24558
table(lapop$smedia7r) #Whatsapp
##
## Sí No
## 17446 9569
lapop$hombre <- 2-lapop$q1
En primer lugar, se crean las tablas bivariadas entre cada red social y país. Estas tablas presentan el % de quienes usan y el % de los que no usan cada red social. Estas tablas se guardan en objetos de R. Luego se unen estos objetos usando los comandos as.data.frame para unir las tablas como un dataframe y cbind para juntar las columnas. Esta tabla presenta datos de países que no tienen información de las variables sobre redes sociales. Para presentar una tabla que incluya solo a los países que tienen información en estas variables, se eliminan estas filas de país sin información y también se eliminan las columnas que registran los % de los que No usan estas redes sociales. Finalmente, se cambia el nombre de las columnas del dataframe.
fbpais <- round(prop.table(table(lapop$pais, lapop$smedia1r), 1), 3)*100
twpais <- round(prop.table(table(lapop$pais, lapop$smedia4r), 1), 3)*100
whpais <- round(prop.table(table(lapop$pais, lapop$smedia7r), 1), 3)*100
tablapais <- as.data.frame(cbind(fbpais, twpais, whpais))
tablapais <- tablapais[c(-16,-19, -21, -22, -23, -24, -25, -26, -27, -28,
-29, -30, -31, -32), c(-2, -4, -6)]
varnames <- c("Usa Facebook", "Usa Twitter", "Usa Whatsapp")
colnames(tablapais) <- varnames
tablapais
## Usa Facebook Usa Twitter Usa Whatsapp
## México 48.7 8.4 55.6
## Guatemala 43.8 6.7 47.8
## El Salvador 56.7 6.9 56.5
## Honduras 44.8 5.2 47.4
## Nicaragua 49.0 6.0 48.0
## Costa Rica 67.6 8.8 82.0
## Panamá 35.9 6.6 56.8
## Colombia 60.6 11.6 63.7
## Ecuador 67.3 12.7 60.7
## Bolivia 58.2 5.8 64.0
## Perú 61.5 8.5 58.8
## Paraguay 61.0 8.4 69.4
## Chile 63.7 10.2 76.1
## Uruguay 68.7 11.2 80.4
## Brasil 60.4 8.9 75.1
## Argentina 69.1 14.7 79.5
## Rep. Dom. 62.8 10.6 68.6
## Jamaica 47.9 5.5 68.3
Para tener una mejor presentación de la tabla se tienen dos alternativas: la primera con la librería knitr y la otra con la librería formattable.
library(knitr)
kable(head(tablapais), format="markdown", digits=1)
| Usa Facebook | Usa Twitter | Usa Whatsapp | |
|---|---|---|---|
| México | 48.7 | 8.4 | 55.6 |
| Guatemala | 43.8 | 6.7 | 47.8 |
| El Salvador | 56.7 | 6.9 | 56.5 |
| Honduras | 44.8 | 5.2 | 47.4 |
| Nicaragua | 49.0 | 6.0 | 48.0 |
| Costa Rica | 67.6 | 8.8 | 82.0 |
library(formattable)
formattable(tablapais)
| Usa Facebook | Usa Twitter | Usa Whatsapp | |
|---|---|---|---|
| México | 48.7 | 8.4 | 55.6 |
| Guatemala | 43.8 | 6.7 | 47.8 |
| El Salvador | 56.7 | 6.9 | 56.5 |
| Honduras | 44.8 | 5.2 | 47.4 |
| Nicaragua | 49.0 | 6.0 | 48.0 |
| Costa Rica | 67.6 | 8.8 | 82.0 |
| Panamá | 35.9 | 6.6 | 56.8 |
| Colombia | 60.6 | 11.6 | 63.7 |
| Ecuador | 67.3 | 12.7 | 60.7 |
| Bolivia | 58.2 | 5.8 | 64.0 |
| Perú | 61.5 | 8.5 | 58.8 |
| Paraguay | 61.0 | 8.4 | 69.4 |
| Chile | 63.7 | 10.2 | 76.1 |
| Uruguay | 68.7 | 11.2 | 80.4 |
| Brasil | 60.4 | 8.9 | 75.1 |
| Argentina | 69.1 | 14.7 | 79.5 |
| Rep. Dom. | 62.8 | 10.6 | 68.6 |
| Jamaica | 47.9 | 5.5 | 68.3 |
En la página 58 del reporte “El pulso de la democracia” se presenta los resultados del cruce entre las variables uso de redes sociales y variables sociodemográficas como urbano/rural, sexo, edad, riqueza y años de educación. La variable urbano/rural se llama “ur” en la base de datos y está codificada de la siguiente manera:
En la base de datos también se cuenta con una recodificación de esta variable. La variable recodificada “urban” está codificada se la siguiente manera:
En primer lugar se presentará las tablas cruzadas, para entender mejor cómo se construye la tabla general. Por ejemplo, el reporte muestra, luego de la columna de población general, las columnas para usuarios y no usuarios de Whatsapp (variable “smedia7r”) y en las filas, la primera corresponde a urbano (variable “urban”, donde 0 es rural y 1 urbano)
round(prop.table(table(lapop$urban, lapop$smedia7r), 2)*100, 1)
##
## Sí No
## 0 23.3 38.1
## 1 76.7 61.9
Esto se puede ver mejor en un gráfico de barras agrupadas. Lo primero que haremos es crear una tabla con los datos agrupados. Se agrupa tanto por uso de Whatsapp como por urbano/rural, es decir, en cuatro combinaciones. En cada subgrupo se calcula el n. Dado que los % se tienen que calcular por cada grupo de “smedia7r”, se veulve a agrupar y se calcula los % de cada subgrupo, de tal manera que los % sumen 100% en cada subgrupo de “smedia7r”. Con la tabla lista, se usa el comando ggplot definiendo que “smedia7r” sea la variable en el eje X, que el eje Y sea el % y que los subgrupos se formen por la variable “urbano”. Se usa la especificación dodge para tener las barras separadas por cada grupo.
lapop$urbano = as.factor(lapop$urban)
levels(lapop$urbano) <- c("Rural", "Urbano")
face <- subset(lapop, !is.na(smedia7r)) %>% #Se usa !is.na para que no se reporte los NA en la tabla
group_by(smedia7r, urbano) %>% #Se configuran los grupos
count() %>% #Se calcula el n
group_by(smedia7r) %>% #
mutate(porcentaje = round(n/sum(n), 3)*100)
face
## # A tibble: 4 x 4
## # Groups: smedia7r [2]
## smedia7r urbano n porcentaje
## <fct> <fct> <int> <dbl>
## 1 Sí Rural 4062 23.3
## 2 Sí Urbano 13384 76.7
## 3 No Rural 3643 38.1
## 4 No Urbano 5926 61.9
ggplot(data=face, aes(x=smedia7r, y=porcentaje, fill=urbano))+
geom_bar(position="dodge", stat="identity")+
geom_text(aes(label=paste(porcentaje, "%", sep="")), position=position_dodge(0.9), vjust=-0.5)+
ylab("Porcentaje")+
xlab("Usuario de Whatsapp")
En este caso las barras celestes indican los porcentajes reportados en la tabla 3.2 del reporte y corresponde a la proporción de personas que viven en el ámbito urbano entre los usuarios (“Sí”) y los no usuarios (“No”). Para que quede claro, ahora se presentará la tabla entre usuarios de Facebook (variable “smedia1r”) y hombre (variable “hombre”), pero presentando solo los % usado en la tabla y ahora usando el estilo de código “pipe”.
tabla1 <- subset(lapop, !is.na(smedia1r)) %>% #Para no incluir al grupo de NA de smedia1r
group_by(smedia1r) %>%
summarise(hombre=mean(hombre, na.rm=T)) #Se incluye na.rm=T porque hombre tiene NAs
tabla1
## # A tibble: 2 x 2
## smedia1r hombre
## <fct> <dbl>
## 1 Sí 0.498
## 2 No 0.497
Nuevamente, se reporta solo estos porcentajes en la tabla 3.2 del reporte. Como se indicó, en este documento, los resultados no son exactamente iguales porque en estos ejercicios no estamos tomando en cuenta el efecto de diseño muestral. Es por este motivo que aquí se calcula que la proporción de hombres entre los usuarios de Facebook es 49.8%, cuando en el reporte se indica 49.7%. Con esto en mente, lo que se hará es crear una tabla donde se calcule cada uno de esos porcentajes parciales. En el siguiente código se ingresa en cada celda de un dataframe la proporción de personas que viven en el ámbito urbano y la proporción de hombres, por usuario/no usuario de cada red social. Solo vamos a trabajar con las variables categóricas “urban” y “hombre” y no con edad, riqueza o años de estudio para no tener una tabla tan extensa, pero el procedimiento con estas variables numéricas sería idéntico.
df1 <- lapop %>%
filter(smedia1==1) %>%
summarise(round(mean(urban, na.rm=T), 3)*100)
df1[1,2] <-lapop %>%
filter(smedia1==2) %>%
summarise(round(mean(urban, na.rm=T), 3)*100)
df1[1,3] <- lapop %>%
filter(smedia4==1) %>%
summarise(round(mean(urban, na.rm=T), 3)*100)
df1[1,4] <- lapop %>%
filter(smedia4==2) %>%
summarise(round(mean(urban, na.rm=T), 3)*100)
df1[1,5] <- lapop %>%
filter(smedia7==1) %>%
summarise(round(mean(urban, na.rm=T), 3)*100)
df1[1,6] <- lapop %>%
filter(smedia7==2) %>%
summarise(round(mean(urban, na.rm=T), 3)*100)
df1[2,1] <- lapop %>%
filter(smedia1==1) %>%
summarise(round(mean(hombre, na.rm=T), 3)*100)
df1[2,2] <-lapop %>%
filter(smedia1==2) %>%
summarise(round(mean(hombre, na.rm=T), 3)*100)
df1[2,3] <- lapop %>%
filter(smedia4==1) %>%
summarise(round(mean(hombre, na.rm=T), 3)*100)
df1[2,4] <- lapop %>%
filter(smedia4==2) %>%
summarise(round(mean(hombre, na.rm=T), 3)*100)
df1[2,5] <- lapop %>%
filter(smedia7==1) %>%
summarise(round(mean(hombre, na.rm=T), 3)*100)
df1[2,6] <- lapop %>%
filter(smedia7==2) %>%
summarise(round(mean(hombre, na.rm=T), 3)*100)
Una vez creada la tabla, se le da el estilo correspondiente.
tablasoc <- as.data.frame(df1)
varnames <- c("Usuario de Facebook", "No usuario de Facebook", "Usuario de Twitter",
"No usuario de Twitter", "Usuario de Whatsapp", "No usuario de Whatsapp")
colnames(tablasoc) <- varnames
row.names(tablasoc) <- c("Urbano (%)", "Hombre (%)")
tablasoc
## Usuario de Facebook No usuario de Facebook Usuario de Twitter
## Urbano (%) 77.0 64.1 84.7
## Hombre (%) 49.8 49.7 60.8
## No usuario de Twitter Usuario de Whatsapp No usuario de Whatsapp
## Urbano (%) 70.2 76.7 61.9
## Hombre (%) 48.6 49.4 50.4
Con la tabla formateada, se puede presentar de esta manera.
kable(head(tablasoc), format="markdown", digits=1)
| Usuario de Facebook | No usuario de Facebook | Usuario de Twitter | No usuario de Twitter | Usuario de Whatsapp | No usuario de Whatsapp | |
|---|---|---|---|---|---|---|
| Urbano (%) | 77.0 | 64.1 | 84.7 | 70.2 | 76.7 | 61.9 |
| Hombre (%) | 49.8 | 49.7 | 60.8 | 48.6 | 49.4 | 50.4 |
formattable(tablasoc)
| Usuario de Facebook | No usuario de Facebook | Usuario de Twitter | No usuario de Twitter | Usuario de Whatsapp | No usuario de Whatsapp | |
|---|---|---|---|---|---|---|
| Urbano (%) | 77.0 | 64.1 | 84.7 | 70.2 | 76.7 | 61.9 |
| Hombre (%) | 49.8 | 49.7 | 60.8 | 48.6 | 49.4 | 50.4 |
De esta manera se ha reproducido (parcialmente) la tabla 3.2 del reporte, que es un resumen de varias tablas de contingencia entre las variables categóricas de uso de redes sociales y variables sociodemográficas, como sexo y urbano.
En este documento se ha trabajado con variable categóricas ordinales, como la frecuencia de uso de redes sociales. También se ha introducido al uso de tablas de contingencia de dos variables categóricas y la creación de gráficos de barras agrupadas para 2 variables.