基础知识
第一章
大数据有哪些特征?
- 价值高:大数据有巨大的潜在价值,但同其呈几何指数爆发式增长相比,某一对象或模块数据的价值密度较低,这无疑给我们开发海量数据增加了难度和成本。
- 体量大:从2013年至2020年,人类的数据规模将扩大50倍,每年产生的数据量将增长到44万亿GB,相当于美国国家图书馆数据量的数百万倍,且每18个月翻一番。
- 速度快:随着现代感测、互联网、计算机技术的发展,数据生成、储存、分析、处理的速度远远超出人们的想象力,这是大数据区别于传统数据或小数据的显著特征。
- 种类多:大数据与传统数据相比,数据来源广、维度多、类型杂,各种机器仪表在自动产生数据的同时,人自身的生活行为也在不断创造数据;不仅有企业组织内部的业务数据,还有海量相关的外部数据。
大数据预处理的方法有哪些?
- 数据清理:主要是达到数据格式标准化、异常数据清除、数据错误纠正、重复数据的清除等目标。
- 数据集成:是将多个数据源中的数据结合起来并统一存储,建立数据仓库。
- 数据变换:过平滑聚集、数据概化、规范化等方式将数据转换成适用于数据挖掘的形式。
- 数据归约:寻找依赖于发现目标的数据的有用特征,缩减数据规模,最大限度地精简数据量。
大数据的挖掘方法有哪些?
- 分类:朴素贝叶斯算法、支持向量机SVM算法
- 聚类:K-Means算法、K近邻算法
- 关联规则:Apriori算法
- 预测模型
第二章
简述数据预处理的原理
通过数据预处理工作,可以使残缺的数据完整,错误的数据纠正、多余的数据去除,进而将所需的数据挑选出来,并且进行数据集成。数据预处理的常见方法有数据清洗、数据集成与数据变换。
数据清洗有哪些方法?
数据清洗
- 忽略元组:通常当在缺少类标号时,通过这样的方法来填补缺失值
- 人工填写缺失值:数据偏离的问题小,但该方法十分费时,不具备实际的可操作性
- 使用一个全局常量填充缺失值:大量采用同一属性值,可能会误导挖掘程序得出有偏差甚至错误的结论
- 用属性的均值填充缺失值:数据属性分为数值属性和非数值属性进行处理,通过利用已存数据的多数信息来推测缺失值
- 用同类样本的属性均值填充缺失值:利用均值替换缺失值
- 使用最可能的值填充缺失值:数据属性分为数值属性和非数值属性进行处理,通过利用已存数据的多数信息来推测缺失值
数据光滑技术
- 分箱:分箱方法通过考察某一数据周围数据的值,即“近邻”来光滑有序数据的值。
- 回归:光滑数据可以通过一个函数拟合数据来实现。线性回归的目标就是查找拟合两个属性的“最佳”线,使得其中一个属性可以用于预测出另一个属性
- 聚类:离群点可通过聚类进行检测,将类似的值组织成群或簇,离群点即为落在簇集合之外的值。许多数据光滑的方法也是涉及离散化的数据归约方法。
数据集成需要重点考虑的问题有哪些?
- 模式集成和对象匹配问题
- 冗余问题
- 元组重复
- 数据值冲突的检测与处理问题
数据变换主要涉及哪些内容?
- 光滑:去除数据中的噪声
- 聚集:对数据进行汇总或聚集
- 数据泛化:使用概念分层,用高层概念替换低层或“原始”数据
- 规范化:将属性数据按比例缩放,使之落入一个小的特定区间
- 属性构造:可以构造新的属性并添加到属性集中,以帮助挖掘过程
第三章
简述数据挖掘的概念
数据挖掘是从大量的、有噪声的、不完全的、模糊和随机的数据中,提取出隐含在其中的、人们事先不知道的、具有潜在利用价值的信息和知识的过程
数据挖掘的常用算法有哪几类?有哪些主要算法?
常用算法
- 分类
数据挖掘方法中的一种重要方法就是分类,在给定数据基础上构建分类函数或分类模型,该函数或模型能够把数据归类为给定类别中的某一种类别,这就是分类的概念。
- 聚类
聚类也就是将抽象对象的集合分为相似对象组成的多个类的过程,聚类过程生成的簇称为一组数据对象的集合。
- 关联规则
关联规则属于数据挖掘算法中的一类重要方法,关联规则就是支持度与信任度分别满足用户给定阈值的规则。
- 时间序列预测
时间序列预测法是一种历史引申预测法,也即将时间序列所反映的事件发展过程进行引申外推,预测发展趋势的一种方法。
数据挖掘方法中分类的含义?分类与聚类方法的区别?
分类是一种重要的数据分析形式,根据重要数据类的特征向量值及其他约束条件,构造分类函数或分类模型(分类器),目的是根据数据集的特点把未知类别的样本映射到给定类别中。
聚类(clustering)就是将具体或抽象对象的集合分组成由相似对象组成的为多个类或簇的过程。由聚类生成的簇是一组数据对象的集合,簇必须同时满足以下两个条件:每个簇至少包含一个数据对象;每个数据对象必须属于且唯一地属于一个簇。
R语言
R语言的数据类型
赋值
赋值:等号赋值 = 、向左赋值<-(和向等号赋值一样)、向右赋值->
变量赋值:a = 1,b<-2,3->c(多条语句放在同一行时用逗号分隔)
向量赋值:d1=c(1,2,3),d2=c("xxx","yyy"),d3=("*")
空值,用NA表示
x=NA(数据缺失值用NA表示,或称为空值)、
is.na(x)(判断x是不是缺失值,返回值为TRUE或FALSE)
常见的数据类型
逻辑值(Logical):TRUE,FALSE
数值(Numeric):12.3,99.5
整数(Integer):2L,3L,0L
复数(Complex):3+2i
字符串(Character):"dsfsad","你好","TRUE"
类型 | 辨别 | 转换 |
---|---|---|
数值型(numeric) | is.numeric() | as.numeric() |
整数型 (integer) | is.integer() | as.integer() |
逻辑型(logical) | is.logical() | as.logical() |
日期型(Date) | is.Date() | as.Date() |
字符型(character) | is.character() | as.character() |
复数型(complex) | is.complex() | as.complex() |
空值(NULL) | is.null() | as.null() |
可以通过methods(is)命令来查看所有类型判断函数,methods(as)命令查看所有的类型转换函数。
日期类型数据处理
R语言的基础包中提供了两种类型的时间数据,一类是Date日期数据,它存储的是天,不包括时间和时区信息,另一类是POSIXct/POSIXlt类型数据,其中包括了日期、时间和时区信息。
函数 | 功能描述 |
---|---|
ISOdate() | 用数字直接生成日期对象, 得到的是一个POSIXct对象 |
ISOdatetime() | 用数字直接生成日期对象, 允许继续加入小时、分钟、秒数信息 |
Sys.Date() | 返回系统当前的日期 |
Sys.time() | 返回系统当前的日期和时间 |
Sys.timezone() | 返回系统当前所在的时区 |
date() | 返回系统当前的日期和时间(返回的值为字符串) |
as.Date() | 将字符串形式的日期转换为日期格式 |
format() | 将日期变量转换成指定格式的字符串 |
as.POSIXlt() | 将字符串转化为包含时间及时区的日期变量 |
strptime() | 将字符型变量转化为包含时间的日期变量 |
strftime() | 将日期变量转换成指定格式的字符型变量 |
difftime() | 计算两个日期变量间隔的秒数、分钟数、小时数、天数、周数 |
weekdays() | 取日期变量所处的星期几 |
months() | 取日期变量所处的月份 |
quarters() | 取日期变量所处的季度 |
format()函数将日期/时间输出为字符串,各种日期/时间格式含义如下:
格式 | 含义 | 示例 |
---|---|---|
%d | 数字表示的日期(0~31) | 01~31 |
%a | 缩写的星期名 | Mon/周一 |
%A | 非缩写星期名 | Monday/星期一 |
%w | 数字表示的星期几 | 0~6(0为周日) |
%b | 缩写的月份 | Jan/1月 |
%B | 非缩写月份 | January/一月 |
%m | 月份(01~12 ) | 01~12 |
%y | 两位数的年份 | 19 |
%Y | 四位数的年份 | 2019 |
%H | 24小时制小时(00~23) | 00~23 |
%I | 12小时制小时(01~12) | 01~12 |
%p | AM/PM(上午/下午)指示 | AM/PM(上午/下午) |
%M | 十进制分钟(00~60) | 00~60 |
%S | 十进制秒(00~60) | 00~60 |
算术运算和初等函数
+(加),-(减),*(乘),/(除)
%/%(取整),%%(取余),^(乘方)
sqrt()(平方根),exp()(指数),log()(对数)
sin()(正弦),cos()(余弦),tan()(正切)
关系运算
\> (大于),<(小于),>=(大于等于),<=(小于等于),==(等于),!=(不等于)
|(或),&(与),!(非),||(只与第一个元素进行逻辑或运算),&&(只与第一个元素进行逻辑与运算)
a = c(1,2,1,0,3,-1,-2)
a>1|a<0
#结果 FALSE TRUE FALSE FALSE TRUE TRUE TRUE
a>1&&a<0
#结果 FALSE
all() (向量、矩阵、数组中的所有元素是否为真)
any() (向量、矩阵、数组中的任意一个元素是否为真)
%in%(元素是否在对象中)
x=1
a=c(1,2,1,0,3,-1,-2)
x%in%a
#结果TRUE,说明x在a中
R语言的数据对象
常见的R数据对象有:
R语言拥有许多用于存储数据的对象类型,常用数据对象包括向量(vector)、矩阵(matrix)和数组(array)、因子(factor)、列表(list)和数据框(data.frame)。它们在存储数据的类型、创建方式、结构复杂度,以及用于定位和访问其中个别元素的标记等方面均有所不同。多样化的数据对象赋予了R灵活处理数据的能力。
向量
向量的构造
等差数列,差为1或-1:用:(冒号)来定义逐项增加1或减1的等差序列,例如a:b,表示从a开始,逐项加1或者减1的等差序列
x1=1:5 #其结果为:1,2,3,4,5
x2=1:-5 #其结果为:1,0,-1,-2,-3,-4,-5
等差数列,给定差值:用seq()函数来定义等差序列
函数形式为seq(from=value1,to=value2,by=value3)其中from表示序列开始值,to表示序列结束值,by表示元素之间的差值(或间隔)
s1=seq(-5,5,2)
#s1的起始值为-5,结束值为5,差值为2
#s1的值为:-5,-3,-1,1,3,5
重复数列:用rep()函数来定义重复序列
函数的形式为:rep(x,times)其中x表示待重复的数值,times表示重复的次数
s2=rep(5,5)
#s2共有5个重复值为5,5,5,5,5
任意序列:用c()来定义包含任意值的向量
s3=c(1,2,3)
#s3的值时1,2,3
向量的操作
访问任意元素:用下标来访问向量中的元素,形式如下:
a[i] #a是向量,i是向量的下标
a[c(i,j,k)]#同时访问向量a中的第i、j、k这三个元素
a[c(TRUE,FALSE,……)]#通过逻辑值来访问,实现条件筛选
a[a >1]#通过关系运算来访问符合条件的元素
修改任意元素
a[i] = b#修改向量的单个值,b是只包含一个值的对象
a[c(i,j,k)] b#修改向量的多个值,b可以是包含三个值的向量,也可以是一个固定值
增加元素:用c()增加元素到向量的前端或者后端
s3=c(1,2,3)
s3=c(-1,0,s3)#在s3的前端增加-1,0
s3=c(s3,4,5)#在s3的后端增加4,5
删除元素:用-i删除向量中的元素,或不选取第i个元素;用-c(i,j,……)删除向量中的第i,j,……等多个元素,或不选取第i,j,……等多个元素
s3=c(1,2,3,4,5)
s4=s3[-1]#不选取第一个元素
s5=s3[c(-1,-3)]#不选取第一个元素和第三个元素
#不建议在原向量中删除元素,而是定义新的向量
向量运算
向量的长度:用length()函数计算向量的长度
s3=c(1,2,3,4)
length(s3)
#计算向量s3的长度4
对于数字,整数和复数类型的向量,这类向量之间可实现+、-、*、/、逻辑运算、及求内积等向量运算。
s3=(1,2,3)
s4=(4,5,6)
s3+s4#里面的各项元素对应相加
s3-s4#里面的各项元素对应相减
s3*s4#里面的各项元素对应相乘
s3/s4#里面的各项元素对应相除
s3+2#s3里面的各项元素都加2
s3-2#s3里面的各项元素都减2
s3/2#s3里面的各项元素都除2
s3<2#判断s3中哪些元素小于2
s3==s4#判断s3和s4哪些元素相等
s3%%2==2#判断s3中的元素整除以2的结果哪些等于2
R语言文本处理
基本文本处理包括字符串元素个数统计、字符串的合并及拆分、字符串的提取和替换以及字符编码转换等操作。基础包中的文本处理函数如下:
grep函数族
grep函数族中的grep、grepl、regexpr、gregexpr等函数的匹配规则均可以使用正则表达式。
函数 | 作用 |
---|---|
grep() | 查找功能,返回匹配结果的下标集 |
grepl() | 查找功能,返回是否匹配的逻辑向量 |
regexpr() | 返回匹配向量包括字符的位置及匹配长度(只匹配第一次出现的),不匹配返回-1 “match.length”给出匹配文本长度的整数向量(或-1) |
gregexpr() | 返回匹配列表包含字符的位置及匹配长度(匹配多次),不匹配字符返回-1,每个元素的格式与regexpr的返回值相同 |
regexec() | 返回匹配列表包含字符的位置及匹配长度(只匹配第一次出现的),不匹配返回-1 |
参数 | 描述 |
---|---|
pattern | 正则表达式 |
x, text | 字符向量或字符对象 |
ignore.case | 逻辑值,FALSE表示大小写敏感、TRUE表示大小写不敏感 |
perl | 逻辑值,是否使用perl风格的正则表达式,FALSE表示不使用,TRUE表示使用 |
value | 逻辑值,FALSE返回匹配元素的下标,TRUE返回匹配的元素值 |
fixed | 逻辑值,FALSE表示正则表达式匹配,TRUE为精确匹配 |
useBytes | 逻辑值,FALSE表示按字符匹配,TRUE表示按字节匹配 |
invert | 逻辑值,FALSE 查找匹配值,TRUE返回不匹配元素的下标或值(根据value值) |
常用正则表达式转义符
基本文本处理包括字符串元素个数统计、字符串的合并及拆分、字符串的提取和替换以及字符编码转换等操作。基础包中的文本处理函数如下:
转义字符 | 作用 | ||
---|---|---|---|
\f | 换页符 | ||
\n | 换行符 | ||
\r | 回车符 | ||
\t | 制表符(tab) | ||
\v | 垂直制表符 | ||
. | 可以匹配任何单个的字符、字母、数字甚至.字符本身。同一个正则表达式允许使用多个.字符。但不能匹配换行 | ||
\ | 转义字符,如果要匹配就要写成“\(\)” | ||
\ | 表示可选项,即\ | 前后的表达式任选一个 | |
^ | 取非匹配 | ||
$ | 放在句尾,表示一行字符串的结束 | ||
() | 提取匹配的字符串,(\s*)表示连续空格的字符串 | ||
[] | 选择方括号中的任意一个 | ||
{} | 前面的字符或表达式的重复次数。如{3,6}表示重复的次数不能小于3,不能多于6,否则都不匹配 | ||
* | 匹配零个或任意多个字符或字符集合,也可以没有匹配 | ||
+ | 匹配一个或多个字符,至少匹配一次 | ||
? | 匹配零个或一个字符 | ||
\d | 任何一个数字字符,等价于[0-9] | ||
\D | 任何一个非数字字符,等价于^[0-9] | ||
\w | 任何一个字母、数字字符(大小写均可以)或下划线字符 | ||
\W | 任何一个非字母、数字或字符下划线字符 | ||
\s | 任何一个空白字符(等价于[\f\n\r\t\v]) | ||
\S | 任何一个非空白字符(等价于1) |
字符串提取、替换和拆分
在对文本进行处理时,经常需要截取字符串某一部分,此时可用substr()和substring()函数实现,如果对提取的字符串进行重新赋值,也可用于字符串替换。其函数基本形式为:
substr(x, start, stop)
substring(text, first, last = 1000000L)
substr(x, start, stop) = value
substring(text, first, last = 1000000L) = value
参数 | 说明 |
---|---|
x/test | 字符串或者字符串向量 |
start/first | 预读取/替换字符串的第一个下标(起始位置) |
stop/last | 预读取/替换字符串的最后一个下标(结束位置),last默认值为1000000,可以不传参 |
value | 用于替换提取字符串的值 |
Stringr扩展包
stringr包被定义为一致的、简单易用的字符串工具集。所有的函数和参数定义都具有一致性,让字符串处理变得简单易用。string包属于扩展包,首次使用前需通过install.packages(“stringr”)进行在线安装。
R语言数据处理
文件读取
RData文件
R提供了独特的存储数据的方式,即.RData文件,该文件能够存储一个或多个R数据对象。通过调用save()函数,可以把R数据对象存储到.Rdata文件中。
save(R数据对象,file="文件地址")
R通过load()函数读取.RData文件。
load(file,envir=parent.frame(),verbose=FALSE)
file是RData文件路径及文件名,envir是R运行环境,该值通常为缺省值,即当前R运行环境,verbose,是否在加载的过程中打印对象的名称,可以只填file路径其他可以省略。
TXT文件
虽然RData能够方便的存储R数据对象,但是有时也需要把数据存为txt格式以便于其他软件使用,同时也可以读取来自其他软件存储的txt文件
read.table(file,header=FALSE,sep="")
file是文件地址(可以在前面填上文件名称);header是如果txt文件中包含表格(即列名)则header=TRUE;sep是指文件中列之间的分隔符,通常为制表符、空格(缺省值为空格)、逗号、分号,根据文件的格式来设置
参数 | 描述 |
---|---|
file | 要读取的数据文件名称,文件如果不在当前文件夹路径下,需添加绝对路径 |
header | 逻辑值,导入文件是否有标题行,默认为FALSE,不含有标题行,设置为TRUE则将文件第一行作为变量的标题 |
sep | 文件中字段的分隔符,默认为sep=””,表示分隔符为一个或多个空格、制表符、换行或回车 |
quote | 设置如何引用字符型变量。默认情况下,字符串可以被引号”或’括起,如果没有设定分割字符,引号前面加\,即quote=”\” |
dec | 设置用来表示小数点的字符,默认为. |
row.names | 读入数据的行名,默认为1,2,3,…… |
col.names | 读入数据的列名,如header设置为FALSE时,默认为V1,V2,V3,…… |
na.strings | 赋给缺失值的值,默认为NA |
skip | 开始读取数据前跳过的数据文件的行数 |
strip.white | 是否消除空白字符 |
blank.lines.skip | 是否跳过空白行 |
CSV文件
CSV文件是”,“(逗号)分隔的文本文件,也是一种重要的数据表格存储格式。
read.csv(file,header=TRUE,sep=",",quote="\",dec=".",fill=TRUE,comment.char="",……)
file是文件地址(可以在前面填上文件名称);header如果csv由表头,则header设置为TRUE,否则设置为header=FALSE,sep列之间的分隔符,通常以逗号分隔。
write.csv(data,file="")
data是存入该csv文件的数据;file是要存入该csv文件的地址
Excel文件
在读取xlsx格式数据时需要加载xlsx包
library(xlsx)#用于加载xlsx
read.xlsx(file="",sheetIndex,sheetName="",encoding="UTF-8")
file是文件地址(可以在前面填上文件名称);sheetIndex:xlsx文件的表单索引;sheetName:xlsx文件的表单名称;encoding:是否设置编码。
函数 | 用途 |
---|---|
write.xlsx() | 将R语言中数据框写入Excel文件,可向已存在文件追加工作表,同时定义表名,也支持中文表名 |
read.xlsx() | 读取Excel文件 |
loadWorkbook() | 将Excel文件载入R中作为对象 |
saveWorkbook() | 可将修改过的内容保存到Excel文件 |
getSheets() | 读取R语言中Excel对象的工作表,返回java对象 |
createSheet() | 在Excel文件中新建工作表 |
removeSheet() | 删除Excel文件中的工作表 |
write.xlsx()函数
参数 | 描述 |
---|---|
x | 需要写入到Excel工作簿中的数据框 |
file | 输出文件的路径 |
sheetName | 保存到工作簿中的工作表名,默认为Sheet1 |
col.names | 逻辑值,保存文件中是否含有列名,默认为TRUE |
row.names | 逻辑值,保存文件中是否含有行名称,默认为TRUE |
append | 逻辑值,是否将x追加到现有文件中,默认为FALSE |
showNA | 逻辑值,默认为FALSE,如果设置为TRUE,则NA值保留为空单元格 |
read.xlsx()函数
参数 | 描述 |
---|---|
file | Excel文件的路径 |
sheetIndex | 工作薄中的工作表的索引值 |
sheetName | 工作表名 |
rowIndex | 数值向量,表示想提取的行。如为空,且未指定startRow和endRow,则提取所有行 |
startRow | 数值,读取的起点行。仅当参数rowIndex为NULL时有效 |
endRow | 数值,读取的终点行。如设为NULL,则读取所有行,仅当参数rowIndex为NULL时有效 |
colIndex | 数值向量,表示想提取的列。如为空,则提取所有的列 |
as.data.frame | 布尔值,是否强制转换为data.frame。如FALSE,则用列表表示,每个元素为一列 |
header | 布尔值,是否将第一行识别为标题 |
keepFormulas | 布尔值,是否以文本格式保留Excel公式 |
SAV文件
R还能读取spss软件存储的数据,读取SVA文件时加载foreign包
library(foreign)#导入读取SAV文件的包
read.spss(file="",to.data.frame=T)
file是文件地址(可以在前面填上文件名称);to.data.frame是否转换为数据框T是转换F是不转换
检查R数据对象
通过glimpse()函数查看R对象的结构,如:数据框的变量名称、数据类型和取值等
通过view()函数查看R数据对象的值
命令行查看:当R数据较小时,可以在控制台中输入R数据对象的名称并运行,从而查看R数据对象
在Rstudio工作区的environment标签页查看R数据对象
若R数据对象为txt,csv,xlsx等外部数据,则可以通过其他软件来查看数据对象
attach()和detach()函数
attach()
把数据库加载到R搜索空间中,加载后可以直接通过名字访问数据库中的R数据对象
attach(what,pos=2L,name=deparse(subsitute(what),backtick=FALSE),warn.conflicts=TRUE)
what:数据库的名称,可以是R数据框,R数据文件,或R运行环境通常不需要设置其他参数
#加载数据框的作图语句
plot(iris$Sepal.Length.iris$Sepal.Width)
#加载数据框的作图语句
attach(iris)#加载数据框
plot(Sepal.Length.Sepal.Width)#简化变量的调用
detach()
把数据库从R搜索空间中移除,移除后将不可以直接通过名字访问数据库中R数据对象
detach(what,pos=2L,unload=FALSE,character.only=FALSE,force=FALSE)
what:数据库的名称,可以是R数据框,R数据文件,或R运行环境通常不需要设置其他参数
detach(iris)#移除数据框对象
排序:order()函数
通过order()函数来对数据进行排序
order()函数
order(…,na.last=TRUE,decreasing=FALSE,method=c("auto","shell","radix"))
其中
…:是用于排序的变量
na.last:如果有空值,是否把空值放在末尾
decreasing:默认情况下升序排列
注意:order()函数的返回值为序号
R语言数据处理方法
背景知识
变量的分类
变量:是描述所观察个体的某种特征,其特点是从一次观察到下一次观察可能会出现不同的结果,变量观察的结果就是数据。
根据计量尺度的不同,可以将变量分为分类变量和数值变量:
分类变量:取值为对象的属性、类别、或区间的变量
数值变量:取值为数字尺度的变量
分类变量通常说明事物的品质特征,通常用文字来表述,其结果表现为类别,也称为定性变量或品质变量
数值变量则说明事物或现象的数量特征,通常用数值来表现,也称为定量变量
数值变量可以分为离散变量和连续变量
离散变量:取值是有限的数值
连续变量:其取值在任意区间内、或多个区间内是任意值。
分类变量可以分为无序的分类变量和有序的分类变量
无序的分类变量:也成为名义值分类变量,其取值之间没有顺序关系
有序的分类变量:也成为值分类变量或排序变量,其取值之间具有顺序关系
根据数据的来源或搜集方式,数据通常可分为观测数据和实验数据
观测数据:通过调查、或观测搜集到的数据,这类数据是在没有对观测个体进行人为控制或干预得到的数据,
实验数据:在实验室中控制或干预实验对象所收集得到的数据
根据描述的现象和时间的关系可以分为截面数据和时间序列数据
截面数据:在相同时间或者近似相同时间点上收集得到的数据
时间序列数据:按照时间顺序收集得到的,用于描述现象随着时间变化的情形
数据的来源
直接来源:一是来自调查或观察,二是来自实验
间接来源:主要是公开出版或者报道的数据,有些事未公开出版的数据
直接数据的来源
当已有数据不能满足需要时,可以亲自取调查或实验
两个重要的概念
总体:包含所研究的全部元素的集合
样本:从总体中抽取的一部分元素
注:当总体总量较大时,需要从总体中抽取一部分样本进行研究,然后再依据样本来推断总体的情况
获取样本的方法
抽样调查法是指从研究对象的全部单位中抽取一部分单位进行考察和分析,并用这部分单位的数量特征去推断总体的数量特征的一种调查方法
概率抽样:也称随机抽样,是按照随机原则抽选样本的抽样方式,抽样时每个样本单位被选中的概率是已知,且能从概率意义上控制抽样误差
非概率抽样:不满足概率抽样要求的抽样都被归为非概率抽样,非概率抽样的单个单位被选中的概率是不可知的,且不能从概率意义上控制抽样误差。
简单随机抽样
简单随机抽样直接从总体单位中随机抽选样本单位,每个个体被选入样本的概率都相等
简单随机抽样是最基本的抽样方法,许多抽样方法都是在它的基础上发展起来的,其数学性质简单,理论也成熟
分层抽样
分层抽样也称为分类抽样,它是在抽样之前先将总体的元素划分为若干层,然后从各个层中抽取一定数量的元素组成一个样本
系统抽样
系统抽样也称为等距抽样,它是先将总体各元素按照某种顺序排列,并按某种规则确定一个随机起点,然后每隔一定的间距抽取一个元素,直到抽取n个元素组成一个样本。
整群抽样
整群抽样是先将总体划分为若干群,然后以群作为抽样单元从中抽取部分群组组成样本,再对抽中的每个群中包含的所有元素进行调查
数据抽样
“抽样”对于数据分析和挖掘来说是一种常见的前期数据处理技术。对于小概率事件、稀有事件的类失衡情况,即在数据中可能会存在某个或某些类别下的样本数远大于另一些类别下的样本数目。如果不对数据进行处理就建模,此时建立的分类器会倾向于预测数量较多的一类,显然该分类器是无效的,并且这种无效是由于训练集中类别不均衡而导致的。
克服类失衡问题常用的技术有以下两种:
•偏置学习过程的方法,它应用特定的对少数类更敏感的评价指标。
•用抽样方法来操作训练数据,从而改变类的分布。
有多种抽样方法用于改变数据集中的类失衡,常用的有以下两种:
•欠采样法,它从多数类中选择小部分案例,并把它们和少数类样本一起组成一个相对平衡的数据集。
•过采样法,它采用另外的工作模式,使用某些进程来复制少数类样本。
类失衡处理方法:SMOTE
有一种系统构造人工数据样本的方法SMOTE(Synthetic Minority Over-sampling Technique)。在R语言中,DMwR扩展包中的SMOTE()函数可以实现SMOTE方法。该函数可以实现过采样或欠采样的SMOTE方法。该函数常用参数有三个:
•perc.over:过采样时,生成少数类的新样本个数;;
•k:过采样中使用K近邻算法生成少数类样本时的K值,默认是5;
•perc.under:欠采样时,对应每个生成的少数类样本,选择原始数据多数类样本的个数。
例如,当perc.over=500表示对原始数据集中的每个少数样本,都将生成5个新的少数样本;perc.under=80表示从原始数据集中选择的多数类的样本数据集中新生成少数样本的80%。
数据随机抽样:sample()函数
sample()函数基本表达形式为:sample(x, size, replace = FALSE, prob = NULL)
其中x是数值型向量,size是抽样个数,replace表示是否有放回抽样,默认FALSE是无放回抽样,TURE是有放回抽样。
数据等比抽样:createDataPartition函数
通过sample()函数虽然能实现对数据集按照某个变量的类别进行等比例抽样,但是当类别多的时候代码就比较繁琐。现在给大家介绍caret扩展包中的createDataPartition()函数,可以快速实现数据按照因子变量的类别进行快速等比例抽样。其函数基本表达形式为:
createDataPartition(y, times = 1,p = 0.5,list = TRUE,groups = min(5, length(y)))
其中y是一个向量,times表示需要进行抽样的次数,p表示需要从数据中抽取的样本比例,list表示结果是否为列表形式,默认为TRUE,groups表示如果输出变量为数值型数据,则默认按分位数分组进行取样。
用于交叉验证的样本抽样
caret扩展包中的createFolds()函数和createMultiFolds()函数。createFolds()函数的基本形式为:
createFolds(y, k = 10, list = TRUE, returnTrain = FALSE)
其中y是我们要依据分类的变量;k指定k折交叉验证的样本,默认为10,每份的样本量为总量/k;list是否以列表或矩阵的形式存储随机抽取的索引号,默认为TRUE;returnTrain是否返回抽样的真实值,默认返回样本的索引值。
createMultiFolds函数的基本表达式为:
createMultiFolds(y, k = 10, times = 5)
其中k指定k折交叉验证的样本,默认为10,每份的样本量为总量/k;times指定抽样组数,默认为5组(每组中都有10折抽样)。
数据清洗
缺失值处理及判断:识别缺失值
R语言中缺失值以NA(Not Available)表示,判断数据中是否存在缺失值最基本的函数是is.na(),它可以应用于向量、数据框等多种对象,返回结果为逻辑值。当元素为缺失值时,返回TRUE,当元素有真实值时,返回FALSE。例如,令y <- c(1, 2, 3, NA),则is.na(y)返回向量c(FALSE, FALSE, FALSE,TRUE)。
mice扩展包中的md.pattern()函数可生成一个以矩阵或数据框形式展示缺失值模式的表格,该函数只有一个参数,就是要判断的矩阵或者数据框。
R语言有多种对数据缺失值模式进行可视化的方法,此处介绍常用的一种方法。可以利用VIM扩展包中的aggr()函数以图形方式描述数据的缺失情况。其表达形式为:
aggr(x, delimiter = NULL, plot = TRUE, ...)
x表示一个向量、矩阵或数据框,delimiter用于区分插补变量,如果给出对应的值说明变量的值已被插补,但在判断缺失模式时,这一参数默认是忽略的;plot是逻辑值,指明是否绘制图形,默认为TRUE。
缺失值处理及判断:处理缺失值
删除缺失样本:直接过滤缺失样本是最简单的方式,前提是缺失数据的比例较少,而且缺失数据是随机出现的,这样删除缺失样本后对分析结果影响不大。R语言中使用na.omit()函数可以删除带有缺失值的记录,只留下完整的记录。
对缺失值进行替换:在数据挖掘中,通常面对的是大型数据库,它的变量有几十上百个,因为一个变量值的缺失而放弃大量的其他变量值,这种删除是对信息的极大浪费,最常见的就是通过给缺失元素赋值的方式来解决。常用的赋值方式是利用变量均值或中位数来代替缺失值,这样做的优点在于不会减少样本信息,处理起来简单,但缺点在于当缺失数据不是随机出现时会产生偏差。
对缺失值进行赋值:使用均值、中位数对缺失元素进行替换的方法仅仅使用变量自身数据进行处理。实际工作中,很多数据集各变量间是相互影响的,我们可以使用建模方式对变量缺失元素进行预测。此方法将通过诸如线性回归、逻辑回归、决策树、组合、贝叶斯定理、K近邻算法、随机森林等算法去预测缺失值,也就是把缺失数据所对应的变量当作因变量,其他变量作为自变量,为每个需要进行缺失值赋值的字段分别建立预测模型。
异常值判断处理
数据样本中的异常值(Outlier)通常是指一个离散类别型变量(Category)里某个类别值出现的次数太少,或者指一个数值区间型变量(Interval)里某些取值太大或太小。忽视异常值的存在是十分危险的,不加剔除地把异常值加入数据的计算分析过程中,很可能会干扰模型系数的计算和评估,从而严重降低模型的稳定性。
数值区间型变量的异常值是指样本中的个别值,其数值明显偏离其余样本的观测值。异常值也称为离群点,因此异常值分析也称为离群点分析。对异常值的分析方法主要有:简单统计量分析、3σ准则、箱线图分析、聚类分析。
•简单统计量分析:拿到一份数据,可以先对数据进行描述统计量分析,进而查看哪些数据不符合实际业务情况。常用的统计量主要是最大值和最小值,可用于判断这个变量中的数据是否超出了合理的范围。
•3σ准则:又称为拉依达准则如果数据服从正态分布,在3σ准则下,异常值被定义为一组测定值与平均值的偏差超过三倍标准差的值。在正态分布中σ代表标准差,,μ代表均值。3σ准则为:数值分布在(μ-σ, μ+σ)中的概率为0.6826;数值分布在(μ-2σ, μ+2σ)中的概率为0.9544;数值分布在(μ-3σ, μ+3σ)中的概率为0.9973。距离平均值 3σ之外的值出现的概率小于0.003,属于极个别的小概率事件,故称为异常值。
•箱线图分析:箱线图是常用来识别异常值的手段之一,具有数据不要求服从正态性、鲁棒性强等特性。但在箱线图中,我们只能看到该变量有无异常点,对异常点的样本号及异常值不能在图中立即识别,此时我们可以借助boxplot.stats()函数辅助进行单变量的异常检测。
•聚类分析:如果需要利用多个数值型变量来决定样本是否属于异常值的话,我们可以使用聚类算法来检测异常。最常用的是使用K-means算法,数据被分成k组,通过把它们分配到最近的聚类中心(簇中心)。然后,我们能够计算每个对象到簇中心的距离(或相似性),并且选择最大的距离作为异常值。
数据变换
对于数据分析建模来说,数据变换是最常用、也是最有效的一种数据处理技术。经过适当的数据转换后,我们才能将原始数据转换成适合建模的数据,模型的效果常常有明显的提升。正因如此,数据变换成了很多数据分析师在建模过程中常使用的数据处理手段之一。
按照采用的变换方法和目的的不同,数据变换常用的有以下几类:
•产生衍生变量:前文已经有介绍,不再赘述。
•数据分箱:所谓“分箱”,实际上就是按照变量值划分的子区间,如果一个变量值处于某个子区间范围内,就称把该变量值放进这个子区间所代表的“箱子”内。R语言中可以用cut()函数实现
cut(x, breaks, labels = NULL,include.lowest = FALSE, right = TRUE, dig.lab = 3,ordered_result = FALSE, ...)
其中,参数x是数据向量,参数breaks是划分区间,参数labels是否给不同区间指定标签,参数include.lowest是否包含最小值,参数right指定闭区间方向,dig.lab 表示几位有效数字,ordered_result 表示是否给出大小排序。
•数据标准化:数据标准化转换也是数据分析中常见的数据转换手段之一,数据标准化转换的主要目的是为了消除变量之间的量刚(各变量的数据范围差异)影响,将数据按照比例进行缩放,使之落入一个相同范围之内,让不同的变量经过标准化处理后可以有平等分析和比较的基础。如K均值聚类、层次聚类、主成分分析,一般基于距离的算法或模型都需要对原始数据进行标准化处理。常用的数据标准化转换是Min-Max标准化和零-均值标准化。
数据哑变量处理
•哑变量(Dummy Variable)也叫虚拟变量,引入哑变量的目的是将不能够定量处理的变量量化,如性别、年龄、职业等。这种“量化”通常是通过引入“哑变量”来完成的。根据这些变量的因子水平,构建只取0或1的人工变量,通常称为哑变量。举一个例子,假如变量“性别”的取值为:男性、女性。我们可以增加2个哑变量来代替“性别”这个变量,分别为性别.男性(1=男性/0=女性)、性别.女性(1=女性/0=男性)。
•在研究变量间关系或者建模时可能都需要引入哑变量,例如在线性回归分析中引入哑变量的目的是为了考察定性因素对因变量的影响。
caret包中的dummyVars()函数
•caret扩展包中的dummyVars()函数专门用于处理哑变量,其基本表达形式为:
dummyVars(formula, data, sep = ".", levelsOnly = FALSE, fullRank = FALSE, ...)
其中,formula表示模型公式;data是需要处理的数据集;sep表示列名和因子水平间的连接符号;levelsOnly默认是FALSE,当为TRUE时表示仅用因子水平表示新列名;fullRank默认是FALSE,当为TRUE时表示进行虚拟变量处理后不需要出现代表相同意思的2列。
数据去重
mean(example)#求表中的平均数
median(example)#求表中的中位数
which.max(example)#求表中的众数
tibble数据框
tibble是一种与data.frame类似的数据框,它是不破坏R现有代码的前提下,对传统数据框功能进行改进的新数据结构。与data.frame相比tibble更易于使用
定义data.frame()数据框的方法
mydata=frame(x,y,z)
tibble(mydata)
tibble数据框的操纵与data.frame相似,可以通过$符号或者索引[[]]选取某列
筛选某些行:filter()函数
filter()函数常用与逻辑运算符、between()函数,%in%运算符协同工作从而筛选出满足某些条件的数据子集。
filter(example,a==1|b==2)
filter(example,between(a,1,3))
filter(example,a%in%c(1,2))
filter(example,a==1|is.na(d))#显示数据缺失的行
select()函数
select()函数常与冒号,减号,one_of()函数等集合操作协同,从而筛选满足某些条件的数据子集。
select(example,a,b,c)
var=c(a,b,c)
select(example,one_of(var))
#如果要选取的列是挨着的,则可以通过冒号来选取
select(example,a:c)#选取a到c的所有列
#如果你不想选取某些列可以用-
select(example,-(a:c))#不选取a:c之间的列
#将特定的列移到数据集开头
select(example,a,b,c,everything())
arrange()函数
arrange()函数与filter()函数的工作方式相同,它只改变数据按行的排列方式,默认情况下,arrange()会按照输入的列名对数据进行升序排列。如果数据中存在缺失值arrange()函数会自动将缺失值NA排在最后面。
arrange(example,a)#按照a列表升序排列数据
arrange(example,a,b,c)#按照多个变量升序排列数据
arrange(example,desc(a))#通过降序排列数据
mutate()函数
mutate()函数常常通过对变量的比较运算、逻辑运算、算数运算、三角函数运算等协同创建新变量。
mutate(example,new_a=a+1)#创建新的变量
mutate(example,move_diff=a-lag(a))#生成当前值与滞后项的差值
transmute()函数
transmute(example,new_a=a+1)#返回只包含创建的新变量的数据框
数据汇总summarize()函数
summarize()函数常与group_by()函数协同实现分组统计
count_a=group_by(example,a)%>%summarize(example=n())
常见汇总函数
mean()#均值
sd()#标准误
n()/count()#计数
sum()#求和
max()#最大值
min()#最小值
median()#中位数
mad()#绝对中位差
IQR()#四分位距
quantile(x,ratio)#分位数
first()#取下标排在分组第一个位置的数据
last()#取下标排在分组第n个位置的数据
nth(x,n)#取下标排在分组第n个位置的数据
n_distinct()#取唯一值
数据去重
我们可以通过base包中的unique()或者dplyr包中的distinct()函数,其中unique()函数能对矩阵、数组或数据框进行操作,移除重复元素或记录。
数据排序
可使用基础包的sort()和order()函数实现。其中sort()函数返回的是排序后的数据结果,order()函数返回的是排序后的元素所在位置。两者默认都是按照升序(由小到大)排序,可以通过将参数decreasing设置为TRUE,改成降序排序。
数据筛选
有时候,我们更关注数据集中的部分数据,可以利用R语言强大的索引特性来定位符合筛选条件的元素,也可以根据表达式得到符合条件的数据子集。
基础包的subset()函数非常适合做数据筛选的工作。subset()函数主要参数有两个:参数subset是逻辑表达式,用来过滤符合条件的行或元素;参数select是用来选择需要保留的列。
dplyr扩展包的filter()函数也能对数据进行筛选操作。
数据合并
基础包的行合并rbind()和列合并cbind()函数在第二章已经接触过。这两个函数很简单,大家记住一点:rbind()函数使用时要确保各数据对象具有相同的列数,cbind()使用时要确保各数据对象具有相同的行数。
在dplyr扩展包中有bind_rows()和bind_cols()函数实现简单的行列合并功能,需要注意的一点是,这两个函数只能操作数据框。
数据关联
通过cbind()函数可以实现简单的数据合并,如果想实现更复杂的数据匹配,就需要借助merge()函数了。R语言中的merge()函数类似于Excel中的Vlookup()函数,可以实现对两个数据表进行匹配和拼接功能。merge()函数的表达形式如下:
merge(x, y, by = intersect(names(x), names(y)),
by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
sort = TRUE, suffixes = c(".x",".y"), no.dups = TRUE,
incomparables = NULL, ...)
merge()函数有4种匹配拼接模式,分别为inner,left,right和outer模式。 其中inner为默认的匹配模式,代表内连接;all=T代表全连接;all.x=T代表左连接;all.y=T代表右连接。
merge()函数一次只能匹配两个表,如果想实现两张表以上的关联,则需要多次运用merge()函数实现。
dplyr扩展包的left_join()、right_join()、inner_join()、full_join()函数也能轻松实现左连接、右连接、内连接和全连接。以下代码利用full_join()函数结合管道符号%>%实现df_join2的效果。
数据转换
让我们学习如何利用transform()函数进行数据转换。
当重新赋值的标签在数据集变量名中未出现时,则会在数据集后面新增列。以下代码实现将变量vs、am值进行转换后分别赋值给变量Engine、Transmission,此时会在mtcars中新增两列。
R语言案例
成绩表格
names=c("张青松","王宇翔","田思雨","徐丽娜")
a = c(68,85,74,88)
b=c(85,91,74,100)
d=c(84,63,61,49)
e=c(89,76,80,71)
f=c(86,66,69,66)
class1=data.frame(姓名=names,统计学=a,数学=b,营销学=d,管理学=e,会计学=f)
- \f\n\r\t\v ↩