文章目录

  • 高级数据管理
  • 标准差
  • 绝对中位差
  • 分位数
  • quantile()函数
  • 百分位数
  • 数据预处理
  • 中心化
  • 标准化 (Standardization)
  • 数据中心化和标准化的区别
  • 归一化(Normalization)
  • 标准化和归一化
  • 概率函数
  • 协方差
  • 控制流
  • 分支结构
  • 重复和循环
  • 自定义函数


高级数据管理

一个数据处理难题,由于每一门成绩的量纲不同,无法根据成绩进行排名。

R语言求样本标准差 n r语言算标准差_r语言

标准差

标准差(Standard Deviation) ,是离均差平方的算术平均数(即:方差)的算术平方根,用σ表示。标准差也被称为标准偏差,或者实验标准差,在概率统计中最常使用作为统计分布程度上的测量依据。

标准差能反映一个数据集的离散程度。平均数相同的两组数据,标准差未必相同。


R语言求样本标准差 n r语言算标准差_数据_02

R语言求样本标准差 n r语言算标准差_R语言求样本标准差 n_03

标准差的意义

例1:A、B两组各有6位学生参加同一次语文测验,A组的分数为95、85、75、65、55、45,B组的分数为73、72、71、69、68、67。这两组的平均数都是70,但A组的标准差约为17.08分,B组的标准差约为2.16分。

结论:说明A组学生之间的差距要比B组学生之间的差距大得多。

例2:选基金:衡量基金波动程度的工具就是标准差(StandardDeviation)。标准差是指基金可能的变动程度。标准差越大,基金未来净值可能变动的程度就越大,稳定度就越小,风险就越高。

绝对中位差

在统计学中,绝对中位数MAD是对单变量数值型数据的样本偏差的一种鲁棒性测量。

对于单变量数据集X1,X2,…,Xn, MAD定义为数据点到中位数的绝对偏差的中位数:

R语言求样本标准差 n r语言算标准差_标准差_04

也就是说,先计算出数据与它们的中位数之间的残差(偏差),MAD就是这些偏差的绝对值的中位数。

MAD与标准差的关系

为了能将MAD当作标准差σ估计的一种一致估计量,使用

R语言求样本标准差 n r语言算标准差_标准差_05

其中 k 为比例因子常量,值取决于分布类型。对于正态分布数据,k的值为:1.4826

在R语言中,计算MAD的函数是stats包中的mad(),不同的是它默认乘上了一个比例因子1.4826,为了达到渐进正态一致性。

mad(x, center = median(x), constant = 1.4826, na.rm = FALSE, low = FALSE, high = FALSE)

Description:

Compute the median absolute deviation, i.e., the (lo-/hi-) median of the absolute deviations from the median, and (by default) adjust by a factor for asymptotically normal consistency.

low: if TRUE, compute the ‘lo-median’, i.e., for even sample size, do not average the two middle values, but take the smaller one.

high: if TRUE, compute the ‘hi-median’, i.e., take the larger of the two middle values for even sample size.

> x<-c(1,2,3,4,5)
> median.x<-median(x)
> median.x
[1] 3
> diff.x<-abs(x-median.x)
> diff.x
[1] 2 1 0 1 2
> mad(x)
[1] 1.4826

绝对中位差有什么用?

用途:

MAD常用于异常值检测

离群点:是数据集中的一个数据点,该数据点与所有其他观察值相距较远。 位于数据集总体分布之外的数据点。

绝对中位差较标准差而言对“野”点(outlier)更加的鲁棒。在标准差的计算中,数据点到其均值的距离要求平方,因此对偏离较为严重的点偏离的影响得以加重,也就是说“野”点严重影响着标准差的求解,而少量的“野”点对绝对中位差的影响不大

R语言求样本标准差 n r语言算标准差_r语言_06

分位数

定义1:分位数(Quantile),亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点,常用的有中位数(即二分位数)、四分位数、百分位数等。

定义2:对一个有着连续分布函数的样本集X,分位数是将一个概率分布切分为有着相同概率的连续区间的切分点。

R语言求样本标准差 n r语言算标准差_r语言_07

