Facebook社交网络R语言分析

本文将基于facebook的好友关系数据,研究用户分布规律,并提供简单的好友推荐算法。

数据来源

KONECT1 http://konect.uni-koblenz.de/networks/facebook-wosn-links

数据原始格式

. txt文本格式,空格分隔
. 注释信息以%开头
. 每行一组数据,共四个字段
    第一字段:用户ID1
    第二字段:用户ID2
    第三字段:用途不明
    第四字段:好友关系建立时间,多数为0,数据缺失

% sym unweighted

% 817035 63731 63731

1 2 1 0

1 3 1 0

1 4 1 0

2 3 1 1183325626

2 7 1 0

2 9 1 1187651286

...

Note:好友信息以无向图的形式存储,不存在重复链接,保证第一字段用户ID始终小于第二字段用户ID;从实例数据中我们可以看到用户1和用户2是好友,但只存在于用户1的好友记录里,而不会在用户2的好友记录里重复出现

数据清洗

需要从原始数据中清除这些:

  1. 以%开头的注释行
  2. 不明用途的第三字段
  3. 数据缺失的第四字段
# 利用linux命令sed,awk完成数据清洗cat facebook-wosn-links.txt | sed '/%/d' | 
awk '{print $1" "$2}' > facebook-wosn-links-clean.txt

数据读入

利用R语言read.table函数以table格式存储数据

# R语言读入数据friends.whole <- read.table("Your File Address", 
header=FALSE, sep=" ", col.names=c("from","to"))

数据选取

数据中包含非常多的用户,数据间相互影响,为了使结果更清晰,我们选定某一用户,分析其好友的分布特点

library(igraph)# 将所有用户按照好友数量倒序排序sort(table(c(friends.whole$from, friends.whole$to)), dec=T)# 选定拥有合适好友数量的用户uid <- 979# 好友IDfriends.connected <- unique(c(friends.whole$to[friends.whole$from == uid], 
friends.whole$from[friends.whole$to == uid]))# 选取该用户所有好友friends.sample <- friends.whole[
((friends.whole$from %in% friends.connected) & 
(friends.whole$to %in% friends.connected)), c(1,2)]# 创建graph对象,并去除循环friends.graph <- graph.data.frame(d = friends.sample, 
directed = F, vertices = unique(c(friends.sample$from, 
friends.sample$to)))

friends.graph <- simplify(friends.graph)
is.simple(friends.graph)# 去除孤立的点,其实本例中并不存在孤立点,但作为标准化操作保留dg <- degree(friends.graph)
friends.graph <- induced.subgraph(friends.graph, 
which(dg > 0))

好友分布图

plot(friends.graph, layout = layout.fruchterman.reingold, 
vertex.size = 2.5, vertex.label = NA, edge.color = 
grey(0.5), edge.arrow.mode = "-")

接下来,我们希望将不同群体的好友用不同的颜色标明出来,提供类似于好友自动分组的功能;使用的是igraph包提供的walktrap.community函数2

friends.com = walktrap.community(friends.graph, steps=10)# 返回每个节点的分组结果V(friends.graph)$sg = friends.com$membership# 按照分组结果赋予节点不同的颜色V(friends.graph)$color = NA
V(friends.graph)$color = rainbow(max(V(friends.graph)$sg))[V(friends.graph)$sg]

plot(friends.graph, layout = layout.fruchterman.reingold, 
vertex.size = 5, vertex.color = V(friends.graph)$color, 
vertex.label = NA, edge.color = grey(0.5), edge.arrow.mode = "-")

在图中,有些用户是中间人的角色,连接了两个聚集,我们可以利用igraph包提供的betweenness函数找出他们

V(friends.graph)$btn = betweenness(friends.graph, directed = F)
plot(V(friends.graph)$btn, xlab="Vertex", ylab="Betweenness")

betweenness函数统计的是通过每个节点的最短路径的数量,该值越高,则表明该节点作为中间节点的作用越强

