《数据整理实践指南》一第2章 是我的问题还是数据的问题

第2章 是我的问题还是数据的问题

数据整理实践指南
Kevin Fink

假设给你一份未知来源的数据集,如何确定数据是否有用呢?

这种情况并不少见,给了你一份数据集,却无法提供关于数据来源、如何收集、字段含义等方面的诸多信息。事实上,收到这样的数据可能再正常不过了。在很多情况下,收到的数据可能经过了很多人的处理和加工,和收集的原始数据已经差别甚大,确实也没有人知道这些数据是什么含义了。在本章中,我将一步步引导你如何理解数据、验证数据并最终把数据集转换成可用的信息。特别地,我将探讨洞察数据的特殊方式,并给出一些示例,说明自己从中学到了什么。

首先,我先简单提一下自己的背景。在过去25年里,我一直在处理很多不同的数据。我编写代码,处理加速计和水听器信号,分析水坝和其他大型架构(哈维姆德学院工程专业的本科生);分析不同种类的蝙蝠叫声(华盛顿大学电子工程专业的研究生);构建对图像声纳数据进行可视化的系统(应用物理实验室的研究助理);利用大量的Web内容构建内容过滤系统(N2H2公司的联合创始人和CTO);为门户软件设计内网搜索系统(DataChannel),并且把多个目录辅助数据集结合到可搜索的网站中(WhitePages.com的CTO)。在过去5年的时间里,我在Demand Media公司花了大部分时间使用很多不同的数据源构建广告和内容推荐系统的优化系统,对大规模数据驱动的搜索引擎优化(SEO)和搜索引擎营销(SEM)有广泛涉猎。

大多数示例涉及我在广告优化、内容推荐、SEO和SEM方面相关的工作。和其他大多数领域一样,这些领域也有自己的术语,表2-1列出了一些相关术语的定义。

2.1 理解数据结构

当收到数据集时,第一个障碍往往是无法访问。不过,暂时忽略这些问题,假设可以读取该数据集所在的物理媒介,对它进行解压或通过其他方式抽取文件,把数据转换成某种可读形式。一旦完成这些,下一步是要理解数据结构。传输数据时,往往会使用很多不同的数据结构。庆幸的是,有很多数据结构实际使用并不频繁。我将重点讨论最常见(也是最容易处理)的几种格式:表格(Columnar)、XML、JSON和Excel。

最常见的格式是表格(也就是说,数据是按行和列存储的)。列可以由制表符(tab键)、逗号或其他字符分隔,这些列可以是固定长度。行一般由换行符和/或回车符分隔。对于某些较小的数据集,数据可能是某种专门格式,比如各种Excel版本所使用的格式,但是很容易通过适当软件将其转换成更简单的文本格式。我经常收到Excel电子表格,几乎总是马上把它们导出成tab分隔的文本文件中。

CSV格式的文件是最常见的。在这些文件中,每条记录一行,各个字段用逗号分隔。有些值或所有值(特别是字段内的逗号)可能会通过引号或其他字符引起来,以和分隔符逗号区别开。最常见的情况是,如果使用逗号作为分隔符,包含逗号的字符串就通过双引号引起来。有时,会把所有的字符串都引起来,有时只把那些包含分隔符的字符串引起来。Excel会自动加载CSV文件,大多数编程语言也都提供库处理这类文件。

注意
 在下面的例子中,会使用一些基本的UNIX命令:尤其是echo和cat命令。这只是为了简单说明示例数据。以$开头的行,表示在UNIX Shell终端下运行的命令。举个例子,由于制表符(\t)和空格在页面上看起来很相似,我会通过下面这种方式生成数据:

$ echo -e 'Field 1\tField 2\nRow 2\n'

该示例数据包含两行,第一行有两个字段,分隔符是\t。 我还会详细探讨绝大多数的管道,如下所示。

$ cat filename |
虽然在实践中,你可能是把文件名作为第一个命令的参数。也就是说,命令

$ cat filename | sed -e 's/cat/dog/'

和命令在功能上完全等价(而且后者更高效)。

$ sed -e 's/cat/dog/' filename

下面这行Perl代码从CSV文件中抽取第三个和第一个字段。

$ echo -e 'Column 1,"Column 2, protected","Column 3"'
Column 1,"Column 2, protected","Column 3"

$ echo -e 'Column 1,"Column 2, protected","Column 3"' | \
     perl -MText::CSV -ne '
     $csv = Text::CSV->new();
     $csv->parse($_); print join("\t",($csv->fields())[2,0]);'
Column 3     Column 1

下面这段Perl代码可读性更好。

use Text::CSV;

