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