Python进行因子分析

news2024/11/13 15:20:24

1 因子分析

1.1 定义

  因子分析法(Factor Analysis)是一种利用降维的思想,从研究原始变量相关矩阵内部的依赖关系出发,把一些具有错综复杂关系的变量归结为少数几个综合因子的一种多变量统计分析方法。其优势在于不仅可以在减少大量指标分析的工作量的同时保证分析结果的合理性,还能够使得提取的公因子更具有对研究对象的解释性和客观性。
  设随机变量 X = ( X 1 , X 2 , … , X p ) X=(X_{1},X_{2},\dots,X_{p}) X=(X1,X2,,Xp), 其中 E ( X ) = μ , D ( X ) = ∑ E(X)=\mu,D(X)=\sum E(X)=μ,D(X)=; 同时有几个难以观测的随机变量 F = ( F 1 , F 2 , … , F m ) ( m < p ) F=(F_{1},F_{2},\dots,F_{m})(m \lt p) F=(F1,F2,,Fm)(m<p),其中 E ( F ) = 0 , D ( F ) = I m E(F)=0,D(F)=I_{m} E(F)=0,D(F)=Im,即 F F F中各个分量方差为1,并且彼此不相关。又有 p p p个附加的随机变量 e = ( e 1 , e 2 , … , e p ) e=(e_{1},e_{2},\dots,e_{p}) e=(e1,e2,,ep) F F F互不相关,并且有 E ( e ) = 0 , D ( e ) = d i a g ( σ 1 , … , σ p ) d e f = D E(e)=0,D(e)=diag(\sigma_{1},\dots,\sigma_{p})^{def}=D E(e)=0,D(e)=diag(σ1,,σp)def=D
  如果随机向量 X X X满足下面的模型: { x 1 = c 1 + a 11 f 11 + a 12 f 12 + ⋯ + a 1 m f 1 m + e 1 x 2 = c 2 + a 21 f 21 + a 22 f 22 + ⋯ + a 2 m f 2 m + e 2 ⋮ x p = c p + a p 1 f p 1 + a p 2 f p 2 + ⋯ + a p m f p m + e p (1) \left\{ \begin{aligned} x_{1}&=c_{1}+a_{11}f_{11}+a_{12}f_{12}+\dots+a_{1m}f_{1m}+e_{1}\\ x_{2}&=c_{2}+a_{21}f_{21}+a_{22}f_{22}+\dots+a_{2m}f_{2m}+e_{2}\\ \vdots & \\ x_{p}&=c_{p}+a_{p1}f_{p1}+a_{p2}f_{p2}+\dots+a_{pm}f_{pm}+e_{p} \end{aligned} \right.\tag{1} x1x2xp=c1+a11f11+a12f12++a1mf1m+e1=c2+a21f21+a22f22++a2mf2m+e2=cp+ap1fp1+ap2fp2++apmfpm+ep(1)则称该模型为正交因子模型,用矩阵可以写为: X = c + A F + E (2) X=c+AF+E \tag{2} X=c+AF+E(2)其中 F F F称作公共因子,随机变量 e e e称为 X X X的特殊因子,每个特殊因子之间以及特殊因子与各个公共因子之间都是互不相关的。矩阵 A = ( a i j ) p × m A=(a_{ij})_{p\times m} A=(aij)p×m是等待估计的系数矩阵,被称为因子载荷矩阵。关于因子载荷矩阵,需要说明以下几点:

  • a i j a_{ij} aij为因子载荷,是连接观测变量和因子变量之间的纽带,其值是 X i , F j X_{i},F_{j} Xi,Fj的协方差,其值越大,则 F j F_{j} Fj对于 X i X_{i} Xi的载荷量越大, X i X_{i} Xi F j F_{j} Fj之间的相关程度越大,关系越密切。
  • A A A中第 i i i行元素的平方和称为变量 X i X_{i} Xi的共同度,共同度大表明变量能被因子说明的程度高;
  • A A A中第 j j j列元素的平方和称为公共因子 F j F_{j} Fj X X X的方差贡献,是衡量公共因子相对重要性的指标,贡献越大公共因子的作用和影响越大。

  在正交因子模型中,需要使用 m + p m+p m+p个不可观测的随机变量 F F F e e e来表示原始变量 X X X,常用的回归方法无法确定因子载荷矩阵 A A A。基于前述的关于公共因子及特殊因子之间的相关假设,可以得出
∑ = E [ ( X − μ ) ( X − μ ) T ] = E [ ( A F + ϵ ) ( A F + ϵ ) T ] = A D ( F ) A T + D ( ϵ ) = A A T + D \begin{aligned}\sum&=E[(X-\mu)(X-\mu)^{T}]\\&=E[(AF+\epsilon)(AF+\epsilon)^{T}]\\&=AD(F)A^{T}+D(\epsilon)\\&=AA^{T}+D\end{aligned} =E[(Xμ)(Xμ)T]=E[(AF+ϵ)(AF+ϵ)T]=AD(F)AT+D(ϵ)=AAT+D因此 ∑ − D = A A T \sum-D=AA^{T} D=AAT,由此可知模型中第 j j j变量和第 k k k个变量的协方差 σ j k \sigma_{jk} σjk可以由下述公式得到: σ j k = a j 1 a k 1 + a j 2 a k 2 + ⋯ + a j n a k n \sigma_{jk}=a_{j1}a_{k1}+a_{j2}a_{k2}+\dots+a_{jn}a_{kn} σjk=aj1ak1+aj2ak2++ajnakn如果原始变量已经被标准化为单位方差,那么在 ∑ − D = A A T \sum-D=AA^{T} D=AAT中就可以使用相关矩阵来代替协方差矩阵。因此可以看出,公共因子解释观测变量之间的相关关系,而因子分析的目的是由样本的协方差矩阵 ∑ ^ \hat{\sum} ^来估计 ∑ \sum ,进而求出 A A A D D D。即从可观测的变量 X X X所给出的样本求出载荷矩阵 A A A,然后再预测公共因子 F F F

1.2 基本步骤

1.2.1 预处理

  因子分子法使用的前提是各指标变量之间应当具有可比性,但研究中所选取的指标单位可能不统一,而且有一些是正向指标,有一些是适度指标,因此进行因子分析前,需要对选取的原始变量无量纲化处理。

1.2.2 确定原始变量是否适用于因子分析

  在进行因子分析时,需要对原始变量进行相关系数矩阵运算,来检测所选取的原始变量之间是否存在较强的相关关系。可以使用KMO(Kaiser-Meyer-Olkin)与Bartlett球形度检测方法来对因子分析进行适用性检验。

  • KMO检验:该检验可以对原始变量之间的简单相关系数和偏相关系数的相对大小进行检验。其计算公式如下: K M O = ∑ ∑ i ≠ j r i j 2 ∑ ∑ i ≠ j r i j 2 + ∑ ∑ i ≠ j α i j ⋅ 1 , 2 , … , k 2 KMO=\frac{\sum\sum_{i \neq j}r_{ij}^{2}}{\sum\sum_{i \neq j}r_{ij}^{2}+\sum\sum_{i \neq j}\alpha_{ij \cdot1,2,\dots,k}^{2}} KMO=i=jrij2+i=jαij1,2,,k2i=jrij2其中, r i j r_{ij} rij为简单相关系数, α i j ⋅ 1 , 2 , … , k \alpha_{ij \cdot 1,2,\dots,k} αij1,2,,k为偏相关系数。 K M O ∈ [ 0 , 1 ] KMO \in [0,1] KMO[0,1]取值越大,变量间的相关性越强,偏相关性越弱,因子分析的效果越好。一般超过0.7,就可以进行因子分析。
  • Bartlett球形度检测:该检验可以检测变量是否独立,它是以相关系数矩阵为基础的。其对应的原假设及统计量为:
    H 0 : H0: H0:其相关系数矩阵为单位矩阵;
    统计量:根据相关系数矩阵的行列式得到的;
    如果该值较大,且其对应的相伴概率值小于指定的显著水平时。如果统计量值较大,拒绝零假设,表明相关系数矩阵不是单位阵,原有变量之间存在相关性,适合进行因子分析。
1.2.3 抽取公因子并确定公因子数量

  公因子提取一方面可以对原始数据进行优化,另一方面提取相同性质的关键因子,以便于减少无用变量。常用的公因子提取方法是主成分分析法。实际应用常共同使用以下两个准则来确定因子的个数:

  • 特征值准则:取特征值大于或等于1的主成分为公共因子,而放弃小于1的;
  • 碎石检验准则:按照因子被提取的顺序,画出因子的特征值随因子个数变化的散点图,再根据图的形状来判断所要提取=的公共因子及其个数。根据碎石图,一般认为曲线开始扁平前的一个点对应的因子数目是提取公共因子的最大数。

注意:这里说的特征值指的是相关系数矩阵的特征值。

1.2.4 因子旋转并命名

  公因子只有经过正交旋转后,因子载荷矩阵中的系数才会更加显著,公因子才会具备实际意义,这样提取的公因子才能更加清晰准确地解释原始变量。通常因子旋转所用的手段是:正交旋转。得到因子解后,需要赋予每个因子一个有意义的解释,即给因子命名。

2 Python进行因子分析

  这里使用Python中专门进行因子分析的包factor_analyzer来展示因子分析的整个过程,实验数据来自于参考文献5。具体代码如下:

import pandas as pd
import numpy as np
from factor_analyzer import FactorAnalyzer
import factor_analyzer
from sklearn.preprocessing import MinMaxScaler
from sympy import *
from matplotlib import pyplot as plt

data=pd.read_excel(r'C:/Users/sunta/Downloads/因子分析数据.xlsx',header=0,index_col=0)

#预处理:归一化
mm_scaler=MinMaxScaler()
data=mm_scaler.fit_transform(data)

#计算相关系数矩阵
data_corr=factor_analyzer.corr(data)

#验证是否适用于因子分析
_,kmo_total=factor_analyzer.calculate_kmo(data)
bartlett=factor_analyzer.calculate_bartlett_sphericity(data)
print("KMO:{}, Bartlett球形检测:{}".format(kmo_total,bartlett))

#求取相关系数矩阵的特征值
eig_w,_=np.linalg.eig(data_corr)

#绘制碎石图
plt.plot(range(1,data.shape[1]+1),eig_w,'o-')
plt.xticks(range(1,data.shape[1]+1))

for i in range(1,data.shape[1]+1):
    plt.text(i,eig_w[i-1],'{:.3f}'.format(eig_w[i-1]))
plt.xlabel('因子个数')
plt.show()

#因子分析
fa=FactorAnalyzer(n_factors=3,rotation=None)
fa.fit(data)

#转换后的数据
data=fa.transform(data)

这里的结果与参考文献5中的不一样,原因可能在于图片中的数据并不没有展示完整的数据。

3 其他

3.1 因子分析与主成分分析

  主成分分析和因子分析都是利用降维思想,尝试用几个主成分(或公因子)来代表所有原始变量的信息。这两者的不同点如下:

  • 主成分分析法实在损失很少信息的前提下把多个指标转化为几个不相关的综合指标,即每个主成分都是原始变量的线性组合,且各个主成分之间一定互不相关。因子分析一般假定各因子互不相关,但实际上各公因子并不一定满足互不相关要求。
  • 相对于主成分分析,因子分析更倾向于描述原始变量之间的相关关系。

3.2 归一化是否影响相关性计算

  上文中,因子分析的第一步即为数据归一化,这一部分主要是想验证归一化是否会对相关性的计算产生影响。通过随机生成多个字段,并对比归一化前后字段之间的相关性计算值。具体如下:

import numpy as np
import pandas as pd

x1=np.random.randint(0,100,size=100)*5+2
x2=3*x1+2+np.random.random(size=100)*1.1
x3=np.random.random(size=100)*7+3+np.random.random(size=100)*0.5

a=np.array([x1,x2,x3]).T
a=pd.DataFrame(a,columns=['x1','x2','x3'])

print('归一化前的相关性:')
print(a.corr())
print('=====================================')
from sklearn.preprocessing import MinMaxScaler
mm_scaler=MinMaxScaler()
a_mm=pd.DataFrame(mm_scaler.fit_transform(a),
                      columns=['x1','x2','x3'

print('最大最小归一化后的相关性:')
print(a_mm.corr())
print('=====================================')

from sklearn.preprocessing import StandardScaler

std_scaler=StandardScaler()
a_std=pd.DataFrame(std_scaler.fit_transform(a),
                   columns=['x1','x2','x3'])

print("标准化之后的相关性:")
print(a_std.corr())

其结果如下:
在这里插入图片描述
从实验结果中可以发现:归一化并不会对相关性的计算产生影响。

3.3 factor_analyzer包的安装

  若在使用pip命令安装factor_analyzer包时可能会遇到如下图所示的错误(AttributeError: module ‘enum’ has no attribute ‘IntFlag’)。
在这里插入图片描述
  出现上述错误是因为在site-packages包中安装的enum34包和标准库中的enum产生了冲突,这里只需要卸载enum34包(命令:pip uninstall enum34),然后再重新执行pip install factor_analyzer命令即可。这个方案也适用于Windows系统。

参考资料

  1. 《基于因子分析法的贵州百灵财务绩效评价研究》
  2. 《基于因子分析法的B互联网公司财务绩效评价研究》
  3. https://blog.csdn.net/qq_43517528/article/details/119653072
  4. https://blog.csdn.net/qq_31329259/article/details/82697117
  5. https://zhuanlan.zhihu.com/p/437473180
  6. 《基于因子分析的徽商银行竞争力实证》
  7. https://www.jb51.net/article/239608.htm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/182472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

尚硅谷hello scala-配置idea2022.1.2版本创建scala2.11.8版本maven文件

0_前置说明 软件版本 idea2022.1.2 scala2.11.8 java1.8.0_144 尚硅谷资源下载 关注b站尚硅谷 idea资源 百度网盘&#xff1a;https://pan.baidu.com/s/1Gbavx34OfF29LZqJ8dc85g?pwdyyds 提取码: yyds B站直达&#xff1a;​https://www.bilibili.com/video/BV1CK411d7a…

LabVIEW NI Linux Real-Time深层解析

LabVIEW NI Linux Real-Time深层解析NI LabVIEW Real-Time模块支持NI Linux Real-Time操作系统&#xff0c;在选定的NI硬件上提供。本文介绍了具体的新特性和高级功能&#xff0c;可让您为应用充分利用NI Linux Real-Time。Linux Shell支持NI Linux Real-Time操作系统提供了全面…

《Linux0.11源码趣读》学习笔记day6

到上次记录&#xff0c;整个操作系统的全部代码就已经从硬盘加载到内存中了&#xff0c;然后这些代码又通过jmpi跳转到0x90200处&#xff0c;即硬盘第二个扇区开始处的内容 这些内容就是第二个操作系统源代码文件setup.s 不过现在先来看一下操作系统的编译过程 操作系统的编译…

后端学习 - Docker

文章目录基本概念三个核心概念&#xff1a;镜像、容器、仓库联合文件系统 UnionFS常用命令Docker File基本概念 一次配置&#xff0c;处处使用运行在同一宿主机上的容器是相互隔离的&#xff0c;各自拥有独立的文件系统容器模型和虚拟机模型的主要区别 相较于虚拟机而言&#…

【Pytorch项目实战】之生成式网络:编码器-解码器、自编码器AE、变分自编码器VAE、生成式对抗网络GAN

文章目录生成式网络 - 生成合成图像算法一&#xff1a;编码器-解码器算法二&#xff1a;自编码器&#xff08;Auto-Encoder&#xff0c;AE&#xff09;算法三&#xff1a;变分自编码器&#xff08;Variational Auto Encoder&#xff0c;VAE&#xff09;算法四&#xff1a;生成式…

九型人格是什么?

九型人格是什么? 九型人格学(Enneagram/Ninehouse)是一个有2000多年历史的古老学问,它按照人们习惯性的思维模式,情绪反应和行为习惯等性格特质,将人的性格分为九种,又被称为九柱图,起源于中亚西亚地区,和中国的八卦图有点像,近代的九型是由六十年代智利的一位心理学…

计算机组成原理 | 第四章:存储器 | 存储器与CPU连接 | 存储器的校验 | Cache容量计算

文章目录&#x1f4da;概述&#x1f407;存储器分类&#x1f407;存储器的层次结构&#x1f955;原理&#x1f955;主存速度慢的原因&#x1f955;存储器三个主要特征的关系&#x1f955;缓存-主存层次和主存-辅存层次⭐️&#x1f4da;主存储器&#x1f407;概述&#x1f955;…

【opencv】Haar分类器及Adaboost算法人脸识别理论讲解

提到opencv,就不得不提其图像识别能力,最近旷世开源的YoloX项目兴起,作为目前Yolo系列中的最强者,本人对其也很感兴趣,但是完全没用机器学习和计算机视觉的基础,知其然,不知其所以然,于是想稍稍入坑一下opencv图像识别,了解一下相关算法,(说不定以后毕设会用到呢)。…

磨金石教育影视干货分享|朋友亲身经历—给新人剪辑师的三个建议

大学的时候有一个同学很喜欢视频剪辑。平时没事就蹲在电脑前&#xff0c;下载一些素材&#xff0c;自学剪辑软件&#xff0c;慢慢的搞一些创意剪辑。那时候自媒体短视频已经很火爆&#xff0c;这位同学剪辑的视频&#xff0c;不管质量如何就往上面发。一开始我们对于新事物的认…

Java---微服务---分布式搜索引擎elasticsearch(2)

分布式搜索引擎elasticsearch&#xff08;2&#xff09;1.DSL查询文档1.1.DSL查询分类1.2.全文检索查询1.2.1.使用场景1.2.2.基本语法1.2.3.示例1.2.4.总结1.3.精准查询1.3.1.term查询1.3.2.range查询1.3.3.总结1.4.地理坐标查询1.4.1.矩形范围查询1.4.2.附近查询1.5.复合查询1…

SpringBoot+Vue项目学生读书笔记共享平台

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏…

一起自学SLAM算法:10.3 机器学习与SLAM

连载文章&#xff0c;长期更新&#xff0c;欢迎关注&#xff1a; 前面已经分析过的8种SLAM算法案例&#xff08;Gmapping、Cartographer、LOAM、ORB-SLAM2、LSD-SLAM、SVO、RTABMAP和VINS&#xff09;都可以称为传统方法&#xff0c;因为这些算法都是在人为精心设计的特定规则下…

电子技术——MOS放大器基础

电子技术——MOS放大器基础 我们已经学过MOS可以当做一个压控流源&#xff0c;使用栅极电压 vGSv_{GS}vGS​ 控制漏极电流 iDi_DiD​ 。尽管两个量的关系不是线性的&#xff0c;稍后我们将会介绍偏置在线性区的工作方法。 构建压控压源放大器 现在&#xff0c;我们有了一个压…

【Java|golang】1664. 生成平衡数组的方案数---奇数前缀和 + 偶数前缀和

给你一个整数数组 nums 。你需要选择 恰好 一个下标&#xff08;下标从 0 开始&#xff09;并删除对应的元素。请注意剩下元素的下标可能会因为删除操作而发生改变。 比方说&#xff0c;如果 nums [6,1,7,4,1] &#xff0c;那么&#xff1a; 选择删除下标 1 &#xff0c;剩下…

[JAVA安全]JACKSON反序列化

前言 ackson是一个开源的Java序列化和反序列化工具&#xff0c;可以将Java对象序列化为XML或JSON格式的字符串&#xff0c;以及将XML或JSON格式的字符串反序列化为Java对象。 依赖 <dependency><groupId>com.fasterxml.jackson.core</groupId><artifact…

中国省际铁路通行时间数据

一、数据简介 本数据来自南京大学长江产业经济研究院《全国统一大市场下的省际铁路交通研究报告》的附录部分。中国的铁路&#xff08;高铁&#xff09;建设取得了辉煌成果。但受铁路时刻众多、历史数据不容易搜集整理的限制&#xff0c;学术与政策研究者一直无法对铁路建设的时…

三、JDBC详解

教程相关资料&#xff1a;https://www.aliyundrive.com/s/wMiqbd4Zws6 1&#xff0c;JDBC概述 在开发中我们使用的是java语言&#xff0c;那么势必要通过java语言操作数据库中的数据。这就是接下来要学习的JDBC。 1.1 JDBC概念 JDBC 就是使用Java语言操作关系型数据库的一套…

Nacos 配置中心 服务端推送变更源码讲解

目录 1. 配置引起变更的两种方式 1.1 后台管理直接操作 1.2 NacosClient 调用 RPC 接口 2. 变更事件处理 AsyncNotifyService 2.1 HTTP 任务 2.2 RPC任务 2.3 NacosServer 其他节点接收到消息后如何处理 3. 客户端推送实现&#xff1a;DumpService.dump 接着上一篇 Nac…

1601_读Dennis M. Ritchie and Ken Thompson的The UNIX TimeSharing System_Unix分时复用系统

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 很久之前就闻听了UNIX的大名&#xff0c;也看过很多相关的故事类文章。其中最让我印象深刻的莫过于Ken发明UNIX的故事以及这个系统对于Linux以及GNU的OS的影响&…

Linux操作系统之线程同步

文章目录一、线程的实现&#xff1a;用户级、内核级、组合二、线程的同步&#xff08;通讯&#xff09;&#xff1a;信号量&#xff0c;互斥锁&#xff0c;条件变量&#xff0c;读写锁1&#xff09;信号量2&#xff09;互斥锁操作&#xff1a;加锁&#xff0c;解锁。3&#xff…