Data Science的入门级工作(1)

最近看到豆瓣的“冒牌HR”挑灯看剑和一亩三分地的Warald老大都写了关于Data Science的一些东西。我也来凑个热闹好了,不过我的出发点是用自己做过的一些项目来让大家有个直观的感受——data science到底做些什么。当然我不是正宗的data scientist,统计、数据挖掘和机器学习的积累都……只有一点点,所以我主要做的是入门级的工作,数据处理(data manipulation)和数据探索(data exploration),外加我自己比较喜欢的数据可视化(data visualization)。如果你想看到的是通过分析来做预测(prediction)、推荐(recommendation)等等,这篇博客可能让你失望。

如果文中有说错和不完全的地方,还请各位指正。

基本上所有跟数据有关的工作,首先要做的不是收集数据更不是计算。第一步,也是最重要的一步是,你要通过数据来回答什么问题。“Twitter上的中文用户和微博上的中文用户讨论的话题是不是一样的”?这就是一个很具体的问题,要回答这个问题,你需要去找Twitter和微博的数据,然后再确定用什么方法来分析。这也是一个典型的统计学理假设再检验的模式。像“明天会不会下雨?”或者“奥巴马会在那几个州选票领先?”这样更加庞大而泛泛的问题,你可能需要先把他们具体化到类似于“根据去年这个时候人们购买雨伞的数量来判断明天会不会下雨”,或者“根据Twitter上的geo tag和tweet内容来分析奥巴马再哪个州有优势”这一类的问题。

总之,先要确定研究问题,然后通过它来确定需要的数据和分析方法。

下面是两个具体例子。

项目1,微博和Twitter。

这个项目是2011年下半年开始的,持续了几个月左右。第一部分可以在这里看到。第一部分主要是做的网络关系分析(network analysis),通过分析社交关系网来探索两个平台上用户的特征。完成第一部分之后,我想进一步的分析一下两个平台在内容上的差异。

首先是收集数据。Twitter的数据好弄,我们学院有一个API,几个学生写了小脚本不断的在爬。我的工作就是从这些已经爬好的数据里挑出中文的tweet。主要方法就是通过encoding,具体代码在github。微博上则通过stream api来收集公共时间轴的数据。整个过程大概持续了一个月,收集的总量现在不太记得了,大概是十几或者几十个GB级别的文本文件。

上面说了,我想回答的问题是两个平台上人们分享、谈论的内容有没有差异。很自然的,我想到了用语言学里的常见方法——建立“词汇模型”(languange model)。大概的思路就是找出两个平台上用户所使用的高频词汇,如果高频词汇差别很大(在统计上呈显著),那么可以断言两个平台上人们在说不一样的东西。由于我们面对的是中文,所以涉及到一个分词的问题。

比如有人有天发了这样一个推“结婚的和尚未结婚的”。那我应该是把它分成“结婚-的-和-尚未-结婚-的”,还是“结婚-的-和尚-未-结婚-的”?这种对于你我来讲很简单的问题对于计算机来说则很头疼。做好中文分词这本身就是一个很难且庞大的话题。我自然不会自己去发明一套分词算法,“善假于物”是做data的人必须知道的技巧。我当然是找一个好用的分词库了。Smallseg是我用的一个python的分词库,另外现在还有个库叫jieba貌似也不错。

分好词以后,记得把stop word去掉。语言学里有个理论是出现屏率太高的词本身没有多少语义分析上的意义,比如中文里的“的地得”、“和”,还有“你我他”等等。如果不把这些词去掉,那么每一个词汇库看起来都可能差不多。

以上,就是所谓的数据处理(data manipulation)的过程了。总结起来这个过程就是把原始数据(raw data)给转换成自己所需要的数据格式。

做好数据处理之后,在微博和Twitter上抓取到的内容就被分解成了一个个的词汇,所谓建立词汇模型,就是计算某一个词汇在整个词汇数据里出现的概率,里面具体牵扯到一个叫Maxim Likelihood的方法理论。上文我还提到需要比较两个词汇库的差异性,这里面用到的则是统计上的T检验(T-test)。

具体分析过程就不在这里赘述了,挑几个有意思的可视化给大家看看吧。

首先是高频词:

Screen Shot 2013 05 12 at 11 57 30 AM

