利用d3.js对大数据资料进行可视化分析
insight-labs · 2013/12/19 18:18
作者: [email protected] [email protected]
0x00 背景
对于前段时间流出的QQ群数据大家想必已经有所了解了,处理后大小将近100G,多达15亿条关系数据(QQ号,群内昵称,群号,群内权限,群内性别和年龄)和将近9000万条群信息(群号,群名,创建时间,群介绍),这些数据都是扁平化的2维表格结构,直接查询不能直接体现出用户和群之间的直接或者间接关系。通过数据可视化,可以把扁平结构的数据作为点和线连接起来,从而更加直观的显示出来从而进行分析。
d3.js是一个近年来推出的基于javascript的数据展示库,全称为Data Driven Document, 在浏览器数据展示领域的地位类似于通用js框架里的jQuery。d3.js的官网是d3js.org,大家可以在上面看到很多例子和应用。d3.js也是图形数据库neo4j所内置的数据展示工具。
说到图形数据库,其实正确的翻译应该是图数据库,图即所谓的Graph,来自于数学里的图论,比如四色定理和推销员过桥的问题(著名的NP问题之一)。图数据库着重于数据之间的关联和属性,对于关系错综复杂的关系分析效率很高。例如,我想知道谁是我朋友的朋友,并且他们有哪些朋友也认识我。对于这种问题,普通关系型数据库的计算复杂度是O(N^c)左右或者更高,N为选择范围的数据集合大小,你好友数量加上好友的好友的数量等,c为关系层数。图数据库的计算复杂度在O(N^2)左右或者更低,但是基本不会超过O(N^2)。图数据库对于复杂关系数据查询起来效率高的主要原因是在数据输入的时候就已经对关系进行了处理和索引,这样做在查询的时候具有很高的效率,但是在数据导入的时候会很慢。QQ群的15亿个关系在向图数据库neo4j里导入的时候花了3天都没弄完,也没有进度提示,所以后来我直接放弃了。
0x01 数据处理
在QQ群和群成员关系里面,对于层数我是这么定义的:
第1层:目标QQ加入的所有群
第2层:目标QQ加入的所有群的所有成员
第3层:目标QQ加入的所有群的所有成员加入的所有群
.
.
.
复制代码
大家可以看出这样的查询是可以递归的,假设每个QQ号所加入的群数量和每个群的成员数量为N,那么查询3层数据时总计算量为N*N*N
=n^3,所以当查询层数为c层的时候,计算复杂度是N^c。
前面说过,图数据库的计算复杂度一般在N^2以下,所以当使用普通的关系型数据库的时候,如果查询的层数不多,效率和图数据库比起来差不多,加上关系数据库自带的便于管理和导入导出的属性,所以我还是选择了mysql数据库。
对于QQ和QQ群之间的关系,每个QQ号都能加入群,一个群里也有很多QQ,基本都在几十到几百人,所以两个QQ号在同一个群里不一定代表他们的关系很紧密,换句话说QQ和QQ群之间的关系相对于QQ好友而言相对较弱。但是这并不代表我们从中不能分析出有用的资料,俗话说的好,大数据就像一座金矿,只有用力挖才能挖到金子。
d3.js支持多种数据格式,比如JSON,XML,CSV,HTML等,因为PHP的数组可以很简单的转换为JSON格式,所以我选择用PHP写API来获取JSON数据。QQ和QQ群是一种典型的图数据的应用,QQ和QQ群作为节点(node),QQ加入了哪些群作为关系(link),d3.js内置了一个功能很强大的内建布局,叫做Force-Directed Graph(受力导向图),后面简称为force。force布局模拟了一些基本的物理粒子原理,比如引力和斥力(确切的说是模拟了电磁力和引力,在离的远的时候会互相吸引,在离的近的时候斥力急剧增加),并且可以调节力的大小和受力距离等等,可以说是自由度相当高。关于d3.js的force布局,在官网有详细的API和不少例子,这里我就不贴代码了。
在force布局里面,数据源的JSON可以有很多种不同的格式和属性,但是基本格式如下:
{"nodes":[{"num":10001,type:"qq"},{"num":12345678,type:"qun"}],"links":[{"source":"10001","target":"12345678","auth":1,"nick":"pony"}]}
复制代码
其中nodes数组对应的是节点列表,links对应的是关系列表。
每个节点可以有很多自定义属性,在d3.js可以针对每个节点存取节点的属性,比如我定义num是QQ号或者群号,type代表节点是QQ还是群,另外我在js里设定在type==‘qun’的时候显示群的图标,是qq的时候显示qq的图标。关系里面默认的属性有source和target,分别对应一个关系的两头,默认情况下关系里面的source和target对应的数字是节点在节点数组里面的位置index。但是我自定义成了qq号和群号。另外你也可以定义其他属性,比如auth代表这个QQ号在群里的权限,nick是群昵称。
对于QQ群这样的关系来说,基本上在第4层和以上的QQ和群的关系就比较弱了,所以为了提高查询速度和减少节点数量,我只查询2层关系(少么?不少,要想想有些群有超过500人……)。
首先,d3.js需要在浏览器里面运行,我的首选是Google Chrome,V8引擎的效率果然不错,在节点和关系不多的时候基本感觉不到延迟,后来在FF和IE11里面测试了一次,FF比Chrome卡一半左右,IE的话我只能呵呵了……
先拿小马哥做个测试,QQ号是霸气的10001。当d3.js导入完数据JSON的时候,各种节点会在屏幕上乱飞几秒钟,直到他们的力达到一个稳定的平衡点。结果如下:
说明:
企鹅图标的节点代表QQ,群图标的节点是群(废话么)。
每条线代表一个关系,一个QQ可以加入N个群,一个群也可以有N个QQ加入。
线的颜色分别代表:
土豪金:群主
狗腿绿:群管理员
屌丝蓝:群成员
复制代码
大家也可以看到,群主和管理员的关系线也比普通的群成员长一些,这是为了突出群内的重要成员的关系。
图标旁边自动标注了QQ号和群号,如果有的话还有群名。没有在QQ号旁边标注昵称是因为很多人加入不同的群使用的是不同昵称,所以把昵称放到了其他的地方显示。
在下图中大家可以隐约的看到,所有的关系都是以QQ 10001为起点的。
在图上节点是可以拖拽的,拖拽后会固定在你释放的地方。我们把几个群稍微拖的分开一点,关系就一目了然了
这个时候我们可以看到在目标的QQ群里也有很多共同QQ号,比如有些QQ号同时加入了2,3个群。群名显示的都是各种产品开发讨论群,这些同时加入2,3个产品群的人估计不是产品经理就是主管吧……
鼠标悬停到群图标上可以看到群的详细信息(如果有的话)
图3.1
因为很多人在不同群里的昵称不一样,所以群内昵称等信息就只能放到link上面了,因为线比较细,所以鼠标比较难对准,这个功能还待修改。
这个家伙和小马哥一起同时在3个群里,好基友?
图4
小马哥的QQ群信息展示完了,下面我们来看看更加实际的应用,比如把某圈子里的人找出来。我们先从某土豪大黑阔大牛的QQ号入手:
初始数据好多……此大黑阔加入的群够杂的,不过就是因为杂所以才能更深入的了解一个人的所有喜好。看看群名神马的,我好像看到了dota,XX国际俱乐部,web技术交流,XXsec等群……充分说明了此人……是个屌丝技术宅大黑阔,XX国际俱乐部又似乎带着那么种高大上的感觉……
图中错综复杂的各种关系组成了一朵朵盛开的菊花,向我们诉说着他的历史……
为了理清他那不堪回首的过去和关系网,我特地把浏览器窗口拖到第二个屏幕上,然后把群挨个分开。为了保护当事人的隐私,这张图我打码了。
这张图比较宽,建议大家下载下来放大看
0x02 总结
假如把层数扩展到4层,不知能否筛选出中国所有黑阔的QQ号呢?至少我已经在这张图里看到了很多熟悉的名字和号码。
腾讯总是说漏洞早已修复,不存在问题了,广大网民放心,但实际上信息泄露这种事情,岂是你漏洞修复好了就结束了的事情?
利用d3.js对大数据资料进行可视化分析相关推荐
- 聚合中返回source_大数据搜索与可视化分析(9)elasticsearch聚合分析Metric Aggregation...
在上一篇文章中,我们介绍了<大数据搜索与可视化分析(8)kibana入门教程-2-Discover>,本文学习elasticsearch聚合分析,是对<大数据搜索与可视化分析(3)e ...
- 大数据开源的可视化分析工具,主要有哪些?
目前,我们可以在市场上找到很多用于网络分析和数据可视化的开源工具,例如NetworkX,R和Gephi中的iGraph包等.在所有工具中,Gephi一直以来被认为是最值得推荐的,它可以帮助用户轻松实现 ...
- 大数据总监python可视化分析30W数据后,找到了抹黑我们的原因
真利益相关,人在国内,刚下...算了,在办公室. 我不知道是谁在推特上抹黑我们,我也不想知道他们为什么这么对待我们,作为大数据行业的一员,我觉得什么东西都得有数据来证明对吧,如果靠嘴的话,那对面早就赢 ...
- 央行的数字货币拥有政府信用背书,是法币并能利用交易留痕大数据来追踪
作为新兴事物,数字货币的试点受到社会各界广泛关注,"十四五"规划也提出了"建设现代中央银行制度,完善货币供应调控机制,稳妥推进数字货币研发,健全市场化利率形成和传导机制& ...
- 【2017年第3期】大数据服务三农的初步分析与探索
孙忠富, 褚金翔, 马浚诚, 杜克明, 郑飞翔 中国农业科学院农业环境与可持续发展研究所,北京 100081 摘要:三农问题是当前中国密切关注的社会问题,大数据技术的发展为三农带来了新的机遇.首先,对 ...
- 《大数据》2015年第3期“网络大数据专题”——大数据时代的互联网分析引擎...
大数据时代的互联网分析引擎 窦志成,文继荣 (中国人民大学信息学院大数据管理与分析方法研究北京市重点实验室 北京 100872) 摘要:随着互联网尤其是移动互联网的高速发展,互联网文档的数量.内容的丰 ...
- 医院大数据中心建设要点分析
当前,医院内部信息化体系纷乱复杂,已建设的业务系统少则数十个,多则近百个.既包括HIS.LIS.PACS.EMR.心电等医疗业务系统,还涉及到人.财.物等运营管理系统,每个系统厂商不同,设计不同.尽管 ...
- 大数据时代的互联网分析引擎
随着互联网尤其是移动互联网的高速发展,互联网文档的数量.内容的丰富度和复杂度都大大增加,互联网正朝大数据时代迈进,而用户的信息需求也趋于复杂化.除了基本的信息检索需求外,对大量相关文档的深入理解与聚合 ...
- 基于大数据的城市可视化治理:辅助决策模型与应用
作为数据分析和知识挖掘的常用方法, 可视化在城市规划.管理工作中的运用日见增多.考虑大数据的基本特性和可视化技术本质, 从图像展示.图像理解.图像运用三方面对管理决策的动态过程加以探索, 提出大数据可 ...
最新文章
- 《DNS与BIND(第5版)》——4.10 下一步是什么
- 腾讯数据科学家手把手教你做用户行为分析(案例:出行选择)
- 实时流处理框架Storm、Spark Streaming、Samza、Flink,孰优孰劣?!
- java内存高水位_jvm(1)---java内存结构
- 机器学习重大挑战:坏数据和坏算法正在毁掉你的项目
- 苏宁智能 BU大数据中心数据治理团队负责人韦真:数据治理“三字经”,超实用!...
- sql concat函数_使用SQL Plus(+)和SQL CONCAT函数SQL Server CONCATENATE操作
- Android Studio for Experts(Android Dev Summit2015)
- 卷积神经网络(CNN)的细节问题(滤波器的大小选择)
- Adobe下周将推新补丁和新的更新模式
- mysql程序,各种MySQL程序概述(转)
- 瑞友天翼服务器系统资源不足,瑞友天翼问题处理
- 百度云盘Mac破解不限制下载速度-百度网盘客户端 - Go语言编写
- spring中 allowBeanDefinitionOverriding(spring.main.allow-bean-definition-overriding)原因分析、解决办法
- 一对一直播,一对一脚本开发行业的下一个风口将在5G普及后到来!
- 本地连接不通的情况下连接vmbox
- 使用后羿采集器采集数据,并导出到MySql数据库中
- WM_KILLFOCUS和WM_SETFOCUS
- 【HIT-CN/不定期更新】计网NFAQ
- python播放网络音乐_Python实现在线音乐播放器示例
热门文章
- 部署ebe-shop商城系统(使用IDEA克隆Git项目)
- mac book air 编译sqlcipher
- java 生成操作excel文件_Java生成和操作Excel文件
- (46.4)【WAF绕过】基于工具的使用绕过WAF、WAFNinja、burpsuite、sqlmap、Fuzz/爆破、wafw00f
- 单链表实现增删改查(进化版)
- word中列表序列隔空不同的简单解决方案
- 面试:一分钟自我介绍
- Cocos2d-JS大作《东邪西毒》上线 全新引擎产品线正式登场
- Linux下delete后内存仍然无法释放
- layui分页 加下拉选择