社交网络分析的 R 基础:(五)图的导入与简单分析
如何将存储在磁盘上的邻接矩阵输入到 R 程序中,是进行社交网络分析的起点。在前面的章节中已经介绍了基本的数据结构以及代码结构,本章将会面对一个实质性问题,学习如何导入一个图以及计算图的一些属性。
- Dolphins 网络为例,将其导入到 R 程序中。Dolphins 是一个无权无向的真实网络,描述了生活在新西兰的一个峡湾附近的宽吻海豚社区,其中节点表示海豚,边表示海豚间的社会关系。将数据集下载完成后,打开名为
out
的文件。% sym unweighted 9 4 10 6 10 7 11 1 ......
在读取文件之前还需要对其进行一下修改,可以看到该文件的第一行“
% sym unweighted
”是由空格分隔的三个元素,R 语言还没有太过智能,在读取到第二行时会因为只有两个元素而报错,因此需要将第一行删除。下面使用read.table()
将文件读入到 R 程序中:graph.edges <- read.table(file = "out.dolphins", header = FALSE)
?? 提示
也可以将 out 文件中的制表符(\t)替换成逗号(,),将文件更改为使用逗号分隔的 CSV 文件,并使用
read.csv()
函数读取。你也许会好奇读入的
graph.edges
到底是什么东西,使用class()
函数来看看变量的类型:> class(graph.edges) [1] "data.frame"
data.frame
似乎前面的章节并没有介绍,受限于研究的方向,这有可能是你唯一一次接触数据框类型,不用管它,下面将读入的数据转换为图:> library(igraph) > graph <- graph_from_data_frame(graph.edges, directed = FALSE)
下面画图看看导入的 Dolphins 网络:
> class(graph) [1] "igraph" > plot(graph)
输出一下 Dolphins 网络的规模:
> cat(sprintf("Nodes: %s\nEdges: %s\n", length(V(graph)), length(E(graph)))) Nodes: 62 Edges: 159
这里使用了两个全新的函数
V()
和E()
,其中V()
是获取图的点集,E()
是获取图的边集,今后的大部分分析是建立在这两个集合之上,这两个函数会伴随你的 R 语言旅程直到结束。导入的网络可以保存为 R 文件,下次可以直接载入使用,使用同样的方法也可以持久化实验数据。
> save(graph, file = "dolphins.RData") # 保存 graph 变量 > load(file = "dolphins.RData") # 导入 RData 文件中存储的变量
生成人工网络
使用人工网络验证算法的有效性也是实验中必不可少的一环,下面介绍几种常见的人工网络结构。
- 全连接图
graph <- make_full_graph(10)
- 树状图
graph <- make_tree(21, children = 3, mode = "undirected")
- k-正则图
graph <- sample_k_regular(20, 3)
- Erdos-Renyi Random
graph <- sample_gnp(20, 0.1)
- 小世界网络
graph <- sample_smallworld(dim = 1, size = 20, nei = 2, p = 0.1)
?? 提示
其他人工结构请查看 igraph 文档:https://igraph.org/r/doc
图的基本分析
上文从导入外部网络和生成人工网络两个角度获得了
igraph
图对象,下面将使用igraph
包中的函数对 Dolphins 网络进行简单的分析。- 判断图的连通性
> is.connected(graph) [1] TRUE
- 计算图的度
> degree(graph) # 计算图中所有节点的度,其中第一行为节点的名称,第二行为节点的度 9 10 11 ... 6 7 5 ... > degree(graph, v = "9") # 计算图中部分节点的度 9 6
- 计算图的密度
> edge_density(graph) [1] 0.0840825
- 对图的路径分析
> diameter(graph, directed = FALSE, weights = NA) # 直径 [1] 8 > radius(graph) # 半径 [1] 5 > distances(graph, v = V(graph)$name[1], to = V(graph)$name[10], algorithm = "unweighted", weights = NA) # 计算节点间的最短距离 20 9 3 > shortest_paths(graph, from = "1", to = "6", weights = NA) # 计算节点1到节点6的最短路径 $vpath $vpath[[1]] + 6/62 vertices, named, from e1ce364: [1] 1 41 37 40 58 6
- 计算图的聚类系数
> transitivity(graph, type = "average") [1] 0.3029323
?? 练习
1. 试着在数据集网站中下载其他网络导入到 R 程序中;
2. 试着计算导入网络的平均度;
3. 查找 igraph 文档,试着计算导入网络的同配系数(Assortativity)。
- 全连接图