#Activamos las librerías con las que vamos a trabajar: “rtweet”, “tidyverse”…

#Creamos un token de acceso a la API de Twitter con las claves brindadas en el portal de Twitter Developer.

appname <- "RTWITcdmx"
consumer_key <- "15mHUXssb4AJuEnjpoPbnMSFz"
consumer_secret <- "dKynxJuLCwybFCMq6ST8UIXaWwQQx7d7FfjQsxYm6PAwDQQegP"
access_token <- "1257366372713201668-x4o0gFX9lykt7bsE8kncdbOtdIpqLd"
access_secret <- "uGQzD4cK1078kEkx6d7WlxWbIakuFaI9wnrETkWBHq1Wi"

twitter_token <- create_token(
  app = appname,
  consumer_key = consumer_key,
  consumer_secret = consumer_secret,
  access_token = access_token,
  access_secret = access_secret
)

get_token()
## <Token>
## <oauth_endpoint>
##  request:   https://api.twitter.com/oauth/request_token
##  authorize: https://api.twitter.com/oauth/authenticate
##  access:    https://api.twitter.com/oauth/access_token
## <oauth_app> RTWITcdmx
##   key:    15mHUXssb4AJuEnjpoPbnMSFz
##   secret: <hidden>
## <credentials> oauth_token, oauth_token_secret
## ---

#Hacemos nuestra búsqueda de tweets en Ciudad de México. Ponemos como punto céntrico de referencia el Ángel de la Independencia, en Av. Reforma, (geocode: 19.427122,-99.167653), con un radio de 20 millas a la redonda. #Queremos tweets que estén hablando del presidente López Obrador (o como se lo abrevia en la prensa y en el día a día, AMLO)

#“AMLO” como palabra clave es especialmente significativa para analizar Twitter, debido a la característica sintética y tendiente a la abreviación propia del lenguaje y discursividad en Twitter.

tweets_cdmx <- search_tweets(q= "AMLO",
                             geocode = "19.427122,-99.167653,20mi",
                             include_rts = FALSE,
                             n = 100000,
                             retryonratelimit = TRUE)
## retry on rate limit...
## waiting about 5 minutes...

#Nos descarga un dataset de más de 10,000 tweets. En la última semana, se twittearon más de 10,000 mensajes conteniendo la palabra “AMLO”, en la region metropolitana de la Ciudad de México. Exploramos brevemente el dataset con “summarize”, “head”, “levels”, “names”, etc.

#Hago una copia de seguridad del dataset, porque ya lo perdí 3 veces re-escribiéndolo sobre la misma variable y tuve que descargarlo de vuelta.

tweets_cdmx_backup <- tweets_cdmx

#Cantidad de usuarios que twittearon en esta semana sobre AMLO:

nlevels(as.factor(tweets_cdmx$screen_name))
## [1] 3885

#Hay unos 3,868 usuarios de Twitter en CDMX y alrededores que han twitteado sobre AMLO en la última semana. #¿Quienes son los usuarios más populares en nuestro dataset (en términos de cantidad de seguidores)?

#Más específicamente: ¿qué primeras hipótesis podemos formular sobre las figuras o medios que marcan la pauta hegemónica del análisis político mexicano?

tweets_cdmx_users <- tweets_cdmx %>%
  group_by(screen_name) %>%
  summarise(followers = max(followers_count),
            Q.Tweets.Semana = n(),
            retweet_sum = sum(retweet_count),
            ratio = retweet_sum/Q.Tweets.Semana)

tweets_cdmx_users %>%
  top_n(10, followers) %>%
  arrange(desc(followers))
## # A tibble: 10 x 5
##    screen_name     followers Q.Tweets.Semana retweet_sum   ratio
##    <chr>               <int>           <int>       <int>   <dbl>
##  1 AristeguiOnline   8600334              86        4708   54.7 
##  2 CarlosLoret       8372141               5       16499 3300.  
##  3 lopezdoriga       7616826             142        5878   41.4 
##  4 DeniseDresserG    4242661               2        4238 2119   
##  5 NTelevisa_com     3067628              40         352    8.8 
##  6 CinePREMIERE      1859776               2           4    2   
##  7 Foro_TV           1673765              30         319   10.6 
##  8 MVRNoticias       1202101               2          22   11   
##  9 JohnMAckerman      779789               1        1187 1187   
## 10 PublimetroMX       729314              32          46    1.44
ggplot(tweets_cdmx_users %>%
         top_n(10, followers)) +
  geom_bar(aes(x = screen_name, weight= followers)) +
  coord_flip() +
  labs(x= "Usuario",
      y= "Seguidores",
      title= "CDMX: la política a través de Twitter",
      subtitle= "Top-10 usuarios según cantidad de seguidores (que han mencionado a AMLO en sus publicaciones, CDMX, 2/5-10/5)")

#Vemos que figuran periodistas, analistas políticos e investigadores, como Carmen Aristegui (CNN), Carlos Loret (Televisa), Joaquín López-Dóriga (Televisa), Denisse Dresser (Diario Reforma Foro TV, ITAM), John M. Ackerman (UNAM), así como canales de televisión (Publimetro, Foro TV, Televisa).