while(<>) {
 my $csv = Text::CSV->new();
 $csv->parse($_);
 my @fields = $csv->fields();
 print join("\t",@fields[2,0]),"\n";
}

大多数数据并不包含\t,因此它是一个很安全、很受欢迎的分隔符。以\t 分隔的文件通常不允许在数据中包含\t,因此不要用引号或转义字符,使得\t 分隔的文件比CSV文件更容易处理。使用UNIX命令行工具可以很容易地处理以\t分隔的文件,比如perl、awk、cut、join、comm等。很多简单的可视化工具(如Excel)可以半自动化方式导入\t分隔的文件,每个字段作为一列,很方便人工处理。

以下几个简单的示例,输出以\t 分隔的字符串的第一个字段和第三个字段。cut命令只会按出现的顺序输出数据,但其他工具可以重新组织数据。以下示例分别使用cut、awk和perl输出第一个和第三个字段。

  $ echo -e 'Column 1\tColumn 2\tColumn 3\n'
  Column 1 Column 2 Column 3
cut:

$ echo -e 'Column 1\tColumn 2\tColumn 3\n' | \
     cut -f1,3
  Column 1   Column 3
awk:

  $ echo -e 'Column 1\tColumn 2\tColumn 3\n' | \
       awk -F"\t" -v OFS="\t" '{ print $3,$1 }'
  Column 3   Column 1
perl:

  $ echo -e 'Column 1\tColumn 2\tColumn 3\n' | \
       perl -a -F"\t" -n -e '$OFS="\t"; print @F[2,0],"\n"'
  Column 3   Column 1

在某些场合,XML是常见的数据格式。虽然XML并没有真正非常流行,但一些数据库(比如BaseX)以XML作为内部存储格式,其他很多数据库支持直接以XML格式导出数据。对于CSV,很多语言提供库,可以把它解析成本地数据格式,对数据进行分析和转换。

以下是一行Perl代码,它从XML中抽取字段。

$ echo -e '<config>\n\t<key name="key1" value="value 1">
\n\t<description>Description 1</description>
\n\t</key>\n</config>'
<config>
   <key name="key1" value="value 1">
   <description>Description 1</description>
   </key>
</config>

$ echo '<config><key name="key1" value="value 1">
     <description>Description 1</description>
     </key></config>' | \
     perl -MXML::Simple -e 'my $ref = XMLin(<>);
     print $ref->{"key"}->{"description"}'
Description 1

下面这段Perl代码可读性更好。

use XML::Simple;

my $ref = XMLin(join('',<>));
print $ref->{"key"}->{"description"}';

虽然JSON主要是用于Web API,以在服务器和JavaScript客户端之间传输信息,但它有时也用于传输大量的数据。有很多数据库把JSON作为内部数据格式(如CouchDB)或使用了序列化的JSON格式(如MongoDB),因此从这些系统中导出的数据通常是JSON格式。

下面一行Perl代码从JSON文件中抽取一个节点信息。

$ echo '{"config": {"key1":"value 1","description":"Description 1"}}'
{"config": {"key1":"value 1","description":"Description 1"}}

$ echo '{"config": {"key1":"value 1","description":"Description 1"}}' | \
     perl -MJSON::XS -e 'my $json = decode_json(<>);
     print $json->{"config"}->{"description"}'
Description 1

下面这段Perl代码可读性更好。

use JSON::XS;

my $json = decode_json(join('',<>));
print $json->{"config"}->{"description"}';
时间: 2024-09-23 10:23:34

《数据整理实践指南》一第2章 是我的问题还是数据的问题的相关文章

《数据整理实践指南》一第1章 从头说起:什么是噪音数据

第1章 从头说起:什么是噪音数据 数据整理实践指南我们都口口声声说喜欢数据,实际上并非真的喜欢. 我们喜欢的只是洞察数据,这和喜欢数据本身并不一样. 实际上,很多人和我一样,甚至可以说并不关心数据本身. 什么是噪音数据(Bad Data)呢?很难给它下个准确的定义.有些人认为它纯粹属于经验上的.技术方面的问题:缺失值.记录格式不对或者是蹩脚的文件格式.当然,这些都属于噪音数据,但是实际上噪音数据涵盖的范围要比这广得多.噪音数据还包含那些浪费你的时间.导致你不得不在公司加班以及那些让你崩溃欲哭无泪

《数据整理实践指南》一导读

前 言 数据整理实践指南本书使用的体例提示 这个图标代表小窍门.建议或一般注解.警告 这个图标代表警示或警告.代码范例的使用本书是帮助你完成工作的.一般说来,你可以在没有我们许可的情况下,在程序和文件里使用本书中的代码,除非你在重复创建代码中极为重要的一部分.比如说,写一段程序要用好几段本书中的代码,不需要经过许可.而销售或发布来自O'Reilly书籍中配套的CD-ROM是需要经过许可的.通过引用本书内容和代码示例回答问题不需经过许可.但将来自本书的大量代码示例合并到你的产品文档时,必须经过许可