从图上看出,有3个节点的betweenness值明显高于其他节点,因此我们可以选取betweenness值500为阙值将这3个节点在图上标明出来

V(friends.graph)$size = 5V(friends.graph)[btn>=500]$size = 15V(friends.graph)$label = NA
V(friends.graph)[btn>=500]$label = V(friends.graph)[btn>=500]$name

plot(friends.graph, layout = layout.fruchterman.reingold, 
     vertex.size = V(friends.graph)$size, 
     vertex.color = V(friends.graph)$color, 
     vertex.label = V(friends.graph)$label, 
     edge.color = grey(0.5),
     edge.arrow.mode = "-")

最后,我们希望从二级好友3中找出一些用户来进行推荐,可以根据共同好友数量来选取

# 所有二级好友friends.2nd <- c(friends.whole$from[
(friends.whole$to %in% friends.connected)], 
friends.whole$to[
(friends.whole$from %in% friends.connected)])# 该用户本身也会被包含到二级好友中,需要剔除friends.2nd <- friends.2nd[friends.2nd!=uid]# 按共同好友的数量进行倒序排序friends.recommand <- sort(table(friends.2nd), dec = T)# 取出共同好友最多的10个用户来推荐friends.recommand <- friends.recommand[1:10]

> friends.recommand[1:10]
friends.2nd
用户ID      5050  5559  6896  5587  7659  6255 14521   554  5586  6062 共同好友数量   63    22    20    19    18    17    16    15    15    15

根据共同好友数量的推荐算法虽然较为简单,但只要网络本身包含较多的真实线下好友关系,推荐的结果还是非常有价值的。此外,还有许多推荐算法,如根据用户的属性(兴趣爱好,地理位置等)来做聚类推荐,我们将在以后的文章中进行探讨。

原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2015-12-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序人生

谈谈调度 - Linux O(1)

约莫十五年前,当我刚刚开始参加工作时,赶上 Linux 发布划时代的 2.6 内核。在这个大家都翘首期盼的内核版本中,最令人兴奋的便是 O(1) schedul...

2598
来自专栏CDA数据分析师

数据整理中经典的分类汇总问题的Python实现

? 数据分析职场新人,精通一门语言至关重要。写个web服务,可以用python、 写个服务器脚本,可以用python、 数据清洗和网络爬虫,可以用python...

18310
来自专栏吉浦迅科技

DAY51:阅读Warp Shuffle Functions

__shfl_sync, __shfl_up_sync, __shfl_down_sync, and __shfl_xor_sync exchange a va...

762
来自专栏机器之心

从七桥问题开始:全面介绍图论及其应用

选自Medium 作者:Vardan Grigoryan 机器之心编译 图论是计算机科学中最重要、最有趣的领域之一,同时也是最容易被误解的。本长文从图论最基础的...

3438
来自专栏AI科技大本营的专栏

浮点峰值那些事儿

本文作者高洋,目前在商汤科技高性能计算组担任总监,对于并行计算颇有心得。本篇为高洋写给高性能并行计算的初学者,核心内容是教初学者用科学手段测量硬件的理论指标。有...

2195
来自专栏顶级程序员

为什么Python是入行人工智能的首选语言?

在所有编程语言里,Python并不算萌新,从1991年发布第一个版本,至今已经快30年了。

874
来自专栏CDA数据分析师

一个初级python web后端开发工程师的面试总结

原文链接:https://blog.csdn.net/ayocross/article/details/56509840

793
来自专栏数据结构与算法

P2038 无线网络发射器选址

题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大。某城市决定对城市内的公共场所覆盖无线网。 假设该城市的布局为由严格平行的129 条东西向街道和12...

3338
来自专栏张高兴的博客

为什么树莓派不会受到 Spectre 和 Meltdown 攻击

1412
来自专栏有趣的Python

算法与数据结构(六)并查集

并查集 Union Find 图相关算法的实现。 一种不一样的树形结构 连接问题 Connectivity Problem 可视化的来看连接问题: ? 连接问题...

2754

扫描关注云+社区