作为计算社会科学的重要方法,社会网络分析是近年来国内逐渐普及的人文社科新方法。

社会网络又叫复杂网络,社会网络用节点与边表示一组事物之间关系的方式,这种思想来源于数学中的图论。对广大文科生来说,虽然不需要理解图论的全部知识,但需要了解社会网络相关的基本概念,数据猿就以Networkx和Gephi为例,展开对社会网络分析的探索。

希望能通过对python的networkx的学习和使用,逐渐熟悉社会网络分析在人文社科中的应用。今天先从Networkx开始,学习networkx生成图的基本方法。

本文目录如下——

python 社交网络分析 python做社会网络分析_python判断无向图是否有环

Networkx,可以用于创建、操控和研究复杂网络的结构、动力和功能的Python第三方库。

networkx功能和优势

Networkx脱胎于图论,是一款针对复杂网络的软件,其功能和优势如下——

  • 可描述简单图、有向图和多图数据结构
  • 多种标准图算法
  • 网络结构和分析方法
  • 生成经典图,随机图和语义网络
  • 任意数据形式可构成节点,任意数据属性可形成边
  • 3种 BSD 附属开源协议
  • 已测试良好的代码覆盖90%
  • 其他python的优势,如快速成型、易于教授和多平台适应

networkx的安装

需要 Python 3.6, 3.7,  3.8版本。

pip安装pip install networkx升级pip install --upgrade networkx卸载pip uninstall networkx

安装networx,同时需要安装过以下软件

  • NumPy 提供矩阵和线性代数的相关数学算法支持
  • SciPy
  • pandas 提供稀疏矩阵表示图和许多数值科学工具
  • Matplotlib 提供灵活的绘图工具
  • PyGraphviz and pydot 提供绘图和布局
  • PyYAML 提供YAML格式的读写
  • gdal 提供shapefile格式的读写
  • lxml 适用于 GraphML XML 格式的读写

networkx简单绘图.Graph()

导入库

import networkx as nximport matplotlib.pyplot as plt

创建简单的图——无向单图

#创建最简单的图G = nx.Graph() # 注意,Graph,而不是graph# 添加点G.add_node(1)# 添加边G.add_edge(2,3)#元组# 绘图nx.draw(G)

python 社交网络分析 python做社会网络分析_networkx edge 属性_02

可以看到,3个节点被创建,节点2,3之间有一条边。这就是networkx中最简单的图,无向单图。

networkx有向单图.DiGraph()

Digraph中,除了add_node()方法添加元组类型的边,还可以通过add_nodes_from()添加列表类型的边。在旧版本的networkkx还可以使用add_cycle(),利用列表创建一个闭环的图。number_of_edges()可以计算边的数量和。

G = nx.DiGraph()G.add_node(1)G.add_node(2)G.add_nodes_from([3, 4, 5, 6])#G.add_cycle([1, 2, 3, 4])G.add_edge(1, 3)G.add_edges_from([(3, 5), (3, 6), (6, 7)])print("输出全部节点:{}".format(G.nodes()))print("输出全部边:{}".format(G.edges()))print("输出全部边的数量:{}".format(G.number_of_edges()))nx.draw(G)plt.show()

python 社交网络分析 python做社会网络分析_networkx edge 属性_03

添加字符串为节点

G.add_node("wenkeshuju")        # adds node "wenkeshuju"G.add_nodes_from("wenkeshuju")  # adds 10 nodesG.add_edge(3, 'w')

python 社交网络分析 python做社会网络分析_networkx edge 属性_04

路径图.path_Graph()

.path_Graph()可以添加节点的任何可迭代容器。如果容器产生2元组(node, node属性dict),则还可以添加节点和节点属性。

路径图.path_Graph()G = nx.path_graph(8)nx.draw(G)plt.show()

python 社交网络分析 python做社会网络分析_python 社交网络分析_05

循环图.cycle_graph()

.cycle_graph()可以形成一个完善的首尾相接循环图,是基本的复杂网络结构之一。

G = nx.cycle_graph(24)pos = nx.spring_layout(G, iteratinotallow=200)nx.draw(G, pos, node_color=range(24), node_size=800, cmap=plt.cm.Blues)plt.show()

注意,这里的pos参数,采用了spring_layout()布局,iterations是迭代次数,一般来说,迭代次数越多,节点的布局越合理。node_colornode_size调控节点颜色和大小,cmap限定主题颜色。

python 社交网络分析 python做社会网络分析_python中判断无向图是否有环_06

皮特森图.petersen_graph()

皮特森图是一种特殊的图,它是一个有趣的连通简单图,一般画作五边形中包含有五角星的造型。Petersen图的构成多种多样,形态各异,共120多种,然而它不是平面图,因而没有一种使得边与边没有交点。

# 绘制皮特森图G = nx.petersen_graph()plt.subplot(121)nx.draw(G, with_labels=True, font_weight='bold')plt.subplot(122)nx.draw_shell(G, nlist=[range(5, 10), range(5)], with_labels=True, font_weight='bold')plt.show()

python 社交网络分析 python做社会网络分析_python中判断无向图是否有环_07

可以看到,Petersen图的顶点具有轮换对称性,即Petersen图是旋转对称的,Petersen图的边也随着点一起对称。

除以上经典的图形外,还需要了解的是无向多图和有向多图两种类型,以及非常多的基本图形。如下表所示——

python 社交网络分析 python做社会网络分析_python中判断无向图是否有环_08

小结

了解到networkx生成图的方式和种类只是networkx的第一步,对于文科生来说,我们还需要掌握如何将多种类型的数据转为社会网络和语义网络,并充分理解社会网络分析的各项分析指标,如pagerank接近中性度最短网络直径等。并且,还需充分理解社会网络分析的布局等可视化方法,这样才能从容地解决大量的社会网络分析问题。

参考资料:

networkx官方文档:

https://networkx.github.io/documentation/

文字编辑:数据猿Riggle