简单的社交网络分析(基于R)

原文链接:http://cos.name/2011/04/exploring-renren-social-network/#comment-2281

最近四五年间,互联网行业似乎总是绕不开社交网络这个概念。无论是旗舰级别的传说中的facebook、LinkedIn,还是如雨后春笋般冒出来的各种团购和微博网站,全都或多或少地体现着SNS(社会网络服务)的特色。这些五花八门的产品,在丰富我们业余生活的同时,也为研究者提供了大量珍贵的数据。以往只能依靠有限的调研或模拟才能进行的社会网络分析(SNA),现在具备了大规模开展和实施的条件。国内著名而典型的SNS网站“人人网”,最近依靠上市新闻重新赢得了大家的关注。本文基于人人网的好友关系数据,应用统计分析软件R做了社会网络分析的一些尝试。

注:网络边界的确定,是社会网络分析的关键而困难的步骤。由于数据获取的限制,本文分析的对象限制于我的好友。也就是说,本文分析的网络是我自己的好友圈子,读者看了这些分析结果或许会觉得索然无味,感兴趣的同学可以分析一下自己的社交网络,看看是否会有类似的结果。

2011-06-20 增加了新的代码在附件中,可以直接获取“共同好友”。如果只需要分析好友的群组关系(而忽略并无技术含量的好友推荐功能),可以直接运行这段代码,大幅度提高效率,几分钟就能搞定,同时绕过好友同名的问题。欢迎试用,如需修改参数麻烦自行操作。=”=
2011-12-15 修改了正文的脚本,修正了数据读取的代码中的一处错误。

一、读取数据

之所以选择人人网作为分析的对象,很重要的一点原因在于其数据获取较为便利。本文读取数据的过程借助了一款命令行浏览器cURL,这个浏览器在R中可以用RCurl包实现,简要的中文介绍建议参考medo的《R不务正业之RCurl》。通过RCurl的简单编程,我们可以在R中实现登录人人网、发布状态以及读取页面数据等功能。

人人网好友列表页面的url为http://friend.renren.com/GetFriendList.do?curpage=0&id=****,其中curpage为页码参数,id为相应的用户。通过对id与curpage做简单的循环,我读取了自己(陈逸波)的所有好友以及好友的好友。(读取数据的R代码见文末附件。)

用上述代码读取到的数据集记为friend_all,该数据有如下的格式:

1
2
set.seed (13)
friend_all[ sample (1: nrow (friend_all), 10), ]
                u0        id0     u1       id1
68282          沈叶  229657865 邢凤婷 238382560
19358        吴昊宸  115975869   吴玥 250106135
18406   叶敏佳MO小沫  222288430 官兴华  32503437
7782           李彬   54598688 鱼化石 323984442
57464          牛智 1411553595   谢諹 221389295
1833         马天云   23157153   张立 227738255
222150       刘雯欢  227317115   李嫣 334590411
278125       陈长虹  236145500 李利文 249059215
135239         高涛  248013976 宋阳阳 247196544
18214        蒋鸿章   35702214 华明明 226037245

其中,第一行数据表示“沈叶”与“邢凤婷”是好友关系,id0与id1为相应的用户id。需要注意的是人人网中不可避免地会出现同名用户的情况,因此id才是用户的唯一标识。

二、绘制简单的好友关系网络图

本文分析的焦点集中于我的好友之间形成的网络,因此考虑做网络图来直观地展示网络的结构。

首先,从上述读取到的数据集中筛选出希望分析的子集。这个子集包含了两个条件:

(1)网络中没有我自己(否则会呈现以我为中心的分布,失去了分析的意义);
(2)网络中的用户都是我自己的好友。

1
2
3
4
5
tmp1 = friend_all[friend_all[, 2] == "41021031" , ]
## "41021031"是用户的uid,在读取数据的代码中可以自动获取
tmp2 = friend_all[(friend_all[, 2] != "41021031" ) &
                   (friend_all[, 4] % in % tmp1[, 4]), c (2, 4)]
tmp1 = tmp1[tmp1[, 4] % in % tmp2[, 1] & tmp1[, 4] % in % tmp2[, 2], ]

然后就是直接利用igraph包的做图功能绘制相应的网络图。考虑前面提到的用户同名情况,直接用id来做后续的分析。

