其他分享
首页 > 其他分享> > 3、主成分分析

3、主成分分析

作者:互联网

主成分分析

主成分分析(Principal Components Analysis,PCA)是一种数据降维技术,通过正交变换将一组相关性高的变量转换为较少的彼此独立、互不相关的变量,从而减少数据的维数。

其主要流程如下:
(1)对原始数据进行标准化处理
(2)计算样本相关系数矩阵
(3)求相关系数矩阵的特征值和相应的特征向量
(4)选择重要的主成分,并写出主成分表达式
(5)计算主成分得分
(6)依据主成分得分的数据,进一步从事统计分析

1、读取数据

import pandas as pd
Data = pd.read_excel('农村居民人均可支配收入来源2016.xlsx')
X = Data.iloc[:,1:]
#返回各类型之间的相关系数
R = X.corr()
R
工资性收入 经营净收入 财产净收入 转移净收入
工资性收入 1.000000 -0.388997 0.826683 0.401917
经营净收入 -0.388997 1.000000 -0.205737 -0.314542
财产净收入 0.826683 -0.205737 1.000000 0.297458
转移净收入 0.401917 -0.314542 0.297458 1.000000

DataFrame.corr()函数

参数说明:
method:可选值为{‘pearson’, ‘kendall’, ‘spearman’}
pearson:Pearson相关系数来衡量两个数据集合是否在一条线上面,即针对线性数据的相关系数计算,针对非线性 数据便会有误差。
kendall:用于反映分类变量相关性的指标,即针对无序序列的相关系数,非正太分布的数据
spearman:非线性的,非正太分析的数据的相关系数
min_periods:样本最少的数据量
返回值:各类型之间的相关系数DataFrame表格。取值范围为[-1,1],取值接近-1,表示反相关,类似反比例函数,取值接近1,表正相关

绘制各变量数据相关性的热力图

#导入相关库
import seaborn as sns

#这部分解决中文空白,有这方面问题推荐(https://blog.csdn.net/weixin_41571493/article/details/83243458)
import matplotlib
#指定默认字体
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
#解决负号'-'显示为方块的问题
matplotlib.rcParams['axes.unicode_minus'] = False

#绘制热力图关键代码
sns.heatmap(X.corr(),cmap="YlGnBu_r",linewidths=0.1,vmax=1.0, square=True,linecolor='white', annot=True)

<matplotlib.axes._subplots.AxesSubplot at 0x2623b089c48>

seaborn.heatmap参数介绍

vmin,vmax:用于指定图例中最小值与最大值的显示值,没有该参数时默认不显示

cmap:指定一个colormap对象,用于热力图的填充色
参数:'Accent', 'Accent_r', 'Blues', 'Blues_r', 'BrBG', 'BrBG_r', 'BuGn', 'BuGn_r', 'BuPu', 'BuPu_r', 'CMRmap', 'CMRmap_r', 'Dark2', 'Dark2_r', 'GnBu', 'GnBu_r', 'Greens', 'Greens_r', 'Greys', 'Greys_r', 'OrRd', 'OrRd_r', 'Oranges', 'Oranges_r', 'PRGn', 'PRGn_r', 'Paired', 'Paired_r', 'Pastel1', 'Pastel1_r', 'Pastel2', 'Pastel2_r', 'PiYG', 'PiYG_r', 'PuBu', 'PuBuGn', 'PuBuGn_r', 'PuBu_r', 'PuOr', 'PuOr_r', 'PuRd', 'PuRd_r', 'Purples', 'Purples_r', 'RdBu', 'RdBu_r', 'RdGy', 'RdGy_r', 'RdPu', 'RdPu_r', 'RdYlBu', 'RdYlBu_r', 'RdYlGn', 'RdYlGn_r', 'Reds', 'Reds_r', 'Set1', 'Set1_r', 'Set2', 'Set2_r', 'Set3', 'Set3_r', 'Spectral', 'Spectral_r', 'Wistia', 'Wistia_r', 'YlGn', 'YlGnBu', 'YlGnBu_r', 'YlGn_r', 'YlOrBr', 'YlOrBr_r', 'YlOrRd', 'YlOrRd_r', 'afmhot', 'afmhot_r', 'autumn', 'autumn_r', 'binary', 'binary_r', 'bone', 'bone_r', 'brg', 'brg_r', 'bwr', 'bwr_r', 'cividis', 'cividis_r', 'cool', 'cool_r', 'coolwarm', 'coolwarm_r', 'copper', 'copper_r', 'crest', 'crest_r', 'cubehelix', 'cubehelix_r', 'flag', 'flag_r', 'flare', 'flare_r', 'gist_earth', 'gist_earth_r', 'gist_gray', 'gist_gray_r', 'gist_heat', 'gist_heat_r', 'gist_ncar', 'gist_ncar_r', 'gist_rainbow', 'gist_rainbow_r', 'gist_stern', 'gist_stern_r', 'gist_yarg', 'gist_yarg_r', 'gnuplot', 'gnuplot2', 'gnuplot2_r', 'gnuplot_r', 'gray', 'gray_r', 'hot', 'hot_r', 'hsv', 'hsv_r', 'icefire', 'icefire_r', 'inferno', 'inferno_r', 'jet', 'jet_r', 'magma', 'magma_r', 'mako', 'mako_r', 'nipy_spectral', 'nipy_spectral_r', 'ocean', 'ocean_r', 'pink', 'pink_r', 'plasma', 'plasma_r', 'prism', 'prism_r', 'rainbow', 'rainbow_r', 'rocket', 'rocket_r', 'seismic', 'seismic_r', 'spring', 'spring_r', 'summer', 'summer_r', 'tab10', 'tab10_r', 'tab20', 'tab20_r', 'tab20b', 'tab20b_r', 'tab20c', 'tab20c_r', 'terrain', 'terrain_r', 'twilight', 'twilight_r', 'twilight_shifted', 'twilight_shifted_r', 'viridis', 'viridis_r', 'vlag', 'vlag_r', 'winter', 'winter_r'