图中的横轴是300个高频词,红色的点某个词在Twitter上出现的概率,蓝绿色的点是微博的,这里高频的定义是出现屏率大于0.0005。从图中可以看出,同一个流行词,在Twitter和微博上出现的概率有很大的差别。如果我们把这些词汇按照其在Twitter上出现的概率排序,就会得到另外一个图:

Screen Shot 2013 05 12 at 11 59 09 AM

这个可视化里可以看到,在Twitter上经常出现的流行词,在Weibo上不一定是流行的,反之亦然。

然后我还追踪了单独的某个话题,在两个平台上出现的屏率,并以该话题在wikipedia上被编辑的次数作为参考。去年春天薄督闹得满城风雨,下图是就是“薄熙来”这个名字在Twitter和微博上出现的频率,这个图并不用怎么分析就能看出两个平台的差异性:

Screen Shot 2013 05 12 at 11 59 40 AM

去年同时还发生了另外一件事,那就是舒淇被挖了老底,我也研究了一下“舒淇”这个名字被提及的概率:

Screen Shot 2013 05 12 at 12 01 42 PM

大概可以得到的结论是,两个平台对这种话题都挺有兴趣的。但是,微博上话题的兴起似乎比Twitter晚一些。

另外,这里用Wikipedia上相应词条做对比的原因是我假设当一个话题有突发新闻(breaking news)时,它在的Wikipedia上的页面会有一个编辑高峰期。这个曲线正好可以被用来作为一个参考曲线。

(下一篇我会讲关于Wikipedia编辑记录的数据处理、探索和可视化)

在硅谷初创公司的暑期实习报告

周五是这个暑假实习的最后一天,昨天搬家,今天彻底闲下来了,于是琢磨着写篇这个东西交粮填坑。

经过二、三月份的求职,我最后拿到了几个家不同公司的offer。大家听过的公司可能有Yelp.com和Wikipedia Foundation,另外两个给我offer的都是初创公司:Nebula(云计算)和affine.tv(视频分析广告)。最后选择了去Nebula,职位就是Front End Developer。关于我的求职过程和面试,见这些个帖子:这个,还有这个

总结一下求职心得:

找工作就是一个对自己积累的所学所知的展示过程。这里有两个东西很重要,一是积累,一是展示。

上课、作业、之前的实习、业余project甚至包括看电影、旅游、扯淡和发白日梦等等都是积累过程。这些“可积累项”里面,一个人或多或少的总能有几项,那么有几项就好好积累几项,好好上课做作业可以帮你答题,有实习就好好做可以帮你拿refference和为简历增色,有老外愿意跟你扯淡就好好扯可以练表达,有旅游就赶紧上路可以帮你长见识建气场。总之要让自己有货。

展示包括但不限于:简历、求职信、各类面试和在Career Fair去跟人扯淡。没有积累,属于无货可倒;有积累而不会展示,属于有货倒不出。我觉得后者更惨一点。

所以,在积累的过程中,一定要注意积累“如何展示我的积累”这个技能,比如怎样写简历,怎样交流,怎样面试。

把积累和展示做好了,我觉得找到工作——至少是找到实习职位——不是难事。

为啥要选择一个我入职时不满40人、成立还不满一年的公司,而不去选上市公司(Yelp.com)或者是用户几亿的非盈利网站(Wikipedia)呢?

首先,是因为……Carerr Fair上我没有找到梦想公司的摊位(Apple)导致我简历都没有扔出去,于是剩下的公司无论规模还是知名度来讲在我眼里都是平等的了。

其次是我仔细考量了Nebula做的东西和Founder(NASA前CTO),感觉上十分之靠谱。另外此公司对一个云计算的开源项目贡献巨大,很合我心意。

再次,是因为相比大一点的公司,我更能感受到初创公司对人的渴望。我面了三个初创公司,一个初次面试就是CEO/Founder亲自上阵(我很无耻的fail掉了二面);Nebula则是VP打电话来游说我,此VP是第一个图形化浏览器的作者之一,还是Netscape的founding engineer;最后一个公司也是Founder/CEO打电话来游说我加入。一个刚刚到美国不到一年的小硕士哪见过这种阵势,立马被震撼住。

