• Tag Archives: 数据可视化

编程语言的网络

最近在上Coursera的SNA社交网络分析,翻之前学生做的大作业压力好大,有做知识网络Network map of Knowledge and Art,有做俄罗斯选举的投票网络,还有类似的哲学的发展网络。按照哲学家网络的思路,我拿编程语言的网络来练个手,每种语言是一个节点,如果语言B受语言A的影响,则B向A连边,比如Java和Python都有受Smalltalk的OO影响,smalltalk又受Lisp,Logo影响。

数据获取
数据来自DBpedia语义数据库,简单的说,它收集的是维基百科的数据,然后经过一些处理得到结构化的语义web。互联网发明人蒂姆·伯纳斯-李曾在TED演讲"关联数据",互联网最初的设计只是想把文档放在一起而已,但是现在互联网还是有巨大的可释放潜力,我们从网上得到的数据不是我们想要的数据。在DBpedia如果你去找John McCarthy,会包含了与John McCarthy相关的信息,它们被联系到了一起,比如他的导师、他所带出来的学生、出生年、出生地、获得的成就等,下一代搜索引擎比如Wolfram|Alpha就是这么工作的。
然后用SparQL,它将Web2.0和Semantic web两种新的web技术联系起来,你可以直接在web页写类似sql语句进行查询编程语言以及该编程语言收到那些语言的影响(要翻墙):

SELECT * WHERE {
?p a <http://dbpedia.org/ontology/ProgrammingLanguage>.
?p <http://dbpedia.org/property/influencedBy> ?influencedBy.
}

拿到数据初始化/归一化,导出为csv。

数据可视化
使用Gephi进行数据可视化,这是个开源的复杂网络分析软件,没教程也能上手。这里生成了552 nodes, 1011 edges的网络,平均路径长度3.126,Force Atlas Layout,使用HITS算法提炼枢纽节点,可见Lisp, Smalltalk, C, Java, Scheme, Pascal在语言发展中的地位,不过ALGOL和Fortran不是很大,估计是太古老太传说了,新语言出度没有传递给这两者。
颜色按Community分类:绿色是functional language和logic language,橙色是object-oriented,淡蓝色Javascript,Pascal和Ada,ALGOL在一起,Lisp和Scheme分家了,看看就好。

network

节点大小按Degree设置,标出了一些有代表性的语言 比如R,Logo, Prolog, COBOL
network

如果把C语言和他的邻居受C语言影响和影响C语言的节点筛选出来,C的入度有54是所有节点里最大的,庞大的C家族一目了然:
红色表示出度,C的前身是B,原型是ALGOL 60,受Fortran和PL/I影响用= operator来表示赋值,而非ALGOL的:= operator。
蓝色入度表示C影响了C++, Python, Perl, JavaScript等语言,大部分都借鉴了C的语法。
network

Python,胶水语言,借鉴了Perl, C++, Lisp, Java, Haskell, C, ALGOL, Dylan, Icon等等等等
network

Haskell出度14是最大的,除了Lisp, Scheme, ML/Standard ML好多不认识的语言,冷艳高贵orz
network

我把Lisp, C++, Smalltalk, Java, R, javascript也做了图,放在了豆瓣相册

最后感觉编程语言网络好看有余营养不足:没有时间信息,层次也没有树状清晰。不过可以像豆瓣代码大爆炸一样按时间添加节点效果会很赞。除了分析枢纽Hub节点和平均路径长度应该还有可以挖掘的地方。

O'Reilly动物丛书颜色分析

在上次O'Reilly情人节福利文章里提到O’Reilly动物丛书颜色和内容的联系,于是拿到了360本O’Reilly丛书的旧数据,使用Python+networkx+matplotlib进行分析:

按颜色关键词排序
对书名进行分词作为关键词,统计频次排序。这里篇幅限制列出了出现大于1次的keywords列表,很明显动物丛书颜色是有主题的,比如最新的Data Science Kit都是红色封面。

