¿Cómo extraer información del Facebook de los candidatos presidenciales?

Para extraer información de los candidatos en Facebook vamos a usar el paquete Rfacebook. Además tenemos que activar nuestra API de Facebook, que podemos activar desde Facebook Developpers. Luego para autenticar la aplicación en R, la opción más fácil es usar un token temporal que podemos obtener desde el Graph API Explorer. Es importante, que este token dura tan solo dos horas, por lo que es necesario actualizarlo cuando se vence.

¿Cómo comenzar?

Lo primero es instalar y cargar los paquetes que vamos a utilizar, y guardar nuestro token en un objeto de R.

#instalar los paquetes
install.packages("Rfacebook")
install.packages("tidyr")
install.packages("dplyr")
install.packages("ggplot2")

#Cargar los paquetes
library(ggplot2)
library(tidyr)
library(dplyr)
library(Rfacebook)

#Guardar nuestro token en un objeto de R
token <- "NUESTRO TOKEN"

Extraer las páginas

Primero vamos a extraer información de las páginas públicas de los candidatos. Para ello vamos a utilizar la función getPage(), que nos permite extraer la lista de posts de la página, la fecha en la que fueron publicados y la cantidad de likes, shares y comments que tuvieron. Los argumentos de la función serían:

  • "nombre de la página" , por ejemplo “FabricioAlvaradoPresidente”
  • token, el token que guardamos anteriormente en un objeto
  • n, el número de posts que queremos extraer; lo ideal es poner un número alto, aunque Facebook tiene un límite
  • since y until, esto los usamos si queremos extraer datos de un periodo en específico. Si no los ponemos, se extraerán todos los posts hasta alcanzar el límite máximo.

Por ejemplo, si queremos extraer los posts de la página de Fabricio Alvarado del 1 de enero del 2017 al 15 de enero de 2018, el comando sería así:

getPage("nombre de la página", token, n = 5000, since='2017/01/01', until='2018/12/15')

Ahora vamos a hacer esto para todos los candidatos, y guardar la información en objetos:

#Fabricio
fabriciop <- getPage("FabricioAlvaradoPresidente", token, n = 5000, since='2017/01/01', until='2018/12/15')

#Juan Diego
juandip <- getPage("juandiegocastrocr", token, n = 5000, since='2017/01/01', until='2018/12/15')

#Desanti
desantip<- getPage("alvarezdesanti", token, n = 5000, since='2017/01/01', until='2018/12/15')

#Carlos Alvarado
carlosp<- getPage("carlosalvaradoquesada", token, n = 5000, since='2017/01/01', until='2018/12/15')

#Piza
pizap<- getPage("RodolfoPizaR", token, n = 5000, since='2017/01/01', until='2018/12/15')

#Edgardo Araya
edgardop<- getPage("EdgardoArayaFA", token, n = 5000, since='2017/01/01', until='2018/12/15')

##Rodolfo Hernandez
hernandezp<- getPage("DrHernandez.CR", token, n = 5000, since='2017/01/01', until='2018/12/15')

Podemos explorar los datos, con la función glimpse. Todas las bases de datos tienen las mismas variables.

glimpse(juandip)
## Observations: 829
## Variables: 11
## $ from_id        <chr> "105896236141807", "105896236141807", "10589623...
## $ from_name      <chr> "Juan Diego Castro Fernández", "Juan Diego Cast...
## $ message        <chr> "Por 30 años los gobernantes nos dijeron que sa...
## $ created_time   <chr> "2018-01-15T20:54:05+0000", "2018-01-15T17:30:2...
## $ type           <chr> "photo", "photo", "photo", "video", "photo", "p...
## $ link           <chr> "https://www.facebook.com/juandiegocastrocr/pho...
## $ id             <chr> "105896236141807_1653940424670706", "1058962361...
## $ story          <chr> NA, NA, NA, NA, "Juan Diego Castro Fernández ad...
## $ likes_count    <dbl> 50, 478, 230, 1320, 693, 600, 640, 564, 389, 55...
## $ comments_count <dbl> 6, 86, 41, 249, 160, 64, 178, 158, 50, 56, 108,...
## $ shares_count   <dbl> 10, 113, 43, 458, 144, 159, 148, 189, 62, 71, 1...