#Agarramos la lista del top-10 de usuarios con más seguidores, y la re-ordenamos según el ratio de re-tweets promedio que recibieron, lo cual nos marca una pauta del grado de infuencia de cada usuario. Si bien Carlos Loret es la segunda figura con más seguidores, es por lejos la más re-twiteada en términos promedio durante esa semana. En cambio, PublimetroMX y CinePREMIERE , si bien aparecen en el top-10 en cantidad de seguidores, son re-twiteados muy poco, en términos promedio.

#Sin embargo, veamos quiénes son los usuarios más influyentes en términos de ratio tweets/retweets:

tweets_cdmx_users %>%
  top_n(10, ratio) %>%
  arrange(desc(ratio))
## # A tibble: 10 x 5
##    screen_name     followers Q.Tweets.Semana retweet_sum ratio
##    <chr>               <int>           <int>       <int> <dbl>
##  1 CarlosLoret       8372141               5       16499 3300.
##  2 fmartinmoreno      120760               7       16297 2328.
##  3 DeniseDresserG    4242661               2        4238 2119 
##  4 LCUgalde            62436               1        1915 1915 
##  5 GerCarrasco90       19163               1        1726 1726 
##  6 JohnMAckerman      779789               1        1187 1187 
##  7 beltrandelrio      617827               2        2312 1156 
##  8 LuisGonzali          5503               4        3218  804.
##  9 panchogarfias       39877               9        7078  786.
## 10 economicliberal      6506               3        1902  634

#Vemos que aparecen otros tantos periodistas y analistas político-económicos, pero también otras figuras no famosas. Muchas de las figuras más influyentes en términos de cantidad de seguidores, son las mismas en términos de ratio tweets/retweets. Es lógico pensar que las personas con más contactos así mismo sean las que tengan mayor ratio o área virtual de influencia.

#Sin embargo, con esto podemos ya podemos identificar ciertos usuarios/tweets que fueron muy influyentes y retwiteados esta semana, si bien su base de sguidores no es tan amplia, como es el caso de “LuisGonzali” y “economicliberal”. La gran influencia/repercusión de estos usuarios muy probablemente es un fenómeno pasajero de esta semana. Si extrayeramos información de la API de Twitter semana a semana, durante un período de tiempo más largo, muy probablemente estas 2 figuras ya no aparecerían en el top-10, y se mantendrían aquellos usuarios que tienen un ratio tweets/retweets alto consistentemente a lo largo del tiempo.

ggplot(tweets_cdmx_users) +
  geom_histogram(aes(x = followers)) + 
  labs(title = "Twitter CDMX: primacía de populariodad",
       subtitle = "Histograma de cantidad de seguidores por usuario (CDMX, 2/5/20 - 10/5/20)",
       x= "Cantidad de seguidores",
       y= "Cantidad de usuarios",
       caption= "Fuente: Twitter")  +
  scale_x_log10()
## Warning: Transformation introduced infinite values in continuous x-axis
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 16 rows containing non-finite values (stat_bin).

#Vemos una distribución de poder muy clara, donde una gran masa de usuarios concentra muy pocos seguidores, mientras que unos pocos usuarios concentran miles y hasta millones de seguidores. El poder y area de influencia discursiva de estas figuras aparece sobredimensionada.

#Veamos ahora ¿qué mensajes son los que tienen mayor repercusión? (en términos de cantidad de re-tweets)

tweets_cdmx %>%
  filter(!is_retweet) %>%
  top_n(10, retweet_count) %>%
  select(text, screen_name, followers_count, retweet_count) %>%
  arrange(desc(retweet_count))
## # A tibble: 10 x 4
##    text                               screen_name  followers_count retweet_count
##    <chr>                              <chr>                  <int>         <int>
##  1 "Hemos denunciado con pruebas a @… CarlosLoret          8372141          8521
##  2 "Dice AMLO que sus detractores so… panchogarfi…           39877          4826
##  3 "Nunca, en la dolorida historia d… fmartinmore…          120760          4771
##  4 "El hijo de #Bartlett parece el c… CarlosLoret          8372141          4479
##  5 "Jaja! Dice @lopezobrador_  que e… RicardoAlem…          189177          3779
##  6 "Ex-Secretario de HACIENDA, Carlo… luispazos1             59151          3600
##  7 "La cancelación de los proyectos … fmartinmore…          120760          3323
##  8 "AMLO y @HLGatell son idolatrados… DeniseDress…         4242661          3101
##  9 "Si la energía eólica y la solar … fmartinmore…          120760          2953
## 10 "AMLO ha dicho que el PIB es una … LuisGonzali             5503          2879

#2 de los mensajes originales más re-twiteados son de Carlos Loret, 2 de Martín Moreno, y el resto de otros individuos. #Todos los tweets más re-twiteados durante esta muestra de esta semana, son opositores y ampliamente críticos al gobierno de AMLO. Los motivos o temas de crítica no son estandarizados: hay quien señala casos de corrupción, mal manejo de la política energética, mal manejo de la política fiscal, mal manejo de la política contra el COVID-19, mal manejo de la política de asistencia y previsión social.

