查看原文
其他

软件应用 | 主成分分析的Python实现

数据Seminar 2022-12-31

The following article is from Stata and Python数据分析 Author 爬虫俱乐部

本文作者:万   浩,中南财经政法大学统计与数学学院

本文编辑:张孟晗

技术总编:陈   鼎

来      源:Stata and Python数据分析


主成分分析
主成分分析(PCA), 是通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。主成分分析首先是由K.皮尔森(Karl Pearson)对非随机变量引入的,随后H.霍特林(Harold Hotelling)将此方法推广到随机向量的情形。
在实际问题中,为了全面分析问题,往往提出很多与此有关的变量,我们称之为原始变量,每个原始变量都在不同程度上反映这个问题的某些信息,使得观测数据中的信息一定程度上有所重叠。主成分分析利用了降维的思想,把很多个原始变量化为少数几个能够反映原始变量绝大部分信息的综合变量,从而简化了问题的分析。



Python实现
1输出相关矩阵
我们首先导入Python的numpy和pandas库,选取的数据为美国50个州每100000人的七种犯罪率数据,样本量n=50,原始变量个数p=7,我们读取数据文件后计算原始变量的相关矩阵,命令如下:
import numpy as npimport pandas as pd
data = pd.read_excel('states.xls') # 读取数据文件var_ind = data.columns[1:]capital_index = list(data['states'])data = data.iloc[:, 1:]
corr_mat = data.corr() # 计算相关矩阵print(corr_mat)
相关矩阵的结果如下所示:

从相关矩阵的结果可以看到,部分原始变量存在较强的相关关系,说明原始变量间存在着一定的信息重叠,使得变量降维成为可能。
2数据标准化后求主成分
主成分分析中,我们首先应保证所提取的前几个主成分的累计贡献率达到较高的水平,也就是说原始变量在降维后信息的损失不宜过多,即满足条件累计贡献率contri >0.85;其次这些被提取的主成分必须有符合实际背景的解释。当然,主成分的解释含义多少带有一些模糊性。
由于七种犯罪率数值相差较大,所以我们将数据标准化后再计算原始变量的协方差矩阵。在保证累计贡献率contri >0.85的条件下得到相关矩阵的前3个特征值和其特征向量,命令如下:
data = (data-data.mean())/data.std() # 数据标准化cov_mat = data.cov() # 计算协方差矩阵
eigvals,eigvects = np.linalg.eig(cov_mat) # 计算特征值与特征向量def cal_contribution(eigvals, k): for i in range(1, k): contri = eigvals[:i].sum()/eigvals.sum() # 计算累计贡献率 print('第%d主成分贡献率为:%s'%(i, contri)) if contri >0.85: return ii = cal_contribution(eigvals, 7)eigs = eigvals[:i]A = eigvects[:i].T # 计算特征向量矩阵A1 = pd.DataFrame(A)A1.index = var_indA1.columns = [1, 2, 3]score_mat = data.dot(A) # 计算主成分得分print(A1)print('特征值为%s' %eigs)
特征值和特征向量结果如下所示:

可以看到,第一主成分与每一种犯罪都有一定的关系,我们可以称之为综合犯罪水平,第二主成分与汽车犯罪、杀人罪有较强的关系,我们可以称之为暴力犯罪水平,第三主成分与夜盗罪、盗窃罪、抢劫罪有较强的关系,我们则称之为经济犯罪水平。
3计算主成分得分并排序
得到主成分后,我们就可以按每一个主成分得分进行排序,即能看到各州犯罪的特点,命令如下:
score_mat.index = capital_indexsort_1 = score_mat.sort_values(0) # 按第一主成分得分排序sort_1.columns = [1, 2, 3]sort_2 = score_mat.sort_values(1) # 按第二主成分得分排序sort_2.columns = [1, 2, 3]sort_3 = score_mat.sort_values(2) # 按第三主成分得分排序sort_3.columns = [1, 2, 3]print(sort_1)print(sort_2)print(sort_3)
我们展示第一主成分排序结果,如下所示:

第一主成分得分排序的结果我们看到Nevada、Alaska、California等州综合犯罪率是较高的。通过以上的介绍,可以了解手写代码进行主成分分析的过程,那么也请你动起手来设计一段代码完成一些小任务吧!




星标⭐我们不迷路!
想要文章及时到,文末“在看”少不了!

点击搜索你感兴趣的内容吧


往期推荐


统计计量 | 内生性!内生性!解决方法大集合

数据资源 | 企研·学术大数据平台:福建农林大学开通试用!

热点资讯 | 三农学术周报(第17期)

统计计量 | 因果推断:混杂因素的敏感性分析

机器学习 | 线性回归:不能忽视的三个问题

统计计量 | 实证研究中常犯的18个统计学错误, 避坑防雷指南!

统计计量 | 双重差分法(DID)平行趋势检验绘图的相关操作







数据Seminar




这里是大数据、分析技术与学术研究的三叉路口


推荐 | 青酱


    欢迎扫描👇二维码添加关注    

点击下方“阅读全文”了解更多

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存