1
2
3
4
5
6
7
8
9
10
11
12
13
library (igraph)
people = data.frame (id = tmp1[, 4], name = tmp1[, 3])
gg = graph.data.frame (d = tmp2, directed = F, vertices = people)
is.simple (gg)
gg = simplify (gg)
## 去掉重复的连接
is.simple (gg)
## png("net_simple.png", width = 500, height = 500)
par (mar = c (0, 0, 0, 0))
set.seed (14)
plot (gg, layout = layout.fruchterman.reingold, vertex.size = 5, vertex.label = NA ,
     edge.color = grey (0.5), edge.arrow.mode = "-" )
## dev.off()

从图中可以直观地看出,我的好友网络存在一定的人群分割,可以尝试对这个网络进行一些分析以提取出其中相对独立的子群(或者称为社群)。

三、子群分割

信息的分类和过滤是社会网络服务的一项特征,例如人人网对好友关系有一套自己的分类方式,用户可以自行对好友进行分组,从而对信息的收发做分组的管理。但是作为用户却未必能够养成并保持这种分组的习惯(例如我自己就从来没有对好友做过分组)。与此同时我们揣测,作为真实关系的线上反映,人人网的好友网络是能够自动呈现出一定的人群分割的,而在社会网络分析中,对网络成分的分析也确实是一项重点。通过分析网络的结构,提取出其中的子群,能够让我们更好地理解这个网络的组成方式,从而更好地管理和利用信息流。

寻找子群的算法有很多,igraph包提供了若干函数以实现对网络子群的搜索,本文采用了其中的walktrap.community()函数,更多细节及其他算法可以查看帮助文档。

为了在网络图中展示这些子群,我们采用不同的颜色来标记他们。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
com = walktrap.community (gg, steps = 6)
sg = data.frame (name = com$labels, sg = com$mem + 1)
subgroup = vector ( "list" , length ( unique (com$mem)))
for (i in 1: length ( unique (com$mem))){
subgroup[[i]] = as.character (sg[sg[, 2]== i, 1])}
rm (i)
## subgroup
V (gg)$sg = com$mem + 1
V (gg)$color = rainbow ( max ( V (gg)$sg))[ V (gg)$sg]
## png("net_walktrap.png", width = 500, height = 500)
par (mar = c (0, 0, 0, 0))
set.seed (14)
plot (gg, layout = layout.fruchterman.reingold, vertex.size = 5,
     vertex.color = V (gg)$color, vertex.label = NA , edge.color = grey (0.5),
     edge.arrow.mode = "-" )
## dev.off()

从图中可以直观地看出好友网络已经被划分为若干相对独立的子群。这也与我们对人人网(尤其是其前身校内网)的直观理解相符合——人人网的好友关系基本都是真实线下关系的反映,很自然地可以划分为初中同学、高中同学、大学同学,等等(例如网络的上半部分为小学及中学的同学,下半部分为大学同学,而左侧的五个节点,那是统计之都的同学们。)。

具体地看一下划分得到的子群,就能够更好地理解子群的含义。我挑出了比较典型的几个子群,其中包括:

“实验室同学”(子群9)

1
subgroup[[9]]
[1] "周莉"      "杨志昌"    "潘伟"      "卢进文"   "胡刚"

“校内论坛上某版版友”(子群7)

1
subgroup[[7]]
 [1] "曲文君"       "翟传鑫"       "梁玮"         "单广宇"
 [5] "花木马leeear" "王昉"         "李典"         "陈侃"
 [9] "王祎萍"       "牛智"         "郗旺"         "何志嵩"

“高中学弟学妹”(子群11)

1
subgroup[[11]]
 [1] "邹舒怡"      "封启云"      "何非"        "朱亚希"      "陈平"
 [6] "洪怡君"      "程功"        "李常然"      "朱燕^^Jue" "周飏 Ivy"

“统计之都”(子群8)

1
subgroup[[8]]
[1] "魏太云"   "邓一硕"   "吴云崇"   "高涛"     "统计之都"

其他子群还包括“大学同学(数学系)”、“大学同学(非数学系)”等等,不一而足(甚至能够区分高中的不同班级的同学)。因此可以认为上述算法得到的子群划分是合理且有意义的。

更进一步地,可以对照网络图来考察各个子群成员的分布情况。例如大学数学系同学(下方蓝色点)的链接较为紧密,而非数学系的大学同学(主要是校内论坛上的朋友,下方红色点)的分布则相对分散。通过网络密度可以定量地印证这一点:

1
2
3
4
5
6
7
8
9
10
## 数学系
sg10= subgraph (gg, V (gg)[sg==10])
## 非数学系
sg1= subgraph (gg, V (gg)[sg==1])
graph.density (gg)
## [1] 0.06376068
graph.density (sg10)
## [1] 0.5883441
graph.density (sg1)
## [1] 0.1223607

四、起到中介作用的那些好友

