Final Term 2016 Matricola: 458856 Nome: Giulio Bambini Esame: Analisi delle reti sociali
Sommario Abstract... 3 1.Community discovery... 3 1.1 Modularità di Louvain... 4 1.2 Algoritmo DEMON... 4 1.3 Algoritmo K-clique... 4 2. Tie strength... 5 3. Spreading... 10 2
Abstract Il seguente elaborato si propone di analizzare alcune caratteristiche della rete estratta da Wikipedia. Le proprietà della rete sono già state analizzate durante la prima parte del corso. I task eseguiti sono il Community Discovery, il Tie Strength e lo Spreading. 1. Community discovery 1.1 Modularità di Louvain L algoritmo Louvain definisce un valore compreso tra -1 e 1 per misurare la densità di link intracomunitari. Figura1. La rete reale analizzata secondo diversi parametri di risoluzione With resolution : -1.0 0.5 1 Modularity -0,001 0,450 0,498 Modularity with -0,001 0,189 0,498 resolution Number of 5318 21 11 approximate communities Strongly connected 59 59 59 components Weakly connected components 2 2 2 Tabella1. Statistiche della modularità applicata alla rete reale La rete reale è stata analizzata e filtrata sulla base della modularità e i risultati sono evidenziati nella Tabella1. Ciò ha permesso di distinguere a livello superficiale i principali cluster che rappresentano le comunità approssimative. Sulla base del valore di resolution compreso tra -1 e 1 sono state eseguite tre differenti analisi. Per il valore -1.0 è stata evidenziata un unica componente gigante; per 0.5 sono state trovate 21 comunità, mentre per il valore 1 sono state trovate 11 comunità. 3
Successivamente è stato applicato un filtro Giant Component con Gephi per escludere i nodi singoli e le coppie di nodi che rappresentano comunità isolate dal resto della rete. Ciò ha permesso di evidenziare alcune discrepanze rispetto ai dati della tabella precedente: With resolution : -1.0 0.5 1 Modularity -0,001 0,447 0,498 Modularity with -0,001 0,187 0,498 resolution Number of exact 5317 19 9 communities Strongly connected 57 57 57 components Weakly connected components 2 2 2 Tabella2. Statistiche della modularità applicata alla rete reale con filtro Giant Compnent Nonostante i valori di modularità siano pressoché invariati, il numero delle comunità è diminuito e con esso anche il numero delle componenti connesse. 1.2 Algoritmo DEMON L analisi è stata svolta incrementando il parametro riguardante il numero minimo di nodi presenti in una comunità nel programma DEMON.py. Tale valore è stato incrementato fino ad ottenere una singola comunità. min_size nodes,edges n. communities density/clust. Coeff. 3 5163,17106 9 0,001 6 5148,18969 9 0,001 10 5131,7647 4 0,000 20 5100,6538 5 0,000 30 5069,10856 7 0,000 40 5034,9757 4 0,000 50 5002,8131 5 0,000 100 4834,4854 2 0,000 150 4398,4397 1 0,000 Tabella3. Statistiche sul numero di comunità identificate con DEMON.py Rispetto all applicazione dell algoritmo di Louvain il numero delle comunità generate con DEMON.py risulta insolitamente basso per valori di min_community_size inferiori a 10. Ciò denota una distribuzione pressoché uniforme delle comunità per ogni ordine di grandezza. 1.3 K-clique L analisi è stata svolta utilizzando il comando nx.find_cliques() su network x. I sottografi creati sono stati trattati come indiretti poiché il comando k-clique non permette di analizzare grafi diretti attraverso il comando DiGraph(). k connected components 1 * 4
2 * 3 * 4 342 5 112 6 81 9 1 Tabella4. Statistiche sul numero di comunità identificate con K-clique 2. Tie Strength Per prima cosa è stata effettuata un analisi preliminare per definire le componenti connesse della rete reale. La rete si presenta composta da 1 componente debolmente connessa e da 57 componenti fortemente connesse. Figura2. Distribuzione delle componenti connesse nella rete reale Per analizzare in dettaglio le 57 componenti fortemente connesse sono state utilizzate le seguenti funzioni di NetworkX: nx.number_strongly_connected_components() e nx.number_weakly_connected_components(). Da questa operazione è emerso che l intera rete corrisponde a un unica componente debolmente connessa composta da 5317 nodi. In essa sono state evidenziate poi 57 componenti fortemente connesse, 56 delle quali corrispondono a nodi sparsi fortemente connessi tra loro, ma con legami deboli al di fuori delle loro cerchia. Una delle 57 componenti fortemente connesse rappresenta invece la nostra intera rete (intesa come componente debole) meno i 56 nodi fortemente connessi tra loro ma con legami deboli, per un totale di 5261 nodi. 5
Per facilitare la comprensione della struttura delle componenti è stato utilizzato il comando nx.condensation() per visualizzare l intera rete composta dalle 57 componenti fortemente connesse in maniera schematica. Figura3. Rappresentazione della rete attraverso il comando nx.condensation() I 56 nodi fortemente connessi vanno tutti nella stessa direzione, tranne il nodo con label #55 che è orientato nel senso opposto e che da solo rappresenta l intera rete (sottratti i 56 nodi fortemente connessi con legami deboli). Per cercare di capire come la forza dei legami impatta sulla connettività e la resistenza della rete reale, è stata definita la forza dei legami per ciascun arco all interno della componente fortemente connessa, escludendo i 56 nodi isolati. Successivamente è stata messa a confronto la stessa rete reale in due ambienti di lavoro separati. Nel primo ambiente sono stati rimossi dalla rete i legami più deboli, nel secondo ambiente sono stati rimossi i legami più forti. Per la stima della forza dei legami è stata utilizzata la seguente formula: number of nodes who are neighbors of both A and B number of nodes who are neighbors of at least one of A or B Il seguente codice in python assegna la forza a ciascun legame, rimuove rispettivamente i 10 legami più deboli esportando il grafo attraverso il comando nx.write_graphml(gn, 'remove_weak.graphml'), e i 10 legami più forti attraverso il comando nx.write_graphml(gn, 'remove_strong.graphml'). Sono stati ignorati alcuni archi con forza del legame >= a 0.99 perché gli archi con forza compresa tra 0.99 e 1.0 è probabile che siano connessi con loro stessi da self loop. def edges_tie_weight(dict_edges): dict_tie_strength = {} dict_values = {} for first_node, first_list in dict_edges.iteritems(): for second_node in first_list: second_list = dict_edges[second_node] numerator = list(set(first_list) & set(second_list)) 6
denominator = list(set(first_list) set(second_list) - set([first_node, second_node])) value = float(len(numerator)) / len(denominator) if value < 0.99: key = (first_node, second_node) dict_tie_strength[key] = value dict_values.setdefault(value,[]).append(key) dict_result = {} dict_result['dict_tie_strength'] = dict_tie_strength dict_result['dict_values'] = dict_values return dict_result def remove_edge(dict_edges, tpl_key): lst_values = dict_edges[tpl_key[0]] lst_values.remove(tpl_key[1]) dict_edges = nx.to_dict_of_lists(gs) tie_weight = edges_tie_weight(dict_edges) tw_values = tie_weight['dict_values'] tw_keys = tie_weight['dict_tie_strength'] val_weakest = min(tw_keys.values()) lst_weakest = tw_values[val_weakest] #remove 10 weakest edges removed = [] i = 0 for tpl_key in lst_weakest: if not (tpl_key[0] in removed) and not (tpl_key[1] in removed): remove_edge(dict_edges, tpl_key) removed.append(tpl_key[0]) removed.append(tpl_key[1]) i += 1 if i == 10: break Gn = nx.from_dict_of_lists(dict_edges, nx.digraph()) nx.write_graphml(gn, 'remove_weak.graphml') val_strongest = max(tw_keys.values()) lst_strongest= tw_values[val_strongest] #remove 10 strongest edges removed = [] i = 0 for tpl_key in lst_strongest: if not (tpl_key[0] in removed) and not (tpl_key[1] in removed): remove_edge(dict_edges, tpl_key) removed.append(tpl_key[0]) removed.append(tpl_key[1]) i += 1 if i == 10: break Gn = nx.from_dict_of_lists(dict_edges, nx.digraph()) nx.write_graphml(gn, 'remove_strong.graphml') Per verificare la resistenza della rete sono stati rimossi di volta in volta sempre più legami, da una parte per la rete a cui vengono tolti i legami più forti, dall altra per la rete a cui vengono tolti i legami più deboli. Le statistiche ci mostrano che per 10 legami rimossi rispettivamente da entrambe le parti, la struttura di entrambe le reti rimane stabile ed invariata: 7
Statistiche Crawled network (G) Strongly connected graph (Gs) Gs with eliminated 10 weakest ties Gs with eliminated 10 strongest ties Diameter 9 9 9 9 Radius 0 5 5 5 Avg. path length 3.5295905 3.5271369 3.5272129 3.5271373 (Gephy) Avg. shortest path 3.4924229 3.5271369 3.5272088 3.5271373 length (Networkx) Avg. degree 48.858 49.058 49.055 49.055 Avg. weighted 24.429 24.529 24.527 24.527 degree Density 0.005 0.005 0.005 0.005 Modularity 0.495 0.496 0.498 0.491 Number of 9 10 10 10 communities Avg. clastering 0.193 0.193 0.193 0.193 coefficient Measurement of resilience 0 1 1 1 Tabella5. Statistiche del confronto in seguito alla rimozione di 10 legami deboli e 10 legami forti Per approfondire maggiormente l esperimento è stato portato avanti il processo iterativo di rimozione di 10 legami deboli e 10 legami forti con lo scopo di testare eventuali comportamenti insoliti da parte delle due reti. Come previsto, alla terza iterazione aggiuntiva, la rete da cui sono stati rimossi i legami deboli si è trasformata in due componenti con un legame. Con il comando condensation è stato rappresentato il grafo da cui sono stati rimossi i legami deboli: esso non è più una componente unica. Figura4. Rappresentazione del grafo con legami deboli rimossi Le statistiche nella tabella sottostante ci mostrano i dati per quattro iterazioni: 8
Statistic Gw iteration 2 Gs iteration 2 Gw iteration 3 Gs iteration 3 Gw iteration 4 Gs iteration 4 Diameter 9 9 9 9 9 9 Radius 5 5 5 5 5 5 Avg. path length (Gephy) 3.5272823 3.5273270 3.5273999 3.5273999 3.5272971 3.5272971 Avg. shortest path length (Networkx) 3.5272823 3.5271376 3.5273999 3.5271380 3.5266266 3.5271383 Avg. degree 49.051 49.049 49.047 49.047 49.043 49.043 Avg. weighted degree 24.525 24.525 24.523 24.523 24.522 24.522 Density 0.005 0.005 0.005 0.005 0.005 0.005 Modularity 0.495 0.497 0.493 0.498 0.498 0.487 Number of 8 9 9 8 10 7 communities Avg. clastering coefficient 0.193 0.193 0.193 0.193 0.193 0.193 Measurement of resilience 1 1 1 1 0 1 Tabella6. Statistiche del confronto delle iterazioni per 10 legami deboli e 10 legami forti In conclusione, osservando il comportamento delle due reti, possiamo intuire come i legami più deboli siano più importanti per la connettività rispetto ai legami più forti. Questa considerazione viene fatta a seguito dell osservazione della variazione della lunghezza media degli shortest path. Difatti, come possiamo vedere in Figura5 e Figura6, rimuovere legami forti ha un minimo impatto sulla lunghezza media dei percorsi minimi mentre si dimostra il contrario nel caso della rimozione di legami deboli, per la quale si registra un aumento notevole di average shortest path lenght. 12 10 8 6 4 weak strong 2 0 0 1 2 3 4 Figura5. Distribuzione di average shortest path length per Gw. 9
0,5 0,498 0,496 0,494 0,492 0,49 0,488 0,486 0,484 0,482 0,48 0 1 2 3 4 weakn strongn Figura6. Distribuzione di average shortest path length per Gs. Una successiva conclusione interessante consiste nel fatto che alla rimozione di legami forti la modularità e il numero delle comunità tende a decrescere. Riguardo alla resistenza della rete possiamo concludere che la rimozione di soli 10 legami non è sufficiente a vedere cambiamenti netti all interno della rete. 3. Spreading Per svolgere il seguente task sono stati simulati tre processi di diffusione SIR rispettivamente sulla rete reale e le due reti sintetiche generate secondo il Barabasi Albert Model e l Erdos Renyi Model. I risultati ottenuti sono stati successivamente messi a confronto. Simulando il processo di diffusione SIR si nota che quando il numero di nodi infetti è basso, il virus si diffonde liberamente e che il numero dei nodi infetti aumenta esponenzialmente. Questa è una caratteristica comune anche nei modelli di diffusione SI e SIS. Tuttavia, a differenza dei modelli SI e SIS, in SIR tutti i nodi infettati non sono più infettabili, il che presuppone che siano immuni o morti. Con il parametro R0 < 1 il virus persiste all interno della rete, per R0 = 1 viene individuata la soglia di massimo contagio, mentre per R0 > 1 il virus muore naturalmente. Questo modello è sicuramente più completo rispetto ai modelli SI e SIS proprio per le seguenti ragioni: - non ignora il fatto che un nodo (nel caso specifico una pagina di Wikipedia) possa entrare in contatto solo con un gruppo di nodi a lui vicini nella rete. -considera il fatto che il nodo una volta contagiato possa guarire/morire/ diventare immune. Per simulare il processo SIR sulle tre reti è stato usato Nepidemix con python. Di seguito i parametri utilizzati per le tre reti: 10
Infection rate = 0.09; Recovery rate = 0.04; Initial state S = 95%; Initial state I = 5%; Initial state R = 0%. Il risultato della simulazione con Nepidemix ha prodotto il seguente output in csv illustrato in Figura7: Figura7. Risultati della simulazione della durata di 150 secondi. I risultati completi della simulazione sono stati riportati nel grafico sottostante illustrato in Figura8: 6000 5000 CN_I 4000 3000 2000 1000 CN_S CN_R BA_I BA_S BA_R ER_I ER_S ER_R 0 Time 4,8 9,7 14,6 19,5 24,4 29,3 34,2 39,1 44,0 48,9 53,8 58,7 63,6 68,5 73,4 78,3 83,2 88,1 93,0 97,9 102,8 107,7 112,6 117,5 122,4 127,3 132,2 137,1 142,0 146,9 Figura8. Grafico della distribuzione dei valori per le 3 reti durante l esperimento. 11
Il processo di infezione per tutte e tre le reti ha una distribuzione con curva di Poisson non pura. La probabilità che un nodo infetto non trasmetta il virus ai nodi vicini suscettibili decresce esponenzialmente in base al tempo. Osservando i risultati della tabella possiamo concludere che il virus si diffonde più rapidamente nelle reti sintetiche, in particolare nella rete casuale basata sul modello di Erdos Renyi. Essa infatti presenta un picco di nodi infetti il cui numero ammonta al doppio dei nodi contagiati per la rete reale. Nella rete reale, invece, la crescita esponenziale non è particolarmente spiccata perché è prevista l immunizzazione. Nel complesso le reti sintetiche risultano più simili nel numero di nodi guariti, la cui crescita è giustificata anche dal numero più elevato di nodi che sono stati precedentemente infettati. Ciò potrebbe essere spiegato anche dal fatto che le reti sintetiche hanno entrambe densità 0.7 (rispetto allo 0.2 della rete reale) e quindi si tratta di due reti fortemente connesse. 12