PMS 301C
微软系列
[('.net', 12), ('windows', 10), ('visual', 7), ('basic', 6), ('c#', 6), ('2000', 5), ('essentials', 4), ('excel', 3), ('win32', 3), ('services', 3), ('writing', 2), ('framework', 2), ('server', 2), ('security', 2), ('access', 2), ('macros', 2), ('active', 2), ('language', 2), ('vb.net', 2), ('system', 2), ('word', 2),('asp.net', 2), ('administration', 2), ('transact-sql', 2),('applications', 2)]
PMS 3272C
Web相关
[('web', 12), ('xml', 7), ('mx', 5), ('javascript', 4), ('apache', 4), ('php', 4), ('essentials', 3), ('flash', 3), ('xslt', 3), ('html', 3), ('actionscript', 3), ('services', 3), ('practical', 2), ('cd', 2), ('privacy', 2), ('perl', 2), ('bookshelf', 2), ('http', 2), ('applications', 2)]
PMS 313C
神兽Perl
[('perl', 25), ('best', 3), ('journal', 3), ('perl/tk', 3), ('regular', 2), ('graphics', 2)]
PMS 165C
Oracle系列
[('oracle', 31), ('pl/sql', 7), ('sql', 3), ('tuning', 2), ('sql*plus', 2), ('performance', 2), ('database', 2), ('essential', 2), ('dbas', 2)]
PMS 2607C
Java相关
[('java', 33), ('enterprise', 7), ('javaserver', 3), ('javabeans', 3), ('best',3), ('applications', 3), ('practices', 3), ('xml', 2), ('web', 2), ('jdbc', 2),('data', 2), ('struts', 2), ('weblogic', 2), ('vol.', 2), ('servlet', 2), ('pages', 2), ('database', 2), ('jakarta', 2), ('workbook', 2)]
PMS 246C
语言+工具
[('python', 6), ('c', 6), ('c++', 5), ('mysql', 3), ('shell', 3), ('awk', 3), ('gnu', 3), ('practical', 3), ('vi', 2), ('unix', 2), ('sed', 2), ('emacs', 2), ('uml', 2), ('editor', 2), ('sql', 2), ('using', 2), ('embedded', 2), ('cvs', 2),('software', 2)]
PMS 2725C
Mac OS X
[('mac', 7), ('x', 7), ('os', 7), ('unix', 4), ('cocoa', 3), ('geeks', 2), ('panther', 2)]
PMS Reflex Blue
网络通信
[('networks', 4), ('using', 4), ('cisco', 4), ('network', 3), ('internet', 3), ('sendmail', 3), ('system', 3), ('administration', 3), ('samba', 2), ('essential', 2), ('routers', 2), ('802.11', 2), ('dns', 2), ('lists', 2), ('wireless', 2),('protocols', 2)]

orelly

按书名关系可视化

按颜色聚类就没有意义了,所以就按书名建图:如果两本书书名有相同的关键词则连边。把无信息量水词pocket, reference,cookbook, programming, guide, definitive, learning, designing, managing, mastering, building加入stopwords,剩下书名包含的信息量更有限了,每个节点的度不大。

作图用了Fruchterman-Reingold force-directed algorithm,同其他书关系比较多的书将绘制的比较靠近中心,而关系较少的会在相对靠外的位置。可以看出橙色和紫色封面的书有比较好的聚类,因为橙色关键字是Oracle紫色关键字是Java,青色的有Perl系列的,右下粉色的是Python系列。

orelly-with-labels

PS1: 不是统计专业的,也不知道还有什么信息可以挖掘,计算closeness, betweenness, Hub节点在这里ms没有实际意义,再去解下最大团Maximum Clique啥的。
PS2: 要是能找到更全更新的O'Reilly动物丛书数据就好啦!

比赛中的数据可视化

上个月在Kaggle看到一个关于Kaggle自己的leaderboard数据可视化任务:表格形式反映比赛排名太枯燥,如何可视化地反映出比赛中随时间交替排名激烈的竞争场面?

To an observer, the leaderboard is a spreadsheet. They see funny team names, numbers with too many decimals, strange column titles, and none of the history behind the battle. We run a veritable nerd olympics, but instead of smashing the 100m world record, we're elbowing for a few decimal places of some esoteric quantity called a capped binomial deviance. It's faceless. It's cold. It fails to tell the story of the battle. And you know what that means?This means war.

提交上来的候选作品思路都差不多,时间为横轴排名为竖轴,可以一目了然看出排名随时间的变化趋势,并且也很容易看出一个队伍是从什么时间点加入比赛的,老外管这个叫Bumps Chart,还跟英国剑桥牛津的划船赛有关。后来Bumps Chart其实就曲线图,但是特别在只有两个时间点。

battles of the best

还有一个比较特别的作品使用Bubble Chart,横轴是每支队伍竖轴是比分,每个泡泡表示一个提交,加入比赛的时间点特别标出。想到ACM比赛就可以这么进行数据可视化处理(当然现在的表格表示挺好的):比赛队伍/通过的题目数/提交次数/程序耗时/时间有五维,比赛队伍用不同颜色泡泡表示,通过的题目数是竖轴,程序耗时是横轴,提交次数可以用泡泡大小来表示,最后时间轴左右拖动显示一个时间点的比赛状态。可以参照Hans Rosling在2006年TED大会上的演讲:数据可视化透视世界发展状况。
kaggle WaterGunRaceChart

close