在社会网络分析中,对节点的中介作用有一个经典的刻画叫做“中间度”。中间度衡量了节点作为中介的程度,当网络中某个个体的中间度较大时,我们认为它在很大程度上起到了中介和沟通的作用。常用的中间度的定义是\sum(g_{ivj} / g_{ij}, i \neq j,i \neq v, j \neq v),其中g_{ij}表示联通i与j两个节点的捷径的条数,g_{ivj}则表示联通i与j两个节点且经过v的捷径的条数(所谓捷径,就是两个节点之间的最短路径)。在igraph包中,betweenness()函数能够简单地计算网络中各个节点的中间度。

1
2
3
4
5
V (gg)$bte = betweenness (gg, directed = F)
## png("net_betweenness.png", width = 500, height = 500)
par (mar = c (0, 2, 0, 0))
plot ( V (gg)$bte)
## dev.off()

根据得到的中间度散点图,我们人为地选择了3000作为分界点,选取中间度高于3000的节点并在图形中利用节点的大小展示出来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
V (gg)$size = 5
V (gg)[bte>=3000]$size = 15
## 这里的3000可以换成分位数之类
V (gg)$label= NA
V (gg)[bte>=3000]$label= V (gg)[bte>=3000]$name
V (gg)$cex=1
V (gg)[bte>=3000]$cex=2
## png("net_walktrap_betweenness.png", width = 500, height = 500)
par (mar = c (0, 0, 0, 0))
set.seed (14)
plot (gg, layout = layout.fruchterman.reingold, vertex.size = V (gg)$size,
     vertex.color = V (gg)$color, vertex.label = V (gg)$label,
     vertex.label.cex= V (gg)$cex, edge.color = grey (0.5),
     edge.arrow.mode = "-" )
## dev.off()

从图中也可以直观地看出,中间度最高的5个节点,确实位于中介的地位。

具体看这5个节点:

1
V (gg)[bte>=3000]
Vertex sequence:
[1] "邱元杰" "娄谦之" "王子涵" "刘波"   "顾鑫"

对这5个节点,基本上都有比较合理的解释,其中有三个人是“高中校友”兼“大学校友”,而另外两个则沟通了“网络好友”与“大学好友”。

五、基于好友关系的一种简单的推荐

最后,我们也做了基于好友关系的好友推荐,推荐的逻辑与人人网自身的推荐逻辑相同:根据共同好友的数量来进行推荐。在具体实现的时候,仍然需要考虑用户同名的情况。

1
2
3
4
5
6
7
tmp3 = friend_all[!(friend_all[, 4] % in %
         friend_all[friend_all[, 2] == "41021031" , 4]), ]
listall = sort ( table (tmp3[, 4]), dec = T)
top = names (listall[1:20])
tmp4 = tmp3[tmp3[, 4] % in % top, 3]
top20 = sort ( table (tmp4), dec = T)
top20
周科  邹碧筠Phoebe       査小狮       韩晶磊       陆丽娜
55           49           42           41           41
焦丽萍       蔡锡真         高晨       鲁锦彪         张洁
40           39           39           38           38
张明珠       范莉悦       钱咏邠   薛俊波悟空         周迪
38           37           37           37           37
陈素         蒋莹         唐甜         费逸       王丽涵
36           36           36           35           35

这个推荐的结果与人人网的推荐基本一致(因为逻辑相同嘛),以下是人人网的一些推荐截图:

上述推荐的机制较为简单,但是在拥有大量真实关系的网络中,推荐的效率还是比较高的。当然,我们也可以开展对文本与行为的挖掘,以得到超越真实线下关系的推荐,但本文尚未做这方面的尝试。

