基于igraph包的社交网络分析,图 graph
http://www.ituring.com.cn/article/1762
社交网络(如脸书和推特)可以完整地展示人们的生活。人们以不同的方式与他人互动,所有这些信息都可以在社交网络中捕捉到。从一个网站中挖掘有用的信息可以帮助一些群体提高他们的竞争力。
最近偶然发现一个叫“igraph”的工具,它提供了一些非常有效的挖掘功能。以下是我觉得有趣的几个:
创建图表
图表由节点和连接组成,两者都可以附加一系列属性值(键/值对)。此外,连接可以是有向的或无向的,也可以是加权的。
图书馆(igraph)
#创建一个有向图
g图(c(0,1,0,2,1,3,0,3),有向=T)
顶点:4
边缘:4
导演:真的
边缘:
[0] 0 - 1
[1] 0 - 2
[2] 1 - 3
[3] 0 - 3
#使用邻接矩阵创建一个有向图
m矩阵(runif(4*4),nrow=4)
[,1] [,2] [,3] [,4]
[1,] 0.4086389 0.2160924 0.1557989 0.2896239
[2,] 0.4669456 0.1071071 0.1290673 0.3715809
[3,] 0.2031678 0.3911691 0.5906273 0.7417764
[4,] 0.8808119 0.7687493 0.9734323 0.4487252
g图.邻接(m 0.5)
顶点:4
边缘:5
导演:真的
边缘:
[0] 2 - 2
[1] 2 - 3
[2] 3 - 0
[3] 3 - 1
[4] 3 - 2
plot(g,layout=layout . fruchterman . rein gold)
IGraph还提供了各种简单的方法来创建各种图表。
#创建完整的图表
g1 - graph.full(4)
顶点:4
边缘:6
导演:假的
边缘:
[0] 0 - 1
[1] 0 - 2
[2] 0 - 3
[3] 1 - 2
[4] 1 - 3
[5] 2 - 3
#创建一个环形图
g2 -图.环(3)
顶点:3
边缘:3
导演:假的
边缘:
[0] 0 - 1
[1] 1 - 2
[2] 0 - 2
#组合两个图表
g - g1 %du% g2
顶点:7
边缘:9
导演:假的
边缘:
[0] 0 - 1
[1] 0 - 2
[2] 0 - 3
[3] 1 - 2
[4] 1 - 3
[5] 2 - 3
[6] 4 - 5
[7] 5 - 6
[8] 4 - 6
graph.difference(g,graph(c(0,1,0,2),directed=F))
顶点:7
边缘:7
导演:假的
边缘:
[0] 0 - 3
[1] 1 - 3
[2] 1 - 2
[3] 2 - 3
[4] 4 - 6
[5] 4 - 5
[6] 5 - 6
#创建一个网格
g1=graph.lattice(c(3,4,2))
#创建一棵树
g2=graph.tree(12,children=2)
plot(g1,layout=layout . fruchterman . rein gold)
plot(g2,layout=layout.reingold.tilford)
IGraph还提供了另外两种图形生成机制。随机图表可以连接任意两个节点。而“优先连接”会给已经有较大度数的节点增加更多的连接(即更多的连接)。
#生成随机图形,固定概率
g -鄂尔多斯.仁义. game(20,0.3)
plot(g,layout=layout . fruchterman . rein gold,vertex.label=NA,vertex.size=5)
#生成随机图形,固定弧数
g - erdos.renyi.game(20,15,type=gnm )
#生成优先附件图
g - barabasi.game(60,力量=1,零.吸引力=1.3)
简单图表算法
本节将介绍如何使用iGraph实现一些简单的图算法。
最小生成树算法可以连接图中的所有节点,并最小化所有连接的权重。
#创建图形并分配随机边权重
g -鄂尔多斯.仁义. game(12,0.35)
E(g)$ weight-round(runif(length(E(g))),2) * 50
plot(g,layout=layout . fruchterman . rein gold,edge.label=E(g)$weight)
#计算最小生成树
最小生成树(g)
plot(mst,layout=layout.reingold.tilford,edge.label=E(mst)$weight)
连通分支算法可以找到将连接其他节点的连接,即两个节点之间的路径将通过其他节点。请注意,在无向图中,连通性是对称的,但在有向图(节点A指向节点B,但节点B不指向节点A的图)中,连通性不是必需的。所以在有向图中有一个连接概念叫做“强”,即只有当两个节点相互指向时,才意味着它们是连通的。“弱”连接意味着它们没有连接。
g图(c(0,1,1,2,2,0,1,3,3,4,4,5,5,3,4,6,6,7,7,8,8,6,9,10,10,11,11,9))
从节点4可到达的节点数
子组件(g,4,mode=out )
[1] 4 5 6 3 7 8
可以到达节点4的节点数
子组件(g,4,mode=in )
[1] 4 3 1 5 0 2
群集(g,mode=弱)
成员资格
[1] 0 0 0 0 0 0 0 0 0 1 1 1
$csize
[1] 9 3
[1] 2
myc - clusters(g,mode=strong )
成员资格
[1] 1 1 1 2 2 2 3 3 3 0 0 0
$csize
[1] 3 3 3 3
[1] 4
mycolor - c(绿色,黄色,红色,天蓝色)
v(g)$ color-mycolor[myc $ membership 1]
Plot (g,layout=layout . fruchterman . rein gold)最短路径算法是最流行的算法,它可以找到节点A和节点b之间的最短路径,在iGraph中,如果图是不加权的(即加权为1),并且在权重为正时使用Dijkstra算法,那么将使用“呼吸优先搜索”算法。如果连接的权重为负,将使用贝尔曼-福特算法。
g -鄂尔多斯.仁义. game(12,0.25)
plot(g,layout=layout . fruchterman . rein gold)
pa - get.shortest.paths(g,5,9)[[1]]
[1] 5 0 4 9
v(g)[pa]$颜色-绿色
例如$color -灰色
例如,path=pa)$color -红色
例如,path=pa)$width - 3
plot(g,layout=layout . fruchterman . rein gold)
图表统计
通过大量的统计,我们可以大致看出图表的形状。在最高权限下,我们可以看到图表的各种信息,其中包括:
-图表的大小(节点和连接的数量)
-图的密度是紧致的(E与V的平方成正比)还是稀疏的(E与V成正比)?
-图是连通的(大多数节点是互连的)还是不连通的(节点是孤立的)?
-图表中最长两点之间的距离
有向图的-对称性
-出/入“度”的分布
#创建随机图表
g -鄂尔多斯.仁义. game(200,0.01)
plot(g,layout=layout . fruchterman . rein gold,vertex.label=NA,vertex.size=3)
节点数量
长度(伏特(克))
[1] 200
#边数
长度(英(克))
[1] 197
#密度(边数/可能的边数)
图表.密度(克)
[1] 0.009899497
#岛屿数量
聚类(g)$否
[1] 34
#全局聚类系数:
#(关闭三胞胎/所有三胞胎)
传递性(g,type=global )
[1] 0.015
#边连通性,0,因为图形是断开的
边缘.连通性(g)
[1] 0
#与图形粘附力相同
图形.附着力(克)
[1] 0
#图表的直径
直径(克)
[1] 18
#图形的互易性
互惠性
[1] 1
#图表的直径
直径(克)
[1] 18
#图形的互易性
互惠性
[1] 1
度分布(克)
[1] 0.135 0.280 0.315 0.110 0.095 0.050 0.005 0.010
绘图(度分布(g),xlab=节点度)
线条(度分布(g))
再往下一点,我们还可以看到每对节点的统计数据,例如:
-计算两点之间没有公共连接的路径(即,需要移除多少个连接才能使两个节点断开)
-计算两点之间的最短路径
-计算两点之间路径的数量和长度
#创建随机图表
g -鄂尔多斯.仁义. game(9,0.5)
plot(g,layout=layout . fruchterman . rein gold)
#计算最短路径矩阵
最短路径(g)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 0 1 3 1 2 2 1 3 2
[2,] 1 0 2 2 3 2 2 2 1
[3,] 3 2 0 2 1 2 2 2 1
[4,] 1 2 2 0 3 1 2 2 1
[5,] 2 3 1 3 0 3 1 3 2
[6,] 2 2 2 1 3 0 2 1 1
[7,] 1 2 2 2 1 2 0 2 1
[8,] 3 2 2 2 3 1 2 0 1
[9,] 2 1 1 1 2 1 1 1 0
#计算连接矩阵
m矩阵(rep(0,81),nrow=9)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 0 0 0 0 0 0 0 0 0
[2,] 0 0 0 0 0 0 0 0 0
[3,] 0 0 0 0 0 0 0 0 0
[4,] 0 0 0 0 0 0 0 0 0
[5,] 0 0 0 0 0 0 0 0 0
[6,] 0 0 0 0 0 0 0 0 0
[7,] 0 0 0 0 0 0 0 0 0
[8,] 0 0 0 0 0 0 0 0 0
[9,] 0 0 0 0 0 0 0 0 0
对于(我在0:8) {
对于(0:8中的j){
if (i==j) {
M[i 1,j 1] - -1
}否则{
M[i 1,j 1] -边.连通性(g,I,j)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] -1 2 2 3 2 3 3 2 3
[2,] 2 -1 2 2 2 2 2 2 2
[3,] 2 2 -1 2 2 2 2 2 2
[4,] 3 2 2 -1 2 3 3 2 3
[5,] 2 2 2 2 -1 2 2 2 2
[6,] 3 2 2 3 2 -1 3 2 3
[7,] 3 2 2 3 2 3 -1 2 3
[8,] 2 2 2 2 2 2 2 -1 2
[9,] 3 2 2 3 2 3 3 2 -1
中心性计算
详细来说,我们可以看到每个节点的统计信息。根据这些图,可以测量节点的“中心性”。
-具有较高渗透度的节点也具有较高的中心度。
-与其他节点之间的路径较短的节点具有较高的“密集中心性”
-与其他节点对具有最短路径的节点具有更高的“中间”
-与具有较高中心性的许多节点连接的节点具有较高的“特征向量中心性”
-局部簇系数表示相邻节点的互连。
#度
度(克)
[1] 2 2 2 2 2 3 3 2 6
#接近度(平均距离的倒数)
亲密度(克)
[1] 0.4444444 0.5333333 0.5333333 0.5000000
[5] 0.4444444 0.5333333 0.6153846 0.5000000
[9] 0.8000000
#中间性
介数(克)
[1] 0.8333333 2.3333333 2.3333333
[4] 0.0000000 0.8333333 0.5000000
[7] 6.3333333 0.0000000 18.8333333
#局部聚类系数
传递性(g,type=local )
[1] 0.0000000 0.0000000 0.0000000 1.0000000
[5] 0.0000000 0.6666667 0.0000000 1.0000000
[9] 0.1333333
#特征向量中心性
事件(g)$向量
[1] 0.3019857 0.4197153 0.4197153 0.5381294
[5] 0.3019857 0.6693142 0.5170651 0.5381294
[9] 1.0000000
#现在排列它们
阶数(度(g))
[1] 1 2 3 4 5 8 6 7 9
顺序(接近度(g))
[1] 1 5 4 8 2 3 6 7 9
顺序(中间值(g))
[1] 4 8 6 1 5 2 3 7 9
顺序(evcent(g)$vector)
[1] 1 5 2 3 7 4 8 6 9德鲁康威发现,低“特征向量中心性”和高“中间性”的人是重要的交往对象,而高“特征向量中心性”和低“中间性”的人与重要的人交往。现在我们来画特征向量的“中心性”和“中间性”的图形。
#创建图表
g1 - barabasi.game(100,directed=F)
g2 - barabasi.game(100,directed=F)
g - g1 %u% g2
lay-layout . fruchterman . rein gold(g)
#画出独立因子和中间中心性
plot(evcent(g)$vector,betweenness(g))
text(evcent(g)$vector,betweenness(g),0:100,cex=0.6,pos=4)
颜色-红色
颜色-绿色
plot(g,layout=lay,vertex.size=8,vertex.label.cex=0.6)
我还会在后面的帖子中介绍一些社交网络分析的特殊例子。
原文链接:使用igraph的基本图形分析(需要FQ)
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。