查看原文
其他

主成分分析的Python实现

爬虫俱乐部 Stata and Python数据分析 2022-03-15

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

本文编辑:张孟晗

技术总编:陈   鼎

Stata&Python云端课程来啦!

好消息!好消息!千呼万唤下,爬虫俱乐部Stata&Python数据分析线上沙龙活动将于11月17日下午3:00到5:00举办。本系列线上沙龙活动是为了促进各位学友关于Stata&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等州综合犯罪率是较高的。通过以上的介绍,可以了解手写代码进行主成分分析的过程,那么也请你动起手来设计一段代码完成一些小任务吧!

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。



腾讯课堂课程二维码








            


 对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!











往期推文推荐

        正则表达式--贪婪模式

        Seminar丨谁更重要:高管股权薪酬与财务报告欺诈        DOS能量,超乎你想象!

        爬虫实战丨走进哈利波特的魔法世界

        数据集合并的新路子-frlink命令

        Seminar丨附近的公司:利用卫星图像研究本地信息优势

        线性同余法生成伪随机数 

         [技能篇]多线程爬虫

“好哭”是衡量一部好电影的标准吗?

Stata&Python云端课程来啦!

带你了解Stata中的矩阵

Seminar|总统的朋友:政治关联与企业价值
爬虫实战 | 爬取中国天气网

爬虫实战 | 爬取东方财富网经济数据——以居民消费价格指数(CPI)为例

Seminar|媒体关联董事对融资和外部治理的影响神奇的组内交叉合并 PDF分章节转TXT并实现可视化——以胡景北知青日记1971至1978年为例

万物皆可开——shellout妙用

无处不在的系列配置项|从零开始的Pyecharts(三)

使用Python制作自动聊天机器人  

fillin一下,平衡回来~

order命令——快速改变变量顺序的利器 Ajax应用场景——以获取雪球网港股代码及公司名称为例

播放列表中的歌单排行 

在Stata中轻松运用program编写命令

Meta Analysis in Stata17      

芒果TV视频弹幕爬取之《我在他乡挺好的》

Stata中的判断神器——confirm命令

cngdf——名义GDP与实际GDP之间的摆渡船

最近《扫黑风暴》有点火爆!我从豆瓣评论中发现了这些……

随机森林-Random Forest 

复原之神--preserve&restore

合并,“纵”享新丝滑:frameappend & xframeappend

关于我们 


   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里
为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众
号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。



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

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