R语言与数据的预处理_TensorFlow学习的博客-程序员秘密

技术标签: 数据预处理  r语言  R语言  大数据  

    在面对大规模数据时,对数据预处理,获取基本信息是十分必要的。今天分享的就是数据预处理的一些东西。

一、获取重要数据

          在导入大规模数据时,我们通常需要知道数据中的关键内容:最值,均值,离差,分位数,原点矩,离差,方差等。在R中常用的函数与作用整理如下:

统计函数

作用

Max

返回数据的最大值

Min

返回数据的最小值

Which.max

返回最大值的下标

Which.min

返回最小值的下标

Mean

求均值

Median

求中位数

mad

求离差

Var

求方差(总体方差)

Sd

求标准差

Range

返回【最小值,最大值】

Quantile

求分位数

Summary

返回五数概括与均值

Finenum

五数概括(最值,上下四分位数,中位数)

Sort

排序(默认升序,decreasing=T时为降序)

Order

排序(默认升序,decreasing=T时为降序)

Sum

求和

length

求数据个数

emm

Actuar包中求k阶原点矩

skewness

Fbasic包中求偏度

kurtosis

Fbasics包中求峰度

      注:对象为分组数据,矩阵时返回的不是整体的方差,均值,而是每一列(组)的方差均值其余变量类似。

 

二、直方图与频数统计

      对于数据分布的认识,在大规模时有必要使用直方图。在R语言中,直方图的函数调用为:

hist(x, breaks = "Sturges",

    freq = NULL, probability = !freq,

    include.lowest = TRUE, right = TRUE,

    density = NULL, angle = 45, col = NULL, border = NULL,

     main= paste("Histogram of" , xname),

    xlim = range(breaks), ylim = NULL,

    xlab = xname, ylab,

    axes = TRUE, plot = TRUE, labels = FALSE,

    nclass = NULL, warn.unused = TRUE, ...)

        这里值得一提的是,分组参数breaks默认使用史特吉斯(Sturges)公式,根据测定数n 来计算组距数k,公式为:k=1+3.32 logn。当然也可以自己设定一个数组来决定分组。(举例参见《R语言绘图学习笔记》)

 

         说完频率分布直方图,我们还有频率分布直方表。对于数据的统计,函数table可以统计出数据中完全相同的数据个数。例如对《全宋词》中暴力拆解(两个相邻字算一词)词语使用数目的统计程序如下:

[plain]  view plain copy print ?
  1. <span style="font-size:18px;">l=scan("Ci.txt","character",sep="\n");  
  2. l.len=nchar(l);  
  3. ci=l;  
  4. sentences=strsplit(ci,",|。|!|?|、");# 句子用标点符号分割。  
  5. sentences=unlist(sentences);  
  6. sentences=sentences[sentences!=""];  
  7. s.len=nchar(sentences);#单句太长了说明有可能是错误的字符,去除掉。  
  8. sentences=sentences[s.len<=10];  
  9. s.len=nchar(sentences);  
  10. splitwords=function(x,x.len)substring(x,1:(x.len-1),2:x.len);  
  11. words=mapply(splitwords,sentences,s.len,SIMPLIFY=TRUE,USE.NAMES=FALSE);  
  12. words=unlist(words);  
  13. words.freq=table(words);#词频统计  
  14. words.freq=sort(words.freq,decreasing=TRUE);  
  15. data.frame(Word=names(words.freq[1:100]),Freq=as.integer(words.freq[1:100]));</span>  


   而对于一堆数,我们按区间做的时候,就还需要函数cut.调用格式如下:

cut(x, breaks, labels = NULL,
    include.lowest = FALSE, right = TRUE, dig.lab = 3,
    ordered_result = FALSE, ...)

举一个具体例子,某一款保险产品,假设保单到达的速率为10张/天,理赔发生的速率为1次/天。假设每张保单价格c=120,理赔额服从参数为v=1/1000 (以c*lambda1=1.2*lambda2/v设定)的指数分布。设定初始u=3000时,计算到第1000天为止发生破产的概率。(案例摘自《复合泊松过程模型的推广和在R语言环境下的随机模拟》 )

破产过程的R代码如下:

[plain]  view plain copy print ?
  1. <span style="font-size:18px;">pois.proc= function(T, lambda){  
  2. S = 0  
  3. I =rpois(1, lambda*T) #产生t 泊松分布,这里调用R 内置的泊松函数避免循环。  
  4. U =runif(I)  
  5. S =sort(T * U) #排序产生顺序统计量的思想  
  6. list(I= I, S = S)  
  7. }  
  8.    
  9. broken.proc= function(k, u= 3000, c= 120){  
  10. n =1000  #模拟到时刻 1000 为止的破产情况  
  11. M =pois.proc(n, 10)  
  12. N =pois.proc(n, 1)  
  13. U = u   #初始盈余  
  14. X = 0  
  15. result=0  
  16. A =sort(c(M$S, N$S))  #M$S和 N$S 是保单和理赔达到时刻  
  17. for(iin 1:length(A)){  
  18. if(any(A[i]==N$S)== 0)  
  19. U=U+c  
  20. else {  
  21. X[i] =rexp(1, rate=1/1000)  
  22. U = U -X[i]   #减去这个随机值  
  23. if(U< 0){    #判断盈余是否小于0(保单到达的时候不需要判断)  
  24. result<-A[i]   #盈余小于 0时,记录这个理赔到达(破产)的刻  
  25. break}    
  26. }  
  27. }  
  28. if(U>= 0){   #如果 for循环没有中断,判最终的盈余其实肯定非负  
  29. result= n + 200  
  30. }  #给结果赋值一个明显比模拟时刻大的数据,表示未破产  
  31. return(result)   #返回最终结果  
  32. }  
  33. #根据这个破产过程可以模拟保险人的频数和频率:  
  34. simulation= function(n=100){ #定义一个重复模拟破产过程的函数  
  35. t =numeric(n)  
  36. for(iin 1:n){  
  37. t[i] =broken.proc(i)}   #产生 n次破产或者代表未破产的时刻  
  38. return(t)}  
  39. time=simulation(n= 1200)  
  40. rangetime= time[time!=1200]  
  41. breakratio= length(rangetime)/length(time);  
  42. breakratio  
  43. break.points<-c(0,10,20,30,40,50,100,200,300,400,500,1000,1200)  
  44. table(cut(time,breaks=break.points))  
  45. hist(rangetime,breaks = 50, xlab='broken time',xlim = c(0, max(rangetime)),main = 'Histogramof Broken time')</span>  


         用R 语言模拟了1200 次,最终结果 1200 次中破产 628 次,破产率大概 52.3% 。输出各阶段破产时刻 频数和率结果如下:

区间

频数

 

 

 

(0,10]

389

 

 

 

(10,20]

89

 

 

 

(20,30]

45

 

 

 

(30,40]

28

 

 

 

(40,50]

16

 

 

 

(50,100]

36

 

 

 

(100,200]

17

 

 

 

(200,300]

6

 

 

 

(300,400]

2

 

 

 

(400,500]

0

 

 

 

(500,1000]

0

 

 

 

(1000,1200]

572

 

 

 

     对于一些数据我们可能直接录入的是频率分布直方表,那么actuar包中提供了一个有用的数据结构grouped.data。调用格式:

grouped.data(..., right = TRUE, row.names = NULL, check.rows = FALSE,
             check.names = TRUE)

运用举例:

[plain]  view plain copy print ?
  1. <span style="font-size:18px;">library(actuar)  
  2. z=rnorm(10000)  
  3. break.points<-c(-Inf,-3,-2,-1,0,1,2,3,Inf)  
  4. tz<-table(cut(z,breaks=break.points))  
  5. tz  
  6. zz<-grouped.data(Group=break.points,freq=as.matrix(tz))  
  7. zz</span>  


对比一下下面的输出结果,我们发现分组数据的均值计算与总体数据计算方法是不一样的。

[plain]  view plain copy print ?
  1. <span style="font-size:18px;">mean(zz)  
  2. mean(zz[c(2:7),])  
  3. mean(z)</span>  


注:函数elev()可以计算有限期望值,可以避免mean(zz)不存在的尴尬。

   当然对于数据的直观分析R提供的函数有许多,我们将常见的函数汇总如下:

[plain]  view plain copy print ?
  1. EDA <- function (x)  
  2.   {   
  3.     par(mfrow=c(2,2))              # 同时做4个图  
  4.     hist(x)                        # 直方图   
  5.     dotchart(x)                    # 点图  
  6.     boxplot(x,horizontal=T)        # 箱式图  
  7.     qqnorm(x);qqline(x)            # 正态概率图  
  8.     par(mfrow=c(1,1))              # 恢复单图  
  9.   }  


三、正态检验与经验分布

对于数据的分布估计经验分布是一个非常好的估计。在actuar包中函数ogive给出的实现:

ogive(x, y = NULL, ...)
 
## S3 method for class 'ogive'
print(x, digits = getOption("digits") - 2, ...)
 
## S3 method for class 'ogive'
summary(object, ...)
 
## S3 method for class 'ogive'
knots(Fn, ...)
 
## S3 method for class 'ogive'
plot(x, main = NULL, xlab = "x", ylab = "F(x)", ...)

还是以上面的例子数据zz为例:

ogive(zz)

plot(ogive(zz))

输出结果:

Ogive forgrouped data

Call:ogive(zz)

    x =  -Inf,     -3,     -2, ...,      3,    Inf

      F(x) =     0, 0.0011, 0.0229,  ...,0.9985,      1

 

由于大数定律的存在,很多情况下,正态性检验是十分有必要的一个分布检验,在R中提供的正态性检验可以汇总为下面的一个正态检验函数:

[plain]  view plain copy print ?
  1. <span style="font-size:18px;">NormTest<-function(data){  
  2. library(fBasics)  
  3. library(nortest)  
  4. udata<-unique(data)  
  5. result<-list()  
  6. result$D<-dagoTest(data)  
  7. result$jB<-jarqueberaTest(data)  
  8. result$SW<-shapiroTest(data)  
  9. result$lillie<-lillie.test(data)  
  10. result$ad<-ad.test(data)  
  11. result$cvm<-cvm.test(data)  
  12. result$sf<-sf.test(data)  
  13. return(result)  
  14. }</span>  


         对于分布的检验还有卡方检验,柯尔莫哥洛夫检验等,在R中也有实现函数chisq.test()等。我们同样以一个例子来说明:


例子摘自:王兆军《数理统计讲义》习题6.3

          解答如下:(结果以注释形式标明)

[plain]  view plain copy print ?
  1. <span style="font-size:18px;">v<-c(57,203,383,525,532,408,273,139,45,27,16)  
  2. chisq.test(v)#p<0.05,认为检验总体是否与给定的p相同,p缺省表示等可能性检验  
  3. #验证V的分布是否为poission分布  
  4. x<-0:10  
  5. options(digits=3)  
  6. likely<-function(lamda=3){  
  7. -sum(y*dpois(x,lamda=lamda,log=T))  
  8. }  
  9. library(stats4)  
  10. mle(likely)  
  11. chisq.fit<-function(x,y,r){  
  12. options(digits=4)  
  13. result<-list()  
  14. n<-sum(y)  
  15. prob<-dpois(x,3.87,log=F)  
  16. y<-c(y,0)  
  17. m<-length(y)  
  18. prob<-c(prob,1-sum(prob))  
  19. result$chisq<-sum((y-n*prob)^2/(n*prob))  
  20. result$p.value<-pchisq(result$chisq,m-r-1,lower.tail=F)  
  21. result  
  22. }  
  23. chisq.fit(x,v,1)#p<0.05 拒绝假设分布</span>  
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jinyeweiyang/article/details/10402385

智能推荐

ARM板上构造gdb +gdbserver调试环境_zht_sir的博客-程序员秘密

S3C2410 ARM板上构造gdb +gdbserver调试环境 远程调试环境由宿主机gdb和目标机调试stub共同构成,两者通过串口或TCP连接。使用GDB标准程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的一段代码,作为宿主机GDB和目标机调试程序间的一个媒介而存在。                就目前而言,嵌入式Linux系统中,主要有

VS2010下编译mp4v2及在项目中的使用_mp4v2 vc 编译_一枪尽骚丶魂的博客-程序员秘密

转自该处最近做项目需要将H264文件封装为mp4文件,从网上找到了MP4V2库,下载下来后不知道从何下手,官方网站https://code.google.com/p/mp4v2/在windows下的编译过程介绍的很简短,对刚刚开始使用VS2010做大型项目的人来说,实在是有些无力。于是从网上找到了下面几篇博客文章,亲测可用,留下来以备查看。1.mp4v2 库在VS2010下的编译过

