buid and modify graph
import networkx as nx
graph = nx.Graph()
graph.add_node(1 )
graph.add_nodes_from(range(2 ,4 ))
graph.add_nodes_from(['u' ,'v' ])
graph.nodes()
[1, 2, 3, 'u', 'v']
graph.add_edge(1 ,2 )
graph.add_edge('u' ,'v' )
graph.add_edges_from([(1 ,3 ),(1 ,4 ),(1 ,5 ),(1 ,6 )])
graph.add_edge('u' ,'w' )
graph.edges()
[(1, 2), (1, 3), (1, 4), (1, 5), (1, 6), ('u', 'v'), ('u', 'w')]
graph.nodes()
[1, 2, 3, 4, 'u', 6, 'w', 5, 'v']
graph.remove_node(2 )
graph.nodes()
[1, 3, 4, 'u', 6, 'w', 5, 'v']
graph.edges()
[(1, 3), (1, 4), (1, 5), (1, 6), ('u', 'v'), ('u', 'w')]
graph.remove_nodes_from([4 ,5 ])
graph.nodes()
[1, 3, 'u', 6, 'w', 'v']
graph.edges()
[(1, 3), (1, 6), ('u', 'v'), ('u', 'w')]
graph.remove_edge(1 ,3 )
graph.remove_edges_from([(1 ,2 ),('u' ,'v' )])
graph.number_of_nodes()
6
graph.number_of_edges()
2
visualize graph
g = nx.karate_club_graph()
import matplotlib.pyplot as plt
kw = {'with_labels' :True , 'node_color' :'lightblue' , 'edge_color' :'gray' }
%matplotlib inline
nx.draw(g,**kw)
g.degree()
{0: 16,
1: 9,
2: 10,
3: 6,
4: 3,
5: 4,
6: 4,
7: 4,
8: 5,
9: 2,
10: 3,
11: 1,
12: 2,
13: 5,
14: 2,
15: 2,
16: 2,
17: 2,
18: 2,
19: 3,
20: 2,
21: 2,
22: 2,
23: 5,
24: 3,
25: 3,
26: 2,
27: 4,
28: 3,
29: 4,
30: 4,
31: 6,
32: 12,
33: 17}
g.degree(33 )
17
g.number_of_nodes()
34
g.number_of_edges()
78
random graph ER model
from scipy.stats import bernoulli
bernoulli.rvs(p=0.1 )
0
bernoulli.rvs(p=0.5 )
0
bernoulli.rvs(p=0.5 )
0
bernoulli.rvs(p=0.5 )
1
import itertools
g = nx.Graph()
n_nodes = 20
p = 0.2
g.add_nodes_from(range(n_nodes))
for node1, node2 in itertools.combinations(range(20 ),2 ):
if bernoulli.rvs(p=p):
g.add_edge(node1,node2)
nx.draw(g)
plot the degree distribution
def plot_degree_distribution (g) :
values = list(g.degree().values())
plt.hist(values, histtype='step' , normed=True )
plt.xlabel('degree $k$' )
plt.ylabel('frequency $P(k)$' )
plt.title('degree distribution' )
plot_degree_distribution(g)
def er_graph (n_nodes, p) :
g = nx.Graph()
n_nodes = 20
p = 0.2
g.add_nodes_from(range(n_nodes))
for node1, node2 in itertools.combinations(range(20 ),2 ):
if bernoulli.rvs(p=p):
g.add_edge(node1,node2)
return g
Descriptive Statistics of Empirical Social Networks
import numpy as np
a1 = np.loadtxt('./adj_allVillageRelationships_vilno_1.csv' ,delimiter=',' )
a2 = np.loadtxt('./adj_allVillageRelationships_vilno_2.csv' ,delimiter=',' )
a1.shape, a2.shape
((843, 843), (877, 877))
g1 = nx.to_networkx_graph(a1)
g2 = nx.to_networkx_graph(a2)
def basic_net_stats (g) :
print('number of nodes ' , g.number_of_nodes())
print('number of edges ' , g.number_of_edges())
print('average degree ' , np.mean(list(g.degree().values())))
basic_net_stats(g1)
number of nodes 843
number of edges 3405
average degree 8.07829181495
basic_net_stats(g2)
number of nodes 877
number of edges 3063
average degree 6.98517673888
plot_degree_distribution(g1)
Largest Connected Component
gen = nx.connected_component_subgraphs(g1)
next(gen).number_of_nodes()
825
next(gen).number_of_nodes()
3
next(gen).number_of_nodes()
3
next(gen).number_of_nodes()
4
next(gen).number_of_nodes()
2
next(gen).number_of_nodes()
4
next(gen).number_of_nodes()
1
next(gen).number_of_nodes()
1
next(gen).number_of_nodes()
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-80-992d1a5e6975> in <module>()
----> 1 next(gen).number_of_nodes()
StopIteration:
len(g1) == g1.number_of_nodes()
True
g1_lcc = max(nx.connected_component_subgraphs(g1), key=len)
plt.figure()
nx.draw(g1_lcc, node_color='red' ,edge_color='gray' ,node_size=20 )
g2_lcc = max(nx.connected_component_subgraphs(g2), key=len)
g1_lcc.number_of_nodes(), g2_lcc.number_of_nodes()
(825, 810)
g1_lcc.number_of_nodes()/len(g1), g2_lcc.number_of_nodes()/len(g2)
(0.9786476868327402, 0.9236031927023945)