数据科学:入门/数据定义
章节摘要
[edit | edit source]“数据”一词是一个通用词,表示测量值的集合。“数据点”指的是单个数据实例。“数据集”是一组结构良好的数据点。数据点可以是几种“数据类型”,例如数字、文本或日期时间。当我们以类似的格式收集关于类似对象的数据时,我们将数据点捆绑到一个“变量”中。我们可以给一个变量一个像“年龄”这样的名称,它可以表示房间里所有人的年龄列表。与变量关联的数据点称为变量的“值”。这些概念是理解数据科学的基础。R 编程语言中变量的处理方式有一些古怪之处。
维基词典将数据定义为 datum 的复数形式;作为信息片段;以及作为彼此不同的对象单元的集合。
维基词典将datum定义为在记录者(人或设备)和阅读者(另一个人或设备)双方都理解的量表上对某事物的测量。该量表是任意定义的,例如从 1 到 10 按 1 个单位递增,从 1 到 100 按 0.1 递增,或者简单地为真或假,开或关,是,否,也许等等;以及作为从直接观察中得知的事实。
就我们的目的而言,这些定义的关键组成部分是数据是经过测量和以可供记录者和阅读者理解的方式进行通信的观察结果。所以,你作为一个人的不是数据,但是关于你的记录观察结果是数据。例如,你的姓名写下来是数据;或者你说话的姓名的数字录音是数据;或者你面部的数字照片或跳舞的视频是数据。
我们不会用正式的词语“datum”来称呼单个测量值,而是会使用维基百科称之为数据点的内容。我们可能会谈论一个数据点或多个数据点。请记住,当我们谈论“数据”时,我们指的是一组聚合的数据点。
维基词典不甚有用地将数据集定义为“一组数据”。我们将数据集定义为对类似对象观察并以类似方式格式化的一组数据点。因此,对一个房间里的人的书面姓名和书面年龄的汇编就是一个数据集。在计算中,数据集存储在磁盘上的文件中。将数据集存储在文件中使其可供分析。
如前所述,数据可以以多种形式存在,例如文本、数字、图像、音频和视频。处理数据的人员非常谨慎地定义了不同的数据类型。他们这样做是因为他们希望对数据执行各种操作,而这些操作只对特定数据类型有意义。例如,加法是我们可以在整数数据类型上执行的操作(2+2=4),但不能在文本数据类型上执行(“two”+“two”=???)。连接是我们可以在文本上执行的操作。连接意味着将事物组合在一起,因此:concatenate(two, two) = twotwo
。为了便于介绍,我们将只关注简单的数字和简单的文本数据类型,并将更复杂的数据类型(如图像、音频和视频)留给更高级的课程。数据科学家使用数学、统计和计算机科学中的各种数据类型来相互交流。
我们只介绍数学中最常用的数据类型。还有很多,但我们会在更高级的课程中学习它们。
- 整数 - 根据维基百科,整数是可以写成没有分数或小数部分的数字,并且落在集合 {..., −2, −1, 0, 1, 2, ...} 中。例如,21、4 和 −2048 是整数;9.75、5½ 和 √2 不是整数。
- 有理数 - 根据维基百科,有理数是可以表示为两个整数的商或分数 p/q 的那些数,其中分母 q 不等于零。由于 q 可以等于 1,所以每个整数都是有理数。有理数的小数展开总是要么在有限位数后终止,要么开始重复相同的有限位数序列。例如,9.75 2/3 和 5.8144144144… 都是有理数。
- 实数 - 根据维基百科,实数包括所有有理数,例如整数 −5 和分数 4/3,以及所有无理数,例如 √2 (1.41421356... 二的平方根)、π (3.14159265...) 和 e (2.71828...)。
- 虚数 - 根据维基百科,虚数是那些平方小于或等于零的数。例如,√-25 是一个虚数,它的平方是 -25。虚数可以写成一个实数乘以虚数单位 i,它由其性质 i 2 = −1 定义。因此,√-25 = 5i。
数据科学家了解到,他们可能执行的数学运算类型取决于数据中反映的数据类型。
我们只介绍维基百科中定义的统计学中最常用的数据类型。统计学中还有几种数据类型,但我们将在更高级的课程中学习它们。
- 名义 - 名义数据以类别形式记录。因此,名义数据也称为分类数据。例如,岩石可以大致分类为火成岩、沉积岩和变质岩。
- 顺序 - 顺序数据以分数的等级顺序记录(第 1 名、第 2 名、第 3 名等)。顺序数据的例子是赛马的结果,它只说明哪些马到达了第一、第二或第三,但没有关于比赛时间的任何信息。
- 间隔 - 间隔数据不仅记录数据点的顺序,还记录数据点之间的间隔大小。摄氏温标是一个非常熟悉的间隔量表测量例子。在这个特定的量表中,测量单位是水沸点和冰点之间温差的 1/100。然而,零点是任意的。
- 比率 - 比率数据是在具有真实零点的间隔量表上记录的。质量、长度、时间、平面角、能量和电荷是比率量表的物理测量示例。非正式地说,比率量表的显著特征是拥有一个零值。例如,开尔文温标具有绝对零的非任意零点。
数据科学家知道,他们将执行的统计分析类型取决于他们将要分析的数据类型。
我们将介绍在计算机科学中最常用的数据类型,这些类型在维基百科中定义。还有很多其他类型,但我们会将其留到更高级的课程中讨论。
- 比特 - 比特(二进制数字的缩写)是计算和通信中信息的最小单位;比特仅表示 1 或 0(一或零)。这种类型的数据有时也称为二进制数据。当 8 个比特组合在一起时,我们称之为字节。一个字节的值可以是 0 到 255 之间的范围(00000000-11111111)。例如,字节 10110100 = 180。
- 十六进制 - 字节通常表示为 16 进制数。 16 进制被称为十六进制(通常缩写为Hex)。Hex 使用十六个不同的符号,最常见的是使用 0–9 来表示 0 到 9 的值,以及 A, B, C, D, E, F(或使用 a–f)来表示 10 到 15 的值。每个十六进制数字表示 4 个比特,因此两个十六进制数字完全表示一个字节。正如我们提到的,字节的值可以从 0 到 255(十进制)不等,但可以更方便地表示为 00 到 FF 之间的两个十六进制数字。一个两字节数也被称为一个 16 位数。与其用 16 个比特来表示一个数字(10101011110011),我们更倾向于用 2AF3(十六进制)或 10995(十进制)来表示它。通过练习,计算机科学家可以熟练地阅读和理解十六进制。数据科学家必须理解和识别十六进制数。有很多网站可以将数字从二进制转换为十进制到十六进制,反之亦然。
- 布尔 - 布尔数据类型对逻辑数据进行编码,逻辑数据只有两个值(通常表示为 "true" 和 "false")。它的目的是表示逻辑和布尔代数的真值。它用于存储表达式逻辑真值的评估。通常,两个值使用逻辑运算符进行比较,例如 .eq.(等于)、.gt.(大于)和 .le.(小于或等于)。例如,
b = (x .eq. y)
将为 "b" 分配布尔值 "true",如果 "x" 的值与 "y" 的值相同,否则它将为 "b" 分配逻辑值 "false"。 - 字母数字 - 这种数据类型在字符串中存储字符序列(a-z、A-Z、0-9、特殊数字)——来自字符集,例如西方语言的ASCII 或中东和亚洲语言的Unicode。由于大多数字符集都包含数字,因此可以包含像 "1234" 这样的字符串。但是,这仍然是一个字母数字的值,而不是整数 1234。
- 整数 - 这种数据类型的定义与数学中相同名称的数据类型基本相同。然而,在计算机科学中,整数可以是带符号的,也可以是无符号的。让我们考虑一个 16 位(两个字节)整数。在无符号形式下,它可以取值从 0 到 65535(216-1)。但是,如果我们将一个比特保留为(负)符号,则范围变为 -32767 到 +32768(十六进制为 -7FFF 到 +8000)。
- 浮点数 - 这种数据类型是一种表示实数的方法,它可以支持广泛的值范围。术语浮点数是指小数点可以“浮动”;也就是说,它可以在数字的有效数字的任何位置。这个位置在内部表示中单独表示,因此浮点数表示可以被认为是科学计数法的计算机实现。在科学计数法中,给定的数字按 10 的幂进行缩放,使其位于某个范围内——通常在 1 和 10 之间,小数点出现在第一个数字的后面。然后,缩放因子(作为 10 的幂)在数字的末尾单独表示。例如,木星卫星木卫一的公转周期为 152853.5047 秒,该值在标准形式的科学计数法中表示为 1.528535047×105 秒。浮点数表示在概念上类似于科学计数法。数字的基数部分称为尾数(或有时称为尾数),数字的指数部分不出所料地称为指数。
- 列表 - 这种数据类型用于表示复杂的数据结构。在最简单的形式下,它具有键值对结构。例如,考虑一个待办事项列表
键 | 值 |
---|---|
1 | 理发 |
2 | 购买杂货 |
3 | 洗澡 |
- 列表可能会变得非常复杂,而且通常确实会变得很复杂。键不必是数字,可以是单词,例如 "one"、"two" 和 "three"。值不必是单个数据点。值可以是一系列数字,也可以是数字矩阵,也可以是一段文字。例如,列表中的第一个键可以是 "罗密欧与朱丽叶",列表中的第一个值可以是整个罗密欧与朱丽叶剧本。列表中的第二个键可以是 "麦克白",列表中的第二个值可以是整个麦克白剧本。最后,列表中的值甚至可以是另一个列表。此时,不要陷入 "列表中包含列表,列表中包含列表..." 的死循环。我们会将这些留给计算机科学专业的学生。
数据科学家了解数据在计算机科学中的表示方式的重要性,因为它会影响他们生成的结果。当大量的小舍入误差在大量迭代中累积时,尤其如此。
- 定量(数值)数据[1]
- 定性(非数值,即文字或图形)
R 语言中至少有 24 种数据类型。[2] 我们只向您介绍 9 种最常用的数据类型。正如您将看到的,它们是数学、统计和计算机科学中数据类型的融合。这正是数据科学家所期望的。这九种分别是
- NULL - 用于表示空值
- logical - 用于表示真或假(开或关;1 或 0)
- character - 用于表示字母数字字符串
- integer - 用于表示正数、负数和零整数(无小数点)
- double - 用于表示实数(带小数点)
- complex - 用于表示同时具有实部和虚部的复数(例如,-1 的平方根)
- date - 用于表示日期
- POSIX - 用于表示日期和时间(日期在内部表示为自 1970-01-01 以来天数,较早的日期则为负值)
- list - 用于存储复杂数据结构,包括大多数内置 R 函数的输出
您可以使用typeof()
命令让 R 告诉您特定数据对象的类型。如果您想知道特定数据对象在 S 语言[3] 的原始定义中叫什么,您可以使用mode()
命令。如果您想知道特定数据对象在用于编写 R 的C 编程语言 中属于哪个对象类,您可以使用class()
命令。在这本书中,我们将主要使用typeof()
命令。
- 关于 R 中列表的说明。R 喜欢使用列表数据类型来存储各种过程的输出。我们通常不会对存储在列表数据类型中的数据执行统计过程——只有一个例外。为了对列表进行统计分析,我们需要将它们转换为具有行和列的表格。R 有许多函数可以将数据在表格结构和列表数据类型之间来回移动。我们提到的例外叫做data.frame 列表对象。类为data.frame 的列表对象以一种特定的方式存储数据行和列,以便于进行统计分析。我们将在下面详细解释数据框。
数据科学家必须清楚地了解数据在分析包中的表示方式,以便应用正确的数学运算和统计分析。
让我们首先注意到,变量的反面是常量。如果我们声明符号“X”是常量,并将其赋值为 5,那么 X=5。它不会改变;X 将始终等于 5。现在,如果我们声明符号“Y”为变量,这意味着 Y 可以具有多个值(参见“variable”的维基词典条目)。例如,在数学方程 Y^^2=4(Y 平方等于 4)中,变量 Y 可以取值为 2 或 -2,并且满足该方程。
想象一下,我们拿一张纸,分成两列。在第一列的顶部,我们放上标签“姓名”,在第二列的顶部,我们放上标签“年龄”。然后,我们要求一个房间里 20 个人在纸上的相应列中写下他们的姓名和年龄。最终,我们将得到一个包含 20 个姓名和 20 个年龄的列表。让我们使用标签“姓名”来表示 20 个姓名的整个列表,使用标签“年龄”来表示 20 个年龄的整个列表。这就是我们使用“变量”一词的含义。变量“姓名”有 20 个数据点(20 个姓名的列表),变量“年龄”有 20 个数据点(20 个年龄的列表)。变量是代表多个数据点的符号,我们也称之为值。与“值”含义相似的其他词语包括测量和观察。数据科学家在相互交流时,会交替使用这四个词语(数据点、值、测量和观察)。
“变量”一词是一个通用词,在许多学科中使用。然而,不同的学科也使用一些意义大致相同的更专业的术语。在数学中,另一个近似于“变量”含义的词语是向量。在计算机科学中,另一个近似于“变量”含义的词语是数组。在统计学中,另一个近似于“变量”含义的词语是分布。数据科学家在相互交流时,经常会交替使用这四个词语(变量、向量、数组和分布)。
让我们再次思考数据集合(如上所述)。数据集通常是两个或多个变量(及其相关值)组合在一起。一旦我们的数据被组织成变量,组合成数据集,并存储在磁盘上的文件中,它就可以被分析。
R 编程语言在数据类型、变量和数据集方面有点怪异。在 R 中,我们有时使用“向量”代替“变量”。当我们将多个向量(变量)组合并存储到 R 中的数据集中时,我们称之为数据框。当 R 将向量存储到数据框中时,它会分配一个角色来指示数据将在后续统计分析中如何使用。因此,在 R 数据框中,例如,“逻辑”、“日期/时间”和“字符”数据类型被分配了因子角色。“双精度”数据类型被分配了num角色,“整数”被分配了int角色。(“复数”数据类型被分配了“cplx”角色,但现在不用担心。)这些角色对应于以下统计数据类型:因子 = 名义,int = 序数,num = 区间。(我们通常在进行统计分析之前将比率数据类型转换为区间数据类型。这通常通过对比率数据取对数来完成。在后面的章节中会详细介绍。)我们可以使用 R 中的结构命令来发现每个变量在数据框中将扮演的角色:str()
。我们在后面的章节中将解释“因子”是什么。
这项作业应该在 3 或 4 个学生的团队中完成。这些团队需要由前两个家庭作业团队中的不同人员组成。所有人都应该与 R 编程语言进行互动。团队成员可以互相帮助学习概念,并找出如何使用 R。通过尝试使用下面描述的命令的不同方法来练习 R。
使用typeof()
命令来验证数据类型。看看你是否可以在按下回车键之前猜测输出会是什么样子。
> a <- as.integer(1)
> typeof(a)
> a
> b <- as.double(1)
> typeof(b)
> b
> d <- as.character(1)
> typeof(d)
> d
> e <- as.logical("true")
> typeof(e)
> e
> f <- as.complex(-25)
> typeof(f)
> f
> g <- as.null(0)
> typeof(g)
> g
> h <- as.Date("2012-07-04")
> typeof(h)
> class(h)
> h
> i <-as.POSIXct("2012/07/04 10:15:59")
> typeof(i)
> class(i)
> i
> j <-as.POSIXlt("2012/07/04 10:15:59")
> typeof(j)
> class(j)
> j
> k <- list("Get haircut", "Buy Groceries", "Take shower")
> typeof(k)
> k
如果你没有通过 as.* 命令明确指定数据类型,R 会尝试找出你想要的数据类型。它并不总是能正确地猜测你的想法。用 R 进行练习,将一些值赋给一些变量,然后使用typeof()
命令查看 R 为你自动分配的数据类型。然后看看你是否可以将一个值从一种数据类型转换为另一种数据类型。
R 语言基于面向对象的编程语言。因此,R 中的东西被称为对象。所以,当我们将一个值赋给字母“X”时,在 R 中我们会说我们已经将一个值赋给了对象“X”。R 中的对象可能具有不同的属性,具体取决于它们的使用方式。对于此练习,我们将关注行为类似于变量的对象。这些类型的对象被称为向量对象。因此,当我们用数据科学的语言谈论变量“X”时,在 R 中我们可以称之为向量“X”。如你所知,变量是可变的东西。让我们在 R 中创建一个字符向量,并为它分配三个值。我们将使用 R 中的连接c()
命令。让我们也使用相同的连接命令创建一个整数向量。
> name <- c("Maria", "Fred", "Sakura")
> typeof(name)
> name
> age <- as.integer(c(24,19,21))
> typeof(age)
> age
这两个向量现在都有三个值。字符字符串“Maria”位于向量“name”的第一个位置,“Fred”位于第二个位置,“Sakura”位于第三个位置。类似地,整数 24 位于向量“age”的第一个位置,19 位于第二个位置,21 位于第三个位置。让我们分别检查一下这些值。
> name[1]
> name[2]
> name[3]
> age[1]
> age[2]
> age[3]
方括号中的数字被称为索引或下标。
如果我们观察了三个人的实际姓名和年龄,使得name[1]
对应于age[1]
,我们将得到一个看起来像下面的数据集。
姓名 | 年龄 |
---|---|
Maria | 24 |
Fred | 19 |
Sakura | 21 |
让我们将我们的数据集放入一个 R 数据框对象中。我们需要为我们的数据框对象想一个名字。让我们称它为“project”。将数据集放入数据框后,我们将使用 R 的“typeof”、“class”、“ls”和“structure”命令(str()
)来检查它。记住,大小写是有意义的。
> project <- data.frame(name, age)
> typeof(project)
> class(project)
> ls(project)
> str(project)
typeof() 函数告诉我们我们创建了一个列表对象。class() 函数告诉我们它是一种特殊类型的列表对象,称为 data.frame。ls() 函数告诉我们我们的列表对象中存在哪些“键值”对。请不要过于担心这些细节。重要的是 str() 函数告诉我们什么。
结构命令告诉我们有三个观察值和两个变量。这很好。它告诉我们变量的名称是$name
和$age
。这告诉我们,当我们将数据集放入 R 数据框列表对象中时,我们需要按如下方式引用数据框中的变量:project$name
和project$age
。结构命令还告诉我们project$name
被分配了“因子”变量的角色,project$age
被分配了“int”角色。这些对应于统计学家使用的“名义”和“序数”数据类型。R 需要知道变量在数据框中扮演的角色,以便对数据执行正确的统计函数。有人可能会说,年龄变量更像是统计区间数据类型,而不是统计序数数据类型。然后我们必须将 R 数据类型从整数更改为双精度。这将更改它在数据框中的角色为“数字”。
与其更改project$age
的数据类型,不如创建一个新的变量,这样原始变量就不会丢失。我们将新变量称为project$age.n
,这样我们就可以知道它是经过转换的project$age
变量。
> project$age.n <- as.double(project$age)
> str(project)
现在我们可以看到,project$age
和project$age.n
变量在数据框中扮演不同的角色,一个是“int”,一个是“num”。现在,通过显示数据框对象来确认整个数据集是否已正确实现到 R 中。
> project
name age age.n
1 Maria 24 24
2 Fred 19 19
3 Sakura 21 21
现在让我们再次检查数据类型。
> typeof(project$name)
> typeof(project$age)
> typeof(project$age.n)
糟糕!我们看到了 R 的一些怪异之处。当我们创建变量“name”时,它的数据类型是“字符”。当我们把它放入数据框时,R 不仅为它分配了“因子”的角色,还将它的数据类型更改为了“整数”。这是怎么回事?这比你现在想知道的要多。我们现在就解释一下,但你真的不必在以后理解它。
- 因为所有统计计算都是基于数字进行的,R 对变量“name”的每个值都分配了一个任意的整数。它将这些任意数字称为级别。然后它用原始值标记这些级别,这样我们就能知道发生了什么。因此在幕后,
project$name
的值为:2(标记为“Maria”)、1(标记为“Fred”)和 3(标记为“Sakura”)。我们可以将project$name
转换回字符数据类型,但我们无法对其进行统计计算。
> project$name.c <- as.character(project$name)
> typeof(project$name.c)
> str(project)
'data.frame': 3 obs. of 4 variables:
$ name : Factor w/ 3 levels "Fred","Maria",..: 2 1 3
$ age : int 24 19 21
$ age.n : num 24 19 21
$ name.c: chr "Maria" "Fred" "Sakura"
现在我们可以看到project$name.c
的数据类型为字符,并且被分配了“chr”的数据框角色。
- ↑ Nils Gehlenborg 和 Bang Wong 将定量数据映射到颜色。自然方法第 9 卷,第 769 页(2012 年)
- ↑ "R 语言参考". 瑞士联邦理工学院. 检索于 2012 年 7 月 4 日.
- ↑ Becker, R.A. (1984). ISBN 0-534-03313-X.
{{cite book}}
: 未知参数|coauthors=
被忽略 (|author=
建议) (帮助) . 美国加利福尼亚州太平洋格罗夫:Wadsworth & Brooks/Cole.
您可以
- 共享 - 复制、分发、展示和表演作品(来自此维基的页面)
- 重新混合 - 改编或制作衍生作品
在以下条件下
- 署名 - 您必须将此作品归功于维基教科书。您不能暗示维基教科书以任何方式认可您或您对本作品的使用。
- 相同方式共享 - 如果您更改、转换或基于此作品进行创作,您只能在与本许可相同或相似的许可下分发结果作品。
- 放弃 - 如果您获得版权持有者的许可,可以放弃上述任何条件。
- 公有领域 - 如果作品或其任何部分根据适用法律属于公有领域,该状态不会受到许可的影响。
- 其他权利 - 许可不影响以下任何权利
- 您的合理使用权或其他适用的版权例外和限制;
- 作者的道德权利;
- 其他人可能在作品本身或作品的使用方式中拥有的权利,例如公开权或隐私权。
- 通知 - 对于任何重新使用或分发,您必须向他人明确说明此作品的许可条款。最好的方法是链接到以下网页。