python实现因子分析(FA)
admin
2024-01-21 03:08:05
0

1 因子分析简介

因子分析是主成分分析的推广和发展,是多元统计分析中降维的一种方法。因子分析是研究相关阵或协方差阵的内部依赖关系,是将多个变量综合变为少数几个因子,以再现原始变量与因子之间的相关关系。

相应概念参考:
https://blog.csdn.net/mengjizhiyou/article/details/83241469

因子分析的一般步骤:

1)将原始数据标准化处理

2)是否适合因子分析

因子分析前,首先进行KMO检验和巴特利球体检验:

  • KMO(Kaiser-Meyer-Olkin)

检验统计量是用于比较变量间简单相关系数和偏相关系数的指标。

KMO统计量是取值在0和1之间。当所有变量间的简单相关系数平方和远远大于偏相关系数平方和时:

值接近1.KMO值越接近于1,变量间的相关性越强,适合作因子分析/

值越接近于0,变量间的相关性越弱,不适合作因子分析。

0.9 以上表示非常适合;0.8表示适合;0.7表示一般;0.6表示不太适合;0.5以下表示极不适合。

  • Bartlett 球度检

巴特利特球度检验的统计量是根据相关系数矩阵的行列式得到的。

如果该值较大,且其对应的相伴概率值小于用户心中的显著性水平,那么应该拒绝零假设,认为相关系数矩阵不可能是单位阵,即原始变量之间存在相关性,适合于做主成份分析。

相反,如果该统计量比较小,且其相对应的相伴概率大于显著性水平,则不能拒绝零假设,认为相关系数矩阵可能是单位阵,不宜于做因子分析。

3)计算相关矩阵R

4)计算相关矩阵R的特征值和特征向量

5)确定公共因子个数 k

按方差贡献定因子数,>80%。

6)构造初始因子载荷矩阵并解释

7)是否需要因子转换

对初始因子载荷矩阵A进行旋转变换,旋转变换是使初始因子载荷矩阵结构简化,关系明确,使得因子变量更具有可解释性,如果初始因子不相关,可以用方差极大正交旋转,如果初始因子间相关,可以用斜交旋转,经过旋转后得到比较理想的新的因子载荷矩阵R’。

8)计算因子得分

9)计算总得分

以公共因子旋转后的方差贡献率为权重,计算出总得分。计算出来的总得分可以用于排名,进行评价分析。

10)建立模型

将因子得分作为变量建模即可。

2 python 实现

# 参考:https://cloud.tencent.com/developer/article/1642275import numpy.linalg as nlg #导入nlg函数,linalg=linear+algebra
from math import sqrt
from numpy import eye, asarray, dot, sum, diag #导入eye,asarray,dot,sum,diag 函数
from numpy.linalg import svd #导入奇异值分解函数"""构建数据集"""
data=pd.DataFrame(np.random.randint(50,100,size=(5, 10)))
data.columns=["特征1","特征2","特征3","特征4","特征5","特征6","特征7","特征8","特征9","特征10"]
data.index=['对象1','对象2','对象3','对象4','对象5']"""将原始数据标准化处理 """
data=(data-data.mean())/data.std() # 0均值规范化"""计算相关矩阵"""
C=data.corr() #相关系数矩阵"""计算相关矩阵及其特征值和特征向量 """
eig_value,eig_vector=nlg.eig(C) #计算特征值和特征向量
eig=pd.DataFrame() #利用变量名和特征值建立一个数据框
eig['names']=data.columns#列名
eig['eig_value']=eig_value#特征值"""确定公共因子个数k """
for k in range(1,11): #确定公共因子个数if eig['eig_value'][:k].sum()/eig['eig_value'].sum()>=0.8: #如果解释度达到80%, 结束循环print(k)break"""构造初始因子载荷矩阵A"""
col0=list(sqrt(eig_value[0])*eig_vector[:,0]) #因子载荷矩阵第1列
col1=list(sqrt(eig_value[1])*eig_vector[:,1]) #因子载荷矩阵第2列
col2=list(sqrt(eig_value[2])*eig_vector[:,2]) #因子载荷矩阵第3列
A=pd.DataFrame([col0,col1,col2]).T #构造因子载荷矩阵A
A.columns=['factor1','factor2','factor3'] #因子载荷矩阵A的公共因子"""因子转换"""
h=np.zeros(10) #变量共同度,反映变量对共同因子的依赖程度,越接近1,说明公共因子解释程度越高,因子分析效果越好
D=np.mat(np.eye(10))#特殊因子方差,因子的方差贡献度 ,反映公共因子对变量的贡献,衡量公共因子的相对重要性
A=np.mat(A) #将因子载荷阵A矩阵化for i in range(10):a=A[i,:]*A[i,:].T #行平方和h[i]=a[0,0]  #计算变量X共同度,描述全部公共因子F对变量X_i的总方差所做的贡献,及变量X_i方差中能够被全体因子解释的部分D[i,i]=1-a[0,0] #因为自变量矩阵已经标准化后的方差为1,即Var(X_i)=第i个共同度h_i + 第i个特殊因子方差def varimax(Phi, gamma = 1.0, q =10, tol = 1e-6): #定义方差最大旋转函数p,k = Phi.shape #给出矩阵Phi的总行数,总列数R = eye(k) #给定一个k*k的单位矩阵d=0for i in range(q):d_old = dLambda = dot(Phi, R)#矩阵乘法u,s,vh = svd(dot(Phi.T,asarray(Lambda)**3 - (gamma/p) * dot(Lambda, diag(diag(dot(Lambda.T,Lambda)))))) #奇异值分解svdR = dot(u,vh)#构造正交矩阵Rd = sum(s)#奇异值求和if d_old!=0 and d/d_old:return dot(Phi, R)#返回旋转矩阵Phi*Rrotation_mat=varimax(A)#调用方差最大旋转函数
rotation_mat=pd.DataFrame(rotation_mat)#数据框化"""计算因子得分"""
data=np.mat(data) #矩阵化处理
factor_score=(data).dot(A) #计算因子得分
factor_score=pd.DataFrame(factor_score)#数据框化
factor_score.columns=['因子A','因子B','因子C'] #对因子变量进行命名
factor_score
#factor_score.to_excel(outputfile)#打印输出因子得分矩阵

