Breve introduccion al analisis de redes con R y
igraph
L. Leticia Ramrez Ramrez, CIMAT, MEXICO
[Link]@[Link]
Diciembre, 2017
Algunos programas y paquetes para el analisis de redes
complejas
I Gephi: Programa para la visualizacion y exploracion de todo
tipo de grafos y redes ([Link]
I igraph: paquete disponible para R, python y C/C++
([Link]
I muxviz: Analisis multinivel y plataforma de visualizacion.
Basado en R y GNU Octave.
I NetworkX: paquete de python para la creacion, manipulacion
y estudio de estructuras, dinamicas y funciones de redes
complejas.
I pajek: Programa para el analisis y visualizacion de grandes
redes.
I SocNetv:Programa para el analisis de redes sociales y su
visualizacion.
I Otros: SNAP, NetMiner, UCINet, GUESS, ORA, Cytoscape,
Orgnet, Polinode, Keyhubs, KeyLines, KXEN, Keynetiq,
Linkurious
igraph
La librera igraph se desarrollo con el objetivo de poder realizar el
analisis de de grandes redes y aprovechar el lenguaje de
progragramacion en el cual estar incrustado con el fin de poner
usarse de forma interactiva.
I igraph es un software que es libre y abierto con licencia GNU
(General Public License)
I igraph esta escrito en ANSI C, lo qeu lo hace portable a varias
plataformas
Lo instalamos desde R con el comando:
if (!require("igraph")) [Link]("igraph")
library("igraph")
Primeros Ejemplos
Creamos un objeto tipo grafo con 7 vertices y arcos especificados
por los siguientes pares.
g<-[Link](1-2, 1-3, 2-3, 2-4, 3-5, 4-5, 4-6,
4-7, 5-6, 6-7)
V(g) #reporta los vrtices
E(g) #reporta los arcos
plot(g)
# alternativamente:
g1 <- graph(edges=c(1,2,2,3,3,1), n=5, directed=F )
gdir<-[Link](1-+2, 3-+2, 3++1)
plot(gdir)
# para aadir los nombres:
V(gdir)$name<-c("Eli", "Mary", "Ariel")
# o directamente
[Link] <- [Link](Eli-+Mary, Ariel-+Mary, Ariel++Eli)
plot([Link])
Algunas funciones basicas
Una vez creado el objeto podemos:
#preguntar
[Link](g)
[Link](g)
[Link](gdir,mode="weak") #con. si direcciones ignoradas
[Link](gdir,mode="strong")#con. por caminos con direcci
#recuperar la matriz de adyacencias
[Link](g)
#extraer subgrficos
h<-[Link](g, 1:5)
#incluir (o excluir) vertices o arcos a los existentes
h<-h+vertices(6:10)
h<-h+edges(c(6,7),c(7,9),c(7,8),c(8,9), c(7,6))
h<-h-vertices(6,10) #elimina tambi'en los arcos incidentes
h<-h-edges(c(7,8))
#obtener vecinos
neighbors(g,5)
Algunas funciones basicas
Una vez creado el objeto podemos:
#es una red dirigida y sin ciclos?
[Link](g) #Nota: la ver. no direc. de una DAG puede tener cicl
#saber si dos redes son isomorfas
g2<-g; V(g2)$names<-sample(1:7)
isomorphic(g, g2)
# diametro
diameter(g)
#indagar sobre los componentes conectados
clusters(g)
#cliques
cliques(g,3)
#sucesin de grados (no ordenados)
degree(g) #y cuando g es dirigida:
degree(gdir,mode="in"); degree(gdir,mode="out")
#calcular el dimetro
diameter(g,weight=NA)
Generando algunos grafos especiales
Deterministas
[Link]<-[Link](6)
[Link]<-[Link](6)
[Link]<-[Link](7,children=2,mode="undirected")
[Link]<-[Link](6,mode="undirected")
par(mfrow=c(2, 2))
plot([Link]); plot([Link]); plot([Link]); plot([Link])
[Link]<-[Link](length=5,dim=2)
plot([Link], layout=[Link]([Link](1:5, 1:5)))
Aleatorios
[Link]<-sample_k_regular(6, 3, directed = FALSE)
[Link]<- [Link](20, 0.3)
[Link]<-sample_pa(20, m = 2, directed=FALSE)
[Link] <- sample_smallworld(1, 20, 3, p=0.05)
par(mfrow=c(2, 2))
plot([Link]); plot([Link]); plot([Link]);
plot([Link])
Posicion absoluta y relativa de vertices: layouts
plot([Link], layout=layout_randomly)#aleat. en cuadro
plot([Link], layout=layout_in_circle) #en circulo
plot([Link], layout=layout_on_sphere) #en esfera
plot([Link], layout=layout_with_fr)#Fruchterman-Reingold
plot([Link], layout=layout_with_kk)
#todas las funciones de posicin disponibles:
layouts <- grep("layout_", ls("package:igraph"),
value=TRUE)[-1]
layouts
Posicion absoluta y relativa de vertices: layouts
Podemos crear nuestro propia funcion de posicion.
Ejemplo
[Link]<-function(g,r,s){
n<-length(V(g))
id<-1:n
angle<-2*pi*(id-1)/n
cbind((1+r*sin(angle*s))*cos(angle),
(1+r*sin(angle*s))*sin(angle))
}
g<-sample_pa(50, m = 2, directed=FALSE)
plot(g,layout=[Link](g,0.2,s=2))
plot(g,layout=[Link](g,0.2,s=4))
plot(g,layout=[Link](g,0.2,s=10))
Embelleciendo las graficas
g<-sample_pa(100, m = 2, directed=FALSE)
plot(g)
E(g)$color <- "grey"
V(g)$color <- "blue"
V(g)$[Link] <- V(g)$color
V(g)$label <- NA
V(g)$size <- 6
E(g)$width <- 1
plot(g)
V(g)$color[seq(1,length(V(g)),by=2)] <-"red"
plot(g)
Embelleciendo las graficas
Alternativamente, los atributos se pueden especificar dentro de la
funcion plot.
gb<-[Link](n=10,power=1)
plot(gb,
layout=[Link],
[Link]=10, # default is 15
[Link]=0.7,# tamao de etiquetas
[Link]=0.9 # tamao de cabezas de fechas
)
Embelleciendo las graficas
# color vertices of the largest component
largest_comp <- function(graph) {
cl <- components(graph)
V(graph)[[Link](cl$csize) == cl$membership]
}
g <- sample_(gnp(100, 2/100),
with_vertex_(size = 3, label = ""),
with_graph_(layout = layout_with_fr)
)
giant_v <- largest_comp(g)
V(g)$color <- "blue"
V(g)[giant_v]$color <- "orange"
V(g)$size[giant_v] <- 7
plot(g)
Graficas interactivas
tkplot(g, [Link] = 700, [Link] = 700,
layout=layout_with_fr)
Importando Redes
De la pagina href[Link] pongo disponible
la base [Link] con la informacion de correos publicada
por the Feeral Energy Regulation Commision durante su
invetigacion. Los nodeos corresponden a direcciones de correos y si
una direccion envio un correo a otra, se consideran conectados por
un arco (no direccionado).
[Link]<-[Link]("[Link]",sep="\t",
skip=3)
dim([Link])
tt<-([Link]([Link])+1)[1:1000,]
enron<-graph_from_edgelist(tt)
plot(enron,
[Link]=6,
[Link]=NA,
[Link]=0.9
)