¿Cuántos likes, shares y comments han tenido los candidatos en el último año?

Para ello requerimos crear nuevas variables en la base de datos y transformarla de forma que podamos graficarla. El objetivo final es poder ver la evolución en el tiempo de los likes, shares y comments de los candidatos. Necesitamos entonces, agrupar los datos en formato largo Ver tutorial de limpieza.

#Crear una función para dar formato de fecha

format.facebook.date <- function(datestring) {
  date <- as.POSIXct(datestring, format = "%Y-%m-%dT%H:%M:%S+0000", tz = "GMT")
}

#Transformamos la base de datos de cada uno de los candidatos

fabricio <- fabriciop %>%
  mutate(datetime=format.facebook.date(created_time))%>%   #Creamos una nueva variable de fecha
  group_by(datetime)%>%  #Agrupamos por fecha
  gather(metrica, cantidad, likes_count, comments_count, shares_count)%>%  #Transformamos la base a formato largo
  arrange(desc(datetime)) #La ordenamos de forma descendente

juandi<- juandip %>%
  mutate(datetime=format.facebook.date(created_time)) %>%
  group_by(datetime)%>%
  gather(metrica, cantidad, likes_count, comments_count, shares_count)%>%
  arrange(desc(datetime))

desanti<- desantip %>%
  mutate(datetime=format.facebook.date(created_time)) %>%
  group_by(datetime)%>%
  gather(metrica, cantidad, likes_count, comments_count, shares_count)%>%
  arrange(desc(datetime))

carlos<- carlosp %>%
  mutate(datetime=format.facebook.date(created_time)) %>%
  group_by(datetime)%>%
  gather(metrica, cantidad, likes_count, comments_count, shares_count)%>%
  arrange(desc(datetime))

piza<- pizap %>%
  mutate(datetime=format.facebook.date(created_time)) %>%
  group_by(datetime)%>%
  gather(metrica, cantidad, likes_count, comments_count, shares_count)%>%
arrange(desc(datetime))

edgardo<- edgardop %>%
  mutate(datetime=format.facebook.date(created_time)) %>%
  group_by(datetime)%>%
  gather(metrica, cantidad, likes_count, comments_count, shares_count)%>%
  arrange(desc(datetime))

hernandez<- hernandezp %>%
  mutate(datetime=format.facebook.date(created_time)) %>%
  group_by(datetime)%>%
  gather(metrica, cantidad, likes_count, comments_count, shares_count)%>%
  arrange(desc(datetime))

Ahora vamos a graficar los tres indicadores para cada uno de los candidatos. Vamos a usar un gráfico de líneas con el paquete ggplot2. Graficamos en el eje x la fecha, en el y la cantidad y agrupamos por métrica (likes, shares y comments) de forma que tengamos tres líneas, una para cada variable. Además ponemos un límite al eje Y, deforma que sea el mismo para todos los gráficos y podamos ver las diferencias.

fabriciografico<- ggplot(fabricio, aes(x = datetime, y = cantidad, group = metrica)) +
  geom_line(aes(color = metrica)) +
  ggtitle("Fabricio Alvarado") +
  scale_y_continuous(limits=c(0,25000))
fabriciografico

jdcgrafico<- ggplot(juandi, aes(x = datetime, y = cantidad, group = metrica)) +
  geom_line(aes(color = metrica)) +
  ggtitle("Juan Diego") +
  scale_y_continuous(limits=c(0,25000))
jdcgrafico

desantigrafico<- ggplot(desanti, aes(x = datetime, y = cantidad, group = metrica)) +
  geom_line(aes(color = metrica)) +
  ggtitle("desanti") +
  scale_y_continuous(limits=c(0,25000))
desantigrafico

carlosgrafico<- ggplot(carlos, aes(x = datetime, y = cantidad, group = metrica)) +
  geom_line(aes(color = metrica)) +
  ggtitle("Carlos Alvarado") +
  scale_y_continuous(limits=c(0,25000))
carlosgrafico

pizagrafico<- ggplot(piza, aes(x = datetime, y = cantidad, group = metrica)) +
  geom_line(aes(color = metrica)) +
  ggtitle("Rodolfo Piza")+
  scale_y_continuous(limits=c(0,25000))
