1、1数据科学导论 第四章 数据整理和清理案例本章导言 整理及清理数据是任何数据科学家必定会遇到的问题.数据存储格式千差万别,不存在统一的方法.本章通过例子介绍如何进行数据整理和清理.本章处理后的数据可能在后面章节用到.一般的“教科书数据”往往都不需要多少加工就可以直接使用,所以本章可作参考或者自学之用.23主要内容一 GDP 数据案例二 世界卫生组织案例之一三 世界卫生组织案例之二四 数据中的缺失值五 本章的python代码4一 GDP 数据案例GDP数据案例例4.1 各国按支出类型分列的本地生产总值支出数据(GDP1.csv),该数据涉及220 个国家的9 个指标及最长47 年(1970 至2
2、016 年)的记录,单位均为美元值.该数据是矩形数据,有83060 行及4 列.数据共包括220 个国家,9 个指标及最多47 年的记录,理论上应该有220*9*47=93060 个记录,但由于不一定所有国家都提供了同样多的指标,对于每个指标也不一定提供了那么多年,因此实际上只有83060 条观测值(行).5数据相关符号及含义6整理成“观测值-变量”矩形数据 形成每个国家各个时期不同指标的多元时间序列(如:行代表年份,每列一个经济指标);形成每年的不同国家各个指标的横截面数据(如:行代表国家或地区,每列一个经济指标);形成单项指标的各个时期不同国家的多元时间序列(如:行代表年份,每列一个国家)
3、.7形成2016年各国的多指标数据 第第1步步 导入导入tidyverse包包,读入读入GDP1.csv数据数据.GDP1=read.csv(GDP1.csv)levels(GDP1,3)=paste0(V,1:9)#简化名字简化名字library(tidyverse)tb=as.tibble(GDP1)8形成2016年各国的多指标数据 第第2步步 整理整理GDP1.csv数据数据.tb2016%#选中选中2016之后去掉之后去掉Year列列spread(key=Item,value=Value)#转换转换Item元素为列元素为列,Value为值为值tb%#原始数据原始数据%是是程序包程序包p
4、urrr 提供的一个提供的一个“管道管道”性质的算子性质的算子,可以把一系列操作串起来而不用每次存一个对可以把一系列操作串起来而不用每次存一个对象象.9形成2016年各国的多指标数据subset(Year=2016)%#选择选择2016年年select(-Year)%#选择选择Year之外的变量也可以用下面一行之外的变量也可以用下面一行spread(key=Item,value=Value)%#做转换做转换ggplot(.,aes(x=V4,y=V5)+geom_point()+geom_smooth()#选选V4,V5作散点图并拟合作散点图并拟合loess曲线曲线10形成日本各个时期不同指标
5、的多元时间序列library(magrittr)#用于调用算子用于调用算子%$%#第一种方法第一种方法:固有固有R函数画图函数画图.前四行产生数据前四行产生数据,最后三行画图最后三行画图tb%subset(Country.or.Area=Japan)%#选定日本选定日本select(-Country.or.Area)%#选择除国家、地区之外的变量选择除国家、地区之外的变量spread(key=Item,value=Value)%#经济指标为列经济指标为列,时间为行时间为行select(-Year)%ts(start=1970,end=2016)%#标为时间序列标为时间序列plot(plot.t
6、ype=single,col=11:19,lty=1:9)%$%#时间序列图时间序列图legend(topleft,paste0(V,1:9),col=11:19,lty=1:9,cex=.7)#图例图例11形成日本各个时期不同指标的多元时间序列#第二种方法第二种方法:ggplot画图画图.前两行产生数据前两行产生数据,最后三行画图最后三行画图tb%subset(Country.or.Area=Japan)%#选国家选国家ggplot(aes(x=Year,y=Value)+geom_line(aes(color=Item),size=1)+theme_minimal()12形成各个时期不同国
7、家的多元时间序列只选V6(GDP)一个经济指标,先形成以时间为行,以国家为列的数据(赋值给对象GDP),然后挑选金砖五国的列(列号:28;44;95;163;182),再用函数ts 转换成时间序列类型,最后画出图4.3.13形成各个时期不同国家的多元时间序列#产生以时间为行,以国家为列的只有GDP(V6)一个指标的数据GDP=tb%subset(Item=V6)%select(-Item)%spread(key=Country.or.Area,value=Value)#准备选择BRICS国家,下面重设国家名字(原数据是很长的国家全名)BS=c(Brazil,China,India,Russia
8、,South Africa)GDP,c(28,44,95,163,182)%#只取金砖国家的列ts(start=1970,end=2016)%plot(plot.type=single,col=1:5,lty=1:5)%$%legend(topleft,BS,col=1:5,lty=1:5,cex=.7)1415二 世界卫生组织案例之一世界卫生组织案例 选取 WHO Data 名下名下Demographic and socioeconomic statistics 组和组和Risk factors 组的共11个数据集.每个数据集仅表明一些国家或地区少数年份的单一指标.希望能够选择最近的年份把这
9、些数据文件的内容放到一个数据集中,形成代表国家或地区的行及代表不同指标的列.1611个数据文件及说明17数据提取 NN=c(D1,D12,D13,D15,D16,D17,D18,D2,D5,D6,D7)Files=paste0(NN,.csv)DF=lapply(Files,read.csv)a=list(a=c(2,5,1,7),b=list(c(1:9,89,-1),New,Happy),LETTERS)a$a2 a1418数据提取 DF=list()#定义一个空list,下面再往其中赋值 for(i in 1:length(Files)DFi=read.csv(Filesi)lapply
10、(DF,names)19删除多余的行和列 U=NULL for(i in 1:length(DF)U=unique(c(U,unique(as.character(DFi,1)Trash=c(1,2,3,4,footnoteSeqID)U=setdiff(U,Trash)#集合差:去掉Trash DF=lapply(DF,function(x)xx,1%in%U,)#只取trash之外的部分 DF=lapply(DF,function(x)select(x,-Value.Footnotes)#去掉注释列20把多个数据合并成一个数据 x=DF1 for(i in 2:length(NN)x=me
11、rge.data.frame(x,DFi,by=Country.or.Area)write.csv(x,DP.csv,row.names=FALSE)#把合并的结果数据存成csv文件2122三 世界卫生组织案例之二世界卫生组织案例之二选择10 个数据,这些数据在网站上的名字及含义如下表23输入并识别数据library(stringr)RFiles=c(R1.csv,R10.csv,R11.csv,R13.csv,R14.csv,R15.csv,R2.csv,R6.csv,R8.csv,R9.csv)RN=str_sub(RFiles,1,-5)#选取没有扩展名.csv的字符串:#第1到倒数第5
12、个(-5)RS=lapply(RFiles,function(x)read.csv(x,na.strings=-)24删除多余的行和列library(tidyverse)Trash=c(1,footnoteSeqID,10,11,2,3,4,5,6,7,8,9)%!in%-function(x,y)!(%in%(x,y)#等价于!(x%in%y)RS=lapply(RS,function(x)xx,1%!in%Trash,)#只取Trash之外的行RS=lapply(RS,function(x)select(x,-Value.Footnotes)#去掉注释列25合并数据IA=c(2,3,6,7
13、)#没有性别或区域的4个变量RNIA=R10 R11 R15 R2IG=c(1,4,5,8)#3个GENDER,将转换成12个变量RNIG=R1 R13 R14 R6IR=c(9:10)#2个RESIDENCE.AREA(不考虑总和Total),#IR将转换成4个变量RNIR=R8 R9S=c(Female,Male,Both sexes)#标记GENDER的水平R=c(Rural,Urban)#标记RESIDENCE.AREA的水平26其他问题levels(RR$R2)2=str_sub(levels(RR$R2)2,2,4)#去掉第二个水平中的%as.character%as.numeri
14、c()return(Z)2728四 数据中的缺失值缺失值的审视与标记 缺失值已经标明的情况 数据中往往有缺失值,首先假定缺失值是用字符NA标记的,这是R 系统可以自动识别的标准记号.对于这种数据对象,可以使用程序包mice9的函数md.pattern(对应于英文missing data pattern)可以得到一个数据的缺失值的基本情况.library(mice)md.pattern(DRmix,26:32)29缺失值的审视与标记 缺失值未标明的情况如果原始数据没有注明有没有缺失值,人们不可能在读入文件时猜测哪些值会缺失,这时就利用“手工”程序和逻辑判断来“捕捉”缺失值.如原始数据已经说明缺失
15、值的标记,则在读入时就可以自动标出缺失值.比如,例4.4的缺失值来自文件R6.csv,而且缺失值是用-标记的,在读入该数据时加入一个选项na.strings=-来自动把-标为NA.请读者比较下面的运算(对R6.csv 最后两个变量的汇总):30缺失值的审视与标记31删除缺失值的方法及问题 默认删除 x=c(3,7,4.5,6,21,NA,-5)mean(x)1 NA mean(x,na.rm=TRUE)1 6.083333除了na.rm 选项之外,还有一些选项如na.action=na.exclude 和na.action=na.omit 之类如同删除一样.32删除缺失值的方法及问题 直接删除
16、相关的行或列library(tidyverse)DRmix=read_csv(DRmix.csv)#以以tibble形式形式Total=DRmix,-1%dim()%prod()%print()#数据数目总数#删除相应缺失行后剩余数目:Row_omit=DRmix,1%na.omit()%dim()%prod()%print()1 430933删除缺失值的方法及问题#删除3个缺失列后剩余数目:Col_omit=DRmix,-1%select(-R6M,-R6F,-R6B)%dim()%prod()%print()1 4788 Total-Row_omit#删除相应缺失行后实际删除的数目1 99
17、2 Total-Col_omit#删除相应3个缺失列后实际删除的数目1 51334用认定值或某些准则来填补缺失值 用认定的值来填补name=c(Lucy,Barbara,Tom,Zina,John,Janet)hight=c(1.6,1.7,NA,1.75,NA,1.8)gender=c(Female,Female,Male,NA,Male,Female)(z=data.frame(name,hight,gender)z$hightis.na(z$hight)=c(1.85,1.9)z$genderis.na(z$gender)=Female;z35用认定值或某些准则来填补缺失值用相应列的均值
18、、中位数来填补下面用程序包Hmisc12的函数impute来实现对缺失值的填补 library(Hmisc)x=c(3,7,NA,21,NA,10000)impute(x,fun=mean)#用均值填补1 2 3 4 5 63.00 7.00 2507.75*21.00 2507.75*10000.00 impute(x,median)#用中位数填补36利用可预测模型来填补缺失值w=read.table(dermatology.data,sep=,header=FALSE,na.strings=?)for(i in(1:ncol(w)-34)w,i=factor(w,i)library(VIM
19、)aggr_plot-aggr(w,col=c(navyblue,red),numbers=TRUE,sortVars=TRUE,cex.axis=.25,gap=3,ylab=c(Histogram of missing data,Pattern)37K 最近邻方法填补library(VIM)library(laeken)getwd()w=read.table(dermatology.data,sep=,header=FALSE,na.strings=?)for(i in(1:ncol(w)-34)w,i=factor(w,i)a=kNN(w,numFun=weightedMean,weig
20、htDist=TRUE)38程序包mice 的填补方法 程序包mice(英文Multivariate Imputation by Chained Equations 的缩写)中的同名函数mice 包含了各种通过链方程填补缺失值的方法.算法mice 为多变量缺失数据创建多重填补值.该方法基于完全条件规范(fully conditionalspecification),其中每个存在缺失值的变量由单独的模型来填补.算法mice 可以用于包括连续形式、二进位形式、无序分类变量和有序分类变量等各种变量混合的数据.library(mice)b=mice(w)39利用随机森林方法来填补缺失值 下面用程序包missForest17(Stekhoven&Buehlmann,2012)来说明对例4.5数据缺失值的填补过程.该程序只有一行,也不用选项.library(missForest)miss.w=missForest(w)4041五 本章的python代码本章的python代码.DS python codeDSchap4.ipynb4243谢谢敬请指正!
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。