【数学建模之Python】7.因子分析的因子旋转与因子不旋转的对比(利用factor_analyzer库旋转因子)

本文通过Python的`numpy`、`scikit-learn`和`factor_analyzer`库展示了如何进行主成分分析(PCA)和因子分析,包括特征值计算、特征向量排序、载荷矩阵构建以及因子旋转,旨在解释公共因子对原始变量的方差贡献。通过对比未旋转和旋转后的因子载荷矩阵,强调了因子旋转对提高解释效果的重要性。
摘要由CSDN通过智能技术生成

你们的每个赞都能让我开心好几天✿✿ヽ(°▽°)ノ✿

1.题目:假定某地固定资产投资率x1、通货膨胀率x2、失业率x3、相关系数矩阵为\begin{bmatrix} 1 &1/5 &-1/5 \\ 1/5 &1 &-2/5 \\ -1/5 &-2/5 &1 \end{bmatrix},试用主成分分析法求因子分析模型

(《Python数学实验与建模》(司守奎)例11.9)

2.代码如下

注意:

(1)要先明白因子分析中的基本概念,如贡献、贡献率、共同度、载荷矩阵

(2)要先安装factor_analyzer库,在Anaconda Prompt里pip install factor_analyzer,这个库的作用就是根据相关系数矩阵,旋转因子得到理想的载荷矩阵

版本声明:

python 3.7.1

#特征值要降序,对应的特征向量也要排序
#我参考了https://blog.csdn.net/qq_41081716/article/details/103332472
import numpy as np
from sklearn import decomposition as dc
from scipy.linalg import eig
from factor_analyzer import FactorAnalyzer#这个包需要自己安装,用于因子旋转以得到更好结果,见p345


#1.应用原理计算方法
r=np.array([[1,1/5,-1/5],
           [1/5,1,-2/5],
           [-1/5,-2/5,1]])
val,vec=np.linalg.eig(r)#求相关系数矩阵的特征值和特征向量,但是这样求出来的特征值是没有排序的
index=np.argsort(val)[::-1]
print('特征值降序的下标:',index)
A1=np.tile(np.sqrt(val),(3,1))*vec#利用同维数矩阵逐个元素相乘求载荷矩阵
A2=vec*np.sqrt(val)#向量放第二位自动转置,好像也可以解释成广播机制,不过我更倾向于第一种理解
A3=A2[:,index]#排序后的载荷矩阵
print('排序前特征值:',val.round(4))
print('排序后特征值:',np.sort(val)[::-1].round(4))
print('排序前特征向量:\n',vec.round(4))
print('排序后特征向量:\n',vec[:,index].round(4))
print('排序前载荷矩阵:\n',A1.round(4))
print('排序后载荷矩阵:\n',A3.round(4))

num=int(input(('请输入选择公共因子的个数:')))
A=A3[:,:num]#提出num个因子的载荷矩阵
#print('\n',A)
Ac=np.sum(A**2,axis=0)#逐列元素求和
Ar=np.sum(A**2,axis=1)#逐行元素求和
print('对x的贡献为:',Ac)
print('对x的贡献率为:',Ac/3)
print('对x的累计贡献率为:',np.sum(Ac/3))
print('共同度为:',Ar)
#根据贡献率来看,可得知因子f1是最重要的
#共同度是指某一原变量在所有公因子上载荷平方和反应公公元素对原变量的方差的解释程度,大于0.8即可得到很好的结果


#2.应用factor_analyzer求解
f=FactorAnalyzer(rotation='varimax', n_factors=num, method='principal')
'''
(1)rotation:旋转的方式,包括None:不旋转,'varimax':最大方差法,'promax':最优斜交旋转;
(2)n_factors:公因子的数量;
(3)method:因子分析的方法,包括'minres':最小残差因子法,'principal':主成分分析法;
'''
f.fit(r)
print('\n因子旋转后的载荷矩阵:\n',f.loadings_)
Ac=np.sum(f.loadings_**2,axis=0)#逐列元素求和
Ar=np.sum(f.loadings_**2,axis=1)#逐行元素求和
print('对x的贡献为:',Ac)
print('对x的贡献率为:',Ac/3)
print('对x的累计贡献率为:',np.sum(Ac/3))
print('共同度为:',Ar)

输入选择几个公共因子,当num=2时,结果为:

特征值降序的下标: [1 0 2]
排序前特征值: [0.8536 1.5464 0.6   ]
排序后特征值: [1.5464 0.8536 0.6   ]
排序前特征向量:
 [[-0.8881  0.4597  0.    ]
 [ 0.3251  0.628   0.7071]
 [-0.3251 -0.628   0.7071]]
排序后特征向量:
 [[ 0.4597 -0.8881  0.    ]
 [ 0.628   0.3251  0.7071]
 [-0.628  -0.3251  0.7071]]
排序前载荷矩阵:
 [[-0.8205  0.5717  0.    ]
 [ 0.3003  0.7809  0.5477]
 [-0.3003 -0.7809  0.5477]]
排序后载荷矩阵:
 [[ 0.5717 -0.8205  0.    ]
 [ 0.7809  0.3003  0.5477]
 [-0.7809 -0.3003  0.5477]]
请输入选择公共因子的个数:2
对x的贡献为: [1.54641016 0.85358984]
对x的贡献率为: [0.51547005 0.28452995]
对x的累计贡献率为: 0.7999999999999998
共同度为: [1.  0.7 0.7]

因子旋转后的载荷矩阵:
 [[ 0.17265918  0.98498163]
 [ 0.99698659  0.07757406]
 [-0.85195502 -0.52361497]]
对x的贡献为: [1.74962082 1.25037918]
对x的贡献率为: [0.58320694 0.41679306]
对x的累计贡献率为: 1.0
共同度为: [1. 1. 1.]

 对比可发现旋转因子后,共同度变大了,反应公共因素对原变量的方差的解释效果很好

factor_analyzer学习参考

你们的每个赞都能让我开心好几天✿✿ヽ(°▽°)ノ✿

  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
因子分析是一种常用的数学建模方法,通过降维分析来揭示观测变量背后的潜在因子结构。在Python中,可以使用factor_analyzer进行因子分析的实现。首先,需要安装factor_analyzer,可以在Anaconda Prompt中使用命令"pip install factor_analyzer"进行安装。 接下来,根据相关系数矩阵进行因子分析。可以使用factor_analyzer中的FactorAnalyzer类来实现。具体的步骤如下: 1. 导入所需的和数据。 2. 计算相关系数矩阵。 3. 创建FactorAnalyzer对象。 4. 使用fit()方法拟合数据并进行因子分析。 5. 使用get_factor_variance()方法获取因子方差解释比例。 6. 使用transform()方法将原始数据转换为因子得分。 下面是一个示例代码: ``` # 导入所需的 import pandas as pd from factor_analyzer import FactorAnalyzer # 导入数据 data = pd.read_csv('data.csv') # 计算相关系数矩阵 corr_matrix = data.corr() # 创建FactorAnalyzer对象 fa = FactorAnalyzer(n_factors=3, rotation='varimax') # 拟合数据并进行因子分析 fa.fit(data) # 获取因子方差解释比例 variance = fa.get_factor_variance() # 将原始数据转换为因子得分 factor_scores = fa.transform(data) ``` 请注意,上述代码中的"data.csv"是示例数据文件的路径,你需要将其替换为你自己的数据文件路径。 相关问题: 1. 如何选择因子个数? 2. 什么是因子旋转? 3. 如何解释因子方差解释比例? 相关问题: 1. 如何选择因子个数? 2. 什么是因子旋转? 3. 如何解释因子方差解释比例?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若oo尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值