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.

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 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:

  1. Diariamente
  2. Algunas veces a la semana
  3. Algunas veces al mes
  4. Algunas veces al año
  5. Nunca

DESCRIBIR LAS VARIABLES

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
Facebook 56.2 32.1 8.4 1.8 1.5
Twitter 33.7 30.9 17.9 8.2 9.3
Whatsapp 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
Facebook 56.2 32.1 8.4 1.8 1.5
Twitter 33.7 30.9 17.9 8.2 9.3
Whatsapp 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.

CRUCE DE VARIABLES

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

CRUCE CON VARIABLES SOCIODEMOGRÁFICAS

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:

  1. Urbano
  2. Rural

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:

  1. Rural
  2. Urbano

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.

RESUMEN

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.