第1章 写在前面

1.1 数据工程和编程语言

数据工程和编程语言

近年来大数据(BigData)的概念火得不行,之前流行的互联网+,换成大数据+后又成就了一大批创业公司。政府部门对大数据战略部署同样重视,各种大数据产业园和科技区如雨后春笋般火热发展。很多不同行业的人言必称大数据,时常把大数据时代的4个V和3种思维参见《大数据时代》, [英]维克托·迈尔-舍恩伯格·肯尼思·库克耶◎著,盛杨燕周涛◎译挂在嘴边,但他们心里所说的和实际所做的,大多只是大数据领域上层应用中的一个子集,即基于数据做一些统计、分析和展示,甚至很多时候数据并不满足“大”的特征。

当然,这本书的目的并不是探讨大数据的知识体系和技术架构,而是从个人角度出发,介绍如何在时间有限(可能你并不是大数据领域的专业从事人员)和资源有限(可能你只有一台笔记本电脑可以运行程序)的条件下,实现一些个人能力足以完成的、简单而有趣的数据工程和数据应用。这本书的读者可能已经具备一定的编程基础,也有可能之前未曾接触过任何代码,在经过恰当的学习和足够的练习之后,都可以拿出自己的笔记本电脑,独立实现让人惊艳的数据成果和作品。

1.1.1 如何玩转数据

在进行一项数据工程之前,首先需要考虑并解决一些问题,想清楚这些问题的答案比直接撸起袖子写代码更为重要。

1.获取

我们的数据从何而来?巧妇难为无米之炊,如果希望做出有价值、有意义的成果,所用数据的数量和质量都应得到保证。理想情况下自然是别人准备好数据提供给我们,但现实情况往往是需要我们自己去获取。如果不具备大规模部署传感器和海量用户上传数据等采集数据的能力,那么通过爬虫从已有网站上获取结构化数据则是唯一的解决途径。因此需要考虑并解决的问题包括以下几点,我需要哪方面的数据?哪些网站已经具备了这些数据?我需要从这些网站分别采集哪些数据?多大的数据量才能满足我的需求?数据是一次获取即可,还是需要持续更新?如果需要持续更新,应当达到怎样的更新频率?

2.存储

我们需要把获取的数据存储下来,以便进一步使用。不同的数据量和数据类型,可能适合于不同的存储方案。对于数据量较少、后续处理较简单的情况,可以将数据存储到静态文件中,如txt、csv、json等格式文件。这种方法读写都十分方便,并且易于数据的复制和共享。对于数据量较大、后续处理较复杂的情况,可以将数据存储到一些通用而且成熟的开源数据库中,如MySQL、PostgreSQL等关系型数据库,以及MongoDB、Neo4j等非关系型数据库(NoSQL)。这种方法更为稳定且易于维护,支持数据的Create、Update、Read、Delete等后续操作。如果有部署Web网站应用的需求,那么将数据库作为后端数据存储则是更好的选择。因此需要考虑并解决的问题包括:我有多大数据量需要存储?后续处理是否复杂?数据是否会持续更新?我应该选择哪种数据存储方案?

3.分析

在经过必要的清洗工作之后,我们希望从数据中挖掘出感兴趣的价值和结论。一方面可以进行一些简单的计算汇总工作,从不同维度聚合出对应的结果;另一方面也可以从统计学或机器学习的角度出发,分析数据不同字段之间的关联,同时训练一些分类或聚类分类和聚类的概念参见第10章机器学习的模型,用以解决实际应用问题。不同类型的数据,如文本、数值和类别值等,所涉及的数据分析方法可能完全不同。因此需要考虑并解决的问题包括:我的数据属于何种类型?我希望从数据中挖掘出哪些价值?我希望通过数据完成哪些任务?我应当选择哪些分析技术和算法模型?

4.可视化

用数据可视化的方法表达和展示所得结论。正所谓一图胜千言,枯燥的数据和苍白的语言也许并不足以承载数据的价值,而借助图形、色彩、布局等视觉元素则能更生动、更丰富、更全面地诠释数据的灵魂。我们既可以使用散点图、折线图、柱状图等经典图形,也可以大开脑洞去尝试一些天马行空的表达形式,充分探索组织图形、色彩和布局等内容的可能性。因此需要考虑并解决的问题包括:我需要展示哪些数据和结论?哪种图形和表现形式最能满足我的需求?可视化是选择静态图片、交互网站,还是动态视频?

如果以上4个步骤的问题都已经想清楚,那么恭喜你,可以按照你的想法开始玩转数据了。通过获取、存储、分析和可视化,将原始数据逐步提升为信息、知识和价值,这便是玩转数据最大的魅力和乐趣所在。

1.1.2 关于编程语言

哪种编程语言最好,最适合做数据工程?如果真要讨论起来,这将是一个永远没有结论的哲学问题。既然无法给这个问题一个合适的答案,不如将单选题变为多选题,毕竟只学习一门语言可能远远不够。以全栈数据工程师为目标,我们应当各方面内容都有所涉足,同时具备自己最为擅长和习惯使用的一至两门语言。

C++和Java这两门语言最好熟悉其一,从而了解编程语法的基本内容和面向对象的编程思想。熟悉的要求是指不用完全掌握和精通,在需要用到的时候查一查,能够快速回想起相关内容即可。很多人会发现,掌握一门语言之后,再去学其他语言便能很快上手,因为不同语言之间的编程思想都是基本相通的。

Python是一门简单好用而且功能强大的语言,也是笔者使用最多、最为熟悉的一门语言。Python的强大之处在于其具备极为丰富的功能包,从前端到后端,从软件到硬件,从机器学习到自然语言理解,几乎无所不包、全栈通吃。同时对语法的约束和限制也没有C++、Java那样严格,因此非常适合新手学习。有一句经典的玩笑话,“Python大法好,除了炒菜别的都可以干”。

R是一门统计分析语言,和Python类似,具有数量众多且功能强大的包,以及庞大而活跃的用户社区。近年来R的学习门槛和成本都在不断降低,可以用于进行专业的统计分析和图形绘制,极力推荐同时掌握Python和R。

除此之外,还有和Web网站开发相关的一些语言,如前端的HTML、CSS和JavaScript,后端的PHP、NodeJS等。在这些语言的基础上还衍生出了丰富的封装和框架如果将原始语言理解成木材,那么封装和框架便是造好的轮子,可以大大节省开发时间,便于用户更快、更好地进行开发。就像Python的功能包难以全部掌握一样,和Web网站开发相关的封装和框架更是难以全部熟悉。

笔者个人习惯于使用Python获取数据并写入文件或数据库中,结合Python和R进行数据分析和挖掘。至于数据可视化部分,则使用R绘制静态图形,基于Web网站实现动态交互可视化。

本书的后续章节将以Python为主,完整地介绍如何进行数据的获取、存储、分析和可视化,以个人能力独立完成一些有趣的事情。