可以直接调用包factor_analyzer,详见:

https://cloud.tencent.com/developer/article/1897844?from=article.detail.1642275

参考:

https://cloud.tencent.com/developer/article/1642275
http://www.cdadata.com/7460

相关内容

热门资讯

上海特色会议场地:选择多样,魅... 上海,一个充满活力和魅力的国际大都市,不仅是经济、金融、贸易和航运中心,也是举办各种会议的热门城市。...
国庆中秋假期来宁夏,教你点一桌... 这是一篇关于来宁夏吃什么的稿件 小编手把手教你点一桌好菜 荤菜、素菜、主食、汤类、小吃 可选性太多啦...
虾仁炒冬瓜的家常做法,3步搞定... "妈,冬瓜还能和虾一起炒?"上周女儿看见我在厨房鼓捣这道菜时,满脸写着怀疑。结果菜刚上桌,她就着汤汁...
山海相约, “明”动湾区!三明... 为抢抓国庆黄金周市场机遇,9月12日至14日,三明文旅产品在2025广东国际旅游产业博览会精彩亮相。...
东港又添时尚休闲文化旅游新地标... 大连文体旅集团·东港公司精心打造的“山海经文化休闲栈道”于9月初全面开放。至此,东港四大文旅升级项目...
川酒原酒“芯”时代,中国原酒引... 川酒集团的实践,为传统原酒产业提供了一条清晰可行的升级路径:通过数字化技术解决稳定性与定制化难题,通...
原创 水... "这菜长得跟水草似的,真能吃?"去年我第一次在云南菜市场见到水性杨花菜时,也是满脸怀疑。直到客栈老板...
罗永浩西贝“互撕”,预制菜缘何... 红星资本局9月12日消息近日,“罗永浩吐槽西贝预制菜”登上微博热搜。对此,西贝创始人贾国龙予以否认,...
吉林锅贴煎到金黄!韭菜肉馅多汁... 本文聚焦吉林特色美食 —— 韭菜肉馅锅贴,从其历史渊源、食材甄选、制作工艺到食用体验展开详细介绍。文...
广式早茶:一盅两件里的慢时光,... 在广州,叫醒人们的不是闹钟,而是早茶店里飘出的虾饺香。对于老广来说,“饮早茶” 从不是简单的 “吃早...
香蕉泡酒选啥酒?42度清香型纯... 泡酒选择需谨慎,否则无益又伤身。下面,分享一些从泡酒达人得到的专业经验。第一、近年来,市面上很多白酒...
西安嘉会坊咖啡生活节启幕 9月12日,西安嘉会坊咖啡生活节活力启幕。记者在现场看到,在延续往年快闪公园形式的基础上,“2025...
10月16日增发《联合国粮食及... 根据2025年纪特邮票发行计划,2025年10月16日将增加发行《联合国粮食及农业组织成立八十周年》...
十道精品川菜,做法独特,味道一... 想吃川菜吗?十道精品川菜,做法独特,味道一绝,值得大家参考和收藏。 韭爆腰花,川味火爆菜品,讲究火...
帝卡姆环球严选量贩零食,以极致... 近年来,随着消费升级和电商渠道的多元化发展,零食行业迎来了新一轮的变革。在这一背景下,帝卡姆环球严选...
白水煮蛏子:简单做法,鲜美滋味 白水煮蛏子是一道非常受欢迎的海鲜美食,其制作方法简单易懂,口感鲜美,深受广大食客的喜爱。下面,就让我...
炖东北乱炖时,别纠结先后顺序,... 一锅热气腾腾的“大杂烩”,才是秋天最朴实的温暖 秋风一起,胃口就跟着凉飕飕的天气变得格外诚实——总馋...
油面筋塞肉:家常美味,鲜香四溢 准备食材:肉末、葱花、鸡蛋、盐、生抽、老抽、蚝油。调制肉馅:将肉末、葱花、鸡蛋、盐、生抽、老抽、蚝油...
煎日式照烧鸡腿时,别用鸡胸肉代... 滋滋作响的照烧鸡腿在锅里欢快地唱着歌,浓郁的酱香钻进鼻孔,让人忍不住咽口水——这大概就是幸福的声音吧...