Archive

Networks

Twitter is a great network data source. Using R, you can easily connect to Twitter, download a bunch of tweets and analyze them. In this case, I wanted to focus on replies and retweets. Below find a summary of reply and retweet networks (complete code here)

– The script connects to Twitter and downloads 1.000 tweets (one hour delay) of any given term –

tweets <- searchTwitter(“Spanair”, n=1000,language=”es”)

head(tweets)

[[1]] [1] “MadridNoticias: Afectados por el accidente de Spanair luchan por mantener vivo el recuerdo cinco años después http://t.co/T2Z0ntntGV #TeleMadrid”

[[2]] [1] “Franches98: El accidente que quebró a Spanair: Investigadores del grupo de investigación Applied Economics and Management … http://t.co/phZ1rcF5h7”

[[3]] [1] “FansDelPoeta_: El accidente que quebró a Spanair: Investigadores del grupo de investigación Applied Economics and Management de la Universidad de Se…”

[[4]] [1] “Ariel_x31: El accidente que quebró a Spanair: Investigadores del grupo de investigación Applied Economics and Management … http://t.co/p3pchacEUu”

[[5]] [1] “aracelii92: RT @A3Noticias: Hoy se cumplen cinco años del accidente de Spanair que costó la vida a 154 personas [VÍDEO] http://t.co/5H7qQgTEAC”

[[6]] [1] “Oye_Niinii: El accidente que quebró a Spanair: Investigadores del grupo de investigación Applied Economics and Management … http://t.co/e1jCrsdvMT”

df_tweets <- twListToDF(tweets)

str(df_tweets)

data.frame’: 1000 obs. of  12 variables:

$ text        : chr  “Afectados por el accidente de Spanair luchan por mantener vivo el recuerdo cinco años después http://t.co/T2Z0ntntGV #TeleMadri”| __truncated__ “El accidente que quebró a Spanair: Investigadores del grupo de investigación Applied Economics and Management .

$ favorited   : logi  FALSE FALSE FALSE FALSE FALSE FALSE …

$ replyToSN : chr NA NA NA NA …

$ created : POSIXct, format: “2013-08-20 08:11:18” “2013-08-20 08:11:12” …

$ truncated : logi FALSE FALSE FALSE FALSE FALSE FALSE …

$ replyToSID : chr NA NA NA NA …

$ id : chr “369733367031283712” “369733343165689857” “369733322261274625” “369733285590478848” …

$ replyToUID : chr NA NA NA NA …

$ statusSource: chr “<a href=\”http://dlvr.it\” rel=\”nofollow\”>dlvr.it</a>” “<a href=\”http://twitterfeed.com\” rel=\”nofollow\”>twitterfeed</a>” “<a href=\”http://twitterfeed.com\” rel=\”nofollow\”>twitterfeed</a>” “<a href=\”http://twitterfeed.com\” rel=\”nofollow\”>twitterfeed</a>” …

$ screenName : chr “MadridNoticias” “Franches98” “FansDelPoeta_” “Ariel_x31” …

$ retweetCount: num 0 0 0 0 73 0 1 0 0 0 …

$ retweeted : logi FALSE FALSE FALSE FALSE FALSE FALSE …

replyto <- df_tweets[3]

user <- df_tweets[10]

df_reply <- cbind(replyto,user)

str(df_reply)

‘data.frame’: 1000 obs. of 2 variables:

$ replyToSN : chr NA NA NA NA …

$ screenName: chr “MadridNoticias” “Franches98” “FansDelPoeta_” “Ariel_x31” …

head(df_reply)

replyToSN screenName

1 <NA> MadridNoticias

2 <NA> Franches98

3 <NA> FansDelPoeta_

4 <NA> Ariel_x31

5 <NA> aracelii92

6 <NA> Oye_Niinii

replies <- subset(df_reply,replyToSN!=”<NA>”)

str(replies)

‘data.frame’: 20 obs. of 2 variables:

$ replyToSN : chr “elmundoes” “A3Noticias” “elmundoes” “A3Noticias” …

$ screenName: chr “jgrvilla” “OMerinoG” “jgrvilla” “OMerinoG” …

head(replies)

replyToSN screenName

49 elmundoes jgrvilla

90 A3Noticias OMerinoG

text_1 <- subset(df_tweets,replyToSN!=”<NA>”)

str(text_1)

data.frame’: 20 obs. of  12 variables:

$ text : chr ““@elmundoes: 5º aniversario del accidente de Spanair. Un estudio lo vincula con la quiebra de la compañís aérea. http://t.co/73″| __truncated__ ““@A3Noticias: Hoy se cumplen cinco años del accidente de Spanair que costó la vida a 154 personas [VÍDEO] http://t.co/S5wH6TE90″| __truncated__ ““@elmundoes: 5º aniversario del accidente de Spanair. Un estudio lo vincula con la quiebra de la compañís aérea. http://t.co/73″| __truncated__ ““@A3Noticias: Hoy se cumplen cinco años del accidente de Spanair que costó la vida a 154 personas [VÍDEO] http://t.co/S5wH6TE90″| __truncated__ …

