数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。
在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。
最典型的就是数据的归一化处理,即将数据统一映射到[0,1]区间上。
数据标准化:
0-1标准化 / Z-score标准化
0-1标准化:
# 将数据的最大最小值记录下来,并通过Max-Min作为基数(即Min=0,Max=1)进行数据的归一化处理。
# x = (x - Min) / (Max - Min)
df = pd.DataFrame({"value1":np.random.rand(10)*20,
'value2':np.random.rand(10)*100})
print(df.head())
print('------')
# 创建函数,标准化数据
def data_norm(df,*cols):
df_n = df.copy()
for col in cols:
ma = df_n[col].max()
mi = df_n[col].min()
df_n[col + '_n'] = (df_n[col] - mi) / (ma - mi)
return(df_n)
df_n = data_norm(df,'value1','value2')
print(df_n.head())
value1 value2 0 9.013308 76.086655 1 8.998857 2.701648 2 15.934450 73.463908 3 0.673900 26.387318 4 6.073450 28.756130 ------ value1 value2 value1_n value2_n 0 9.013308 76.086655 0.433025 0.865032 1 8.998857 2.701648 0.432275 0.000000 2 15.934450 73.463908 0.792407 0.834116 3 0.673900 26.387318 0.000000 0.279197
4 6.073450 28.756130 0.280373 0.307120
Z-score标准化
# Z分数(z-score),是一个分数与平均数的差再除以标准差的过程
# z=(x-μ)/σ,其中x为某一具体分数,μ为平均数,σ为标准差
df = pd.DataFrame({"value1":np.random.rand(10) * 20,
'value2':np.random.rand(10) * 100})
print(df.head())
print('------')
# 创建函数,标准化数据
def data_Znorm(df, *cols):
df_n = df.copy()
for col in cols:
u = df_n[col].mean()
std = df_n[col].std()
df_n[col + '_Zn'] = (df_n[col] - u) / std
return(df_n)
# 标准化数据
# 经过处理的数据符合标准正态分布,即均值为0,标准差为1
df_z = data_Znorm(df,'value1','value2')
u_z = df_z['value1_Zn'].mean()
std_z = df_z['value1_Zn'].std()
print(df_z)
print('标准化后value1的均值为:%.2f, 标准差为:%.2f' % (u_z, std_z))
value1 value2 0 8.321070 35.947331 1 8.452941 97.890836 2 5.019369 60.298736 3 10.054911 85.862975 4 18.946354 34.923783 ------ value1 value2 value1_Zn value2_Zn 0 8.321070 35.947331 -0.578846 -0.077938 1 8.452941 97.890836 -0.551582 1.778722 2 5.019369 60.298736 -1.261468 0.651958 3 10.054911 85.862975 -0.220376 1.418206 4 18.946354 34.923783 1.617918 -0.108617 5 9.737703 6.697269 -0.285959 -0.954662 6 17.078566 34.654210 1.231755 -0.116697 7 15.912836 5.941881 0.990742 -0.977304 8 12.394485 22.175238 0.263328 -0.490734 9 5.290011 1.083264 -1.205513 -1.122933 标准化后value1的均值为:0.00, 标准差为:1.00
实例:
# 八类产品的两个指标value1,value2,其中value1权重为0.6,value2权重为0.4
# 通过0-1标准化,判断哪个产品综合指标状况最好。
df = pd.DataFrame({"value1":np.random.rand(10) * 20,
'value2':np.random.rand(10) * 100},
index = list('ABCDEFGHIJ'))
# 进行标准化处理
df_n1 = data_norm(df,'value1','value2')
df_n1['f'] = df_n1['value1_n'] * 0.6 + df_n1['value2_n'] * 0.4
df_n1.sort_values(by = 'f',inplace=True,ascending=False)
df_n1['f'].plot(kind = 'line', style = '--.b', alpha = 0.8, grid = True)
df_n1
# 很明显,下图中产品G的表现最好