R语言学习-简单社会网络分析

一个月前用R语言练习了一下社会网络分析,现在总结一下。这里面的有效信息有线条粗细、箭头方向、节点大小、节点颜色。


这是结果图,字母代表不同的人,连线代表两人的联系(可以以电话通话作为代表),箭头代表的是联系的方向,如果一根线上上有双向箭头,如A和C,意味着两人互相都给对方打过电话,双向都存在联系。如果只有单向箭头,如B和G,意味着B给G打过电话,G没有给B打过电话,是单向联系。故而,双向联系,显然可以表明两者的关系更亲密。

除了单项联系和双项联系可以表明两者的关系亲疏外,线条的粗细,表明了两者联系的频率。显然,线条越粗,频率越高,两者关系更亲密。

因此,根据单向/双向联系和频率这两个维度,可以简单将人际关系划分为四种类型。

1.频率低,单向联系

2.频率低,双向联系

3.频率高,单向联系

4.频率高,双向联系

如果就亲密度而言,2和3哪个亲密度更高,可能需要进一步的分析。但实际上,这四种类型除了用来代表亲密度,还可以用来代表很多别的关系,看诸位感兴趣的主题和领域。

此外,节点的不同大小,也代表了不同的信息。节点越大,意味着与这个节点相关的联系越多。就人际关系而言,节点越大,意味着这个人的朋友圈更高,可以认为这个人是一个中心节点。

再此外,节点的不同颜色,在这个例子中,代表了不同的地域,或者领域,这个例子有三种颜色,意味着所有的人来自这三个地域。通过颜色可以显然看出哪一种地域的人在这个网络中人数最多,也可以验证是否存在地域上的连接:如果这个社会网络中的人更注重地域观念,那么这些人更有可能按照地域差别形成不同的网络。

以下是代码部分:

##准备工作

df<-data.frame(S=c("A","B","C","C","D","C"),D=c("C","G","E","A","F","L"),N=c("3","4","9","4","6","2"))

as_data_frame(df,what=c("both"))

net_pc<-graph_from_data_frame(df,directed=TRUE,vertices=NULL) 

 ## directed=TRUE 意味着线条有方向性,如果没有方向性可以设置为null

net_pc

V(net_pc)

E(net_pc)

plot(net_pc)

##设置权重(决定线条粗细)

E(net_pc)$weight<-df$N

E(net_pc)$weight

##添加地域信息

location<-data.frame(b=c("d","a"),loc=c("west","west","north","north","south","south","west","west"))

fac_loc<-factor(location$loc)

V(net_pc)$location<-fac_loc

V(net_pc)$location

##设置点的大小/中心度

deg<-degree(net_pc,mode="all")

##设置颜色

vcolor<-c("orange","red","lightblue","yellow")

vcolor[1]

V(net_pc)$location[1]

##指定节点的颜色

V(net_pc)[V(net_pc)$location %in% 1]$color<-vcolor[1]

V(net_pc)[V(net_pc)$location %in% 2]$color<-vcolor[2]

V(net_pc)[V(net_pc)$location %in% 3]$color<-vcolor[3]

##指定边的宽度,宽度等于权重

E(net_pc)$width<-E(net_pc)$weight

##开始绘图咯

plot(net_pc,vertex.size=5*deg,vertex.label.cex=.9,vertex.label.dist=2,

    edge.color="gray50",

    edge.arrow.size=1.5,

    edge.curve=.3)

##再加一个图例

legend(x=1.5,y=1.5,inset=0.5,title="Region",c("north","south","west"),

      pch=21,col="#777777",pt.bg=vcolor)

顺便再附一个没有写完的另一个社会网络的代码和图(如果有大神写完可以交流很great):

actors <- data.frame(name=c("Alice", "Bob", "Cecil", "David",

                            "Esmeralda"),

                    age=c(48,33,45,34,21),

                    gender=c("F","M","F","M","F"))

relations <- data.frame(from=c("Bob", "Cecil", "Cecil", "David",

                              "David", "Esmeralda"),

                        to=c("Alice", "Bob", "Alice", "Alice", "Bob", "Alice"),

                        same.dept=c(FALSE,FALSE,TRUE,FALSE,FALSE,TRUE),

                        friendship=c(4,5,5,2,1,1), advice=c(4,5,5,4,2,3))

g <- graph_from_data_frame(relations, directed=TRUE, vertices=actors)

g

plot(g)

E(g)$weight

你可能感兴趣的:(R语言学习-简单社会网络分析)