#Distribución horaria de los Tweets que hablan sobre AMLO y sobre la política mexicana:

ts_plot(tweets_cdmx, "hours")  +
  labs(title = "CDMX: Tweets y política",
       subtitle= "Cantidad de Tweets mencionando a AMLO por hora (CDMX, 2/5/2020 al 10/5/2020)",
       x= "Fecha",
       y= "Cantidad de Tweets",
       caption = "Fuente: Elaboración propia a partir de datos Twitter")

#Vemos que hay una clara estacionalidad de twitteo diaria, a partir del mediodía hasta la noche se twittea mucho de política y llegando a la madrugada y en la mañana la cantidad de tweets caen abruptamente. Esto es interesante porque las conferencias de prensa “matutinas” del presidente AMLO son siempre a las 7:00 AM, en el momento más bajo de twitteos que incluyen su nombre. Así mismo, se observa que se twittea sustancialmente menos los Sábados y domingos.Los cinco picos más altos son los días de semana.

#Veamos los tweets durante un día en particular (jueves):

ts_plot(tweets_cdmx %>%
          filter(created_at >= as_datetime("2020-05-07 00:00:01"),
                 created_at <= as_datetime("2020-05-07 23:59:59")),
        by = "15 minutes",
        color= "red") +
  labs(title = "CDMX: Tweets y política",
       subtitle= "Cantidad de Tweets mencionando a AMLO cada 15 minutos (CDMX, 7/5/2020)",
       x= "Hora",
       y= "Cantidad de Tweets",
       caption = "Fuente: Elaboración propia a partir de datos Twitter") +
  geom_vline(aes(xintercept = as_datetime("2020-05-07 07:00:00")), color= "black") +
  geom_vline(aes(xintercept = as_datetime("2020-05-07 19:00:00")), color= "black") +
  geom_text(aes(x= as_datetime("2020-05-07 08:20:00"), y= 25), 
  label= "Conf. de prensa matutina AMLO", color= "black", size= 2.5) +
  geom_text(aes(x= as_datetime("2020-05-07 20:20:00"), y= 5), 
            label= "Conf. de prensa López-Gatell", size= 2.5)

#Agregamos la hora de la conferencia de prensa que da cada mañana el presidente AMLO, a las 7:00 AM, y su contraparte, la conferencia de prensa que da López-Gatell (subsecretario de Salud de la Nación), reporte nacional sobre las estadísticas diarias en relación a la pandemia de COVID-19, que son los dos eventos diarios en los que el gobierno nacional se comunica a la prensa y a la ciudadanía.

#Analicemos la distribución geográfica de los Tweets geo-referenciados. Por alguna razon, en “bbox_coords”, todos los tweets que provienen del mismo usuario tienen las mismas coordenadas geográficas, por lo que agruparemos los tweets por usuario. Los campos de “geo_coords” y “coords_coords” aparecen todos con NA.

tweets_cdmx_geo <- tweets_cdmx %>%
  lat_lng("bbox_coords") %>%
  filter(!is.na(lat), !is.na(lng))

tweets_cdmx_geo_users <- tweets_cdmx_geo %>%
  group_by(screen_name) %>%
  summarise(followers = max(followers_count),
            Q.Tweets = n(),
            Q.Retweets = sum(retweet_count),
            ratio = Q.Tweets/Q.Retweets,
            lat = max(lat),
            lng = max(lng)) %>%
  arrange(desc(followers))

#Unos 994 tweets (de 10,373 muestreados), es decir un 9.64% del dataset, tiene coordenadas geográficas. #Unos 528 usuarios (de 3,686 muestreados), es decir un 14.32% del dataset, tiene coordenadas geográficas habilitadas.

paleta <- colorNumeric(
  palette = "magma",
  domain = tweets_cdmx_geo_users$followers)

leaflet(tweets_cdmx_geo_users) %>%
  addTiles() %>%
  addCircleMarkers(radius = ~ratio,
                   color = "blue")
## Assuming "lng" and "lat" are longitude and latitude, respectively

#Se han mapeado a los Tweets con geo-coordenadas según el ratio de re-tweets que reciben, para así identificar a los twitteros más influyentes en materia de debate político en línea en la última semana. Aquí surgen varias cuestiones: #(1) El radio de KM al rededor del Ángel de la Independencia tal vez fue un poco excesivo: hemos identificado tweets en la ciudad de Toluca. #(2) Mapear por cantidad de seguidores no es opción ya que esto sobredimensiona algunos usuarios con cientos de miles de seguidores, contra otros que tinene unas cuantas decenas. Al haber usuarios en todo el espectro, leaflet tiene que crear círculos gigantezcos que no permiten visualizar apropiadamente el mapa. #(3) Claramente hay un problema: dijimos que hay 528 usuarios twiteando con sus geo-coordenadas. A simple vista en el mapa no hay 528 locaciones. Sin embargo, se ve a simple vista también que un montón de usuarios aparecen con exactamente la misma locación superpuesta. ¿Qué son estas locaciones? ¿Antenas de 4G? #(4) Hay usuarios con un ratio de tweets/retweets muy alto en el centro de CDMX.