sábado, 11 de julio de 2015

Un ejemplo de PageRank

Si se tienen datos de interacciones de usuarios (o interacciones entre paginas, cuentas bancarias, redes sociales, etc.) puede calcularse la Importancia o relevancia de cada usuario usando el algoritmo PageRank.


Conceptualmente seria así:


























#---------------------------------------------------------------
# carga libreria y datos de dropbox 
library(igraph)
datos <- read.csv("https://www.dropbox.com/s/blugxmyhty6lkeq/Twitter_network_R.csv?dl=1")
 
#---------------------------------------------------------------
# crea objeto de grafo con solo 50 observaciones de ejemplo
grafo <- graph.data.frame(datos[1:50,])
 
#---------------------------------------------------------------
# grafica objeto de grafo como ejemplo
plot(grafo,layout=layout.fruchterman.reingold, vertex.size=8,
     vertex.label.dist=0.4, vertex.color="red", edge.arrow.size=0.5)
 
#---------------------------------------------------------------
# calcula page rank
pr.tmp <- data.frame(pr.value= page.rank(grafo)$vector)
pr     <- data.frame(pr.desc=row.names(pr.tmp), pr.val = pr.tmp[,1])
head(pr[order(pr$pr.val,decreasing = T),]) #imprime los 6 usuarios mas relevantes
 
#---------------------------------------------------------------
# grafica interacciones usando valor page.rank para tamaños en grafico
V(grafo)$label.cex =  0.6 + pr$pr.val*3 # tamaño de letra segun page.rank
plot(grafo,layout=layout.fruchterman.reingold, vertex.size=pr$pr.val*100,
     vertex.label.dist=0.4, vertex.color="red", edge.arrow.size=0.3)

Si se quiere graficar la persona mas importante, usando valor de pagerank, y tener este grafico:
















Puede agregarse al script anterior lo siguiente:
# continuación...
# GRAFICANDO PERSONA MAS IMPORTANTE --------------------------

# Se agrega vector al objeto grafo, con valores de PageRank (pr$pr.val y grafo vienen de script anterior)
V(grafo)$page.rank.vector <- pr$pr.val

# Se identifica el valor máximo de page rank
max.pr <- max(V(grafo)$page.rank.vector)

# Se crea objeto g2 con grafo de persona más influyente
g2 <- subgraph.edges(grafo, E(grafo)[inc(V(grafo)[page.rank.vector>=max.pr])])

# gráfico del objeto g2 
V(g2)$label.cex =  0.6 + V(g2)$page.rank.vector * 3 # tamaño de letra usando PageRank
plot(g2, vertex.size=V(g2)$page.rank.vector*100,
     vertex.label.dist=0.4, vertex.color="red", edge.arrow.size=0.1)



La ppt con imagen se descarga AQUI
Una ppt con conceptos básicos de grafos se puede descargar AQUI


Referencia:
http://is-r.tumblr.com/post/38240018815/making-prettier-network-graphs-with-sna-and-igraph



1 comentario:

  1. Buenas.
    En el código:
    # calcula page rank
    pr.tmp <- data.frame(pr.value= page.rank(grafo)$vector)
    pr <- data.frame(pr.desc=row.names(pr.tmp), pr.val = pr.tmp[,1])
    head(pr[order(pr$pr.val,decreasing = T),]) #imprime los 6 usuarios mas relevantes

    ¿Cómo hago para obtener todos los usuarios de la red, no sólo los 6 más relevantes?

    Gracias

    ResponderEliminar