library(ggmap)
library(rtweet)
library(tidyverse)
library(lubridate)
library(leaflet)
options(scipen=999)
#Cargo los datos de acceso a la variable twitter_token
twitter_token <- create_token(
app = appname,
consumer_key = consumer_key,
consumer_secret = consumer_secret,
access_token = access_token,
access_secret = access_secret)
tweets_cordoba<-search_tweets(geocode="-31.416189,-64.191804,10mi",
include_rts = FALSE,
n=10000,
retryonratelimit = TRUE)
names(tweets_cordoba)
## [1] "user_id" "status_id"
## [3] "created_at" "screen_name"
## [5] "text" "source"
## [7] "display_text_width" "reply_to_status_id"
## [9] "reply_to_user_id" "reply_to_screen_name"
## [11] "is_quote" "is_retweet"
## [13] "favorite_count" "retweet_count"
## [15] "quote_count" "reply_count"
## [17] "hashtags" "symbols"
## [19] "urls_url" "urls_t.co"
## [21] "urls_expanded_url" "media_url"
## [23] "media_t.co" "media_expanded_url"
## [25] "media_type" "ext_media_url"
## [27] "ext_media_t.co" "ext_media_expanded_url"
## [29] "ext_media_type" "mentions_user_id"
## [31] "mentions_screen_name" "lang"
## [33] "quoted_status_id" "quoted_text"
## [35] "quoted_created_at" "quoted_source"
## [37] "quoted_favorite_count" "quoted_retweet_count"
## [39] "quoted_user_id" "quoted_screen_name"
## [41] "quoted_name" "quoted_followers_count"
## [43] "quoted_friends_count" "quoted_statuses_count"
## [45] "quoted_location" "quoted_description"
## [47] "quoted_verified" "retweet_status_id"
## [49] "retweet_text" "retweet_created_at"
## [51] "retweet_source" "retweet_favorite_count"
## [53] "retweet_retweet_count" "retweet_user_id"
## [55] "retweet_screen_name" "retweet_name"
## [57] "retweet_followers_count" "retweet_friends_count"
## [59] "retweet_statuses_count" "retweet_location"
## [61] "retweet_description" "retweet_verified"
## [63] "place_url" "place_name"
## [65] "place_full_name" "place_type"
## [67] "country" "country_code"
## [69] "geo_coords" "coords_coords"
## [71] "bbox_coords" "status_url"
## [73] "name" "location"
## [75] "description" "url"
## [77] "protected" "followers_count"
## [79] "friends_count" "listed_count"
## [81] "statuses_count" "favourites_count"
## [83] "account_created_at" "verified"
## [85] "profile_url" "profile_expanded_url"
## [87] "account_lang" "profile_banner_url"
## [89] "profile_background_url" "profile_image_url"
#Visualizo los 10 tweets con mayor repercusion en orden descendente
tweets_cordoba %>%
top_n(10,retweet_count) %>%
arrange(desc(retweet_count)) %>%
select(screen_name,text,retweet_count)
## # A tibble: 10 x 3
## screen_name text retweet_count
## <chr> <chr> <int>
## 1 juliforcato "Que sensación tan linda cuando te deja de impo… 1051
## 2 WinstonARG "Los zurdos que te defienden la APP del gobiern… 140
## 3 AriGonzalezzz… "No paro de sacarme la pielcita de los labios" 127
## 4 ElPresto2Ok "¿EL PERONISMO? No tiene nada propio. ES UN ROB… 105
## 5 Mike______Azu… "https://t.co/WIprxJyHjD" 80
## 6 ElPresto2Ok "Flaco, no me podés decir que Sol Perez es más … 62
## 7 PSY2K21 "A veces no hay próxima vez." 53
## 8 martinezxavii3 "Puede hacer 30 bajo cero pero en bolas se duer… 47
## 9 Bastetlove3 "Ayyy las paguitas, Ayuso 😏😏😏 https://t.co/kedL… 42
## 10 celezzala "Ochocientos mil trabajos hice, para q ahora va… 33
#Analisis temporal: En que momento del dia se producen la mayor cantidad de tweets:
#Debido a que la base de datos toma los ultimos 10000 tweets en la ciudad, sin importar el contenido, la muestra no alcanza para analizar un dia entero. Por ese motivo, vuelvo a generar un registro de tweets en la ciudad, pero esta vez indicando una palabra clave en el texto del tweet para obtener mayor diversidad en horarios.
tweets_cordoba_keyword<-search_tweets(q="gobierno",
geocode="-31.416189,-64.191804,10mi",
include_rts=FALSE,
n=10000,
retryonratelimit=TRUE)
#Analizo los datos temporales :
tweets_cordoba_keyword %>%
filter(day(created_at)==06) %>%
ts_plot("hours")+
labs(title="Uso de Twitter en Ciudad de Cordoba",
subtitle="Frecuencia de uso por hora",
x="Hora del dia",
y="Frecuencia",
caption="Basado en una busqueda de la palabra 'gobierno'. Fuente: API Twitter")
Se observa que la mayor frecuencia de tweets se produce hacia la media noche, y una reduccion casi total durante la madrugada (entre las 3 y 7 hs).
#POPULARIDAD DE USUARIOS
#Realizo un histograma en escala logaritmica de la distribucion de usuarios segun su popularidad. El motivo de usar la escala logaritmica es por la presencia de fuertes outliers (usuarios con gran cantidad de seguidores en contraposicion con la mayoria).
tweets_cordoba %>%
ggplot()+
geom_histogram(aes(x=followers_count)) +
scale_x_log10() +
labs(title="Uso de Twitter en Ciudad de Cordoba",
subtitle="Popularidad de usuarios",
x="Conteo de seguidores",
y="Frecuencia",
caption="Fuente: API Twitter")
#Obtengo los estadisticos, que muestran un valor mediano de seguidores, bastante mas bajo que el promedio, debido a outliers muy fuertes.
tweets_cordoba %>%
select(followers_count) %>%
summary()
## followers_count
## Min. : 0
## 1st Qu.: 169
## Median : 403
## Mean : 2504
## 3rd Qu.: 927
## Max. :506750
#Obtengo los 5 usuarios mas populares:
tweets_cordoba %>%
group_by(screen_name, followers_count) %>%
summarise() %>%
top_n(5, followers_count) %>%
arrange(desc(followers_count)) %>%
select(screen_name, followers_count) %>%
head()
## # A tibble: 6 x 2
## # Groups: screen_name [6]
## screen_name followers_count
## <chr> <int>
## 1 LAVOZcomar 506750
## 2 Cadena3Com 489529
## 3 ElDoce 402421
## 4 ViaCordobaOK 313781
## 5 CordobaCF_ofi 264239
## 6 frasesmegustan 197389
#DISTRIBUCION GEOGRAFICA DE TWEETS
#Obtengo localizacion de tweets en las variables lat y lng. Luego elimino los campos georefernciados que no servirian ne ggplot, y filtro los tweets no georeferenciados.
tweets_cordoba_geo<-lat_lng(tweets_cordoba) %>%
select(-geo_coords, -coords_coords, -bbox_coords) %>%
filter(!is.na(lat)|!is.na(lng))
#Mapa estatico. Los resultados muestran que los tweets se produjeron en un sector de la ciudad (centro a nor-oeste)
bbox<-make_bbox(lon=tweets_cordoba_geo$lng,lat=tweets_cordoba_geo$lat)
mapa<-get_stamenmap(bbox,maptype="toner",zoom = 11)
tweets_cordoba_geo<-arrange(tweets_cordoba_geo, followers_count)
ggmap(mapa)+
geom_point(data=tweets_cordoba_geo,aes(x=lng,y=lat,color=followers_count,size=retweet_count),alpha=.5)+
scale_color_distiller(palette="Spectral")+
labs(title="Uso de Twitter en Ciudad de Cordoba",
subtitle="Analisis de tweets geo-referenciados",
caption="Fuentes: Datos de API Twitter. Mapa: D. Kahle and H. Wickham. ggmap: Spatial Visualization with ggplot2.
The R Journal, 5(1), 144-161. URL
http://journal.r-project.org/archive/2013-1/kahle-wickham.pdf",
color="Seguidores",
size="Conteo de Retweets")
#Mapa interactivo
paleta<-colorNumeric(palette="viridis",domain=tweets_cordoba_geo$followers_count)
leaflet(tweets_cordoba_geo) %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addCircleMarkers(radius=~retweet_count,
popup = ~text,
color=~paleta(followers_count)) %>%
addLegend(title="Seguidores",pal=paleta,values=~followers_count)
Los resultados muestran una gran concentracion de los usuarios mas populares, pero una baja correlacion entre los seguidores mas populares y los tweets con mayor repercusion. Como la base de datos geolocalizada contiene una muestra mucho menor, realizo un grafico utilizando el dataset original para verificar este comportamiento:
tweets_cordoba_agrupados<-tweets_cordoba %>%
group_by(screen_name,followers_count) %>%
summarise(tweets=n(),retweets=sum(retweet_count),favourites=sum(favourites_count))
tweets_cordoba_agrupados<-mutate(tweets_cordoba_agrupados,tasa_retweet=retweets/tweets,tasa_favourites=favourites/tweets)
ggplot(tweets_cordoba_agrupados) +
geom_point(aes(x=followers_count,y=tasa_retweet,color=tasa_favourites),alpha=.5)+
scale_color_viridis_c()+
labs(title="Uso de Twitter en Ciudad de Cordoba",
subtitle="Analisis de correlacion popularidad - repercusion de tweets",
caption="Fuente: API Twitter",
x="Seguidores",
y="Tasa de Retweets por tweet",
color="Tasa de favoritos por tweet")+
geom_smooth(aes(x=followers_count,y=tasa_retweet),method="lm")
## `geom_smooth()` using formula 'y ~ x'
tweets_cordoba_lm<-lm(tasa_retweet ~ followers_count, data=tweets_cordoba_agrupados)
summary(tweets_cordoba_lm)
##
## Call:
## lm(formula = tasa_retweet ~ followers_count, data = tweets_cordoba_agrupados)
##
## Residuals:
## Min 1Q Median 3Q Max
## -11.18 -0.26 -0.26 -0.25 526.58
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.250853100 0.066577621 3.768 0.000166 ***
## followers_count 0.000022462 0.000005997 3.745 0.000181 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.981 on 8150 degrees of freedom
## Multiple R-squared: 0.001718, Adjusted R-squared: 0.001596
## F-statistic: 14.03 on 1 and 8150 DF, p-value: 0.0001813
Se verifica entonces que no existe una correlacion clara entre cantidad de seguidores y cantidad de retweets, ya que el estadistico R^2 es bajo.