2. Εισαγωγή στην βιβλιοθήκη igraph Βασίλης Καραγιάννης Χρόνης Μωϋσιάδης Παράδειγμα: 4 φίλοι από τα φοιτητικά χρόνια (70-ρηδες τώρα) που βρέθηκαν τυχαία μέσα από το facebook, αποφασίζουν να βαθμολογήσουν ο ένας τον άλλο στην ερώτηση «ποιος μ έκανε να γελώ συχνότερα», με βαθμούς: 1=καθόλου, ως, 5=πάρα πολύ. Αφού απάντησαν στη συνέχεια συμφώνησαν να δεχθούν ως θετική κάθε απάντηση πάνω από 2, οπότε δημιούργησαν τις επόμενες λίστες: Τι συμπεράσματα βγάζετε για την παρέα; 20/10/2015015 igraph-intro- Καραγιάννης-Μωυσιάδης 2
Τι συμπεράσματα βγάζετε για την παρέα από την εικόνα; 3 Κορυφές (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 4
Κατηγορίες δικτύων ως προς τον τρόπο κατασκευής τους: α) Σταθμισμένο δίκτυο (weighted): οι σχέσεις περιγράφονται με έναν συντελεστή βαρύτητας. b) Δίκτυο χωρίς βάρη (binary) δυαδικό δίκτυο ή 0-1 δίκτυο. c) Δυαδικό δίκτυο που προκύπτει από τον καθορισμό ενός κατωφλίου (μια ακμή υπάρχει αν το βάρος είναι μεγαλύτερο του 1). d) Ίδια περίπτωση με την προηγούμενη για βάρος μεγαλύτερο του 2. Κατευθυνόμενο -directed (όταν πχ αναπαριστά τη σχέση «απευθύνομαι σ αυτόν/ην για συμβουλή»)ή μη κατευθυνόμενο non-directed(όταν πχ αναπαριστά τη σχέση «o A είναι φίλος με τον Β»). 5 Στο script του εργαστηρίου αλλά και στη σελίδα του μαθήματος θα βρείτε αρκετές εντολές για τη δημιουργία δικτύων. Εδώ θα παρουσιαστούν αυτές που χρησιμοποιούμε συχνότερα. Δημιουργία directed graph από τη λίστα συνδέσεων (edge list) enl <- cbind( c(1, 1, 2, 3), c(2, 3, 3, 5)) gnn <- graph.edgelist(enl, directed=true) ## δημιουργία της λίστας ## to γράφημα από τη λίστα 6
Δημιουργία της εικόνας του γραφήματος (με βέλτιστο αυτόματο τρόπο που σχεδόν πάντα δίνει κάτι διαφορετικό) plot(gnn) 7 Δημιουργία udirected graph από τη λίστα συνδέσεων (edge list) enlu <- cbind( c(1, 1, 2, 3), c(2, 3, 3, 5)) ## δημιουργία της λίστας gnnu <- graph.edgelist(enlu, directed=false) ## to γράφημα από τη λίστα 8
Δημιουργία της εικόνας του γραφήματος plot(gnnu) 9 Ο πίνακας συνδέσεων (adjacency matrix) του κατευθυνόμενου adjgnn <- get.adjacency(gnn) 10
Ο πίνακας συνδέσεων (adjacency matrix) του μη κατευθυνόμενου adjgnnu <- get.adjacency(gnnu) 11 Δημιουργία του δικτύου από τον πίνακα συνδέσεων (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 ) 12
Η λίστα συνδέσεων-γειτόνων (adjacency list) του μη κατευθυνόμενου adjlgnnu <- get.adjlist(gnnu) 13 Η λίστα συνδέσεων (adjacency list) του κατευθυνόμενου get.adjlist(gnn, mode = "out") ---- get.adjlist(gnn, mode = "in") 14
Αλλαγή της εικόνας του δικτύου, εισαγωγή χαρακτηριστικών (attributes) tkplot(gfrommatn) 15 Πριν κλείσουμε το παράθυρο σώζουμε τις νέες συντεταγμένες και τις δίνουμε ως ιδιότητες των κορυφών (για τις ακμές το V αντικαθίσταται με το E): V(δίκτυο)$ χαρακτηριστικό <- τιμή χαρακτηριστικού Γράφοντας «όνομα δικτύου» και τρέχοντάς το σαν εντολή παίρνουμε το είδος του δικτύου και τα χαρακτηριστικά του. 16
## There are much more attributes. ## Use command ## remove.vertex.attribute ## to remove some attribute ## run?set.graph.attribute 17 Δημιουργία δικτύου δεσμών (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 18
Το αποτέλεσμα: IGRAPH DN-B 6 5 -- + attr: name (v/c), type (v/x) Διαφορετικό χρώμα σε κάθε ένα από τα δυο σύνολα κορυφών: V(gBip)[V(gBip)$type==FALSE]$color="aliceblue" V(gBip)[V(gBip)$type==TRUE]$color="coral1" ## Person ## Event 19 tkplot(gbip) ## διαμόρφωση συντεταγμένων coordgbip <- tkplot.getcoords(2, norm = FALSE) ## 2: id of tkplot window Τη δεύτερη την τρέχουμε αφού διορθώσουμε τις συντεταγμένες 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() ## τερματισμός (πρέπει να γίνεται πάντα) 23 Ένας συνηθισμένος τρόπος να εργαζόμαστε με διμερές είναι να το προβάλουμε στο ένα από τα δυο σύνολα κορυφών (στα πρόσωπα -persons), one-mode projection (οι πολλαπλές ακμές μετατρέπονται σε βάρη των ακμών). adjb <- get.adjacency(gbip) matb <-as.matrix(adjb) matb ## με χρήση του πίνακα συνδέσεων ## αλλαγή σε τυπικό πίνακα 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) 25 ## From graph to data frame dfgbio <- get.data.frame(gbip, "both") dfgbio Μετατρέπουμε το δίκτυο σε data frame (λογιστικό φύλλο), από το οποίο παίρνουμε πληροφορίες ή αλλάζουμε στοιχεία ή το επεξεργαζόμαστε στατιστικά. 26
3. Πρώτα βήματα για τη διαχείριση και την περιγραφή ενός κοινωνικού δικτύου Υποσύνολο δικτύου 3.1 Τα κοινωνικά δίκτυα Τα κοινωνικά δίκτυα διαπερνούν την κοινωνική και οικονομική μας ζωή. Διαδραματίζουν κεντρικό ρόλο στη μετάδοση των πληροφοριών σχετικά με τις ευκαιρίες απασχόλησης, και είναι ζωτικής σημασίας για το εμπόριο πολλών αγαθών και υπηρεσιών. Αποτελούν τη βάση της εφαρμογής της αμοιβαίας ασφάλισης στις αναπτυσσόμενες χώρες. Τα κοινωνικά δίκτυα είναι επίσης σημαντικά για τον καθορισμό του τρόπου εξάπλωση ασθενειών, τα προϊόντα που αγοράζουμε, ποιες γλώσσες μιλάμε, πώς ψηφίζουμε, πόση εκπαίδευση αποκτούμε, την πιθανότητα επιτυχίας επαγγελματικά καθώς και κατά πόσο ή όχι αποφασίζουν κάποιοι να γίνουν εγκληματίες. Social and Economic Networks, Samuel Jackson 2008. 28
3.2 Το παράδειγμα των Μεδίκων Η οικογένεια των Μεδίκων έχει χαρακτηρισθεί ως μια οικογένεια νονών της Αναγέννησης. Αν και στην ολιγαρχία που κυβερνούσε τη Φλωρεντία στις αρχές του 15 ου αιώνα υπήρχαν πλουσιότερες και ισχυρότερες οικογένειες, ο Cosimo de Medici κατάφερε, να την κάνει την ισχυρότερη με τεράστια πολιτική και Οικονομική Δύναμη. Που οφείλεται αυτό; Οι Padgett και Ansell (1993) παρέχουν ισχυρά στοιχεία για το σκοπό αυτό από την τεκμηρίωση του δικτύου των γάμων μεταξύ βασικών οικογενειών στη Φλωρεντία της εποχής εκείνης. 29 3.2 Το παράδειγμα των Μεδίκων Εισαγωγή του αρχείου με τον πίνακα συνδέσεων που βρίσκεται στο φάκελο του project που εργαζόμαστε: t1<-read.table("florentine Family Marriage Ties E.txt ", header = TRUE) Δημιουργία του γραφήματος από το προηγούμενο αρχείο : floge<- graph.data.frame(t1, dir=false) floge ## undirected graph 30
3.2 Το παράδειγμα των Μεδίκων vcount(floge) ecount(floge) V(flogE) E(flogE) is.simple(floge) ## πλήθος κορυφών (order) ## πλήθος ακμών (size) ## διάνυσμα κορυφών (nodes - vertices) ## διάνυσμα ακμών (edges - links) ## σε περίπτωση που υπάρχουν λούπες ή ## πολλαπλές ακμές (loops or multiple edges) 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 3.2 Το παράδειγμα των Μεδίκων CflogE<-clusters(flogE) ## οι συνιστώσες του δικτύου (components) ## όταν αυτό δεν είναι συνδετικό CflogE ## το αποτέλεσμα είναι μια λίστα (list) 32
3.2 Το παράδειγμα των Μεδίκων N Πυκνότητα : E (πυκνό δίκτυο αν είναι >0.25) 2 graph.density(floge) Συνδετικός (ελάχιστο πλήθος κορυφών που πρέπει να αφαιρεθούν ώστε να γίνει μη συνδετικό) και γραμμοσυνδετικός αριθμός (ελάχιστο πλήθος ακμών που πρέπει να αφαιρεθούν ώστε να γίνει μη συνδετικό) vertex.connectivity(floge) edge.connectivity(floge) ## vertex connectivity number ## edge connectivity number 33 3.2 Το παράδειγμα των Μεδίκων 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 flogelay <- layout.fruchterman.reingold(floge) ## βρίσκουμε συντεταγμένες V(flogE)$coord1 <- flogelay [,1] ## τις δίνουμε ως χαρακτηριστικό V(flogE)$coord2 <- flogelay [,2] flogec <- cbind(v(floge)$coord1, V(flogE)$coord2) ## πίνακας 34
3.2 Το παράδειγμα των Μεδίκων Εικόνα του δικτύου plot(floge, layout = flogelay, vertex.frame.color = "white", vertex.label.cex=1.11 ) 35 3.2 Το παράδειγμα των Μεδίκων deg <- degree(floge) Deg ## ακολουθία των βαθμών neimedici<-v(floge)[ nei("medici")] neimedici ## οι γείτονες των Μεδίκων 36
3.2 Το παράδειγμα των Μεδίκων neimsubg <- induced.subgraph(floge, ## είναι οι γείτονες neimedici, impl="copy_and_delete") ## συνδεδεμένοι μεταξύ τους; plot(neimsubg, layout = cbind(v(neimsubg)$coord1, V(neiMsubg)$coord2)) Κυριαρχία της οικογένειας induced.subgraph : υπογράφημα του αρχικού, Υποσύνολο του αρχικού δικτύου 37 3.2 Το παράδειγμα των Μεδίκων Περισσότερες εντολές επεξεργασίας του δικτύου στο script του εργαστηρίου. 38
Άσκηση Δίνεται το δίκτυο γνωριμίας μεταξύ 20 εργαζομένων μιας εταιρίας. 1. Εισάγετε στην R το δίκτυο της εικόνας δεξιά (με λίστα συνδέσεων ή πίνακα συνδέσεων από αρχείο txt). 2. Χρησιμοποιήστε τις συναρτήσεις των διαφανειών 31 ως 34 για να κάνετε μια περιγραφή του δικτύου. 3. Δώστε ως ιδιότητες τα χρώματα ανά κορυφή όπως τα βλέπετε (περίπου), καθώς και τις συντεταγμένες ώστε κατά την αναπαράσταση να έχει περίπου την ίδια εικόνα. Στο επόμενο εργαστήριο να έχετε σε script τις κατάλληλες εντολές ώστε να τις τρέξουμε και να τις σχολιάσετε 39