center:指定颜色中心值,通过该参数可以调整热力图的颜色深浅

annot:指定一个bool类型的值或与data参数形状一样的数组,如果为True,就在热力图的每个单元上显示数值

fmt:指定单元格中数据的显示格式

annot_kws:有关单元格中数值标签的其他属性描述,如颜色、大小等

linewidths :指定每个单元格的边框宽度

linecolor:指定每个单元格的边框颜色

cbar:bool类型参数,是否用颜色条作为图例,默认为True

square:bool类型参数,是否使热力图的每个单元格为正方形,默认为False

cbar_kws:有关颜色条的其他属性描述

xticklabels,yticklabels:指定热力图x轴和y轴的刻度标签,如果为True,则分别以数据框的变量名和行名称作为刻度标签

mask:用于突出显示某些数据

ax:用于指定子图的位置

data:矩阵数据集,可以使numpy的数组(array),如果是pandas的dataframe,则df的index/column信息会分别对应到heatmap的columns和rows

相关详细地址:https://blog.csdn.net/weixin_45492560/article/details/106227864

2、数据规范化处理

#导入预处理库
from sklearn import preprocessing
#均值-方差规范化(Z-Score规范化)
scaled_x = preprocessing.scale(X)
pd.DataFrame(scaled_x)
0 1 2 3
0 2.622677 -1.906530 3.656235 -0.052903
1 1.528879 0.519942 2.007311 -0.752732
2 0.150156 -0.480833 -0.291211 -1.388618
3 -0.102189 -1.407413 -0.683209 -0.472061
4 -0.758911 1.197113 0.413664 0.319342
5 -0.133935 0.763598 -0.290849 -0.604926
6 -0.779360 2.200727 -0.384062 -0.520259
7 -0.763296 1.354170 0.847573 0.176196
8 3.173318 -2.410131 1.884111 3.264694
9 0.738477 0.500291 0.967882 1.111549
10 2.042769 0.753436 1.169481 0.136834
11 -0.319785 -0.013023 -0.547003 0.567560
12 0.274565 0.902574 -0.297714 -0.250674
13 -0.161700 0.058856 -0.483055 -0.010489
14 -0.015269 1.235144 0.074414 -0.856678
15 -0.334895 0.022170 -0.614565 0.585875
16 -0.383753 0.687759 -0.648526 1.150911
17 -0.163726 -0.354858 -0.704526 0.658010
18 0.386605 -0.545390 0.100065 1.148019
19 -0.663769 0.108843 -0.682487 0.498155
20 -0.206935 0.524649 -0.718977 -1.076137
21 -0.397434 -0.346266 -0.152837 1.356553
22 -0.451773 -0.065998 -0.251469 0.608688
23 -0.577278 -1.119076 -0.979105 -0.958535
24 -0.733886 0.321416 -0.671648 -1.643261
25 -0.817064 0.466519 -0.684293 -1.270212
26 -0.409255 -1.162338 -0.647081 -0.047120
27 -0.836106 -1.010286 -0.757635 -0.563797
28 -0.755240 -1.058405 -0.046618 0.618328
29 -0.411614 -0.505117 -0.167289 -0.926403
30 -0.740273 0.768455 -0.416578 -0.805910

3、对标准化后的数据做主成分分析