再次次,Nebula给的薪资虽然不是最好,但是在拿到的几个offer里面也是比较抢眼的,而且公司就在Palto Alto downtown,硅谷腹地,斯坦福旁边。

最后,因为这个选择很刺激……

于是我接受了它的offer。

14周的实习之后,回头看看,嗯,一点也没有后悔。

先写写这14周的收获和感受吧:

1 成为一个开源项目的贡献者,大大小小提交了十几个patch,独自完成了一个feature的开发,这个feature会被打包在下一个发行版中。

2 了解了开源社区的运作机制。

3 技术和学习能力得到提升。

4 了解了硅谷初创公司的活力和艰辛,了解了关于创业、融资、产品等等方面的概念。

5 见证公司的飞速发展,一周入职7个人这种事情也见了一两次。

6 跟CEO面对面吃饭插科打诨,跟业界大牛在聊天软件上开开玩笑,每天穿着人字拖从家里走到公司,轻松愉快的小公司气氛深得我心。

7 在硅谷简直就是步步有惊喜,不知不觉中路过了无数以前只是听说过的公司HQ(Quora, 10gen Mongo DB, Flipboard….)

总结起来就是靠谱小公司有轻松愉快的氛围,紧张有序的工作以及实打实的挑战和学习机会。

有好也有不好,跟大公司比起来,缺点也比较明显:

1 虽然薪资还不错,但是没有Google的免费食物和Facebook的免费实习生宿舍,在Palo Alto这种物价和税都是bug的地区,工资常常就是转手交给了房东和餐馆。

2 组织的再好的小公司,因为太年轻,管理上还是难免会有点点混乱。比如HR在最后一周不知道我离职的日期。

3 问return offer的时候,被告知因为公司太年轻,不知道一年之后会不会幸存、垮掉或者被收购,所以没有正式return offer,但是欢迎半年之后来找全职工作。

还好,这些缺点都是在我预料之中或者是可以接受的。

写这么多,没有鼓励大家都跑去初创公司的意思。每个人都有适合自己的工作和生活方式,上面也列出了小公司的好与不好,大家可以作为参考。

结尾总结一下就是,选择适合你的才是最重要的!

关于Hackathon的那些事

今天三藩正在举办这个暑假最热门的一场hackathon:Greylock Hackfest。之所以热门,是因为它的评委包括了Instagram CEO和LinkedIn co-founder,而最后的第一名的奖品包括跟这些牛人一起吃一顿饭……

但是我没有去,因为我实在是不想熬通宵了。但是又有点不甘心,那就借着周末的时间写写这个话题吧。

Wikipedia一下就能发现Hackathon这个习俗来自于FreeBSD和Sun的一群人,简单来讲就是把Hack和Marathon这两个词杂交一下,意思是很长很长的Hack。大多Hackathon就是简单的集中起一群Hacker,指定一段时间(半天、一天至一周不等),最后拿出一些小型但是完整的项目(产品)。跟别人说起来,甚至有点无聊:就是一群人集中起来不停的写24个小时代码。但是实际上,真正的hacker对这玩意是会上瘾的(我算不上真正的hacker,这不到一年的时间就已经参加了四次)。而真正的上瘾的人,比如我上次Facebook Hackathon的队友,会在周末没事的时候自己找一群人来一发Hackathon,就跟中国人周末打麻将一样……

言归正传,后来hackathon这种活动被Facebook发扬光大了。我们知道扎克伯格是个很纯正的hacker,而Facebook最开始就是这个人独自在宿舍里写出来的,相当于是一个个人的hackathon产物。由此可知扎克伯格是个重度的hackathon上瘾者,不用组织人自己就能来一发……于是Facebook整个公司就继承了他个人的这个风格,进去它的总部大门,就能看到一面墙上写着大大的HACK;然后它时不时的会中断员工正常的开发流程,组织一场公司内部的hackathon,围绕着Facebook的一些功能做一到两天的集中开发。让人津津乐道的Facebook Like按钮就是它内部hackathon的产物。尝到甜头的Facebook每年都会组织一次全公司范围的这种活动,还会跑到美国各大CS强校去搞。慢慢的硅谷里面就开始盛行hackathon,各个公司,从10个人不到的Startup到Yahoo!这种互联网老人,都会时不时来一发。

