Python进行因子分析
创始人
2024-05-20 01:40:22
0

1 因子分析

1.1 定义

  因子分析法(Factor Analysis)是一种利用降维的思想,从研究原始变量相关矩阵内部的依赖关系出发,把一些具有错综复杂关系的变量归结为少数几个综合因子的一种多变量统计分析方法。其优势在于不仅可以在减少大量指标分析的工作量的同时保证分析结果的合理性,还能够使得提取的公因子更具有对研究对象的解释性和客观性。
  设随机变量X=(X1,X2,…,Xp)X=(X_{1},X_{2},\dots,X_{p})X=(X1​,X2​,…,Xp​), 其中E(X)=μ,D(X)=∑E(X)=\mu,D(X)=\sumE(X)=μ,D(X)=∑; 同时有几个难以观测的随机变量F=(F1,F2,…,Fm)(m   如果随机向量XXX满足下面的模型:{x1=c1+a11f11+a12f12+⋯+a1mf1m+e1x2=c2+a21f21+a22f22+⋯+a2mf2m+e2⋮xp=cp+ap1fp1+ap2fp2+⋯+apmfpm+ep(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}⎩⎧​x1​x2​⋮xp​​=c1​+a11​f11​+a12​f12​+⋯+a1m​f1m​+e1​=c2​+a21​f21​+a22​f22​+⋯+a2m​f2m​+e2​=cp​+ap1​fp1​+ap2​fp2​+⋯+apm​fpm​+ep​​(1)则称该模型为正交因子模型,用矩阵可以写为:X=c+AF+E(2)X=c+AF+E \tag{2}X=c+AF+E(2)其中FFF称作公共因子,随机变量eee称为XXX的特殊因子,每个特殊因子之间以及特殊因子与各个公共因子之间都是互不相关的。矩阵A=(aij)p×mA=(a_{ij})_{p\times m}A=(aij​)p×m​是等待估计的系数矩阵,被称为因子载荷矩阵。关于因子载荷矩阵,需要说明以下几点:

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

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

1.2 基本步骤

1.2.1 预处理

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

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

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

  • KMO检验:该检验可以对原始变量之间的简单相关系数和偏相关系数的相对大小进行检验。其计算公式如下:KMO=∑∑i≠jrij2∑∑i≠jrij2+∑∑i≠jαij⋅1,2,…,k2KMO=\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=j​rij2​+∑∑i=j​αij⋅1,2,…,k2​∑∑i=j​rij2​​其中,rijr_{ij}rij​为简单相关系数,αij⋅1,2,…,k\alpha_{ij \cdot 1,2,\dots,k}αij⋅1,2,…,k​为偏相关系数。KMO∈[0,1]KMO \in [0,1]KMO∈[0,1]取值越大,变量间的相关性越强,偏相关性越弱,因子分析的效果越好。一般超过0.7,就可以进行因子分析。
  • Bartlett球形度检测:该检验可以检测变量是否独立,它是以相关系数矩阵为基础的。其对应的原假设及统计量为:
    H0: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 pltdata=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 pdx1=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.5a=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 StandardScalerstd_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

相关内容

热门资讯

老公生日祝福语 老公生日祝福语(精选50句)  温馨的烛光为你点亮,脑海浮现昔日的时光;把双手紧紧握在胸膛;默默为自...
圣诞节快乐祝福语短信 圣诞节快乐祝福语短信大集合46条  如果有个胖红衣老人从窗户爬进你屋子把你装进口袋不要怕,因为我对圣...
夏作文 -作文 夏作文 -作文 夏天是什么样的呢?是温柔的、生气的、悄悄的、美丽的... 我喜欢她, 她很美,却从不...
端午节日祝福短信 端午节日祝福短信  无论是在学校还是在社会中,要用到短信的情况还是蛮多的,短信属于一种非实时的、非语...
新年祝福语简短 新年祝福语大全简短(精选125句)  许一个美好的心愿祝你新年快乐连连,送一份美妙的感觉祝你来年万事...
我的小猪 我的小猪 我的小猪   朱佩(8岁)   我有一只漂亮可爱的`小猪,那是圣诞前夕,圣诞老人送给我的。...
小学生作文 小学生作文(精选15篇)  在学习、工作、生活中,大家都接触过作文吧,作文是人们以书面形式表情达意的...
活到老学到老名言 活到老学到老名言  在现实生活或工作学习中,大家都接触过比较经典的名言吧,名言主要用来激励和告诉当事...
瑶琳仙境作文450字 瑶琳仙境作文450字  在平凡的学习、工作、生活中,大家对作文都不陌生吧,作文是一种言语活动,具有高...
关于帽子的作文100字 第一篇:好吃的帽子 有一天,小松鼠去森林采蘑菇,它采到一个大大蘑菇,关于帽子的作文100字。突然下雨...
精彩的拔河比赛优秀作文 精彩的拔河比赛优秀作文(通用45篇)  在平时的学习、工作或生活中,大家都跟作文打过交道吧,作文根据...
椰趣小学作文400字 椰趣小学作文400字  新年我们一家人来到了晴空万里的海南岛旅游。  我一来到海南岛就喊热,最后我脱...
跳长绳作文200字 跳长绳作文200字(精选48篇)  在日常学习、工作和生活中,大家都写过作文吧,作文是一种言语活动,...
小公鸡照镜子作文350字 小公鸡照镜子作文350字  一天,小公鸡壮壮在外面玩耍,它东转转西转转,突然,它看见有一面奇怪的东西...
往事随风作文600字 往事随风作文600字  在平时的学习、工作或生活中,说到作文,大家肯定都不陌生吧,作文是人们以书面形...
这个女孩好嚣张作文1000字 这个女孩好嚣张作文1000字  我,其貌不扬:两只小小的眼睛像黑色的宝石,一张能说会道的嘴巴,淡淡的...
深思熟虑作文 关于深思熟虑作文范文300字  在平时的学习、工作或生活中,大家都不可避免地会接触到作文吧,作文是经...
感悟失败 -作文 感悟失败 -作文辽中县老大房中心小学 魏嫱 今天是个不幸的日子,考试成绩发下来了,...
我终于见到了大海作文 我终于见到了大海作文  我终于见到了大海  我抬头看天,向大海一样遥远,一样深蓝。那里曾是我的梦,带...
教师之赞作文 教师之赞作文教师之赞作文1  教师之路,平凡而激情。春秋冬夏,三尺讲台十数书桌;斗转星移,校园教室简...