pizagrafico

edgardografico<- ggplot(edgardo, aes(x = datetime, y = cantidad, group = metrica)) +
  geom_line(aes(color = metrica)) +
  ggtitle("Edgardo Araya")+
  scale_y_continuous(limits=c(0,25000))
edgardografico

hernandezgrafico<- ggplot(hernandez, aes(x = datetime, y = cantidad, group = metrica)) +
  geom_line(aes(color = metrica)) +
  ggtitle("Rodolfo Hernández")+
  scale_y_continuous(limits=c(0,25000))
hernandezgrafico

Podemos observar que Fabricio Alvarado es el candidato con un mayor crecimiento en las interacciones, y además el que alcanzó números más altos en los últimos días. PAra ver mejor el detalle, podemos hacer un gráfico, únicamente de los shares, que podría ser un indicador de la cantidad de usuarios que están de acuerdo con una publicación y por eso la comparten.

#GRAFICOS DE SHARES
fshare<- fabricio %>%
  filter(metrica=="shares_count") %>%
  ggplot(aes(x = datetime, y = cantidad, group = metrica)) +
  geom_line(aes(color = metrica)) +
  ggtitle("Fabricio Alvarado Shares") +
  scale_y_continuous(limits=c(0,13000))
fshare

dshare<- desanti %>%
  filter(metrica=="shares_count") %>%
  ggplot(aes(x = datetime, y = cantidad, group = metrica)) +
  geom_line(aes(color = metrica)) +
  ggtitle("Desanti Shares") +
  scale_y_continuous(limits=c(0,13000))
dshare

cshare<- carlos %>%
  filter(metrica=="shares_count") %>%
  ggplot(aes(x = datetime, y = cantidad, group = metrica)) +
  geom_line(aes(color = metrica)) +
  ggtitle("Carlos Shares") +
  scale_y_continuous(limits=c(0,13000))
cshare

pshare<- piza %>%
  filter(metrica=="shares_count") %>%
  ggplot(aes(x = datetime, y = cantidad, group = metrica)) +
  geom_line(aes(color = metrica)) +
  ggtitle("Piza Shares") +
  scale_y_continuous(limits=c(0,13000))
pshare

eshare<- edgardo %>%
  filter(metrica=="shares_count") %>%
  ggplot(aes(x = datetime, y = cantidad, group = metrica)) +
  geom_line(aes(color = metrica)) +
  ggtitle("Edgardo Shares") +
  scale_y_continuous(limits=c(0,13000))
eshare

hshare<- hernandez %>%
  filter(metrica=="shares_count") %>%
  ggplot(aes(x = datetime, y = cantidad, group = metrica)) +
  geom_line(aes(color = metrica)) +
  ggtitle("Hernandez Shares") +
  scale_y_continuous(limits=c(0,13000))
hshare

jshare<- juandi %>%
  filter(metrica=="shares_count") %>%
  ggplot(aes(x = datetime, y = cantidad, group = metrica)) +
  geom_line(aes(color = metrica)) +
  ggtitle("Juan Diego Shares") +
  scale_y_continuous(limits=c(0,13000))
jshare

Si queremos guardar las bases para usarlas en otro formato podemos hacerlo con

#Como Excel
install.packages("xlsx")  # Nota: este paquete da problemas en Mac, pero en windows funciona correctamente
library(xlsx)
write.xlsx(objeto, "nombre.xlsx")

#Como csv
write.csv(objeto, "nombre.csv")  #Al importar a Excel puede descuadrarse, cuidado.  Más recomendable importarlo a excel

Extraer comentarios de un post

Para extraer comentarios de un post, podemos usar la función getPost, y lo que tenemos que introducir como argumento es el id del post y seleccionar si queremos likes y comments (para ello ponemos TRUE o FALSE):

getPost(post_id, token, n = 1000, likes = TRUE, comments = TRUE)

Como ejemplo podemos extraer el post con más interacción de Fabricio Alvarado.

#Extraer comentarios: ejemplo, post más famoso de Fabricio
post<-getPost("167533350116993_848210418715946", token, n = 1000, likes = TRUE, comments = T)

#Lo convertimos en dataframe
post<-as.data.frame(post)