原标题:狗熊会在线实习学员作品 | 基于Facebook上公共主页社交网络的社区发现
本报告借助R语言探究了Facebook网站上各个公共主页之间的社交网络,以重要节点的分析、核心网络的提取以及网络社区的发现等角度为切入点,进行数据分析与可视化。报告从网络科学的视角出发,挖掘并分析了某些网络子群的相应社交属性,从而有助于相关学者定位和把握这些社区的群组特征。
一、背景介绍1.研究问题
根据六人定律,我们只需通过六个人,就可以和世界上任何一个人建立起联系。在当今这个万物互联的时代,社交网站作为一种主流的社交工具,在人们的日常生活中发挥着不容小觑的作用。正因如此,越来越多的官方媒体选择在社交网站上创建公共主页,以此传播讯息并扩大自身的影响力。
为进一步探究社交网站上各公共主页的社交特征与影响力,挖掘该社交网络中存在的社群结构,本报告以2017年11月Facebook网站上的公共主页数据为例进行社交网络分析。
2.研究意义
社交网站运营的重中之重便在于提升流量,留住用户。公共主页作为社交网站用户的重要组成部分,是成千上万个体用户进行信息消费的主要来源之一。探究并厘清各公共主页间的社交网络特征,将会有助于社交网站制定更加合理且高效的个性化推荐。
二、数据介绍及说明
本报告的数据来源于 Stanford Network Analysis Project这一 网站,由 Benedek Rozemberczki , Carl Allen 和 Rik Sarkar 三位学者整理得到。数据内容为2017年11月Facebook网站上的各公共主页的社交网络数据,包括节点数据文件musae_facebook_target.csv和连边数据文件musae_facebook_edges.csv。其中,节点数据文件还给出了Facebook对各个公共主页所对应的用户主体的分类,分别为政治人物、 *** 组织、电视节目和企业四大类。
该网络数据共有22,470个节点、171,002个连边。节点代表公共主页,连边则表示公共主页之间是否相互关注。在Facebook网站上,如果两个主页中有一方给另一方发布的讯息点赞,则这两个主页便可达成互关。本报告中主页互关网络的密度为0.00068,说明网络是相对稀疏的。
三、公共主页关系网络的实证分析1.网络的构建rm(list = ls);cat("\014")
library(igraph)
library(plyr)
library(dplyr)
data1 = read.csv("musae_facebook_edges.csv")
data2 = read.csv("musae_facebook_target.csv")
g = graph_from_data_frame(data1,directed = FALSE)
print(paste0(原始网络的节点数为:, vcount(g)))
print(paste0(原始网络的边数为:, ecount(g)))
2.描述性统计分析2.1网络密度n <- length(V(g))
N <- length(E(g))
density <- N/choose(n, 2)
density
该网络的密度为0.068%,说明此网络较为稀疏。
2.2节点的度
在该主页关系网络中,节点的度表示一个公共主页所互关的不同主页数量。下图为互关网络节点度分布直方图,从图中可以看出节点度分布是严重右偏的,即大部分节点的度很小,存在少部分节点的度很大。这也与社交网络的特点相符合,即存在少部分公共主页互关其它主页数量众多,大部分公共主页用户的社交互动是处于较低水平的,而这些度较大的公共主页也就是主页关系网络中的重要节点。
计算节点的度
degree = ddply(data1, .(id_1), nrow)
添加列名
colnames(degree) = c(id,degree)
绘制直方图
hist(degree$degree,ylab ="频数",xlab ="度",main ="图1 度分布直方图",
col ="lightsteelblue2",xlim = c(0,200),ylim = c(0,20000))
下表展示了主页互关网络中度更高的10个公共主页。排名之一的官方用户主页是 Honolulu District, U.S. Army Corps of Engineers ,它的度为472,代表与其建立互关关系的官媒主页共有472个。排名第三的公共主页是Facebook自身,对应的度为364。
我们不难发现,Facebook也是表1中唯一一个非 *** 机构的公共主页用户,这足以说明其在当今社交媒体的影响力是非常强的。同时,度更高的10个公共主页中有9个都是 *** 机构。之所以会出现这一现象,是由 *** 机构的工作要求所决定的: *** 机构在实施某一政策时,需要与社会上各个部门进行沟通与协作。因此,它们的公共主页互关其它主页的数量会相对较多。
按度的降序排列
degree = degree[order(degree$degree,decreasing = T),]
degree_top10 <- left_join(degree[1:10,],data2)
输出结果
knitr::kable(format(degree_top10[,-1],scientific=F),caption ="表1 度排名前10的公共主页相关信息")
表1 度排名前10的公共主页相关信息
3.节点的中介中心性
betweenness = data.frame(bet = betweenness(g, directed = F, normalized = T))
betweenness$id= data2$id
betweenness = betweenness[order(betweenness$bet,decreasing = T),]
betweenness_top10 <- left_join(betweenness[1:10,],data2)
knitr::kable(format(betweenness_top10[,-2],scientific=F),caption ="表2 中介中心性排名前10的公共主页相关信息")
表2 中介中心性排名前10的公共主页相关信息
为进一步探索公共主页互关网络的社区结构,接下来对该网络进行网络社区发现。
四、公共主页互关网络社区发现1.提取核心网络
为了更加细致地展示Facebook上公共主页的社区结构,本报告采用如下的提取方法得到了公共主页互关网络的核心网络:通过不断删除网络中度小于30的节点直至网络不再变化,最终得到一个由805个节点,24303条边构成的主页核心关系网络。该网络的密度是7.51%。
W <- as_adjacency_matrix(g)
将"dgCMatrix"类型转化为"matrix"类型
W <- as.matrix(W)
提取核心网络
converg <- FALSE
old.nrow <- nrow(W)
while(!converg){
计算W矩阵的列和
d <- colSums(W)
to.keep <-which(d>=30)
保留列和大于等于30的列
if(old.nrow==length(to.keep)){
converg <- TRUE
}
old.nrow <- length(to.keep)
W <- W[to.keep,to.keep]
}
g_core <- graph_from_adjacency_matrix(W, mode ="undirected",)
计算核心网络的节点数
print(paste0(核心网络的节点数为:, vcount(g_core)))
[1] "核心网络的节点数为:805"
计算核心网络的边数
print(paste0(核心网络的边数为:, ecount(g_core)))
[1] "核心网络的边数为:24303"
n_1 <- length(V(g_core))
N_1 <- length(E(g_core))
density_1 <- N_1/choose(n_1, 2)
density_1
[1] 0.07509966
下图展示了核心网络中四类公共主页各自度的分布情况。很显然,主页核心关系网络中的用户主体为 *** 组织,企业及电视节目的官方主页在核心网络中占比相对较小。同时,核心网络中的节点度分布也呈现出了明显的右偏态势:大多数节点的度都很小,只有一小部分节点的度较大。
library(tidyverse)
library(hrbrthemes)
library(viridis)
tmp_data = merge(degree, data2, by =id)
tmp_data = tmp_data[order(tmp_data$degree, decreasing = T), ]
data_core = tmp_data[1:max(which(tmp_data$degree>= 30)),]
data3 = data.frame(data_core[,c(2,5)])
data3 %>%
ggplot( aes(x=page_type, y=degree, fill=page_type)) +
geom_boxplot +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum +
theme(
legend.position="none",
plot.title = element_text(size=11,hjust = 0.5)
) +
ggtitle("图2 核心网络关于度的分组箱线图") +
xlab("")
2.社区划分
本文使用R自带的Louvain算法对主页核心互关网络进行社区发现,得到8个社区。更大的社区有320个公共主页,最小的社区涉及34个官方用户。本文根据社区大小对社区进行排序,更大社区为社区1,最小社区为社区7。
设置随机种子
set.seed(100)
使用multilevel.community函数对核心网络进行社区划分
com = multilevel.community(g_core)
展示每个社区的大小
table(com$membership)[order(table(com$membership),decreasing = TRUE)]
1 3 6 4 2 5 8 7
320 123 99 80 61 49 39 34
下图展示了该互关核心网络社区结构可视化的结果。其中,不同颜色代表着不同的社区。从图中可以看出节点之间呈现出一定的"社区"结构。社区内部的节点连接相对紧密,而在社区之间,节点的连接则比较稀疏。
通过分析公共主页互关核心网络的社区结构,我们可以更透彻地把握公共主页间的社交模式,并挖掘出其中相对活跃的官方用户子群体。
com_color = c("FFCABC",85E0FF,96FAA0,E6D554,
C0EE75,FFB4CF,CDE0FF,FFC097)
为节点添加社区属性
V(g_core)$com= com$membership
g_core = igraph::simplify(g_core, remove.multiple = T,remove.loops = T)
不显示标签
V(g_core)$label=""
设置随机种子
set.seed(100)
绘制
plot(g_core,main ="图3 官媒主页互关网络核心子图",
力导向布局
layout=layout.fruchterman.reingold,
设置节点大小
vertex.size = 7,
设置节点颜色
vertex.color=com_color[V(g_core)$com],
设置节点边框颜色
vertex.frame.color=grey50)
3.子网络分析与可视化
下图为社区7的网络结构图,子网络图大致呈现出正六边形网络结构。不难发现,在该子网络中各节点的度分布十分均匀,且网络的密度为98.2%,聚类系数为98.3%。这说明该社区内部各公共主页用户主体间的社交活动相对频繁,同时,社区群体对官方用户的吸引力也较强。值得注意的是,Facebook的官方主页正隶属于该社区,而Facebook所对应的节点在该社交网络中的度是更大值,为33;其中介中心性同样也是更大值,为0.3326。这些都说明了Facebook对于该社区的维系有着举足轻重的作用。
set.seed(1)
detach("package:dplyr")
计算社区7作者构成的合作网络的密度
g_com7 <- induced_subgraph(g_core, igraph::groups(com)$`7`)提取社区7作者构成的子网络
g_com7 = igraph::simplify(g_com7, remove.multiple = T,remove.loops = T)
print(paste0(子网络的密度为:, graph.density(g_com7)))
[1] "子网络的密度为:0.982174688057041"
print(paste0(子网络的聚类系数为:, transitivity(g_com7)))
[1] "子网络的聚类系数为:0.982624256768458"
绘制社区7作者构成的子网络
V(g_com7)$size= seq(1,14,length.out = max(degree(g_com7)))[degree(g_com7)]节点大小与度成正比
set.seed(1)设置随机种子,保证同一种布局画出来的图可以重复
par(mfrow=c(1,1), mar=c(1,1,1,1))
V(g_com7)$label=
V(g_com7)[V(g_com7)$name==10395]$label<-Facebook
plot(g_com7,main ="图4 基于力导向算法布局的社区7网络结构图",
layout = layout.fruchterman.reingold,绘制力导向布局图
vertex.label = V(g_com7)$label,显示节点标签
vertex.color =FFCABC,设置节点颜色
edge.color =grey80设置边的颜色
)
下图为社区8的网络结构图,子网络图呈现为分布式网络结构。该子网络中度的分布除去 7 News Cairns 所对应的节点外,大体上也较为均匀。
网络的密度为92.4%,聚类系数为94.5%,都处在较高的水平。在社区8的网络中, 7 News Cairns 是澳洲知名新闻平台Cairns News在Facebook网站上的官方主页,这一节点的度是该社区中的最小值,为14;其中介中心性也是最小值,为0.03125,这些结果说明了该公共主页与社区中其它公共主页间的社交关系相对疏远。
set.seed(1)
detach("package:dplyr")
计算社区8作者构成的合作网络的密度
g_com8 <- induced_subgraph(g_core, igraph::groups(com)$`8`)提取社区8作者构成的子网络
g_com8 = igraph::simplify(g_com8, remove.multiple = T,remove.loops = T)
print(paste0(子网络的密度为:, graph.density(g_com8)))
[1] "子网络的密度为:0.92442645074224"
print(paste0(子网络的聚类系数为:, transitivity(g_com8)))
[1] "子网络的聚类系数为:0.945469125902165"
绘制社区8作者构成的子网络
V(g_com8)$size= seq(1,14,length.out = max(degree(g_com8)))[degree(g_com8)]节点大小与度成正比
set.seed(1)设置随机种子,保证同一种布局画出来的图可以重复
par(mfrow=c(1,1), mar=c(1,1,1,1))
V(g_com8)$label=
V(g_com8)[V(g_com8)$name==701]$label<-7 News Cairns
plot(g_com8,main ="图5 基于力导向算法布局的社区8网络结构图",
layout = layout.fruchterman.reingold,绘制力导向布局图
vertex.label = V(g_com8)$label,显示节点标签
vertex.color =C0EE75,设置节点颜色
edge.color =grey80设置边的颜色
)
五、总结
本报告基于Facebook网站上公共主页间的社交网络,运用网络结构数据的分析方法,挖掘出该网站上影响力较大的官方用户。同时,借助Louvain算法对提取出的核心网络进行社区发现,共划分出8个子网络。其中,报告选择了结构较为简单的社区7和社区8进行了相应的分析及可视化。
最后,本报告还可以在很多方面进行拓展。例如,构造有权网络,研究各个公共主页间的联系强度。此外,还可以考虑收集2017年其它月份Facebook网站上的公共主页数据进行探究,从而得出更加深入、丰富的结论。
作者介绍:大家好,我是来自中央财经大学应用统计学20的陈广召同学。经过为期一个月的实习,我掌握了网络数据分析的基础知识,同时,我对R语言的运用也更加熟练。在此,非常感谢项目导师的悉心教导,也祝愿狗熊会能够越办越好!
点击此处阅读全文查看更多内容返回搜狐,查看更多
责任编辑: