Z分数是常用的标准化方法,用来衡量偏差程度(发现异常值)和消除量纲影响,在上图的表格中我们可以发现对于各省份的食品和衣着的数量因为量纲的不同看起来差距非常的大,如果我们想要观察数据的偏差程度此时应该如何进行,可以将它们进行标准化,统一划分到同一个量纲下,经过标准化之后我们可以看到右边的数据现在都是在 0 附近的数据了,关于食品和衣着的数据划分差距没有那么大了。
我们可以利用标准化来发现异常值,判断其是否在正常区间内,超过三个标准差范围内的数据因为非常少,所以我们一般认为超过三个标准差范围内的数据称为异常数据。
这里我们如果按照提供的这两个数据来计算欧氏距离的话,因为食品的数值非常大,所以我们可以看到两个数用来求平方和再开根号的话,衣着带来的影响几乎可以忽略不计,但是其实本身衣着带来的影响还是很大的,为了消除量纲的影响,将它们都进行标准化之后再进行求和就显得很合理了。
import numpy as np
from numpy import mean,std
import pandas as pd
data = pd.read_excel('data_3.2a.xlsx')
data
'''S3 偏差程度'''
#计算Z分数方法1-手动编程
d1 = data.iloc[:,0]
z_d1 = (d1-mean(d1)) / std(d1) #以食品为例
print('各省份食品的标准化结果为',np.round(z_d1,2))
#如果标准化数据中出现绝对值超过3,可以视为异常值。
#继续对衣着进行标准化
d2 = data.iloc[:,1]
z_d2 = (d2-mean(d2)) / std(d2)
print('各省份衣着的标准化结果为',np.round(z_d2,2))
#计算Z分数方法2-调用sklearn包
from sklearn.preprocessing import scale
data['Z_食品']=scale(data['食品'].values.reshape(-1,1))
data['Z_衣着']=scale(data['衣着'].values.reshape(-1,1))
data
读取数据之后我们可以看到我们的数据是这样的
计算食品的Z分数之后,我们可以得到各省的标准化结果
计算衣着的Z分数之后,可以得到以下结果
除了可以根据公式我们自己创建变量来进行计算,当然也可以直接调用现成的包来计算,sklearn 中的 scale 就可以直接用来计算。
from sklearn.preprocessing import scale
data['Z_食品']=scale(data['食品'].values.reshape(-1,1))
data['Z_衣着']=scale(data['衣着'].values.reshape(-1,1))
data
这段代码中我们可以看到首先是对数据的形状进行了变换然后才进行的标准化,不一定必须要先调整形状再进行标准化,这取决于使用的标准化方法对输入数据的要求:
- 一些标准化方法如sklearn中的scale()要求输入是一个二维数组,这时候就需要先通过reshape或增加维度使数据成为二维。
- 而其他标准化方法如sklearn中的StandardScaler()可以直接作用在一维数组上,这时就不需要提前reshape。
- 对于图片数据,有些标准化会要求输入是三维或四维数组,比如TensorFlow中的tf.image.per_image_standardization。
- 有的标准化方法也可以在不改变形状的前提下原位(in-place)进行标准化。
所以综上,进行标准化之前是否一定要先reshape要看具体使用的标准化方法对输入数据的要求而定。
常见的情况是:
- 使用scale()等要求二维输入时,一维数据要先reshape
- 使用TensorFlow等深度学习框架自带的标准化时,需要提前reshape为图像维度
- 而使用StandardScaler等则不需要reshape
要查看标准化函数的输入要求,然后根据需要决定是否需要提前reshape到合适的形状。