数据标准化处理是数据分析的一项基础工作,不同评价指标往往具有不同的量纲,数据之间的差别可能很大,不进行处理会影响到数据分析的结果。为了消除指标之间的量纲和取值范围差异对数据分析结果的影响,需要对数据进行标准化处理,就是说,把数据按照比例进行缩放,使之落入一个特定的区域,便于进行综合分析。
在继续下文之前,先解释三个个术语:
(1)所谓量纲,简单来说,就是说数据的单位;有些数据是有量纲的,比如身高,而有些数据是没有量纲的,例如,男女比例。无量纲化,是指去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或者量级的指标能够进行和加权。
(2)数据的标准化是指将数据按照比例缩放,使之落入一个特定的区间。
(3)归一化是数据标准化中最简单的方式,目的是把数变为(0,1)之间的小数,把有量纲的数据转换为无量纲的纯数量。
常用的归一化方法主要有离差标准化和标准差标准化,r的scale()可以实现标准差标准化,也可以指定标准化之后数据的均值和标准差。
一,离差标准化
离差标准化是对原始数据进行线性变化,使数值映射到[0,1]区间中,转换公式是:
离差标准化保留了原来数据中存在的关系,是消除量纲和数据取值范围对数据分析产生影响的最简单方法,缺点是如果数据集中,且某个数值很大,那么标准化之后大部分值会接近于0,并且不会相差很大。
二,标准差标准化
经过该方法处理的数据的均值是0,标准差是1,转化公式是:
这种方法基于原始数据的均值(mean)和标准差(standard deviation)对数据进行标准化,是用的最多的数据的标准化方法,但是,均值和标准差受离群点的影响很大。
三,scale()标准化
R语言通常使用scale()函数对矩阵或数据框按列对数据进行标准化:
scale(x, center = TRUE, scale = TRUE)
参数注释:x是数值矩阵,当center=TRUE时,为数据对象x按列进行中心化;当scale=TRUE时,为数据对象x按列进行标准化。
- 中心化是把每个数据减去均值;
- 标准化是在中心化后的数据基础上再除以数据的标准差;
默认情况下,center=TRUE,scale=TRUE,scale()函数首先把一组数的每个数都减去这组数的平均值,然后除以这组数的均方根。
如果scale=TRUE,而center=FALSE,那么,scale()函数不会把一组数中的每个数减去平均值,而直接处以这组数据的均方根。
1,scale()函数的中心化和标准化
例如,向量v是数值向量,均值是 3,标准差是 1.581139:
v <- c(1,2,3,4,5) v.mean <- mean(v) s <- sd(v)
使用scale()函数进行中心化操作,每个向量原始都减去均值3:
> scale(v,center=TRUE,scale=FALSE) [,1] [1,] -2 [2,] -1 [3,] 0 [4,] 1 [5,] 2 attr(,"scaled:center") [1] 3
使用scale()函数进行标准化操作,先减去均值,后除以均方根:
> scale(v,center=TRUE,scale=TRUE) [,1] [1,] -1.2649111 [2,] -0.6324555 [3,] 0.0000000 [4,] 0.6324555 [5,] 1.2649111 attr(,"scaled:center") [1] 3 attr(,"scaled:scale") [1] 1.581139
2,scale()函数的均值和标准差
默认情况下,使用scale()函数对矩阵或数据框的指定列进行均值为0,标准差为1的标准化操作:
mydata <-scale(mydata)
要对每一列进行任意均值和标准差的标准化,可以使用以下代码,其中M是均值,SD是标准差:
mydata <scale(mydata) *SD + M
参考文档: