文章目录
- 高级数据管理
- 标准差
- 绝对中位差
- 分位数
- quantile()函数
- 百分位数
- 数据预处理
- 中心化
- 标准化 (Standardization)
- 数据中心化和标准化的区别
- 归一化(Normalization)
- 标准化和归一化
- 概率函数
- 协方差
- 控制流
- 分支结构
- 重复和循环
- 自定义函数
高级数据管理
一个数据处理难题,由于每一门成绩的量纲不同,无法根据成绩进行排名。
标准差
标准差(Standard Deviation) ,是离均差平方的算术平均数(即:方差)的算术平方根,用σ表示。标准差也被称为标准偏差,或者实验标准差,在概率统计中最常使用作为统计分布程度上的测量依据。
标准差能反映一个数据集的离散程度。平均数相同的两组数据,标准差未必相同。
标准差的意义
例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定义为数据点到中位数的绝对偏差的中位数:
也就是说,先计算出数据与它们的中位数之间的残差(偏差),MAD就是这些偏差的绝对值的中位数。
MAD与标准差的关系
为了能将MAD当作标准差σ估计的一种一致估计量,使用
其中 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)更加的鲁棒。在标准差的计算中,数据点到其均值的距离要求平方,因此对偏离较为严重的点偏离的影响得以加重,也就是说“野”点严重影响着标准差的求解,而少量的“野”点对绝对中位差的影响不大
分位数
定义1:分位数(Quantile),亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点,常用的有中位数(即二分位数)、四分位数、百分位数等。
定义2:对一个有着连续分布函数的样本集X,分位数是将一个概率分布切分为有着相同概率的连续区间的切分点。
分位数(Quantile),简言之,将数据按照数量均分后的边界值。
二分位数:即中位数 quantile(x,0.5)=median(x)
四分位数(Quartile):是统计学中分位数的一种,即把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值就是四分位数。
分位数的分类
1)第一四分位数(Q1),又称“较小四分位数”,或“下四分位数”,等于该样本中所有数值由小到大排列后第25%的数字;
2)第二四分位数(Q2),又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字;
3)第三四分位数(Q3),又称“较大四分位数”,或“上四分位数”,等于该样本中所有数值由小到大排列后第75%的数字。
第三四分位数与第一四分位数的差距又称四分位距。
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)
> q125%
25.5
> q2<-quantile(x,0.50)
> q2
50% 40
> q3<-quantile(x,0.75)
> q375%
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
数据预处理
在我们做数据的时候,一个数据会有很多特征;比如在描述影响房价的因素,有房子面积,房间数量等。而不同的特征存在不同的量纲,为了消除量纲、数值差异等,我们就需要对数据进行中心化和标准化
中心化
所谓中心化就是将数据减去均值后得到的,比如有一组数据(1,2,3,4,5,6,7),它的均值是4,中心化后的数据为(-3,-2,-1,0,1,2,3)
标准化 (Standardization)
scale函数标准化处理原理是计算每组的平均值和标准差,再求组内各个数值与其平均值的差(中心化后),与其标准差的比值,作为该数值在组内的相对数值。(考虑均值和离散程度)
公式:
y<-(x-mean(x))/sd(x)
均值为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 |
协方差
为什么需要协方差?
标准差和方差一般是用来描述一维数据的,但现实生活我们常常遇到含有多维数据的数据集。如,要统计多个学科的考试成绩。
协方差表示的是两个变量的总体的误差。
如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值,另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值。
如果两个变量的变化趋势相反,即其中一个大于自身的期望值,另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。
二维问题的协方差
三维问题的协方差矩阵
协方差矩阵是个对称矩阵
实例:
> 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"
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){statementsreturn(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<-0for (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)elsereturn(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)elsereturn(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)