¿A quiénes le hablan los candidatos presidenciales? ¿Quiénes son los seguidores de los candidatos presidenciales? ¿De dónde son? ¿Siguen a un solo candidato a varios?
Para extraer los datos de Twitter vamos a usar el paquete rtweet. Lo único que necesitamos para extraer la información es una cuenta de Twitter. Cuando empecemos a correr el código se va a desplegar una ventana de Twitter y nada más autorizamos la aplicación de rtweet. Además vamos a utilizar otros paquetes:
#Si no tenemos los paquetes instalados debemos correr este código primero
install.packages("rtweet")
install.packages("dplyr")
install.packages("ggplot2")
install.packages("plyr")
install.packages("tidyr")
install.packages("gmodels")
#Una vez instalados, cargamos los paquetes
library(rtweet)
library(plyr)
library(dplyr)
library(ggplot2)
library(readr)
library(tidyr)
library(gmodels)
Ahora vamos a extraer los datos de las cuentas de los candidatos Antonio Álvarez Desanti, Juan Diego Castro, Rodolfo Piza, Carlos Alvarado y Edgardo Araya.
Eso lo hacemos con la funcion get_followers("usuario de twitter", n=all). Es importante poner n=all, para extraer todos los seguidores. Esta función nos da un data.frame con el id de todos los usuarios. Sin embargo nos interesa obtener información de esos usuarios. Para eso usamos la función lookup_users, donde el primer argumento de la función es el nombre del objeto que contiene los ids de los seguidores.
Vamos a hacer eso para todos los candidatos. Nota: El código va a tardar varios minutos en correr, por la cantidad de información que está extrayendo, mientras vayan por un café :).
#Desanti
desanti_flw <- get_followers("alvarez_desanti", n = "all")
desanti_flw_data <- lookup_users(desanti_flw$user_id)
#Juan Diego Castro
jdc_flw <- get_followers("JDiegoCastroCR", n = "all")
jdc_flw_data <- lookup_users(jdc_flw$user_id)
#Piza
piza_flw <- get_followers("PizaRodolfo", n = "all")
piza_flw_data <- lookup_users(piza_flw$user_id)
#Carlos Alvarado
carlos_flw <- get_followers("CarlosAlvQ", n = "all")
carlos_flw_data <- lookup_users(carlos_flw$user_id)
#Edgardo Araya
fa_flw <- get_followers("EdgardoArayaFA", n = "all")
fa_flw_data <- lookup_users(fa_flw$user_id)
Este código nos da como resultado 5 bases de datos diferentes con los seguidores de cada candidato.
Ahora vamos a crear nuevas variables en cada una de las bases de datos, para unirlas luego. Para eso vamos a usar la función mutate.
desanti_flw_data <- desanti_flw_data %>%
mutate(candi="desanti",
desanti_c=1)
jdc_flw_data <- jdc_flw_data %>%
mutate(candi="jdc",
jdc_c=1)
piza_flw_data <- piza_flw_data %>%
mutate(candi="piza",
piza_c=1)
carlos_flw_data <- carlos_flw_data %>%
mutate(candi="carlos",
carlos_c=1)
fa_flw_data <- fa_flw_data %>%
mutate(candi="edgardo",
edgardo_c=1)
Ahora vamos a unir las bases de datos.
Lo primero que hay que hacer es guardar todas las bases en una lista que vamos a llamar perfiles. Luego vamos a seleccionar solamente las variables que nos interesan de la base de datos, con la función de dplyr select. Para aplicarlo a todas las bases de una sola vez, usamos la función lapply.
Finalmente, con la funciòn join_all unimos todas las bases de datos. Es importante observar que esta base de datos, solamente tiene una observación por usuario, por lo que si un usuario sigue a dos o más candidatos solamente aparece una vez en la base de datos.
#Primero pongo todos los data.frames en una lista
perfiles <- list(desanti_flw_data, jdc_flw_data, piza_flw_data, carlos_flw_data, fa_flw_data)
#Corro una función para seleccionar solo las variables que nos interesan de las 5 bases de datos
perfiles <- lapply(perfiles, function(x) select(x, user_id, name, screen_name,
followers_count, statuses_count, account_created_at,
ends_with('_c')))
#Unimos todas las bases
seguidores<-join_all(perfiles,by=c("user_id"), type = "full")
#Reemplazamos blancos con cero
seguidores[is.na(seguidores)] <- 0
También vamos a crear otra base de datos, que contenga a todos los usuarios y solamente tenga una variable que me diga a cuál candidato sigue. En esta base, por ejemplo si un usuario sigue a dos candidatos aparece dos veces en la base de datos. Esto es para simplificar el análisis luego.
#Creo una lista con las bases de datos
perfiles2<-list(desanti_flw_data, jdc_flw_data, piza_flw_data, carlos_flw_data, fa_flw_data)
#Selecciono solo las variables de interés.
perfiles2 <- lapply(perfiles2, function(x) select(x, user_id, candi))
#Uno las filas de todas las bases de datos
seguidores2<- do.call(rbind,perfiles2)
Ahora podemos explorar los datos. Primero vamos a trabajar con la base seguidores2, para obtener el número de seguidores de cada candidato. Podemos ver que Juan Diego Castro es el candidato que concentra la mayor cantidad de seguidores con más de 37 mil. Le sigue Álvarez Desanti con cerca de 18.500. Es decir, tiene la mitad de seguidores que Castro. En tercer lugar se encuentra Piza, luego Carlos Alvarado y por último Edgardo Araya.
#Para ver la cantidad de seguidores
table(seguidores2$candi)
##
## carlos desanti edgardo jdc piza
## 7614 18556 5651 37045 12028
#Podemos graficar los datos
ggplot(seguidores2, aes(candi))+ geom_bar() +
xlab("Candidatos") +
ylab("Cantidad de seguidores")
¿Cómo son esos seguidores? Podemos explorar la base seguidores que contiene información de los usuarios. Lo primero es ver qué variables tiene.
#Para ver la cantidad de seguidores
glimpse(seguidores)
## Observations: 61,579
## Variables: 14
## $ X1 <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, ...
## $ user_id <dbl> 4.697562e+09, 9.522777e+17, 9.523313e+17, 8...
## $ name <chr> "Nano Milan", "Pamela Rodriguez", "Prisma A...
## $ screen_name <chr> "NanoMilan2", "Pamroeon", "Prismartx", "cr_...
## $ followers_count <int> 9, 1, 4, 233, 1267, 364, 22, 19, 37, 723, 9...
## $ statuses_count <int> 0, 0, 0, 190, 3839, 5047, 5, 4, 157, 20685,...
## $ account_created_at <dttm> 2016-01-02 17:58:28, 2018-01-13 20:34:40, ...
## $ desanti_c <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
## $ jdc_c <int> 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1...
## $ piza_c <int> 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1...
## $ carlos_c <int> 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1...
## $ edgardo_c <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1...
## $ cantidad <int> 2, 3, 1, 1, 1, 4, 1, 1, 2, 1, 2, 4, 3, 2, 5...
## $ seguidores <chr> "menos de 100", "menos de 100", "menos de 1...
Tenemos dos variables que nos pueden ayudar a ver características de esos usuarios: el número de seguidores y la cantidad de status. Estos son indicadores de cuánto alcance tienen los usuarios y qué tan activos son en Twitter. Una forma de ver esto es a través de un histograma o un boxplot.
options(scipen = 999)
ggplot(seguidores, aes(x=followers_count)) +
ggtitle("Cantidad de seguidores") +
geom_histogram()
ggplot(seguidores, aes(x=1, y=followers_count)) +
ggtitle("Cantidad de seguidores") +
geom_boxplot(alpha=0.2)
ggplot(seguidores, aes(x=statuses_count)) +
ggtitle("Cantidad de posts") +
geom_histogram()
ggplot(seguidores, aes(x=1, y=statuses_count)) +
ggtitle("Cantidad de posts") +
geom_boxplot(alpha=0.2)
Los gráficos nos muestran distribuciones asimétricas, que indican que la mayoría de seguidores tienen pocos seguidores y postean poco, y que hay muchos valores extremos.
Para simplificar el análisis, podemos crear una variable categórica con la cantidad de seguidores, con las siguientes categorías (estas pueden variar según el análisis que quieran hacer o los datos que tengan):
0menos de 100menos de 1000más de 1000#Crear categorías
seguidores <- seguidores %>%
mutate(seguidores=ifelse(followers_count==0, "cero",
ifelse(followers_count<=100, "menos de 100",
ifelse(followers_count<=1000, "menos de 1000", "mas de 1000"))))
#Tabulamos los resultados
CrossTable(seguidores$seguidores, prop.t=F, prop.chisq = F)
##
##
## Cell Contents
## |-------------------------|
## | N |
## |-------------------------|
##
##
## Total Observations in Table: 61579
##
##
## | cero | mas de 1000 | menos de 100 | menos de 1000 |
## |---------------|---------------|---------------|---------------|
## | 1426 | 2383 | 43009 | 14761 |
## | 0.023 | 0.039 | 0.698 | 0.240 |
## |---------------|---------------|---------------|---------------|
##
##
##
##
Se observa que la mayoría de seguidores tienen menos de 100 seguidores (pero más de cero).
Ahora podemos ver si los usuarios siguen a uno o más candidatos. Para ello vamos a crear una nueva variable, con el comando mutate, que me contabiliza la cantidad de candidatos a los que sigue un mismo usuario. Observamos que la mayoría de los usuarios (80%), solamente sigue a un candidato y solamente el 1% sigue a los cinco candidatos analizados.
#Crear nueva variable
seguidores <- seguidores %>%
mutate(cantidad=(desanti_c+jdc_c+piza_c+carlos_c+edgardo_c))
#Tabulamos los resultados
CrossTable(seguidores$cantidad, prop.t=F, prop.chisq = F)
##
##
## Cell Contents
## |-------------------------|
## | N |
## |-------------------------|
##
##
## Total Observations in Table: 61579
##
##
## | 1 | 2 | 3 | 4 | 5 |
## |-----------|-----------|-----------|-----------|-----------|
## | 49414 | 7735 | 2479 | 1182 | 769 |
## | 0.802 | 0.126 | 0.040 | 0.019 | 0.012 |
## |-----------|-----------|-----------|-----------|-----------|
##
##
##
##
Ahora separemos por candidato:
#Desanti
prop.table(table(seguidores$cantidad[seguidores$desanti_c=="1"]))
##
## 1 2 3 4 5
## 0.60880578 0.19481569 0.09770425 0.05723216 0.04144212
#Juan Diego
prop.table(table(seguidores$cantidad[seguidores$jdc_c=="1"]))
##
## 1 2 3 4 5
## 0.75567553 0.14906195 0.05012822 0.02437576 0.02075854
#Piza
prop.table(table(seguidores$cantidad[seguidores$piza_c=="1"]))
##
## 1 2 3 4 5
## 0.42825075 0.26804124 0.15339209 0.08638178 0.06393415
#Carlos
prop.table(table(seguidores$cantidad[seguidores$carlos_c=="1"]))
##
## 1 2 3 4 5
## 0.4349882 0.2215655 0.1304177 0.1120305 0.1009982
#Edgardo
prop.table(table(seguidores$cantidad[seguidores$edgardo_c=="1"]))
##
## 1 2 3 4 5
## 0.2937533 0.2516369 0.1643957 0.1541320 0.1360821
Los resultados muestran que el 75% de los seguidores de Juan Diego Castro solamente lo siguen a él. Lo mismo ocurre con el 61% de los seguidores de Desanti. Esto muestra que los usuarios que siguen a estos candidatos, mayoritariamente solo reciben información de los mismos y no de otras propuestas políticas.
Por su parte, solamente el 43% de los seguidores de Rodolfo Piza y Carlos Alvarado siguen únicamente a estos candidatos, y una quinta parte de ellos sigue a más de uno. En el caso de los seguidores de Edgardo Araya, estos tienen mayoritariamente a seguir a otros candidatos también, y solamente el 30% sigue únicamente a Edgardo.