典型的hackathon现场是3-4四个人一桌,十几桌一起稀里哗啦的敲键盘,时不时拿快白板来涂涂画画,偶尔还来个High five,大概是因为他们解决了什么关键性的问题。屋子里的一角放着咖啡和能量饮料,饭店了会有pizza送上门,组织者坐在另一个角落值班,然后开着音箱放音乐。

对没错,跟棋牌室差不多。

如果你听完了还是觉得很有意思,那我就简单来说说我这一年参加这些活动的感受和经验。我参加过的四场Hackathon有三场是大公司来我们学校搞的,分别是Yahoo!、微软和Facebook,还有一场是这个暑假在三藩参加的一个小startup举办的。四场里我和我的队友们拿了一个第一(微软),一个第三(Facebook)和一个提名(不知名startup)。以下是我的几点感触:

  1. 不打无准备的仗。参加Hackathon毕竟不是打麻将,端杯茶上桌就好。如果想要实实在在做出点什么东西,前期的准备是万万不可少的。准备包括但不限于:想创意、组团队和搭环境。
  2. 创意的可执行度最重要。一个点子可以很好,但它不一定是适合Hackathon的,毕竟只有那么短的时间,你们只有那么点人,怎么样能在如此之短的时间内做出一个让大家眼前一亮的完整的作品。
  3. 团队分工要明确。谁做前端谁做后端谁做设计都要在开始前明确好,不然真正开始项目会手忙脚乱。
  4. 产品展示很重要。实际的开发时间是Hackathon规定时间减去你调试和准备展示的时间。不要小看最后2-3分钟的产品展示,如果这部分演咋了你可能一天都白干了。

以我参加的Facebook校园Hackathon为例。提议前一周我和朋友开始组件团队,最后一共四个人,我做前端,两个人做服务器一个人做算法。四个人开了两次会,确定了主题:一个Chrome插件,通过Facebook帐号登陆后插件可以根据你当前浏览的新闻、网页开启一个聊天室,让你在里面跟那些正在阅读相同内容的人聊天。然后简历了git repo,明确了用什么技术。说实话这个点子有点复杂,设计到的方面太多,本来不太适合,但那24个小时我们配合得很好,本来我认为这是一个有潜力做冠军的项目,可是我们在最后20分钟新加了一个feature,没有测试就准备上台演讲,最后服务器down掉了,重启服务器占据了我们演示时间一大部分,最后就拿了个第三。
对于组织(特别是公司)者来讲,其实组织一次hackathon是一次成本不高的宣传自己并且招揽人才的方法,而且能树立一个很“酷”的公司形象。我个人则是觉得,组织一场hackathon跟开一个棋牌室差不多。

  1. 要有噱头,奖品要好。我开头提到的那个奖品就很丰富,跟硅谷的传奇人物们一起吃饭。Facebook校园Hackathon的奖品则很奇葩:去总部跟各个学校的冠军队伍再来一次Hackathon。但是,在总部的那场的评委是扎克伯格自己。这样一来,既达到了宣传效果,又能吸引高质量的参赛者。就算那个8个人的小公司,奖品也是人手一台Retina Macbook Pro
  2. 关于主题,可以定也可以不定,但是不能用一个很小的题目把参赛者禁锢住。比如像“开发一个可以connect people的东西”这样的主题就很好,“开发一个聊天工具”这样的主题就很烂。
  3. 要明确评判标准,开始之前就列出会从那几个方面来评判最后作品水平的高低。
  4. 要有好吃好喝,特别是提神的东西。

其实细细想来,一次hackathon就是一次微型的产品开发过程,从策划到开发到测试到上线,全面的考察了一个团队的综合水平,难怪各大公司对这类活动趋之若鹜。

当然,对于参与者来讲,恐怕的活动最大的吸引力,还是hack, create and have fun!

Network Analysis用到的工具小结

算是上篇的一个补遗

Networkx

这是一个python库,封装了几乎所有网络分析所需要用到的类和函数。可以构造directed和undirected网络,把网络写成各类格式的文件,有各种属性(Degree,Betweenness,Pagerank等等)的算法。上手简单,用easy_install和macport都能安装。

igraph

一个多语言的库,我主要用到的它的R Package,能够帮助我比较方便的进行一些统计方面的计算和绘图。

Gephi

