一、社团划分
1.1 使用的包
这里使用R语言中的igraph进行社团划分和可视化
1.2 包安装
install.packages("igraph")
随便选择一个CRAN mirror,我这里选择的是China Beijing,安装好后会提示安装成功
引用igraph包
library(igraph)
1.3社团划分
以上准备过程结束后就可以开始进行社团划分了。
1.3.1读取数据
我在这里使用的邻接表,以csv格式存储,读取数据将格式转为图,这里g就是转换过来的图。
setwd("C:/")
data <- read.csv("example2.csv")
edges <- data.frame(from=data[,1],to=data[,2])
g <- graph.data.frame(edges, directed = FALSE)
1.3.2社团划分及可视化
这里使用了fast unfolding、标签传播方法和GN算法进行划分。
#Fast unfolding
system.time(mc <- mu1ltilevel.community(g, weights=NA))
print(modularity(mc))
plot(mc, g,vertex.size=5,vertex.label=NA)
#标签传播
system.time(lc <- label.propagation.community(g))
print(modularity(lc))
plot(lc , g,vertex.size=5,vertex.label=NA)
#GN算法
> ec <- edge.betweenness.community(g)
V(g)$size = 1 #我将大部分顶点的大小设置为1
V(g)[degree(g)>=300]$size = 5 #但度很大的顶点更大
plot(ec, g,vertex.size=5,vertex.label=NA)
![](https://i-blog.csdnimg.cn/blog_migrate/d0b17b709bf00ea6087ca0f91e31e22c.png)
1.3.3最大社团划分结果保存
首先要找到最大的社团,我这又引用了sqldf包
#加载sql相关模块
install.packages("gsubfn")
install.packages("proto")
install.packages("RSQLite")
install.packages("sqldf")
library(gsubfn)
library(proto)
library(RSQLite)
library(sqldf)
#查询图中的点
resultmc <- sqldf("select * from data where x in a and y in a")
gmc <- graph.data.frame(resultmc,directed = FALSE)
#画出子图
plot(gmc,vertex.size=5,vertex.label=NA)
#标签传播最大社团图
a <- data.frame(lc[2])
resultlc <- sqldf("select * from data where x in a and y in a")
glc <- graph.data.frame(resultlc,directed = FALSE)
plot(glc,vertex.size=5,vertex.label=NA)
#GN算法最大社团图
a <- data.frame(ec[3])
resultec <- sqldf("select * from data where x in a and y in a")
gec <- graph.data.frame(resultec,directed = FALSE)
plot(gec,vertex.size=5,vertex.label=NA)
#绘制度的图
degreemc<- degree(gmc,mode="all",normalized=T)
plot(degreemc)
degreelc <- degree(glc,mode="all",normalized=T)
plot(table(degreelc))
degreeec<- degree(gec,mode="all",normalized=T)
plot(degreeec)
#计算度的最大值、聚类系数、平均最短路径
max(degreemc)
transitivity(gmc)
mean_distance(gmc)
max(degreelc)
transitivity(glc)
mean_distance(glc)
max(degreeec)
transitivity(gec)
mean_distance(gec)
到此,就完成了社团划分,和最大社团的可视化,现在对最大社团进行可信度分析。
![](https://i-blog.csdnimg.cn/blog_migrate/bec87959c366f284725b3d0eb6ef9bc2.png)
二、可信度
2.1方法
生成1000个和最大社团相同节点数和密度的随机网络,计算这1000个随机网络的聚类系数的概率密度分布,拟合整正态分布,并计算其95%的置信区间,检验我们划分的社团的聚类系数落在哪个区间,来确认是否划分结果是否可靠。
2.2安装包
> install.packages("survival")
> install.packages("MASS")
> install.packages("fitdistrplus")
> library(fitdistrplus)
2.2生成随机网络
for(i in 1:1000){
+ g<-erdos.renyi.game(121, 0.5)
+ julei <- transitivity(g)
+ result <- c(result,julei)}
fit <- fitdist(result,"norm")
plot(fit)
![](https://i-blog.csdnimg.cn/blog_migrate/c84953b799965c8d663e9f20a6b84234.png)
2.3置信区间
mean和sd值,输入fit即可获取。
left<-mean-1.96*sd
right<-mean+1.96*sd