2. Εισαγωγή στην βιβλιοθήκη igraph Παράδειγμα: 4 φίλοι από τα φοιτητικά χρόνια (70-ρηδες τώρα) που βρέθηκαν τυχαία μέσα από το facebook, αποφασίζουν να βαθμολογήσουν ο ένας τον άλλο στην ερώτηση «ποιος μ έκανε να γελώ συχνότερα», με βαθμούς: 1=καθόλου, ως, 5=πάρα πολύ. Αφού απάντησαν στη συνέχεια συμφώνησαν να δεχθούν ως θετική κάθε απάντηση πάνω από 2, οπότε δημιούργησαν τις επόμενες λίστες: Βασίλης Καραγιάννης Χρόνης Μωϋσιάδης Τι συμπεράσματα βγάζετε για την παρέα; 20/10/2015015 igraph-intro- Καραγιάννης-Μωυσιάδης 2 Τι συμπεράσματα βγάζετε για την παρέα από την εικόνα; Κορυφές (nodes) Ακμές (links arrows) Βάρος (weight) A (A,B) 5 B (A,C) 3 C (B,C) 4 D (C,B) 3 (D,A) 3 (D,B) 4 3 4 Κατηγορίες δικτύων ως προς τον τρόπο κατασκευής τους: α) Σταθμισμένο δίκτυο (weighted): οι σχέσεις περιγράφονται με έναν συντελεστή βαρύτητας. b) Δίκτυο χωρίς βάρη (binary) δυαδικό δίκτυο ή 0-1 δίκτυο. c) Δυαδικό δίκτυο που προκύπτει από τον καθορισμό ενός κατωφλίου (μια ακμή υπάρχει αν το βάρος είναι μεγαλύτερο του 1). d) Ίδια περίπτωση με την προηγούμενη για βάρος μεγαλύτερο του 2. Κατευθυνόμενο -directed (όταν πχ αναπαριστά τη σχέση «απευθύνομαι σ αυτόν/ην για συμβουλή»)ή μη κατευθυνόμενο non-directed(όταν πχ αναπαριστά τη σχέση «o A είναι φίλος με τον Β»). Στο script του εργαστηρίου αλλά και στη σελίδα του μαθήματος θα βρείτε αρκετές εντολές για τη δημιουργία δικτύων. Εδώ θα παρουσιαστούν αυτές που χρησιμοποιούμε συχνότερα. Δημιουργία directed graph από τη λίστα συνδέσεων (edge list) enl <- cbind( c(1, 1, 2, 3), c(2, 3, 3, 5)) gnn <- graph.edgelist(enl, directed=true) ## δημιουργία της λίστας ## to γράφημα από τη λίστα 5 6
Δημιουργία της εικόνας του γραφήματος (με βέλτιστο αυτόματο τρόπο που σχεδόν πάντα δίνει κάτι διαφορετικό) plot(gnn) Δημιουργία udirected graph από τη λίστα συνδέσεων (edge list) enlu <- cbind( c(1, 1, 2, 3), c(2, 3, 3, 5)) ## δημιουργία της λίστας gnnu <- graph.edgelist(enlu, directed=false) ## to γράφημα από τη λίστα 7 8 Δημιουργία της εικόνας του γραφήματος plot(gnnu) Ο πίνακας συνδέσεων (adjacency matrix) του κατευθυνόμενου adjgnn <- get.adjacency(gnn) 9 10 Ο πίνακας συνδέσεων (adjacency matrix) του μη κατευθυνόμενου adjgnnu <- get.adjacency(gnnu) Δημιουργία του δικτύου από τον πίνακα συνδέσεων (adjacency matrix) gfrommatn <- graph.adjacency(adjgnnu, mode="undirected", weighted=null, diag=true, add.colnames=null, add.rownames=na) plot(gfrommatn) Είναι δίκτυο στην igraph? class(gfrommatn ) is.igraph(gfrommatn ) 11 12
Η λίστα συνδέσεων-γειτόνων (adjacency list) του μη κατευθυνόμενου adjlgnnu <- get.adjlist(gnnu) Η λίστα συνδέσεων (adjacency list) του κατευθυνόμενου get.adjlist(gnn, mode = "out") ---- get.adjlist(gnn, mode = "in") 13 14 Αλλαγή της εικόνας του δικτύου, εισαγωγή χαρακτηριστικών (attributes) tkplot(gfrommatn) Πριν κλείσουμε το παράθυρο σώζουμε τις νέες συντεταγμένες και τις δίνουμε ως ιδιότητες των κορυφών (για τις ακμές το V αντικαθίσταται με το E): V(δίκτυο)$ χαρακτηριστικό <- τιμή χαρακτηριστικού 15 Γράφοντας «όνομα δικτύου» και τρέχοντάς το σαν εντολή παίρνουμε το είδος του δικτύου και τα χαρακτηριστικά του. 16 ## There are much more attributes. ## Use command ## remove.vertex.attribute ## to remove some attribute ## run?set.graph.attribute Δημιουργία δικτύου δεσμών (affiliation network) από αρχείο text και η αναπαράστασή του με ένα διμερές γράφημα (bipartite graph or two-mode network): edgelistb <- read.table(text="person Event ## το αρχείο text και η εντολή header=true) gbip <- graph.data.frame(edgelistb, dir=true) Amy football ## που το διαβάζει Bob picnic Sam artshow Amy picnic Bob football", ## η εντολή που δημιουργεί ## ένα αντικείμενο graph V(gBip)$type <- V(gBip)$name %in% edgelistb[,1] ## η εντολή που το ## δημιουργεί διαμέριση gbip 17 18
Το αποτέλεσμα: IGRAPH DN-B 6 5 -- + attr: name (v/c), type (v/x) tkplot(gbip) ## διαμόρφωση συντεταγμένων coordgbip <- tkplot.getcoords(2, norm = FALSE) ## 2: id of tkplot window Τη δεύτερη την τρέχουμε αφού διορθώσουμε τις συντεταγμένες Διαφορετικό χρώμα σε κάθε ένα από τα δυο σύνολα κορυφών: V(gBip)[V(gBip)$type==FALSE]$color="aliceblue" V(gBip)[V(gBip)$type==TRUE]$color="coral1" ## Person ## Event 19 20 Διαμόρφωση της εικόνας του διμερούς δικτύου: Το αποτέλεσμα: plot(gbip, layout=coordgbip, ## συντεταγμένες edge.color="darkgray", ## χρώμα ακμών edge.width=1.5, ## πάχος ακμών vertex.shape="circle", ## σχήμα κορυφών vertex.frame.color= "white", ## χρώμα περιφέρειας κορυφών vertex.size=15, ## μέγεθος κορυφών vertex.label=v(gbip)$name, ## ετικέτες κορυφών vertex.label.font=2, ## γραμματοσειρά ετικετών vertex.label.dist=0) ## θέση ετικέτας 21 22 Για να το σώσουμε σε μορφή pdf: pdf("firstbipartite.pdf") ## δημιουργία pdf plot(gbip, layout=coordgbip, edge.color="darkgray", edge.width=1.5, vertex.shape="circle", vertex.frame.color= "white", vertex.size=15, vertex.label=v(gbip)$name, vertex.label.font=2, vertex.label.dist=0) dev.off() ## τερματισμός (πρέπει να γίνεται πάντα) Ένας συνηθισμένος τρόπος να εργαζόμαστε με διμερές είναι να το προβάλουμε στο ένα από τα δυο σύνολα κορυφών (στα πρόσωπα -persons), one-mode projection (οι πολλαπλές ακμές μετατρέπονται σε βάρη των ακμών). adjb <- get.adjacency(gbip) matb <-as.matrix(adjb) matb ## με χρήση του πίνακα συνδέσεων ## αλλαγή σε τυπικό πίνακα 23 24
Από τον πίνακα αντιστοιχιών μεταξύ των δυο συνόλων στο γράφημα των σχέσεων μεταξύ των προσώπων: foromode <- matb[c(1,2,3), c(4,5,6)] ## επιλογή των στοιχείων personnet <- foromode %*% t(foromode) ## πίνακας συνδέσεων personnetw <- graph.adjacency(personnet, ## γράφημα από τον πίνακα mode="directed", weighted=true, diag=false, add.colnames = NULL) personnetw ### αποτέλεσμα IGRAPH DNW- 3 2 -- + attr: name (v/c), weight (e/n) ## From graph to data frame dfgbio <- get.data.frame(gbip, "both") dfgbio Μετατρέπουμε το δίκτυο σε data frame (λογιστικό φύλλο), από το οποίο παίρνουμε πληροφορίες ή αλλάζουμε στοιχεία ή το επεξεργαζόμαστε στατιστικά. 25 26 3. Πρώτα βήματα για τη διαχείριση και την περιγραφή ενός κοινωνικού δικτύου Υποσύνολο δικτύου 3.1 Τα κοινωνικά δίκτυα Τα κοινωνικά δίκτυα διαπερνούν την κοινωνική και οικονομική μας ζωή. Διαδραματίζουν κεντρικό ρόλο στη μετάδοση των πληροφοριών σχετικά με τις ευκαιρίες απασχόλησης, και είναι ζωτικής σημασίας για το εμπόριο πολλών αγαθών και υπηρεσιών. Αποτελούν τη βάση της εφαρμογής της αμοιβαίας ασφάλισης στις αναπτυσσόμενες χώρες. Τα κοινωνικά δίκτυα είναι επίσης σημαντικά για τον καθορισμό του τρόπου εξάπλωση ασθενειών, τα προϊόντα που αγοράζουμε, ποιες γλώσσες μιλάμε, πώς ψηφίζουμε, πόση εκπαίδευση αποκτούμε, την πιθανότητα επιτυχίας επαγγελματικά καθώς και κατά πόσο ή όχι αποφασίζουν κάποιοι να γίνουν εγκληματίες. Social and Economic Networks, Samuel Jackson 2008. 28 Η οικογένεια των Μεδίκων έχει χαρακτηρισθεί ως μια οικογένεια νονών της Αναγέννησης. Αν και στην ολιγαρχία που κυβερνούσε τη Φλωρεντία στις αρχές του 15 ου αιώνα υπήρχαν πλουσιότερες και ισχυρότερες οικογένειες, ο Cosimo de Medici κατάφερε, να την κάνει την ισχυρότερη με τεράστια πολιτική και Οικονομική Δύναμη. Που οφείλεται αυτό; Οι Padgett και Ansell (1993) παρέχουν ισχυρά στοιχεία για το σκοπό αυτό από την τεκμηρίωση του δικτύου των γάμων μεταξύ βασικών οικογενειών στη Φλωρεντία της εποχής εκείνης. Εισαγωγή του αρχείου με τον πίνακα συνδέσεων που βρίσκεται στο φάκελο του project που εργαζόμαστε: t1<-read.table("florentine Family Marriage Ties E.txt ", header = TRUE) Δημιουργία του γραφήματος από το προηγούμενο αρχείο : floge<- graph.data.frame(t1, dir=false) floge ## undirected graph 29 30
vcount(floge) ecount(floge) V(flogE) E(flogE) is.simple(floge) ## πλήθος κορυφών (order) ## πλήθος ακμών (size) ## διάνυσμα κορυφών (nodes - vertices) ## διάνυσμα ακμών (edges - links) ## σε περίπτωση που υπάρχουν λούπες ή ## πολλαπλές ακμές (loops or multiple edges) CflogE<-clusters(flogE) CflogE ## οι συνιστώσες του δικτύου (components) ## όταν αυτό δεν είναι συνδετικό ## το αποτέλεσμα είναι μια λίστα (list) LflogE <- is.loop(floge, eids=e(floge)) ## για να βρεθούν οι λούπες which(lfloge == TRUE) MflogE <- is.multiple(floge, eids=e(floge)) ## και οι πολλαπλές ακμές which(mfloge == TRUE) is.connected(floge) ## είναι συνδετικό (connected or disconnected) 31 32 N Πυκνότητα : E (πυκνό δίκτυο αν είναι >0.25) 2 graph.density(floge) ApflogE <- articulation.points(floge) Cvertex <- V(flogE)[ApflogE] V(flogE)$color <- "aliceblue" V(flogE)[Cvertex]$color <- "yellow" ## κορυφές τομές (cut vertices) ## ποιοι είναι? ## χρωματίζουμε τους κόμβους ## στις κορυφές τομές δίνουμε άλλο ## χρώμα Συνδετικός (ελάχιστο πλήθος κορυφών που πρέπει να αφαιρεθούν ώστε να γίνει μη συνδετικό) και γραμμοσυνδετικός αριθμός (ελάχιστο πλήθος ακμών που πρέπει να αφαιρεθούν ώστε να γίνει μη συνδετικό) Pvertex <- V(flogE)[degree(flogE)==1] ## περιφερειακοί κόμβοι(βαθμού 1) V(flogE)[Pvertex]$color <- "cyan" ## με διαφορετικό χρώμα V(flogE)$color vertex.connectivity(floge) edge.connectivity(floge) ## vertex connectivity number ## edge connectivity number flogelay <- layout.fruchterman.reingold(floge) ## βρίσκουμε συντεταγμένες V(flogE)$coord1 <- flogelay [,1] ## τις δίνουμε ως χαρακτηριστικό V(flogE)$coord2 <- flogelay [,2] flogec <- cbind(v(floge)$coord1, V(flogE)$coord2) ## πίνακας 33 34 deg <- degree(floge) Deg ## ακολουθία των βαθμών Εικόνα του δικτύου plot(floge, layout = flogelay, vertex.frame.color = "white", vertex.label.cex=1.11 ) neimedici<-v(floge)[ nei("medici")] neimedici ## οι γείτονες των Μεδίκων 35 36
neimsubg <- induced.subgraph(floge, ## είναι οι γείτονες neimedici, impl="copy_and_delete") ## συνδεδεμένοι μεταξύ τους; plot(neimsubg, layout = cbind(v(neimsubg)$coord1, V(neiMsubg)$coord2)) Περισσότερες εντολές επεξεργασίας του δικτύου στο script του εργαστηρίου. Κυριαρχία της οικογένειας induced.subgraph : υπογράφημα του αρχικού, Υποσύνολο του αρχικού δικτύου 37 38 Άσκηση Δίνεται το δίκτυο γνωριμίας μεταξύ 20 εργαζομένων μιας εταιρίας. 1. Εισάγετε στην R το δίκτυο της εικόνας δεξιά (με λίστα συνδέσεων ή πίνακα συνδέσεων από αρχείο txt). 2. Χρησιμοποιήστε τις συναρτήσεις των διαφανειών 31 ως 34 για να κάνετε μια περιγραφή του δικτύου. 3. Δώστε ως ιδιότητες τα χρώματα ανά κορυφή όπως τα βλέπετε (περίπου), καθώς και τις συντεταγμένες ώστε κατά την αναπαράσταση να έχει περίπου την ίδια εικόνα. Στο επόμενο εργαστήριο να έχετε σε script τις κατάλληλες εντολές ώστε να τις τρέξουμε και να τις σχολιάσετε 39