《Python数据科学实践指南》——第0章 发现、出发 0.1 何谓数据科学

第0章 发现.出发 最近一年里,知乎社区有不少朋友邀请我回答关于数据挖掘的问题,其中提问最多的是关于"如何改行做数据挖掘".我想他们之所以邀请我回答这类问题,不是因为我做数据挖掘做得好,而是好奇我是如何改行做数据挖掘的?说来也巧,我本科是学电子的,研究生是学控制的,而我的职业理想是成为一个"先知",但我并不知道如何才能实现这一职业理想.自公元632年人类最后一位先知默罕默德去世之后,将近1400年没人做先知了,既没有人可以指导我,也没有可以效仿的对象.2011年到2

《Python数据科学实践指南》——第1章 Python介绍 1.1 Python的版本之争

第1章 Python介绍 本书主要介绍数据科学所使用的工具,但因为每一种语言都有自己的生态系统,而笔者多用Python,所以本书主要会从Python的角度来介绍这些工具.阅读本书的读者,不管之前的基础如何,如果对Python这门编程语言有一定的了解,将能更好地掌握书中内容.可能有很多读者曾经在学校里学过C/C++或是VB,又或者听说过Java.PHP等这样广泛使用的编程语言,初闻Python的时候可能会对这个名字略感陌生,不过这一点并不能阻碍Python成为数据科学领域的"一等公民".

《Python数据科学实践指南》——第1章Python介绍

第1章Python介绍本书主要介绍数据科学所使用的工具,但因为每一种语言都有自己的生态系统,而笔者多用Python,所以本书主要会从Python的角度来介绍这些工具.阅读本书的读者,不管之前的基础如何,如果对Python这门编程语言有一定的了解,将能更好地掌握书中内容.可能有很多读者曾经在学校里学过C/C++或是VB,又或者听说过Java.PHP等这样广泛使用的编程语言,初闻Python的时候可能会对这个名字略感陌生,不过这一点并不能阻碍Python成为数据科学领域的"一等公民".从本

《数据整理实践指南》一2.3 可视化

2.3 可视化 我觉得特别有帮助的另一种技术是根据字段值创建直方图.这对于大规模数据集尤其有用,而前面提到的简单的统计方式只能看到数据的表面.直方图是每个值在数据集中出现次数的统计,因此直方图还适用于非数值字段,而统计方法就不适用. 举个例子,假设有个包含推荐关键字的数据集,这些关键字是使用Google.Bing或其他搜索引擎进行搜索的词,使用户能够浏览网站的网页.一个大型网站每天可以通过搜索引擎带来数百万的PV,其中搜索关键字可能有数百万,在一段时间后可能会有数十亿的唯一关键字.对于这些关键字

《Python数据科学实践指南》——第2章 Python基础知识 2.1 应当掌握的基础知识

第2章 Python基础知识 为了开启我们的数据科学之旅,本章会进行一些基础的编程训练.第1章中已经搭建好了Python的运行环境,读者应该已经能够在Python shell中执行简单的打印和四则运算了.接下来我们要完整地学习一遍构成一个Python程序的基本要素. 2.1 应当掌握的基础知识 本节会介绍一些学习Python前应当掌握的基础知识,这一部分内容在所有的编程语言学习中基本上都是类似的,Python当然也遵守这些通用的规则,熟悉这些内容的读者可以跳过这一节. 2.1.1 基础数据类型

《Python数据科学实践指南》——第2章Python基础知识

第2章Python基础知识为了开启我们的数据科学之旅,本章会进行一些基础的编程训练.第1章中已经搭建好了Python的运行环境,读者应该已经能够在Python shell中执行简单的打印和四则运算了.接下来我们要完整地学习一遍构成一个Python程序的基本要素.

《Python数据科学实践指南》——第0章发现、出发

第0章发现.出发最近一年里,知乎社区有不少朋友邀请我回答关于数据挖掘的问题,其中提问最多的是关于"如何改行做数据挖掘".我想他们之所以邀请我回答这类问题,不是因为我做数据挖掘做得好,而是好奇我是如何改行做数据挖掘的?说来也巧,我本科是学电子的,研究生是学控制的,而我的职业理想是成为一个"先知",但我并不知道如何才能实现这一职业理想.自公元632年人类最后一位先知默罕默德去世之后,将近1400年没人做先知了,既没有人可以指导我,也没有可以效仿的对象.2011年到201