php如何访问web api接口,PHP调用WebAPI接口_何处轻烟揽月明的博客-程序员秘密

PHP调用WebAPI接口该接口传入参数是JSON格式,传输方式是POST,用PHP调用WebAPI接口,获取返回参数。推荐一个Php在线测试工具,地址:https://www.dooccn.com/php/源码:$Url = “http://218.29.74.138:17252/api/Users/GetUserInfo”;//接口地址$sl_data=array(‘UserCode’=&gt...

RocksDB基本架构与原理介绍__Janick的博客-程序员秘密

RocksdbFlink提供基于流的有状态计算,除了提供实时数据流的处理能力,还需要将计算产生的状态存储起来。为了满足状态存取需求,提供了memory、flie system、rocksdb三种类型的状态存储机制。memory存取高效单空间有限,且可用性低;file system提供状态持久化能力但存取性能较低;rocksdb提供数据快速写入以及数据持久化的能力。本文介绍了Rocksdb设计的基本架构。RocksDB介绍Rocksdb 是基于Google LevelDB研发的高性能kv持久化存

event.cancelBubble的理解_cichaojiao4477的博客-程序员秘密

Bubble就是一个事件可以从子节点向父节点传递,比如鼠标点击了一个TD,当前的event.srcElement就是这个TD,但是这种冒泡机制使你可以从TR或者Table处截获这个点击事件,但是如果你event.cancelBubble,则就不能上传事件。 例子: &lt;html...

Windows Minifilter驱动 - 加载顺序 (2)_zj510的博客-程序员秘密

安装minifilter后,可以在注册表看到一些

随便推点

Flex中字符串ReplaceAll_flex 中 replace_pippo_的博客-程序员秘密

用过FLEX中String类型的朋友可能知道,replace这个方法并不过替换所有内容。那么我们需要替换所有内容怎么办?只有自己动手,丰衣足食咯,呵呵。言归正专,有两种方法,一种是利用Array的方式,另一种是利用正则去替换。/** * StringReplaceAll * @param source:String 源数据 * @param find:String 替换对象 * @pa

pip安装报错 Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-SPz2QZ/cryp......_IDO老徐的博客-程序员秘密

pip安装报错 Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-SPz2QZ/cryptography 解决方法解决方式,去安装 setuptools命令:pip install --upgrade setuptools搞定 。 ...

学习记录之--SQL Server 数据库学习笔记(一)_w_xuexi的博客-程序员秘密

--创建数据库create database EmpDBsgo--切换数据库use EmpDBsgo------------------------------------------------------------------------------------------------------------------创建表 tbDepart  部门表c

c语言单元最短路径贪心算法,单源最短路径 贪心算法_weixin_39543478的博客-程序员秘密

《单源最短路径 贪心算法》由会员分享,可在线阅读,更多相关《单源最短路径 贪心算法(3页珍藏版)》请在人人文库网上搜索。1、实验三 单源最短路径一、实验目的及要求掌握贪心算法的基本思想用c程序实现单源最短路径的算法二、实验环境Window下的vc2010三、实验内容1、有向图与单源点最短路径2、按路径长度非降的次序依次求各节点到源点的最短路径3、Dijkstra算法四、算法描述及实验步骤设给定源点...

小程序复制功能_有什么插件可以复制小程序的文字吗_程序员林的博客-程序员秘密

效果图:官方文档:wx.setClipboardData(Object object)基础库 1.1.0 开始支持,低版本需做兼容处理。本接口从基础库版本1.9.6起支持在小程序插件中使用设置系统剪贴板的内容。调用成功后,会弹出 toast 提示"内容已复制",持续 1.5s参数Object object属性 类型 默认值 必填 说明 data string 是 剪贴板的内容 success f...

java 命名管道_使用命名管道连接到LibreOffice_神秘的云云的博客-程序员秘密

到目前为止我已经使用了套接字模式 . 刚刚在我的机器上通过cmd测试了管道:/usr/lib/openoffice/program/soffice.bin -accept='pipe,name=foo;urp;StarOffice.ServiceManager' -nologo -headless -nofirststartwizard -invisible$ lsof -c soffice|eg...

推荐文章

热门文章

相关标签