大家好!今天给大家带来一个非常简单、实用的统计方法——因子分析,这个方法适用面非常广,无论商科、工科、理科都能用来研究分析。一起来看看吧!
什么是因子分析?用来做什么?
因子分析法(factor analysis)的核心是对若干综合指标进行因子分析并提取公共因子,再以每个因子的方差贡献率作为权数与该因子的得分乘数之和构造得分函数。
第一部分:安装factor_analyzer包
系统解释器: pip install factor_analyzer;
conda-jupyter:conda install -c desilinguist factor_analyzer;
conda install -c desilinguist factor_analyzer
加载后续所需的包
import pandas as pd
import numpy as np
from pandas import DataFrame,Series
from factor_analyzer import FactorAnalyzer, Rotator
说明:
FactorAnalyzer里面包含了基本的功能,例如方差、因子载荷矩阵、提取主成分、计算得分等,但是没有旋转因子矩阵这一重要功能,所以需要加载Rotator,进行补充。
第二部分:导入数据
本文此次数据选自于各大城市《统计年鉴2019》与碳排放相关的各项指标;
在之前的文章中,介绍了如何利用pandas读取.csv文件,这次给大家介绍pandas读取.xlsx文件的方法:
data = pd.read_excel("F:\\公众号\\python\\【案例】因子分析\\data.xlsx", sheetname = 0, header = 0, index_col = 0)
参数说明:
1、sheetname指选取哪个sheet的数据,0代表第一个,1代表第二个,依此类推;如果不填,默认选取所有sheet。
2、header选取哪一行作为列指标;index_col选取哪一列作为索引,这两个与read_csv()相同。
第三部分:建立因子分析模型
fa = FactorAnalyzer(rotation=None)
fa.fit(data)
从结果中可以看出,从中提取了3个主成分因子。
然后我们可以通过.loadings_查看因子载荷矩阵:
print("因子载荷矩阵:\n", fa.loadings_)
很多时候我们从因子载荷矩阵中很难去解释这三个主成分所蕴含的逻辑关系,因此就需要将因子载荷矩阵进行旋转;
旋转的目的是通过改变坐标轴位置,重新分配各个因子所解释方差比例,使其载荷系数更接近1或0,能更好地解释和命名变量。旋转后的因子不改变模型对数据的拟合程度,也不改变各个变量的公因子方差,使因子结构变得更简单:
rotator = Rotator()
print("按正交旋转后的因子载荷矩阵:\n", rotator.fit_transform(fa.loadings_))
说明:
Rotator()默认选择varimax,要得出旋转后的载荷矩阵需要通过.fit_transform()来进行计算;
然后按照每一行中绝对值最大的数进行分组,就可以得到三个主成分中所含有的逻辑关系,在这里就不进行分析了,留给大家自行解释。
假如我们使用varimax方法旋转后,还是不能很好的解释主成分所蕴含的逻辑,那么我们就需要用其它旋转方法进行探索,这里以promax进行展示:
说明:
旋转方法还有:varimax、promax 、oblimin、oblimax、quartimin、quartimax 、equamax
计算变量共同度:
变量共同度也就是变量方差,是每个原始变量在每个共同因子的负荷量的平方和,也就是指原始变量方差中由共同因子所决定的比率。变量的方差由共同因子和唯一因子组成。共同性表明了原始变量方差中能被共同因子解释的部分,共同性越大,变量能被因子说明的程度越高,即因子可解释该变量的方差越多。共同性的意义在于说明如果用共同因子替代原始变量后,原始变量的信息被保留的程度。
一般共同度大于0.5比较好。
fa.get_communalities()
计算因子相关矩阵和特征值
fa.get_eigenvalues()
计算因子方差信息,从上到下依次是每个因子的方差,比例方差和累积方差:
fa.get_factor_variance()
第四部分:计算各个城市得分
为了计算便利,我们先定义一个计算得分的函数,得分的计算公式是以比例方差为权重的加权求和:
def socre(factors):
return sum(factors*fa.get_factor_variance()[1])
然后我们需要继续利用FactorAnalyzer中.transform()计算各个城市三个主成分的值:
fa.transform(data)
紧接着就可以套用循环语句依次计算每个城市的污染得分:
socres = []
for i in range(len(fa.transform(data))):
new = socre(fa.transform(data)[i])
socres.append(new)
并将得分插入到原数据表中:
data['得分'] = socres
最后就可以根据大家各自的需求进行排序、可视化等操作了,是不是比SPSS还要简单呢。
获取代码
之前有小伙伴反映无法打开我上传的代码文件,因为之前的代码文件都是我从notebook中直接保存的.ipynb格式,无法用python直接打开,所以以后传代码,我会再附上完整代码.py格式一起上传。
该篇的数据和完整代码可在公众号中回复“因子分析”获得,谢谢大家支持!