2011-06-20 增加了新的代码在附件中,可以直接获取“共同好友”。如果只需要分析好友的群组关系(而忽略并无技术含量的好友推荐功能),可以直接运行这段代码,大幅度提高效率,几分钟就能搞定,同时绕过好友同名的问题。欢迎试用,如需修改参数麻烦自行操作。=”=
2011-12-15 修改了正文的脚本,修正了数据读取的代码中的一处错误。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
科技创新与生产力 2021年 9 月 总第 332 期 基于大数据社交网络数据分析研究 1 系统需求分析 社交网络已经成为人们日常生活的重要组成部 分袁 是人们传播信息尧 交流互动的重要途径遥 用户 在社交网络上活动时袁 会通过文本信息尧 转发信 息尧 评论等行为产生大量数据信息袁 分析尧 挖掘这 些 大数据 具有 重 要 意 义 遥 目 前 在 世 界 范 围 内 Twi t t er袁 Facebook 是用户最为活跃的社交网络平 台袁 因此本研究针对这两个平台提出一种分析 其数据信息的系统遥 本系统的主要需求包括以下 3 个方面遥 一是数据采集与融合遥 大数据分析必须以数据 采集与融合为前提袁 可以通过种子 U R L 实时采集 或通过设定关键词实时采集袁 利用网络爬虫从 Twi t t er袁 Facebook 中采集数据信息遥 虽然社交网络 平台的功能结构不同袁 界面样式也千差万别袁 但是 其都包含文本信息尧 评论信息尧 转发信息尧 互动关 系信息等袁 系统可以从中抽取存在共性的数据进行 分析尧 融合袁 再以结构化的方式存储于数据库[ 1] 遥 二是信息检索需求分析遥 信息检索方式主要有 两种院 一种是新任务检索袁 即不保留之前的检索数 据袁 开启一个新的检索任务曰 另外一种是当前任务 检索袁 在开启一个新任务检索时袁 上次任务检索的 数据也保留起来袁 两次检索得到的数据求交集或并 集袁 最终实现多任务数据融合遥 两种检索方式都可 以实现以下功能院 关键词检索袁 即输入关键词即可 获取用户信息尧 关系信息等相关结果曰 排除关键词 检索袁 即输入需要排除的关键词后搜索结果中不包 含关键词相关的信息曰 人物检索袁 即输入人物相关 的关键词即可检索到相关信息曰 时间检索袁 可以实 现在特定时间范围内的时间检索曰 来源检索袁 可以 检索到信息的来源数据等遥 三是数据分析与可视化需求遥 数据分析模块主 要对社交网络数据进行挖掘尧 分析袁 其也是整个系 统的核心部分袁 主要功能包括内容分析尧 行为分 析尧 用户画像尧 发现热点话题等遥 其中内容分析中 的内容包括用户发布尧 回复及转发的相关信息袁 除 了显性的信息数据外袁 系统还可以对信息中隐含的 内容做出情感分析袁 将用户感兴趣的信息标记出 来曰 行为分析是指分析用户在社交网络平台上的所 有操作行为袁 将用户的操作过程完整地记录下来袁 将用户的行为轨迹完整地构建尧 预测出来曰 用户画 像是将用户信息进行标签化处理袁 用标签将用户的 行为尧 观点尧 属性等个性化特征描述出来袁 并对用 户个性化的观点尧 关注的话题进行总结尧 分析曰 发 现热点话题主要是对用户的帖子数据进行聚类分 析袁 发现用户关注的热点话题[ 2] 遥 2 系统功能设计 根据上述需求可知袁 该系统需要实现数据采 集尧 数据预处理与融合尧 信息检索尧 数据分析与可 视化功能袁 其中核心功能为数据分析袁 下文详细介 绍系统各功能设计开发过程遥 2. 1 数据采集 数据采集是整个系统完成数据分析的基础模 块袁 传统数据分析过程中多采用社交网络开放的应 用程序接口渊A ppl i cat i on Program m i ng Int erf ace袁A PI冤 获取数据袁 但却易受到限制遥 利用网络爬虫技术采 集数据袁 可以不受数据限制遥 网络爬虫可以根据特 定的规则实现网页内容程序或脚本的自动采集袁 通 晁绪耀 1袁王颖颖 2 摘 要院本文提出一种基于大数据社交网络数据分析系统袁 对社交网络用户的行为数据进行分析袁 能够更有针对性地 研究用户的圈子尧 影响力袁 分析尧 挖掘社交网络数据还能够做市场调研尧 事件预测尧 舆情监控及产品推荐袁 因此设计一 个能够对多源异构社交网络数据分析的系统具有重要意义遥 关键词院大数据社交网络曰数据分析曰系统设计 中图分类号院TP393. 09曰TP311. 13 文献标志码院A D O I 院10. 3969/ j . i ssn. 1674-9146. 2021. 09. 023 渊 1. 郑州职业技术学院袁 河南 郑州 450007曰 2. 郑州升达经贸管理学院袁 河南 新郑 450001冤 收稿日期院2021原01原04曰修回日期院2021原01原17 作者简介院晁绪耀 渊 1990要冤 袁女袁河南驻马店人袁硕士袁助教袁主要从事大数据研究袁E- m ai l 院zhengzhou_0122@ 163. com 遥 文章编号院1674-9146渊圆园21冤09原园23原园3 创 新 思 维 I nnovati ve Thi nki ng 023 .com.cn. All Rights Reserved. SC I -T E C H IN N O V A T IO N & P

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值