基于igraph包的社交网络分析,图 graph

  基于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=h3 )

  成员资格

  [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)

基于igraph包的社交网络分析,图 graph