数据抽样

2018-08-31

2018-08-31
数据抽样与划分

1 随机数的生成


1.1 正态分布随机数

  生成正态分布随机数的函数为rnorm,函数规则为:

  rnorm(n,mean=x,sd=y)

  其中,n表示随机数的数量,mean表示正态分布的均值,sd表示正态分布的标准差。随机数生成如下所示:

rnorm(5,5,5) # 生成随机数                     
## [1]  3.567995 10.677234 -5.876871 13.985518  2.692486

  由上可知,产生5个均值为5,标准差为5的正态分布随机数。

1.2 均匀分布随机数

  生成均匀分布随机数的函数为runif,其函数规则为:

  runif(n,min=x,max=y)

  其中,n表示生成的随机数的数量,min表示均匀分布的下限,max表示均匀分布的上限。随机数生成如下所示:

runif(5,min=3,max=6)  #5个[3,6]的均匀分布随机数                    
## [1] 4.493057 5.863124 5.600650 3.794395 5.942889

  根据上述结果显示,生成了5个[3,6]的均匀分布随机数,min=3为随机数的下限,max=6表示随机数的上限。

2 数据抽样


2.1 随机抽样

  随机抽样常见为有放回、无放回等模拟抽样。用R语言进行抽样需要用到sample()函数,函数规则如下所示:

  sample(X,n,replace=F/T)

  其中,X表示总体数量,n表示样本数量,replace=T表示放回抽样,replace=F表示无放回抽样,默认是无放回抽样。

2.2 放回抽样

  在放回抽样中,抽样结果的数据可以重复出现,需要指定随机数种子的初始值。用函数表示为set.seed(),如下所示:

set.seed(1) # 设置随机种子的初始值为1                     
sample(c(1:20),20,replace=T) # 在1到20数据中,重复的抽取20个元素作为样                  
##  [1]  6  8 12 19  5 18 19 14 13  2  5  4 14  8 16 10 15 20  8 16

  根据以上显示得知,该抽样果是从1-20个数据中进行有放回的随机抽样,共抽取20个元素,其中重复值有19、5、14、8、16。

2.3 无放回抽样

sample(c(1:20),20,replace=F)# 在1到20数据中,不重复的抽取20个元素作为样                     
##  [1] 19  5 12  3 20  6  1 16 11  4 13 15 18  2 10  8  9 14  7 17

  由上可知,抽样结果是从1-20个数据中进行无放回的随机抽样,共抽取20个元素。

3 数据划分


  在对数据进行读取后,有时需要对数据建立模型,用数据进行验证拟合效果。就需要将数据划分为测试集和训练集数据。

data=read.csv("D:/TASK/2R语言基础/导出data.csv")  # 导入csv数据
str(data) # 查看数据结构
## 'data.frame':    792 obs. of  8 variables:
##  $ X       : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ 车名    : Factor w/ 673 levels "DS-5 2014款 1.6T 豪华版THP160",..: 245 36 469 94 595 544 581 44 298 404 ...
##  $ 卖家报价: num  8.5 23.8 9.5 26.5 5.1 7.8 7.3 17.1 3.95 5.2 ...
##  $ 上牌时间: Factor w/ 105 levels "2007年8月","2008年10月",..: 52 70 97 93 26 70 27 31 82 89 ...
##  $ 车程    : num  8.13 3.56 1.61 3.85 9.2 6.59 4.3 9.3 6.2 0.8 ...
##  $ 排放标准: Factor w/ 3 levels "国三","国四",..: 2 2 2 3 2 2 2 2 2 3 ...
##  $ 排量    : num  1.4 2 1.8 1.6 1.8 1.6 2 2 1.5 1.5 ...
##  $ 原价    : num  14.8 37 11 29 14.9 ...

  由上述结构显示,导入数据的样本量是792条,涉及到8个变量。若需要进一步对数据进行测试集和训练集的划分,将对数据顺序随机打乱后进行抽取。如下所示:

set.seed(12345) # 设置随机数种子
a=round(mean(0.7*nrow(data)),0) # 四舍五入
a #查看对象结果
## [1] 554

  由数据划分的结果显示可知,70%的数据抽取数量取整数后是554。

Sample=sample(1:nrow(data),a,replace=F) # 抽样
data_train=data[Sample,]
dim(data_train) # 划分70%的训练集
## [1] 554   8

  通过上述的数据维度结果可知,数据划分的结果抽取数量是占70%,数据抽取的样本数量是554。

str(data_train)# 查看训练集数据
## 'data.frame':    554 obs. of  8 variables:
##  $ X       : int  573 697 604 707 361 132 257 401 799 782 ...
##  $ 车名    : Factor w/ 673 levels "DS-5 2014款 1.6T 豪华版THP160",..: 92 178 608 53 241 160 531 397 326 294 ...
##  $ 卖家报价: num  18.9 5.6 2.48 29.8 7.15 9.2 9.68 3.1 33.3 2.99 ...
##  $ 上牌时间: Factor w/ 105 levels "2007年8月","2008年10月",..: 27 80 13 75 43 85 71 71 62 37 ...
##  $ 车程    : num  7 3.7 12.5 4.48 11.2 3.85 4 3.21 7 8.3 ...
##  $ 排放标准: Factor w/ 3 levels "国三","国四",..: 2 2 1 2 2 2 2 2 2 2 ...
##  $ 排量    : num  1.8 1.5 1.4 2 1.4 1.4 2 1.5 2.7 1.6 ...
##  $ 原价    : num  48.8 10.59 8.19 38.36 14.68 ...

  由数据划分后的结构显示可知,训练集数据的数值类型等结构和原数据基本相同。

data_test=data[-Sample,]
dim(data_test) # 划分30%的测试集
## [1] 238   8

  由上数据维度可知,数据划分的结果抽取数量是占30%,数据抽取的数量取整数后是234,变量个数不发生改变。

str(data_test)  # 查看测试集数据  
## 'data.frame':    238 obs. of  8 variables:
##  $ X       : int  3 9 11 12 15 17 19 24 25 27 ...
##  $ 车名    : Factor w/ 673 levels "DS-5 2014款 1.6T 豪华版THP160",..: 469 298 440 319 377 628 508 405 613 451 ...
##  $ 卖家报价: num  9.5 3.95 3.1 6 7.2 ...
##  $ 上牌时间: Factor w/ 105 levels "2007年8月","2008年10月",..: 97 82 46 12 66 31 4 66 85 35 ...
##  $ 车程    : num  1.61 6.2 7.5 10.4 4.14 7.8 17.9 5.3 3.05 5.59 ...
##  $ 排放标准: Factor w/ 3 levels "国三","国四",..: 2 2 2 2 2 2 1 2 2 2 ...
##  $ 排量    : num  1.8 1.5 1.3 1.8 1.5 1.6 1.6 1.5 2 1.6 ...
##  $ 原价    : num  10.98 5.69 6.08 14.98 11.28 ...

  由上数据结构可知,数据划分的结果抽取数量是占30%,数据抽取的数量取整数后是238.其中训练集数据和测试集数据的样本和同未划分数据的总样本数量相同。