knitr::opts_chunk$set( echo = TRUE ) library(PracticaTwitter)
La intensa actividad en las redes sociales las ha convertido en fuentes de grandes volúmenes de información. En caso de Twitter, la extracción y el análisis de los datos propios de usuarios y mensajes, permitirá obtener múltiples resultados estadísticos. En este sentido y el marco de unas cercanas elecciones epañolas, se pretende realizar un análisis de los datos que se pueden obtener a partir de la cuenta de twitter oficial de los partidos políticos.
Se inicia el estudio ralizando una monitorización de los usuarios que siguen (los Followers) a un partido político, sea en este caso el PP (https://twitter.com/PPopular). El análisis se realiza sobre una muestra de 50 usuarios, a pesar de que la realidad es mucho mayor. El motivo es la restricción que impone Twitter para las consultas realizadas a través de API, limitadas a un máximo de 180 cada 15 minutos.
Primeramente, después de la autenticación a la API de Twitter se obtiene un conjunto data frame con los datos de 80 de los Followers del PP:
twitterAuthentication() # Data frames with PP profile information tuserPp <- getUser("PPopular") # PP data frames with information of 80 followers followersDataFramePp <<- getFollowersDataFrame(tuserPp, 80)
Inicialmente, tratamos de identificar los más relevantes Followers del partido.
# PP friends analysis topFollowersPp <<- getTopFollowers(followersDataFramePp) topFriendsPp <<- getTopFriends(followersDataFramePp) topTweetsPp <<- getTopTweets(followersDataFramePp)
De este modo, en la siguiente tabla se visualizan: los usuarios que siguen a un mayor número de Friends, los más seguidos por Followers y los más activos en el envío de mensajes (Tweets).
# Table print library(xtable) options(xtable.floating = FALSE) options(xtable.timestamp = "") table <- cbind(head(topFollowersPp, n=10), head(topFriendsPp, n=10), head(topTweetsPp, n=10)) names(table) <- c("Usuario", "# Followers", "Usuario", "# Friends", "Usuario", "# Tweets") xt <- xtable(table, align ="|l|ll|ll|ll|", digits = 0, caption = "Tabla 1. Usuarios influyentes en Twitter") print(xt, type = "html", floating = TRUE, latex.environments = "c")
Una vez analizados los usuarios más influyentes, se procede a estudiar el vínculo que une al PP con el global de usuarios. En este sentido, se construye un grafo para visualizar el vínculo entre usuarios: quién sigue a quién y si se da el caso que se siguen mútuamente.
# Graph code plotReciprocalFollowsGraph(tuserPP, followersDataFramePp)
Adicionalmente, podemos extraer el comportamiento de lo usuarios mediante la distribución de su nivel de actividad en la red.
# Graph distribution of "Num of Users"" vs "Num of Tweets"" par(mar = rep(2,4)) hist(followersDataFramePp$statusesCount, breaks = 100, main = "Distribución de la activiad de los usuarios [nº usuarios/nº de Tweets]", col = "blue", border = "blue", axes = TRUE)
Finalmente, mediante la ubicación de los usuarios, podemos observar su distribución geográfica en el territorio.
De este modo, ánalogamente a los cálculos ya realizados, se obtienen los datos del PSOE (https://twitter.com/PSOE) y se realiza la comparativa de distribuciones geográficas entre los Followers de PP y PSOE.
# Data frames with PSOE profile information tuserPsoe <- getUser("PSOE") # PP data frames with information of 80 friends followersDataFramePsoe <<- getFollowersDataFrame(tuserPsoe, 80)
# Map with PP and PSOE Followers mapLocations(followersDataFramePp, followersDataFramePsoe, colours = c("blue","red"), title = "PP vs PSOE followers" )
Es posible extender el análisis a los Tweets enviados por los perfiles de usuario de los partidos políticos. En el estudio efectuado, se han tomado los últimos 1000 Tweets escritos por PP y PSOE.
tweetsOfUserDataFramePsoe <<- getUserTweetsDataFrame(tuserPsoe, 1000) tweetsOfUserDataFramePp <<- getUserTweetsDataFrame(tuserPp, 1000)
De este modo, es posible obtener el historial temporal con la actividad en la red y comparar la cantidad de mensajes enviados entre partidos.
# Graphs of activity ggplot2::qplot(x = created, data = tweetsOfUserDataFramePp, main = "Actividad del PP [nº Tweets/tiempo]", xlab ="Tiempo", ylab = "Tweets", geom = "auto", colour = I("blue"), fill = I("blue")) ggplot2::qplot(x = created, data = tweetsOfUserDataFramePsoe, main = "Actividad del PSOE [nº Tweets/tiempo]", xlab ="Tiempo", ylab = "Tweets", geom = "auto", colour = I("red"), fill = I("red"))
A nivel de la actividad global en red, se analizan los últimos 1000 Tweets que tratan sobre el PP o el PSOE enviados dentro del territorio español.
twitterAuthentication() tweetsDataFramePp <- getTweetsDataFrame("PP", "40.2,-3.71,700km", number=1000) tweetsDataFramePsoe <- getTweetsDataFrame("PSOE", "40.42,-3.71,700km", number=1000)
A partir de los Tweets obtenidos sobre los diferentes partidos políticos, es posible analizar su contenido. De este modo, se estudia cuál de los hilos temáticos correspondientes usa un peor tono e incluye un mayor número de palabrotas.
keyWordsList <- readLines("data/insultos.txt") keyWordsDataFramePp <<- getTweetsWithKeyword(tweetsDataFramePp, keyWordsList) keyWordsDataFramePsoe <<- getTweetsWithKeyword(tweetsDataFramePsoe, keyWordsList)
sumKwPP <- dim(keyWordsDataFramePp)[1] # number of tweets of PP found with keywords if(sumKwPP>0){ pie(c(sumKwPP, 1000 - sumKwPP), labels = c(paste ("Tweets con palabrotas - ", (sumKwPP/1000)*100, "%")), radius = 1, col = c("yellow", "blue"), main="Tweets sobre PP") } sumKwPSOE <- dim(keyWordsDataFramePsoe)[1] # number of tweets of PSOE found with keywords if(sumKwPSOE>0){ pie(c(sumKwPSOE, 1000 - sumKwPSOE), labels = c(paste ("Tweets con palabrotas - ", (sumKwPSOE/1000)*100, "%")), radius = 1, col = c("yellow", "red"), main="Tweets sobre PSOE") }
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.