Analítica con redes sociales - S1: Collecting Twitter Data

Objetivo: En este script realizaremos la conexión a la API de Twitter con la libreria RTweet , a traves de nuestra Twitter App.

Probaremos las diferentes opciones de extraccion que tenemos con esta API:

  • Extracción por palabra clave
  • Extracción de TL por usuario
  • Extracción de Amigos (Friends) por usuario
  • Extracción de Seguidores (Followers) por usuario
  • Extracción de Usuarios por palabra clave en Bio
  • Extracción vía Stream API

Paso 0: Librerias y directorio de trabajo

Si te hace falta alguna librería puedes comprobar e instalarla asi:


## install packages if not already
if (!requireNamespace("rtweet", quietly = TRUE)) 
  {
  install.packages("rtweet")
  }
  

Llamaremos las librerias que requerimos para esta actividad.

##########################################################################################
####### LIBRERIAS
##########################################################################################
library(tm)                 ## Mineria de texto
library(ggplot2)            ## Gráficas
library(tidyverse)          ## Limpieza de datos
library(tidytext)           ## Limpieza de datos
library(dplyr)
library(RColorBrewer)       ## Paletas de colores
library(wordcloud)          ## WordCloud
library(gridExtra)
library(scales)
library(quanteda)
library(knitr)              ## Tablas bonitas

# load twitter library
library(rtweet)             ## R client Twitter’s REST and stream APIs
library(httpuv)             ## Conexión http

#Modelado
library(pROC)
library(randomForest)
library(mlbench)
library(caret)

Debes configurar tu directorio de trabajo, donde tienes los archivos descargados.

#########################################################
####### DIRECTORIO DE TRABAJO
#########################################################

setwd("C:/MyRScripts/2019/WANRS_COL_AI/Data/")

Paso 1: Autenticación

Realizaremos la autenticación con las claves de nuestra Twitter App

##########################################################################################
####### Collecting Twitter Data
##########################################################################################

### App

appname <- "TUAPLICACION"

### App

appname <- "ACA EL NOMBRE DE TU APP"
##Consumer API keys

### API key
key <- "ACA TU API KEY"
### API secret key
secret <- "ACA TU API SECRET KEY"


Existen dos formas de realizar la autenticación.