#1.导入主成分分析模块PCA
from sklearn.decomposition import PCA
#2.利用PCA创建主成分分析对象pca
pca = PCA(n_components = 0.95) # 保留95%的信息量,那么PCA就会自动选使得信息量>=95%的特征数量(贡献率)
#3.调用pca对象中的fit()方法,对待分析的数据进行拟合训练
pca.fit(scaled_x)
PCA(n_components=0.95)
#4.调用pca对象中的transform()方法,返回提取的主成分
Y= pca.transform(scaled_x)
Y
array([[ 4.33588394e+00,  1.28710250e+00,  1.68836853e+00,
         7.59627269e-01],
       [ 1.53736203e+00,  2.12655221e+00,  5.60276387e-01,
         6.40131049e-02],
       [-4.66944685e-01,  1.89313306e-01,  1.38413422e+00,
        -3.11618459e-01],
       [-1.04312708e-01, -1.12335800e+00,  1.17241467e+00,
        -1.83031997e-01],
       [-5.54721923e-01,  6.78553066e-01, -1.03614749e+00,
         6.63603875e-01],
       [-7.86069399e-01,  6.09962137e-01, -1.60843100e-02,
        -2.47651609e-01],
       [-1.74256785e+00,  1.33152775e+00, -1.02791134e+00,
        -5.16135871e-02],
       [-4.35516431e-01,  1.06930104e+00, -9.94762197e-01,
         9.18254667e-01],
       [ 5.26192283e+00, -1.30032837e+00, -6.55866783e-01,
        -5.27193003e-01],
       [ 1.26240024e+00,  5.32639846e-01, -1.04116740e+00,
         8.11681801e-02],
       [ 1.66736332e+00,  1.59956567e+00, -2.70148703e-01,
        -8.45749218e-01],
       [-2.57542053e-01, -6.28504841e-01, -5.04898531e-01,
        -8.66040573e-02],
       [-4.45682855e-01,  6.52553137e-01, -3.33713880e-01,
        -5.52876825e-01],
       [-3.94028140e-01, -2.44018987e-01, -7.21037982e-02,
        -2.07511460e-01],
       [-7.94807468e-01,  1.26287224e+00, -6.92410779e-02,
        -1.84089972e-01],
       [-3.10066027e-01, -6.51088719e-01, -5.46002652e-01,
        -1.24132786e-01],
       [-3.75988294e-01, -4.81183269e-01, -1.40014355e+00,
        -1.79314094e-01],
       [-8.22686408e-02, -9.40422246e-01, -3.60958761e-01,
        -2.46193389e-01],
       [ 9.77781188e-01, -7.33760526e-01, -5.25630075e-01,
        -6.42327309e-02],
       [-6.18022516e-01, -6.75897388e-01, -5.69743441e-01,
         5.46458318e-02],
       [-1.17447251e+00,  4.21744930e-01,  4.67299992e-01,
        -4.66320099e-01],
       [ 3.70127136e-01, -1.03216645e+00, -9.11515523e-01,
         3.28979671e-01],
       [-1.36424303e-01, -5.68926110e-01, -5.03613717e-01,
         2.15121992e-01],
       [-8.71269240e-01, -9.86245934e-01,  1.31181932e+00,
        -1.01766496e-01],
       [-1.62901512e+00,  4.19537188e-01,  9.80345958e-01,
        -5.03624336e-02],
       [-1.58629868e+00,  3.21838194e-01,  5.89065612e-01,
         2.82251329e-03],
       [-1.87412125e-01, -1.21196511e+00,  6.57636221e-01,
         5.46205674e-02],
       [-7.82672229e-01, -1.04722760e+00,  9.18788396e-01,
         2.41238719e-01],
       [ 1.73562321e-01, -1.22932478e+00,  6.57284606e-02,
         7.27617532e-01],
       [-5.38687683e-01, -1.24442717e-01,  9.79170614e-01,
         2.15249182e-01],
       [-1.31161213e+00,  4.75797843e-01,  6.46048652e-02,
         1.03299110e-01]])
#5.通过pca对象中的components_属性、explained_variance_属性、explained_variance_ratio_属性,
#返回主成分分析中对应的特征向量、特征值和主成分方差百分比(贡献率)


#返回特征向量
tzxl = pca.components_
print('特征向量:')
print(tzxl)
print()

#返回特征值
tz = pca.explained_variance_
print('特征值:')
print(tz)
print()

#返回主成分方差百分比(贡献率)
gxl = pca.explained_variance_ratio_
print('方差百分比(贡献率)、每个特征在原始数据信息占比:')
print(gxl)


