He utilizado la API de twitter en R (paquete twitteR) para realizar un estudio de mi red social en Twitter y poder ampliar mi lista de personas y entidades relacionadas con las nuevas tecnologías, data science y big data a las que sigo.
Para ello he creado un script que obtiene la lista de cuentas de twitter a las que sigo (las denominaré amigos de primer nivel), las filtra permitiéndome elegir aquellas relacionadas con temas de tecnología, data science y big data, y obtiene la lista de cuentas seguidas por cada una de ellas (amigos de segundo nivel). Para discriminar entre la gran cantidad de cuentas de segundo nivel aquellas que puedan ser más interesantes he utilizado como criterio de corte sólo elegir aquellas que sean seguidas por más de tres de mis 'amigos' (si existen diferentes cuentas de primer nivel relacionadas con los temas que me interesan que siguen a una misma cuenta, es lógico pensar que esa nueva cuenta de segundo nivel también estará relacionada).
En las siguientes imágenes se muestras el grafo inicial de cuentas de primer nivel que he escogido y el grafo de la red social de cuentas de segundo nivel generado a partir de las cuentas que sigo yo (en rojo mi cuenta, en verde las cuentas que yo sigo y en azul las cuentas de segundo nivel que pueden resultar interesantes):


A continuación incluyo el código del script R que he creado:
En las siguientes imágenes se muestras el grafo inicial de cuentas de primer nivel que he escogido y el grafo de la red social de cuentas de segundo nivel generado a partir de las cuentas que sigo yo (en rojo mi cuenta, en verde las cuentas que yo sigo y en azul las cuentas de segundo nivel que pueden resultar interesantes):


A continuación incluyo el código del script R que he creado:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
############# Objetivo del programa ####################################### | |
## Social Network Analysis | |
## Ampliación de mi lista de contactos relacionada con la tecnología, | |
## data science y big data mediante mineria de datos en Twitter | |
## | |
## Autor: Antonio Soriano Tolosa | |
########################################################################### | |
## Cargo las librerías necesarias | |
library(twitteR) # API de twitter en R | |
library(stringr) | |
library(RCurl) | |
library(tm) # Paquete de text mining para R | |
library(igraph) # Paquete de análisis de redes y grafos | |
library(Matrix) # Trabajo con matrices dispersas | |
## Credenciales de identificación con twitter | |
load("twitter authentication.Rdata") | |
registerTwitterOAuth(cred) | |
## Obtenidendo lista de amigos | |
myUser <- getUser("Phd_A_Soriano",cainfo="cacert.pem") # mi usuario (objeto user) | |
myFriends <- myUser$getFriends(cainfo="cacert.pem",blockOnRateLimit=TRUE) # mis amigos (lista de objetos user) | |
df <- lapply(myFriends,function(x) x$getScreenName()) # Extraigo los nombres de perfil twitter | |
df <- t(data.frame(df)) # Lo paso a data frame | |
row.names(df) <- NULL # Quitamos los nombres de filas, que proporciona algun tipo de ID | |
## Filtrando a mis amigos -> Quito aquellos que no me interesan | |
inx <- numeric(0) | |
for (i in 1:length(df)){ | |
s <- readline(paste("¿te interesa buscar los amigos de @",df[i]," (s/n)? ")) | |
if (s=="s") inx <- c(inx,i) | |
} | |
myFriends <- myFriends[inx]; df <- df[inx]; | |
## Busco a los amigos de mis amigos: Lista de mis amigos, conteniendo una lista con cada uno de los suyos | |
sleeptime = 50 # Hacemos una parada entre cada petición para no sobrepasar los límites de la API de twitte | |
Fusers <- lapply(myFriends,function(x){ | |
a <- tryCatch(x$getFriends(cainfo="cacert.pem"),error=function(e) NULL) | |
Sys.sleep(sleeptime) | |
print(c("User ",x$getScreenName()," read")) | |
return(a)}) | |
## lista de los amigos de 2º nivel a un vector con un solo string -> más fácil de crear un Corpus | |
nameList <- lapply(Fusers, function(l2){lapply(l2,function(x) x$getScreenName())}) # Extraemos nicks de objetos user | |
nameList <- lapply(nameList, function(x){t(data.frame(x))}) # Pasamos a una lista de data.frames | |
nameList <- sapply(nameList,function(x){paste(x,collapse = ' ' )}) # Los dataframe a una cadena de texto y la lista a un vector | |
## Creamos un corpus y una matriz de términos -> Documentos: mis amigos Términos: amigos 2º nivel | |
myCorpus <- Corpus(VectorSource(nameList)) | |
myTdm <- as.matrix(TermDocumentMatrix(myCorpus)) | |
colnames(myTdm) <- df | |
## Filtramos: amigos de 2º nivel compartidos por más de 'nFriends' amigos mios | |
nFriends = 3 | |
myTdm <- Matrix(myTdm[rowSums(myTdm)>nFriends,], sparse = TRUE ) # sparse matrix | |
summ <- summary(myTdm) # Obtenemos indices de columnas y filas de elementos no nulos | |
## Construimos data.frame con relaciones User -> friend | |
# Relaciones: Yo con mis amigos | |
relation <- data.frame(User='Phd_A_Soriano',Friend=df) | |
## Dibujamos grafo con mis amigos | |
g <- graph.data.frame(relation, directed = T) | |
# Ponemos labels a los nodos | |
V(g)$label <- V(g)$name | |
# Dibujamos el gráfico | |
tkplot(g) | |
# Mis amigos con los suyos | |
relation <- merge(relation, data.frame(User= colnames(myTdm)[summ$j], Friend = rownames(myTdm)[summ$i]),all=T) | |
## Creamos gráfo de las relaciones | |
g <- graph.data.frame(relation, directed = T) | |
# Ponemos labels a los nodos | |
V(g)$label <- V(g)$name | |
# Distinguimos los nodos por color | |
V(g)$color <- "lightblue" # amigos 2º nivel en azul | |
V(g)$color[1] <- "red" # Yo me pongo en rojo | |
inx <- match(df,V(g)$name) # Busco a mis amigos entre los nodos | |
V(g)$color[inx] <- "lightgreen" # Mis amigos en verde | |
# Dibujamos el gráfico | |
tkplot(g) |
No hay comentarios:
Publicar un comentario