## Via web browser
```{r}
## autheticate via web browser

twitter_token <- create_token(
  app = appname,
  consumer_key = key,
  consumer_secret = secret)
  

Se debe abrir tu explorador y solicitará que inicies sesión en Twitter

Via access token

Esta conexión se realiza directamente, para ello debes obtener el access_token y access_secret

## autheticate via access token

token <- create_token(
  app = appname,
  consumer_key = key,
  consumer_secret = secret,
  access_token = "ACA TU ACCESS TOKEN",
  access_secret = "ACA TU ACCESS SECRET")
  

Paso 2: Publica un Tweet desde R

Vamos a probar tu conexión publicando un tuit desde la consola de R

# Publicar un Tweet desde R
# Puedes cambiar/personalizar tu mensaje, conserva el Hastag(#) para un ejercicio posterior

post_tweet("Hola, Este es mi primer tuit desde el Workshop Analítica con redes sociales - Twitter #ColombiaAI")

Paso 3:Explorar la REST API

Busqueda por palabra clave

Buscaremos tuits por palabra clave o hastag, etc. Esta opción retorna máximo 9 días de información.

  • Puedes elegir si quieres que tu consulta contenga retweets modificando el parámetro include_rts = TRUE
  • Puedes elegir cuantos tuits quieres obtener. El limite máximo es de 18.000 cada 15min y . modificando el parámetro n = 100
  • Algunas opciones de busqueda:
    • “X” : Buscará X
    • “X Y” = Buscará que este X y Y en cualquier orden en el tuit.
    • “X O Y” = Buscará que este X o Y en el tuit.
    • “‘X Y’“ = Buscará que en el tuit esta exactamente “X Y”

# Buscar tweets por palabra clave, hastag, etc. Traeremos 500 sin incluir retweets

mipalabra = "Digita tu palabra o palabras aca"
tweets_KW <- search_tweets(mipalabra, n = 100, include_rts = FALSE)

View(tweets_KW)
colnames(tweets_KW)

Puedes observar toda la información que se obtiene.

Ahora observa la serie de tiempo de tus resultados, el intervalo de tiempo es configurable. Consulta ?ts_plot

## Serie de tiempo de tus resultados

ts_plot(tweets_KW, by = "hours") +
  ggplot2::theme_minimal() +
  ggplot2::theme(plot.title = ggplot2::element_text(face = "bold")) +
  ggplot2::labs(
    x = NULL, y = NULL,
    title = paste("Línea de tiempo de", mipalabra,"en Twitter",sep =" "),
    subtitle = "Conteo por intervalos de horas",
    caption = "\nSource: Data collected from Twitter's REST API via rtweet"
  )
  

Busqueda por Usuario: Time Line

Buscaremos y descargaremos los tuits hechos por un usuario. Esta opción retorna máximo 3200 tuits. También se puede configurar si quieres que tu consulta contenga retweets modificando el parámetro include_rts = TRUE

En este ejericio vamos a obtener el TL de 3 cuentas de nuestro interes.

## Vamos a obtener el TL de 3 cuentas de nuestro interes.

Cuenta1 = "Avianca"
Cuenta2 = "LATAM_CO"
Cuenta3 = "VivaAirCol"

## Obtenemos el TL y guardamos en tmls 

tmls <- get_timelines(c(Cuenta1, Cuenta2, Cuenta3), n = 3200)

## podemos ver cuantos tuits recuperamos para cada usuario

tmls %>% group_by(screen_name) %>% summarise(numero_tweets = n()) 

Ahora comparemos la serie de tiempo de las 3 cuentas.

library(lubridate)

ggplot(tmls, aes(x = as.Date(created_at), fill = screen_name)) +
  geom_histogram(position = "identity", bins = 20, show.legend = FALSE) +
  scale_x_date(date_labels = "%m-%Y", date_breaks = "1 month") +
  labs(x = "fecha de publicación", y = "número de tweets") +
  facet_wrap(~ screen_name, ncol = 1) +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 90))
  

Busqueda por Usuario: Amigos (Friends)

Buscaremos y descargaremos las cuentas que sigue un usuario específico.

El limite es de 15 de estas solicitudes por 15 minutos, que máximo traen 5000 amigos.

Para seguir más de 5000 cuentas las cuentas deben cumplir ciertos requisitos. En consecuencia, la gran mayoría de los usuarios siguen menos de 5000 cuentas.

## Obtener los IDs de usario que sigue la cuenta objetivo

CuentaObj_fds <- get_friends("ColombiaAI")

## Obtener la información de las cuentas
CuentaObj_fds_data <- lookup_users(ColombiaAI_fds$user_id)

Busqueda por Usuario: Seguidores (Followers)

Buscaremos y descargaremos las cuentas que sigue un usuario específico.

5000, que es el número máximo de seguidores devueltos por una sola llamada. Permite hasta 15 de estas solicitudes cada 15 minutos, lpor tanto el número máximo de seguidores sin espera es de 75,000.


## Obtener los IDs de usario que siguen a la cuenta objetivo
CuentaObj_flw <- get_followers("ColombiaAI", n = 5000)

## Obtener la información de las cuentas
CuentaObj_flw_data <- lookup_users(CuentaObj_flw$user_id)

Busqueda por Usuario: Palabra clave en Bio

Buscaremos y descargaremos las cuentas que tienen alguna palabra clave en su biografía.

## search for users with #rstats in their profiles
usrs <- search_users("Antropologo", n = 1000)

Otras funciones:

  • get_retweets
  • get_retweeters
  • get_trends
  • get_mentions
  • get_favorites

Paso 4:Explorar la Stream API

La API de Streaming de Twitter permite el acceso casi en tiempo real a varios subconjuntos de datos de Twitter. Se pueden obtener de varias maneras: por ID de usuario, por palabra clave, por muestreo aleatorio, por ubicación geográfica, etc.

Busqueda aleatoria por tiempo

## Busqueda por 30 segundos (default)
StrTw <- stream_tweets("")

Busqueda aleatoria por palabra clave

## stream tuits sobre una palabra clave por el tiempo definido
stream_tweets(
  "transmilenio",
  timeout = 30,
  file_name = "STRtweetsabout.json",
  parse = FALSE
)

## Leer los datos
STRtweets <- parse_stream("STRtweetsabout.json")

Paso 5:Loop manejando el Rate limit

Los límites de la API de Twitter limitan el número de Tuits a 18,000 cada 15 minutos. Para obtener más, se establece retryonratelimit = TRUE y rtweet esperará a que se restablezca el límite de velocidad.

Se debe tener en cuenta el tiempo que tardará la descarga al aplicar estos limites. Por ejmplo 2 millones de tuits tardarían mínimo 2 horas.

Así mismo seguirá aplicando el límite de 9 días como máximo.

## retryonratelimit - Loop manejando el Rate limit

# Busqueda de 65,000 tweets por palabra clave
# TT recientes 20190125

TransMilenio <- search_tweets("TransMilenio", n = 65000, retryonratelimit = TRUE, include_rts = FALSE)
Copa <- search_tweets("Copa America", n = 65000, retryonratelimit = TRUE, include_rts = FALSE)
ELN <- search_tweets("ELN", n = 65000, retryonratelimit = TRUE, include_rts = FALSE)

Exportar los datos

Hasta este punto hemos realizado varios ejemplos de extracción de datos haciendo uso del paquete rtweet.

Podemos almacenar cualquiera de las descargas que realizamos para esto utilizaremos la función write_as_csv

# Tuits palabras clave
write_as_csv(tweets_KW, "tweets_KW.csv", prepend_ids = TRUE, na = "", fileEncoding = "UTF-8")
#timelines
write_as_csv(tmls, "tmls.csv", prepend_ids = TRUE, na = "", fileEncoding = "UTF-8")
# Amigos de cuenta objetivo
write_as_csv(CuentaObj_fds_data, "CuentaObj_fds_data.csv", prepend_ids = TRUE, na = "", fileEncoding = "UTF-8")
# Seguidores de cuenta objetivo
write_as_csv(CuentaObj_flw_data, "CuentaObj_flw_data.csv", prepend_ids = TRUE, na = "", fileEncoding = "UTF-8")
# Usuarios por palabra clave en bio
write_as_csv(usrs, "usrs.csv", prepend_ids = TRUE, na = "", fileEncoding = "UTF-8")

Podemos leer archivos .csv que hemos guardado con la función read_twitter_csv

tmls<- read_twitter_csv("tmls.csv", unflatten = FALSE)
Written on January 24, 2019