特征向量:
[[ 0.61009369 -0.38007555  0.55610546  0.41722294]
 [ 0.27066909  0.68308081  0.50755251 -0.45003255]
 [ 0.11152189 -0.60400387  0.05543569 -0.78719062]
 [-0.73626545 -0.15531421  0.65579269  0.06104619]]

特征值:
[2.34641356 0.93022743 0.70345946 0.15323288]

方差百分比(贡献率)、每个特征在原始数据信息占比:
[0.5676807  0.22505502 0.1701918  0.03707247]
#6.主成分表达式及验证 
Y00=sum(scaled_x[0,:]*tzxl[0,:])
Y01=sum(scaled_x[1,:]*tzxl[0,:])
Y02=sum(scaled_x[2,:]*tzxl[0,:])
Y03=sum(scaled_x[3,:]*tzxl[0,:])
print("YOO:{}\nY01:{}\nY02:{}\nY03:{}".format(Y00,Y01,Y02,Y03))
YOO:4.335883942920686
Y01:1.537362033657858
Y02:-0.4669446848076254
Y03:-0.10431270770219245

4、基于主成分进行综合排名。记录综合排名指标为F(F=g1F1+g2F2+…+gmFm),m表示提取的主成分个数,Fi、gi分别表示第i个主成分和其贡献率

#综合得分=各个主成分*贡献率之和
F=gxl[0]*Y[:,0]+gxl[1]*Y[:,1]+gxl[2]*Y[:,2] 

#提取地区
dq=list(Data['地区'].values)  

#以地区作为index,综合得分为值,构建序列
Rs=pd.Series(F,index=dq)      

#按综合得分降序进行排序
Rs=Rs.sort_values(ascending=False) 
Rs
北京     3.038413
上海     2.582823
天津     1.446676
浙江     1.260543
江苏     0.659315
广东     0.300473
河北     0.013099
山西    -0.112498
福建    -0.162941
青海    -0.166951
宁夏    -0.167162
黑龙江   -0.175883
重庆    -0.177313
山东    -0.178765
陕西    -0.267225
江西    -0.290871
四川    -0.291196
辽宁    -0.311699
湖南    -0.319781
内蒙古   -0.338537
安徽    -0.373579
河南    -0.415474
海南    -0.492279
贵州    -0.493301
甘肃    -0.523621
湖北    -0.560027
广西    -0.599919
新疆    -0.626501
云南    -0.663495
西藏    -0.727826
吉林    -0.864497
dtype: float64

代码汇总

import pandas as pd
Data=pd.read_excel('农村居民人均可支配收入来源2016.xlsx')
X=Data.iloc[:,1:]
R=X.corr()

# 数据规范化处理
#导入预处理库
from sklearn import preprocessing
#均值-方差规范化(Z-Score规范化)
scaled_x = preprocessing.scale(X)

#主成分分析
from sklearn.decomposition import PCA
pca=PCA(n_components=0.95) 
pca.fit(scaled_x)
Y=pca.transform(scaled_x)
tzxl=pca.components_              
tz=pca.explained_variance_          
gxl=pca.explained_variance_ratio_   
Y00=sum(scaled_x[0,:]*tzxl[0,:])
Y01=sum(scaled_x[1,:]*tzxl[0,:])
Y02=sum(scaled_x[2,:]*tzxl[0,:])
Y03=sum(scaled_x[3,:]*tzxl[0,:])

#综合排名
F=gxl[0]*Y[:,0]+gxl[1]*Y[:,1]+gxl[2]*Y[:,2] #综合得分=各个主成分*贡献率之和
dq=list(Data['地区'].values)  #提取地区
Rs=pd.Series(F,index=dq)           #以地区作为index,综合得分为值,构建序列
Rs=Rs.sort_values(ascending=False) #按综合得分降序进行排序
print(Rs)

北京     3.038413
上海     2.582823
天津     1.446676
浙江     1.260543
江苏     0.659315
广东     0.300473
河北     0.013099
山西    -0.112498
福建    -0.162941
青海    -0.166951
宁夏    -0.167162
黑龙江   -0.175883
重庆    -0.177313
山东    -0.178765
陕西    -0.267225
江西    -0.290871
四川    -0.291196
辽宁    -0.311699
湖南    -0.319781
内蒙古   -0.338537
安徽    -0.373579
河南    -0.415474
海南    -0.492279
贵州    -0.493301
甘肃    -0.523621
湖北    -0.560027
广西    -0.599919
新疆    -0.626501
云南    -0.663495
西藏    -0.727826
吉林    -0.864497
dtype: float64

标签:分析,02,00,01,gist,scaled,成分,pca
来源: https://www.cnblogs.com/AubeLiang/p/16123210.html