一个跨平台的网络分析工具,我主要用它来进行视觉化。用networkx把网络serielize成GraphML格式的文件,然后用gephi进行视觉化。它还有很多plugins可以安装。

Guess

我的教授自己写的网络分析工具,可以自己写很多script导入,灵活性比较高。

另外就是Twitter和微博的API,大概就这些,以后有新的再加。

Twitter中文top用户和新浪微博top用户对比

这学期的一个课程项目,写出来跟大家分享一下。

一直都会有这种说法,Twitter上的中文用户比微博上的用户更开放,更喜交流。正好这个学期在上网络分析的课,就试图用课上的知识分析一下两边的网络所呈现的状态。

  • 数据收集

我们先用follower数定义出top用户,按照follower数由大到小排rank,取前100做为top用户。微博本身提供了排行榜,其中人气榜是按照follower数量来的。我们先抓取了人气总榜的前100,后来意识到这个总榜里大多数都是明星,跟Twitter的top中文用户差别太大,于是又抓了微博上草根榜前100。

Twitter中文数据比较难办,我参考Twitese的代码,自己写了一个很简易的版本。抓了14w条最近发的推、简介和用户名里有中文的用户,另外写了一些额外的条件保证韩国和日本友人不要跑到我的数据库里来。最后按照Follower数取了前100.

然后分别分析这三个top用户组之间互相关注的情况,得到了三个用户网络分别是Top_Twitter(Twitter top中文用户),Top_Weibo(微博人气总榜top)和Top_G_Weibo(微博草根人气榜top)。其中每一条Edge都代表一个关注关系,每一个点都代表一个用户。这个网络是directed的,就是说从节点A到节点B的edge和从节点B到A的edge是两条edge。

  • 分析

用户交流:

从下面这个图,大概就能看出三个网络中用户的联系程度了。图中点的颜色越红,代表它受到其他点的关注读越高,Top_G_Weibo里有很多孤立的点。:

Overview Visualization

详细数据如下。

网络基础属性

从这个表里可以看到,Top_Twitter这个网络的关注关系的总量差不多是Top_Weibo的两倍,是Top_G_Weibo的5倍左右。这说明在这个三个网络中间,Twitter用户更愿意关注别人。

Global clustering系数代表了点与点之间联系的紧密程度。系数越大,联系越紧密。从表里面同样可以看到,Top_Twitter网络里的节点联系更紧密。

Strong connected component指的是,如果网络中的一个子网络里没一个节点都能到达另外一个节点,那么这个子网络就是整个网络的一个strong connected component。详细看下表:

Strong Connected Component

表里第一行是component的个数,第二行是每个component里的节点数的列表。Top_Twitter里只有一个点可能不被其他点reach到。而Top_G_Weibo里这样的点多达30个。

另外一个重要的数据是每日发推量。Top_Twitter里的用户平均每日发推数量是10.62,Top_Weibo里是4.56,Top_G_Weibo里是4.35。从这个数据也可以看出Twitter中的top中文用户更活跃,愿意发表意见与人交流。

用户多样性:

用户多样性是一个不太好考查的东西,我们讨论后决定,用用户所在地的分布来分析用户多样性。

Location Distribution

三个图中的圆圈上的每一个点都是一个地点,从每个点伸出去的轴都是在同一地点的用户。可以看到三个网络中北京的用户都是处于绝对多数的地位。圆圈的大小则代表100个用户所在地的多样性。Top_Weibo的中心圆最小,明星大多都在香港北京台湾…因为Top_Twitter和Top_G_Weibo里有太多用户的地点是Unknown或者Other,所以他们的多样性,还需要进一步检查。另外注意到Twitter网络里有些用户来几个热点事件地点。

另外我们还考查了几个拥有最大用户数的地点之间的关系:

cities_network.png

北京真是一个超大的hub。另外除了中间那个爆多明星的网络,另外两个网络都显示广东跟北京互动的最多。

  • 讨论

整个项目还有很多可以改进的地方,像location就可以尝试抓取更准确的数据。另外抓取的三个网络全部都是搞biased的网络,如果需要知道整个网络的状况,需要更随机的取样。另外如果可以分析retweet、mention和各个推的内容,就能更准确的分析节点之间的互动了。

下个学期注册了独立学习课程,准备把这个项目继续下去。