本节书摘来华章计算机《数据驱动安全:数据安全分析、可视化和仪表盘》一书中的第1章 ,第1.2.2节,[美]杰·雅克布(Jay Jacobs)鲍布·鲁迪斯(Bob Rudis) 著 薛杰 王占一 张卓 胡开勇 蒋梦飏 赵爽 译, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.2.2 编程技能
不管我们如何将数据科学描绘成对知识、真相的极具魅力的追寻过程,正如我们所提到的,数据科学也会有一些杂乱。这只是一种保守的说法,和数据打交道具有超出想象的大量的不确定性和混乱,不幸的是,这些混乱经常早早地出现在我们尝试收集和准备数据的时候。这些过程是很多数据统计的课程从来没有为学生们准备的,教授直接拿出准备好的相当整洁漂亮的数据集,可以直接导入到数据分析工具内。而一旦学生们离开温暖的课堂时,他们将会立即意识到世界是不规则的,充满了混乱的,而数据(以及后续的分析过程)则是这个混乱世界的真实反映。
在数据科学中有一个冰冷、惨痛的教训:获取到的数据具有大量的不同的格式、状态和参差不齐的质量。数据可能嵌入在非结构化或半结构化的日志文件中,或许需要从网络站点去搜刮,更有甚者,数据来源于极其复杂令人心烦的数据格式,如XML。但是,我们也需要找到方法来收集、整理数据,将其调整到能支持深入分析的数据格式。虽然这些工作可以凭借极大的耐心、文本编辑器、明智地用暑期实习生来完成,但是长远看来,编写程序脚本来完成,可以提供更多的功能性和灵活性和高效性。学习基本的编程技能也会为数据处理提供更多的可能性。这样可以随意接受不同格式的数据并将其转换为最适合分析软件使用的任意数据格式。即便现在能获取到很多称手的数据格式转换工具,它们也无法预见和适合我们将遇到的每种情况。要做到真正高效地处理数据,需要我们去适应数据,而非相反。
256位的AES密钥强度是128位密钥的两倍吗?
因为256位AES密钥长度是128位的两倍,因此对256位AES密钥很自然的猜想是前者的安全性是后者的两倍。由于所谓的“加倍的安全”,我们身边的信息安全人员要求一些项目使用256位密钥。既然如此,我们就来看看这里边的数学原理吧。第一点,正如我们说到的“位”,虽然256位确实是128位的两倍长,但是256位密钥实际上也只多了2128倍的密钥数。我们来打破书本常规并试试回答一个简单地问题:如果你能获取到世界上最快的超级计算机,那么能你破译多少128位的AES密钥呢?
目前(截止到本书撰写的时间)世界上最快的超级计算机是中国的“天河-2号”,它能够每秒进行大约34千万亿次(34×1015次浮点运算)。我们假设其能够一次运算产生一个密钥,再一次运算来验证这个密钥(这个假设是荒谬且保守的),我们每秒能够测试验证惊人的17×1015个密钥。但是128位密钥具有3.4×1038个不同的密钥,意味着用超级计算机整整破解一年后,也只是仅仅探索了密钥空间的百分之1.6×10–13。即便让这超级计算机运行1000年,我们也仅仅是搜寻了密钥空间的百分之0.0000000000016(而且耗费了巨量的电力资源)。
我们简化一下这个问题,暴力破解128位AES密钥的可能性已经如此微小,以至于可以认为是0了。我们可以在这里很专业地说,将128位密钥提升到256位是将破解的可能性从超级无穷小变成2128倍的超级无穷小。
任意的现代编程语言都支持基本的数据操作,但是一些如Python、R等脚本语言似乎在数据分析中比Java、C等编译语言更加常用。即便如此,编程语言其实是无关紧要的,最终的分析结果(以及一个愉快的分析师)比选一门“最好”的语言更重要,能花费最少的精力来完成分析工作就是最好的语言。我们清理、转换数据格式使用的语言一般在Python(pandas)以及R语言之间来回选择(或者有些怀旧的人会选取Perl语言),然后再用R语言或者Python来做数据分析、可视化的工作。学习一些Web相关的语言,如HTML、CSS以及JavaScript有助于创建基于Web的交互式可视化,正如我们将在第11章看到的,但是在数据准备和分析的过程中通常不涉及Web语言。
在本章中有个值得一提的工具:“网关工具”,其介于文本工具和编程之间,也就是电子表格(如微软的Excel或者OpenOffice的Calc)。电子表格可让非程序员做出一些神奇的东西,能快速地得到一些产出结果。尽管电子表格面临一系列的挑战和缺点,但它们也确实具有一些好处。如果处理的数据量不是很大很复杂,以及处理的任务不如“决定世界经济未来走向”重要的话,Excel可能是解决问题的最适合工具。我们强烈推荐选用Excel作为临时的解决方案,其能很好地快速处理一次性任务。但是如果你有一个需要重复分析的任务或者反复使用的模型的话,最好用某种结构化编程语言来处理。
作为一种数据清理工具,使用电子表格初看起来是一个不错的解决办法(尤其是对一些熟悉这方面技能的人来讲),但是电子表格是事件驱动的,意味着它们需要通过点击、打字、拖拽来工作。如果想用来转换一行数据,你就不得不点击表格,选中该行数据,然后再转换数据。这适合一些小的数据集或者快速的任务,但是相信我,你将会(比预期的还频繁)不得不回溯原始数据然后重新清理它。某一天,也许你有一些新的日志文件需要处理,也许你会意识到应该再从原始数据中提取另外的数据关系,也许(累得喘息)你在数据清理过程中发现了一个错误。也许不止一次地,某个点、某个处理细节会导致你重新回溯原始数据,然后重复数据清理以及转换的过程,利用电子表格的话,意味着你需要更多的无数次点击。然而,写一个脚本来运行的话,就可以很轻易、灵活以及一致地执行数据清理过程。
电子表格的限制
在2013年1月16日,摩根大通向股东发表题为《有关摩根大通有限公司 2012 CIO 损失的管理工作报告》(Report of JPMorgan Chase & Co.Management Task Force Regarding 2012 CIO Losses)的报告(在附录B可见完整引用),在报告中,他们调查了在交易中损失的60亿美元。他们对执行故障做了详细审查,并将电子表格作为推波助澜的一个因素。“在审查过程中,额外的操作性问题变得明显。例如,通过一系列的Excel电子表格来操作的模型中,人们必须手动通过粘贴/复制(复制到另外的表格)来操作。”他们发现了一个对电子表格的巨大挑战:在数据计算过程中如何保证数据的一致性和完整性。“我们手动上传的数据缺乏质量控制,以电子表格为基础的数据计算缺乏足够的控制,以及充满了公式、代码频繁变更。”他们接着将电子表格数据模型标记为“错误”以及“难以扩展”。和任何复杂的系统打交道的时候,大量的故障导致数据的灾难,我们很难将电子表格产生的“错误数据”指认为导致损失的主要原因,但是可以肯定的是,其中有它的作用。
在数据准备好进行分析之后,如果会编程的话你就会感到得心应手。很多我们在此提到的编程语言都内置了数据分析的特性。例如,统计学家专门出于数据分析的目的开发了R语言。Python及其扩展包NumPy、SciPy以及pandas,提供了丰富可比较的数据分析环境。但是,仅仅准备和分析数据是不够的,我们还需要表达分析的结果,其中最有效的方法之一就是数据可视化(这个主题占据了本书的好几个章节)。同样,Excel也可以产生一些图表,修改一些Excel的默认设置,就可以得到好的可视化效果。但是在我们看来,复杂的详尽的数据可视化都是通过编程产生,Python和R语言都有一些功能丰富的工具来产生以及探索数据可视化。在很多实例中,你也可以在同一个脚本中结合所有的步骤和函数,可以写一个脚本来抓取原始数据、操作和清理数据、分析数据,然后再对分析结果可视化。