$ favorited : logi FALSE FALSE FALSE FALSE FALSE FALSE …

$ replyToSN : chr “elmundoes” “A3Noticias” “elmundoes” “A3Noticias” …

……………..

ind <- c(1,3,10)

replies_def <- text_1[ind]

str(replies_def)

‘data.frame’: 20 obs. of 3 variables:

$ text : chr ““@elmundoes: 5º aniversario del accidente de Spanair. Un estudio lo vincula con la quiebra de la compañís aérea. http://t.co/73″| __truncated__ ““@A3Noticias: Hoy se cumplen cinco años del accidente de Spanair que costó la vida a 154 personas [VÍDEO] http://t.co/S5wH6TE90″| __truncated__ ““@elmundoes: 5º aniversario del accidente de Spanair. Un estudio lo vincula con la quiebra de la compañís aérea. http://t.co/73″| __truncated__ ““@A3Noticias: Hoy se cumplen cinco años del accidente de Spanair que costó la vida a 154 personas [VÍDEO] http://t.co/S5wH6TE90″| __truncated__ …

$ replyToSN : chr “elmundoes” “A3Noticias” “elmundoes” “A3Noticias” …

$ screenName: chr “jgrvilla” “OMerinoG” “jgrvilla” “OMerinoG” …

df.g <- graph.data.frame(d = replies, directed = FALSE)

plot(df.g, vertex.size=4, vertex.label=V(df.g)$name,vertex.color=”orange”,vertex.label.color=”black”, vertex.frame.color=”white”, edge.color=”grey”,edge.arrow.size=0.01, rescale=TRUE,vertex.label=NA, vertex.label.dist=0.0,vertex.label.cex=0.5, add=FALSE, vertex.label.font=.001)

replies_spanair

rts <- grep(“^rt @[a-z0-9_]{1,15}”, tolower(df_tweets$text), perl=T, value=T)

rt.sender <- tolower(as.character(df_tweets$screenName[grep(“^rt @[a-z0-9_]{1,15}”, tolower(df_tweets$text), perl=T)]))

rt.receiver <- gsub(“^rt @([a-z0-9_]{1,15})[^a-z0-9_]+.*$”, “\\1”, rts, perl=T)

rt.sender[rt.sender==””] <- “<NA>”

rt.receiver[rt.receiver==””] <- “<NA>”

rts.df <- data.frame(rts,rt.sender, rt.receiver)

str(rts.df)

‘data.frame’: 480 obs. of 3 variables:

$ rts : Factor w/ 36 levels “rt @a3noticias: hoy se cumplen cinco años del accidente de spanair que costó la vida a 154 personas [vídeo] http://t.co/5h7qqgt”| __truncated__,..: 1 16 23 20 5 24 10 25 8 35 …

$ rt.sender : Factor w/ 44 levels “adol_izquierdo”,..: 6 4 37 10 8 42 5 41 38 26 …

$ rt.receiver: Factor w/ 30 levels “a3noticias”,”abc_es”,..: 1 13 19 16 4 20 8 21 7 29 …

ddf <- rts.df[c(2:3)]

str(ddf)

‘data.frame’: 480 obs. of 2 variables:

$ rt.sender : Factor w/ 44 levels “adol_izquierdo”,..: 6 4 37 10 8 42 5 41 38 26 …

$ rt.receiver: Factor w/ 30 levels “a3noticias”,”abc_es”,..: 1 13 19 16 4 20 8 21 7 29 …

m <- as.matrix(ddf)

head(m,10)

rt.sender rt.receiver

[1,] “aracelii92” “a3noticias”

[2,] “almudenamama” “fcapilargomez”

[3,] “razican” “la_informacion”

…..

rts.df.2 <- data.frame(rt.sender,rt.receiver)

rts.g <- graph.data.frame(rts.df.2, directed=T)

plot(rts.g ,vertex.size=4, vertex.label=V(rts.g)$name,vertex.color=”red”,vertex.label.color=”black”, vertex.frame.color=”white”, edge.color=”grey”,edge.arrow.size=0.01, rescale=TRUE, vertex.label=NA, vertex.label.dist=0.0,vertex.label.cex=0.5, add=FALSE, vertex.label.font=.001)

retweets_spanair

 

I did some tests with different terms during August 19th and August 20th 2013. Below find the resulting networks.

Retweets  “rajoy”

retweets_rajoy

Retweets “barcenas”

retweets_barcenas

 

Retweets “eshumorcom”

retweets_eshumorcom

Retweets “gif”

retweet_gif

This is how a list of tagged URL may look like using a pair of networks, one for general overview and another for selection purposes.

The Iliad is an interactive project developed by Santiago Ortiz (@moebio) to navigate through the epic poem of Homer using a Stream and a Network.

Homer’s epic contains huge complexity: Gods, Achaeans and Troyans interact and clash following their very different motivations…meanwhile a ten-years war seems to be close to its end. This project explores these complex relations and how they change through the 24 books that conforms this great poem.