ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

3、主成分分析

2022-04-09 20:03:29  阅读:312  来源: 互联网

标签:分析 02 00 01 gist scaled 成分 pca


主成分分析

主成分分析(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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有