分位数(Quantile),简言之,将数据按照数量均分后的边界值。

二分位数:即中位数 quantile(x,0.5)=median(x)

四分位数(Quartile):是统计学中分位数的一种,即把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值就是四分位数。

分位数的分类

1)第一四分位数(Q1),又称“较小四分位数”,或“下四分位数”,等于该样本中所有数值由小到大排列后第25%的数字;

2)第二四分位数(Q2),又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字;

3)第三四分位数(Q3),又称“较大四分位数”,或“上四分位数”,等于该样本中所有数值由小到大排列后第75%的数字。

第三四分位数与第一四分位数的差距又称四分位距。

R语言求样本标准差 n r语言算标准差_r语言_08

R语言求样本标准差 n r语言算标准差_R语言求样本标准差 n_09

quantile()函数

数据总量: 6, 47, 49, 15, 42, 41, 7, 39, 43, 40, 36

排序结果: 6, 7, 15, 36, 39, 40, 41, 42, 43, 47, 49

Q1 的位置=(11+1) × 0.25=3,

Q2 的位置=(11+1)× 0.5=6,

Q3的位置=(11+1) × 0.75=9

Q1 = 15,Q2 = 40,Q3 = 43

> x<-c(6, 47, 49, 15, 42, 41, 7, 39, 43, 40, 36)
> y<-x[order(x)]
> y
 [1]  6  7 15 36 39 40 41 42 43 47 49
> q1<-quantile(x,0.25)
> q1
 25% 
25.5 
> q2<-quantile(x,0.50)
> q2
50% 
 40 
> q3<-quantile(x,0.75)
> q3
 75% 
42.5
> quantile(x)
  0%  25%  50%  75% 100% 
 6.0 25.5 40.0 42.5 49.0

百分位数

百分位数百分位数,统计学术语,如果将一组数据从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。如:30%分位点

观测数据的第n个百分位数指在升序排列的数据中划分前n%的数据的值。

为什么要用分位数?

统计学中分位数的作用想必要追溯到很深入的层次,但就当下理解分位数的阶段,分位数起到的就是一个“临界值”的作用。

随机产生一组学生成绩X=(44 58 69 61 68 74 50 54 62 60),想让10个学生中淘汰35%,请设定分数线?

> X<-c(44,58,69,61,68,74,50,54,62,60)
> quantile(X,0.35)
 35% 
58.3

R语言求样本标准差 n r语言算标准差_R语言求样本标准差 n_10

数据预处理

在我们做数据的时候,一个数据会有很多特征;比如在描述影响房价的因素,有房子面积,房间数量等。而不同的特征存在不同的量纲,为了消除量纲、数值差异等,我们就需要对数据进行中心化和标准化

中心化

所谓中心化就是将数据减去均值后得到的,比如有一组数据(1,2,3,4,5,6,7),它的均值是4,中心化后的数据为(-3,-2,-1,0,1,2,3)

标准化 (Standardization)

scale函数标准化处理原理是计算每组的平均值和标准差,再求组内各个数值与其平均值的差(中心化后),与其标准差的比值,作为该数值在组内的相对数值。(考虑均值和离散程度)

公式:

y<-(x-mean(x))/sd(x)

R语言求样本标准差 n r语言算标准差_标准差_11

均值为0,标准差为1,一定是标准正态吗?

任何分布的随机变量进行“标准化”后的均值都为0,方差都为1。所以你可以很轻松的构建出一个均值为0,方差为1的随机变量出来,然后去验证下它是否符合“标准正态分布”。标准正态分布的均值是0,标准差是1,但并不意味着均值为0,标准差为1的分布是标准正态分布。T分布的均值也0,标准差也可以为1。决定一个分布是否是标准正态分布的参数还有峰度和偏度,最重要的还是看概率密度函数吧。

实例

> x<-trunc(runif(20,400,600))
> x
 [1] 580 494 531 597 410 434 457 441 454 574 432 497 551 599 585 469 487 557 488 518
> y<-(x-mean(x))/sd(x)
> y
 [1]  1.1895629 -0.2263874  0.3828005  1.4694600 -1.6094086 -1.2142597 -0.8355753
 [8] -1.0990079 -0.8849689  1.0907756 -1.2471887 -0.1769938  0.7120913  1.5023891
[15]  1.2718855 -0.6380008 -0.3416392  0.8108785 -0.3251746  0.1687615
> y<-round(y,2)
> mean(y)
[1] -0.001
> sd(y)
[1] 0.9997258
> y<-as.vector(scale(x))
> y
 [1]  1.1895629 -0.2263874  0.3828005  1.4694600 -1.6094086 -1.2142597 -0.8355753
 [8] -1.0990079 -0.8849689  1.0907756 -1.2471887 -0.1769938  0.7120913  1.5023891
[15]  1.2718855 -0.6380008 -0.3416392  0.8108785 -0.3251746  0.1687615
> y<-(x-mean(x))/sd(x)
> y
 [1]  1.1895629 -0.2263874  0.3828005  1.4694600 -1.6094086 -1.2142597 -0.8355753
 [8] -1.0990079 -0.8849689  1.0907756 -1.2471887 -0.1769938  0.7120913  1.5023891
[15]  1.2718855 -0.6380008 -0.3416392  0.8108785 -0.3251746  0.1687615

数据中心化和标准化的区别

中心化和标准化意义一样,都是消除量纲的影响

中心化:数据-均值

标准化:(数据-均值)/标准差数据

中心化: scale(data,center=T,scale=F)

数据标准化: scale(data,center=T,scale=T)或默认参数scale(data)

归一化(Normalization)

归一化:

1)把数据变成(0,1)或者(-1,1)之间的小数。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速。

2)把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权。

(1)Min-Max Normalization   x’ = (x - X_min) / (X_max - X_min)

(2)平均归一化   x’ = (x - μ) / (MaxValue - MinValue)

说明:(1)和(2)有一个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。

(3)非线性归一化

1)对数函数转换:y = log10(x)

2)反正切函数转换:y = atan(x) * 2 / π

说明:(3)经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括 log、指数,正切等。需要根据数据分布的情况,决定非线性函数的曲线,比如log(V, 2)还是log(V, 10)等。

标准化和归一化

(1)如果对输出结果范围有要求,用归一化。

(2)如果数据较为稳定,不存在极端的最大最小值,用归一化。

(3)如果数据存在异常值和较多噪音,用标准化,可以间接通过中心化避免异常值和极端值的影响。

总结:对于数据进行预处理的操作包括:

  • 归一化(Min-Max Normalization、平均归一化,非线性归一)
  • 标准化 (Z-score规范化(标准差标准化 / 零均值标准化))
  • 中心化(x’ = x - μ)

概率函数

分布名称

缩写

分布参数名称

Beta分布

beta

二项分布

binom

柯西分布

cauchy

(非中心)卡方分布

chisq

指数分布

exp

F分布

f

Gamma分布

gamma

几何分布

geom

超几何分布

hyper

对数正态分布

lnorm

Logistics分布

logis

多项分布

multinom

正态分布

norm

泊松分布

pois

Wilcoxon符号秩分布

signrank

t分布

t

均匀分布

unif

Weibull分布

weibull

Wilcoxon秩和分布

wilcox

R语言求样本标准差 n r语言算标准差_r语言_12

R语言求样本标准差 n r语言算标准差_R语言求样本标准差 n_13

协方差

为什么需要协方差?

标准差和方差一般是用来描述一维数据的,但现实生活我们常常遇到含有多维数据的数据集。如,要统计多个学科的考试成绩。

协方差表示的是两个变量的总体的误差。

如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值,另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值。

如果两个变量的变化趋势相反,即其中一个大于自身的期望值,另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。

二维问题的协方差

R语言求样本标准差 n r语言算标准差_数据_14

三维问题的协方差矩阵

R语言求样本标准差 n r语言算标准差_数据_15

协方差矩阵是个对称矩阵

实例:

> x<-c(2, 4, 6, 4)
> y<-c(8, 10, 6, 12)
> cov(x,y)
[1] -1.333333

> x.mean<-mean(x)
> y.mean<-mean(y)
> sum1<-sum((x-x.mean)*(y-y.mean))
> sum1/(length(x)-1)
[1] -1.333333

控制流

语句(statement):一条单独的R语句或者一组复合语句(包含在花括号{}中的一组语句,分号分隔)

条件(condition):一条最终被解析为真或假的表达式

表达式(expression):一条数值或者字符串的求值语句

序列(sequence):一个数值或字符串序列

分支结构

1) if-else结构

x<-1
if(x>0) print("positive")  else  print("negative")

2)ifelse结构

score<-c(50,60,90,46,89)
ifelse(score>=60,"passed","failed")   
[1] "failed" "passed" "passed" "failed" "passed"

R语言求样本标准差 n r语言算标准差_R语言求样本标准差 n_16

3)switch结构:用于多分支情况

switch(expression,list)

如果expr的取值在1-length(list)之间,则函数返回列表相应位置的值。如果expr的值超出范围,则无返回值。

y<-3
switch(y,fruit="apple",meat="beaf",vegetable="patato")
[1] "patato"

重复和循环

1)for结构

for(var in seq) statement

for循环将接受一个迭代器变量和一个向量参数。在每次循环中,迭代器变量会从向量中取得一个值。

> for(i in 1:5) message("i=",i)
i=1
i=2
i=3
i=4
i=5

2)while结构

while(condition)   statement
i<-10
while(i>0){
  print("hello");
  i<-i-1
}

使用for循环和NULL,建立10以内的偶数向量,其中每次迭代均在向量上增加一个元素。

z<-NULL
for (i in seq(0,10,2)){
  z<-c(z,i)
}
z

自定义函数

R语言中,自定义函数的基本格式为:

myfun<-function(arglist){
   statements
    return(object)
                    }

其中,myfun为函数名称;arglist为参数列表;大括号中的部分为函数体。

例题:

定义一个函数first1,找出向量中第一个1出现的位置。

first1<-function(x){
  for(i in 1:length(x))
    if(x[i]==1){
      return(i)
    }
}
print(first1(c(2,2,1,1)))
first1<-function(x){
  return(which(x==1)[1])
}
print(first1(c(2,2,1,1)))

说明:which()产生x中所有值为1的索引,即位置向量。然后取位置向量的第一个元素。

自定义函数,输出向量x中能被3整除的数的个数。

count1<-function(x){
  cnt<-0
  for (i in x) {
    if(i%%3==0){
      cnt<-cnt+1
    }
  }
  return(cnt)
}
x<-1:25
count1(x)#8
count1<-function(x){
  cnt<-length(which(x%%3==0))
  return(cnt)
}
x<-1:25
count1(x)

编写R函数,输入一个整数n,如果n<=0,则中止运算,并输出“Please input a positive integer.”否则,如果n是偶数,则将n除以2,并赋值给n;否则,将3n+1赋值给n,不断循环,直到n=1,停止运算。并输出“Success”.

#角谷定理
first2<-function(n){
  if(n<=0){
    return("Please input a positive interger.")
  }
  while(n!=1){
    if(n%%2==0){
       n=n/2 
    }else{
      n=3*n+1
    }
  }
  return("Success")
}
first2(0)
first2(25)
first2(14)

自定义函数,计算斐波那契数列的第n项,并进行调用,输出数列的第5项和前5项。

fib<-function(n){
  if(n==1||n==2)
    return(1)
  else
    return(fib(n-1)+fib(n-2))
}
print(fib(5))

for (i in 1:5)
  print(fib(i))

sum=0
for (i in 1:5)
  sum=sum+fib(i)
print(sum)

自定义函数,返回X的n次幂,并进行调用,输出5的3次幂。 递归函数。

first3<-function(x,n){
  if(n==1){
    return(x)
  }else{
    return(x*first3(x,n-1))
  }
}
first3(5,3)

自定义函数,计算斐波那契数列的第n项,并进行调用,输出数列的第5项和前5项。

fib<-function(n){
  if(n==1||n==2)
    return(1)
  else
    return(fib(n-1)+fib(n-2))
}
print(fib(5))

for (i in 1:5)
  print(fib(i))

sum=0
for (i in 1:5)
  sum=sum+fib(i)
print(sum)