因子分析(FA)是一种探索性数据分析方法,用于从一组观测变量中寻找具有影响力的潜在因素或潜变量。它通过减少变量数量来帮助数据解读。因子分析从所有变量中提取最大共同方差,并将其汇总为公共得分。
因子分析广泛应用于市场研究、广告、心理学、金融和运筹学。市场研究人员使用因子分析来识别价格敏感型客户、找出影响消费者选择的品牌特征,并有助于理解分销渠道的选择标准。
因子分析
因子分析是一个线性统计模型。它用于解释观测变量之间的方差,并将一组观测变量压缩为称为“因子”的不可观测变量。观测变量被建模为因子和误差项的线性组合(来源 )。因子或潜变量与多个具有共同响应模式的观测变量相关。每个因子解释观测变量中的特定方差量。它通过减少变量数量来帮助数据解释。
因子分析是一种研究若干感兴趣变量 X1、X2、……、Xl 是否与更少数量的不可观测因子 F1、F2、……、Fk 线性相关的方法。
来源:该图片由我根据因子分析笔记中的一张图片重绘。图片给出了因子分析的整体视图。
基本假设:
数据中没有离群点。
样本量应大于因子数量。
不应存在完全多重共线性。
变量之间不应存在同方差性。
因子分析的类型
探索性因子分析(EFA):这是社会和管理研究者中最流行的因子分析方法。其基本假设是任何观测变量都可以直接与任何因子相关。
验证性因子分析(CFA):其基本假设是每个因子与一组特定的观测变量相关。CFA 用于在基础设定上进行验证。
因子分析如何工作?
因子分析的主要目标是减少观测变量的数量并找到不可观测的变量。这些不可观测变量有助于市场研究人员对调查做出结论。将观测变量转换为不可观测变量可通过两个步骤实现:
因子提取: 此步骤使用方差分解方法(如主成分分析和共同因子分析)选择因子数量和提取方法。
因子旋转: 此步骤尝试将因子转换为不相关的因子——其主要目标是提升整体可解释性。常见的旋转方法包括:Varimax(方差最大化)旋转、Quartimax 旋转和 Promax 旋转。
术语
什么是因子?
因子是描述若干观测变量之间关联的潜在变量。因子数量的最大值等于观测变量的数量。每个因子解释观测变量中的一定方差量。方差最小的因子会被舍弃。因子也称为潜变量、隐藏变量、不可观测变量或假设变量。
什么是因子载荷?
因子载荷是一个矩阵,显示每个变量与潜在因子的关系。它给出观测变量与因子之间的相关系数,反映观测变量所解释的方差。
什么是特征值(Eigenvalues)?
特征值表示各因子从总方差中所解释的方差量,也称为特征根。
什么是共同度(Communalities)?
共同度是每个变量的载荷平方和,表示共同方差。范围为 0–1,越接近 1 表示解释的方差越多。
什么是因子旋转?
旋转是改进因子分析解释性的工具。旋转可以是正交或斜交。它通过更清晰的载荷模式重新分配共同度。
选择因子数量
Kaiser 准则是一种分析方法,基于“解释更大方差比例的因子将被选取”。特征值是确定因子数量的良好依据。一般而言,特征值大于 1 的因子会被选中。
图形法基于因子特征值的可视化表示,也称为碎石图(scree plot)。碎石图帮助我们在曲线出现“肘部”的地方确定因子数量。
来源
因子分析 vs. 主成分分析
PCA 成分解释的是最大方差,而因子分析解释的是数据中的协方差。
PCA 成分彼此完全正交,而因子分析不要求因子正交。
PCA 成分是观测变量的线性组合;而在 FA 中,观测变量是不可观测变量(因子)的线性组合。
PCA 成分通常难以解释;在 FA 中,潜在因子可被命名并具有可解释性。
PCA 属于降维方法,而因子分析是潜变量方法。
PCA 是因子分析的一种。PCA 偏观察性,而 FA 是一种建模技术。
来源
使用 factor_analyzer 包在 Python 中进行因子分析
导入所需库
import pandas as pd
from sklearn. datasets import load_iris
from factor_analyzer import FactorAnalyzer
import matplotlib. pyplot as plt
技术支持
加载数据
让我们对 BFI(基于人格评估项目的数据集)进行因子分析,该数据集使用 6 点量表收集:1 非常不准确,2 较不准确,3 稍微不准确,4 稍微准确,5 较准确,6 非常准确。您也可以通过以下链接下载该数据集:https://vincentarelbundock.github.io/Rdatasets/datasets.html
df= pd. read_csv( "bfi.csv" )
技术支持
预处理数据
df. columns
技术支持
Index ( [ 'A1' , 'A2' , 'A3' , 'A4' , 'A5' , 'C1' , 'C2' , 'C3' , 'C4' , 'C5' , 'E1' , 'E2' ,
'E3' , 'E4' , 'E5' , 'N1' , 'N2' , 'N3' , 'N4' , 'N5' , 'O1' , 'O2' , 'O3' , 'O4' ,
'O5' , 'gender' , 'education' , 'age' ] ,
dtype= 'object' )
技术支持
df. drop( [ 'gender' , 'education' , 'age' ] , axis= 1 , inplace= True )
技术支持
df. dropna( inplace= True )
技术支持
df. info( )
技术支持
< class 'pandas.core.frame.DataFrame' >
Int64Index : 2436 entries, 0 to 2799
Data columns ( total 25 columns) :
A1 2436 non- null float64
A2 2436 non- null float64
A3 2436 non- null float64
A4 2436 non- null float64
A5 2436 non- null float64
C1 2436 non- null float64
C2 2436 non- null float64
C3 2436 non- null float64
C4 2436 non- null float64
C5 2436 non- null float64
E1 2436 non- null float64
E2 2436 non- null float64
E3 2436 non- null float64
E4 2436 non- null float64
E5 2436 non- null float64
N1 2436 non- null float64
N2 2436 non- null float64
N3 2436 non- null float64
N4 2436 non- null float64
N5 2436 non- null float64
O1 2436 non- null float64
O2 2436 non- null int64
O3 2436 non- null float64
O4 2436 non- null float64
O5 2436 non- null float64
dtypes : float64 ( 24 ) , int64 ( 1 )
memory usage: 494.8 KB
技术支持
df. head( )
技术支持
A1 A2 A3 A4 A5 C1 C2 C3 C4 C5 ... N1 N2 N3 N4 N5 O1 O2 O3 O4 O5 0 2.0 4.0 3.0 4.0 4.0 2.0 3.0 3.0 4.0 4.0 ... 3.0 4.0 2.0 2.0 3.0 3.0 6 3.0 4.0 3.0 1 2.0 4.0 5.0 2.0 5.0 5.0 4.0 4.0 3.0 4.0 ... 3.0 3.0 3.0 5.0 5.0 4.0 2 4.0 3.0 3.0 2 5.0 4.0 5.0 4.0 4.0 4.0 5.0 4.0 2.0 5.0 ... 4.0 5.0 4.0 2.0 3.0 4.0 2 5.0 5.0 2.0 3 4.0 4.0 6.0 5.0 5.0 4.0 4.0 3.0 5.0 5.0 ... 2.0 5.0 2.0 4.0 1.0 3.0 3 4.0 3.0 5.0 4 2.0 3.0 3.0 4.0 5.0 4.0 4.0 5.0 3.0 2.0 ... 2.0 3.0 4.0 4.0 3.0 3.0 3 4.0 3.0 3.0
5 行 × 25 列
适用性检验
在执行因子分析之前,您需要评估数据集的“可因子化性”。可因子化性意味着“我们能在数据集中找到因子吗?”。有两种方法来检验因子化或抽样适度:
Bartlett 球形度检验
Kaiser-Meyer-Olkin(KMO)检验
Bartlett 球形度检验 使用观测相关矩阵与单位矩阵进行比较,检查观测变量之间是否存在相互相关性。如果检验结果在统计上不显著,则不应进行因子分析。
from factor_analyzer. factor_analyzer import calculate_bartlett_sphericity
chi_square_value, p_value= calculate_bartlett_sphericity( df)
chi_square_value, p_value
技术支持
( 18146.065577234807 , 0.0 )
技术支持
在此 Bartlett 检验中,p 值为 0。检验在统计上显著,表明观测相关矩阵不是单位矩阵。
Kaiser-Meyer-Olkin(KMO)检验 衡量数据是否适合进行因子分析。它既评估每个观测变量的适度性,也评估完整模型的适度性。KMO 估计所有观测变量之间的方差比例。比例越低越适合进行因子分析。KMO 取值范围为 0 到 1,若小于 0.6 则被认为不适合。
from factor_analyzer. factor_analyzer import calculate_kmo
kmo_all, kmo_model= calculate_kmo( df)
技术支持
kmo_model
技术支持
0.8486452309468382
技术支持
我们数据的整体 KMO 为 0.84,表现非常好。这表明您可以继续进行计划中的因子分析。
选择因子数量
在选择因子数量时,您可以使用 Kaiser 准则和碎石图。两者都基于特征值。
fa = FactorAnalyzer( )
fa. analyze( df, 25 , rotation= None )
ev, v = fa. get_eigenvalues( )
ev
技术支持
Original_Eigenvalues 0 5.134311 1 2.751887 2 2.142702 3 1.852328 4 1.548163 5 1.073582 6 0.839539 7 0.799206 8 0.718989 9 0.688089 10 0.676373 11 0.651800 12 0.623253 13 0.596563 14 0.563091 15 0.543305 16 0.514518 17 0.494503 18 0.482640 19 0.448921 20 0.423366 21 0.400671 22 0.387804 23 0.381857 24 0.262539
这里可以看到,只有 6 个因子的特征值大于 1。这意味着我们只需选择 6 个因子(或不可观测变量)。
plt. scatter( range ( 1 , df. shape[ 1 ] + 1 ) , ev)
plt. plot( range ( 1 , df. shape[ 1 ] + 1 ) , ev)
plt. title( 'Scree Plot' )
plt. xlabel( 'Factors' )
plt. ylabel( 'Eigenvalue' )
plt. grid( )
plt. show( )
技术支持
碎石图方法为每个因子及其特征值绘制折线。特征值大于 1 的数量被视为因子数量。
这里可以看到,只有 6 个因子的特征值大于 1。这意味着我们只需选择 6 个因子(或不可观测变量)。
fa = FactorAnalyzer( )
fa. analyze( df, 6 , rotation= "varimax" )
技术支持
fa. loadings
技术支持
Factor1 Factor2 Factor3 Factor4 Factor5 Factor6 A1 0.040783 0.095220 0.048734 -0.113057 -0.530987 0.161216 A2 0.235538 0.033131 0.133714 0.063734 0.661141 -0.006244 A3 0.343008 -0.009621 0.121353 0.033990 0.605933 0.160106 A4 0.219717 -0.081518 0.235140 -0.125338 0.404594 0.086356 A5 0.414458 -0.149616 0.106382 0.030977 0.469698 0.236519 C1 0.077248 -0.004358 0.554582 0.190124 0.007511 0.095035 C2 0.038370 0.068330 0.674545 0.087593 0.057055 0.152775 C3 0.031867 -0.039994 0.551164 -0.011338 0.101282 0.008996 C4 -0.066241 0.216283 -0.638475 -0.143846 -0.102617 0.318359 C5 -0.180812 0.284187 -0.544838 0.025837 -0.059955 0.132423 E1 -0.590451 0.022280 0.053915 -0.071205 -0.130851 0.156583 E2 -0.684578 0.233624 -0.088497 -0.045561 -0.116716 0.115065 E3 0.556774 -0.000895 0.103390 0.241180 0.179396 0.267291 E4 0.658395 -0.136788 0.113798 -0.107808 0.241143 0.158513 E5 0.507535 0.034490 0.309813 0.200821 0.078804 0.008747 N1 0.068011 0.805806 -0.051264 -0.074977 -0.174849 -0.096266 N2 0.022958 0.789832 -0.037477 0.006726 -0.141134 -0.139823 N3 -0.065687 0.725081 -0.059039 -0.010664 -0.019184 0.062495 N4 -0.345072 0.578319 -0.162174 0.062916 0.000403 0.147551 N5 -0.161675 0.523097 -0.025305 -0.161892 0.090125 0.120049 O1 0.225339 -0.020004 0.133201 0.479477 0.005178 0.218690 O2 -0.001982 0.156230 -0.086047 -0.496640 0.043989 0.134693 O3 0.325954 0.011851 0.093880 0.566128 0.076642 0.210777 O4 -0.177746 0.207281 -0.005671 0.349227 0.133656 0.178068 O5 -0.014221 0.063234 -0.047059 -0.576743 -0.057561 0.135936
因子 1 对 E1、E2、E3、E4 和 E5 的载荷较高(外向性)
因子 2 对 N1、N2、N3、N4 和 N5 的载荷较高(神经质)
因子 3 对 C1、C2、C3、C4 和 C5 的载荷较高(尽责性)
因子 4 对 O1、O2、O3、O4 和 O5 的载荷较高(开放性)
因子 5 对 A1、A2、A3、A4 和 A5 的载荷较高(宜人性)
因子 6 在任何变量上都没有较高载荷,且不易解释。若仅取五个因子会更好。
让我们对 5 个因子执行因子分析。
fa = FactorAnalyzer( )
fa. analyze( df, 5 , rotation= "varimax" )
fa. loadings
技术支持
Factor1 Factor2 Factor3 Factor4 Factor5 A1 0.040465 0.111126 0.022798 -0.077931 -0.428166 A2 0.213716 0.029588 0.139037 0.062139 0.626946 A3 0.317848 0.009357 0.109331 0.056196 0.650743 A4 0.204566 -0.066476 0.230584 -0.112700 0.435624 A5 0.393034 -0.122113 0.087869 0.066708 0.537087 C1 0.070184 0.010416 0.545824 0.209584 0.038878 C2 0.033270 0.089574 0.648731 0.115434 0.102782 C3 0.023907 -0.030855 0.557036 -0.005183 0.111578 C4 -0.064984 0.240410 -0.633806 -0.107535 -0.037498 C5 -0.176395 0.290318 -0.562467 0.036822 -0.047525 E1 -0.574835 0.042819 0.033144 -0.058795 -0.104813 E2 -0.678731 0.244743 -0.102483 -0.042010 -0.112517 E3 0.536816 0.024180 0.083010 0.280877 0.257906 E4 0.646833 -0.115614 0.102023 -0.073422 0.306101 E5 0.504069 0.036145 0.312899 0.213739 0.090354 N1 0.078923 0.786807 -0.045997 -0.084704 -0.216363 N2 0.027301 0.754109 -0.030568 -0.010304 -0.193744 N3 -0.061430 0.731721 -0.067084 -0.004217 -0.027712 N4 -0.345388 0.590602 -0.178902 0.075225 0.005886 N5 -0.161291 0.537858 -0.037309 -0.149769 0.100931 O1 0.213005 -0.002224 0.115080 0.504907 0.061550 O2 0.004560 0.175788 -0.099729 -0.468925 0.081809 O3 0.310956 0.026736 0.076873 0.596007 0.126889 O4 -0.191196 0.220582 -0.021906 0.369012 0.155475 O5 -0.005347 0.085401 -0.062730 -0.533778 -0.010384
fa. get_factor_variance( )
技术支持
Factor1 Factor2 Factor3 Factor4 Factor5 SS Loadings 2.473090 2.709633 2.041106 1.522153 1.844498 Proportion Var 0.098924 0.108385 0.081644 0.060886 0.073780 Cumulative Var 0.098924 0.207309 0.288953 0.349839 0.423619
5 个因子累计解释了总方差的 42%。
因子分析的优缺点
因子分析可探索大型数据集并发现相互关联的关系。它将观测变量归纳为少数不可观测变量,或识别相互关联变量的分组,帮助市场研究人员简化市场情境,并找出消费者口味、偏好与文化影响之间的隐藏关系。同时,它也有助于改进未来调查问卷。因子使数据解释更为自然。
因子分析的结果可能存在争议。其解释具有可辩性,因为同一组数据因子可能有不止一种解释。在识别因子并命名之后,仍需要相关领域知识。
结论
恭喜您读到本教程的最后!
在本教程中,您学习了什么是因子分析、因子分析的不同类型、因子分析如何工作、因子分析的基本术语、如何选择因子数量、主成分分析 与因子分析的比较、如何在 Python 中使用 FactorAnalyzer 包实现因子分析,以及因子分析的优缺点。
期待您的反馈或问题。您可以留言提问,我会尽力回答。
如果您想进一步学习 Python 中的因子分析,请参加 DataCamp 的《Python 无监督学习》 课程。
因子分析(FA)是一种探索性数据分析方法,用于从一组观测变量中寻找具有影响力的潜在因素或潜变量。它通过减少变量数量来帮助数据解读。因子分析从所有变量中提取最大共同方差,并将其汇总为公共得分。
因子分析广泛应用于市场研究、广告、心理学、金融和运筹学。市场研究人员使用因子分析来识别价格敏感型客户、找出影响消费者选择的品牌特征,并有助于理解分销渠道的选择标准。
因子分析
因子分析是一个线性统计模型。它用于解释观测变量之间的方差,并将一组观测变量压缩为称为“因子”的不可观测变量。观测变量被建模为因子和误差项的线性组合(来源)。因子或潜变量与多个具有共同响应模式的观测变量相关。每个因子解释观测变量中的特定方差量。它通过减少变量数量来帮助数据解释。
因子分析是一种研究若干感兴趣变量 X1、X2、……、Xl 是否与更少数量的不可观测因子 F1、F2、……、Fk 线性相关的方法。
来源:该图片由我根据因子分析笔记中的一张图片重绘。图片给出了因子分析的整体视图。
基本假设:
因子分析的类型
因子分析如何工作?
因子分析的主要目标是减少观测变量的数量并找到不可观测的变量。这些不可观测变量有助于市场研究人员对调查做出结论。将观测变量转换为不可观测变量可通过两个步骤实现:
术语
什么是因子?
因子是描述若干观测变量之间关联的潜在变量。因子数量的最大值等于观测变量的数量。每个因子解释观测变量中的一定方差量。方差最小的因子会被舍弃。因子也称为潜变量、隐藏变量、不可观测变量或假设变量。
什么是因子载荷?
因子载荷是一个矩阵,显示每个变量与潜在因子的关系。它给出观测变量与因子之间的相关系数,反映观测变量所解释的方差。
什么是特征值(Eigenvalues)?
特征值表示各因子从总方差中所解释的方差量,也称为特征根。
什么是共同度(Communalities)?
共同度是每个变量的载荷平方和,表示共同方差。范围为 0–1,越接近 1 表示解释的方差越多。
什么是因子旋转?
旋转是改进因子分析解释性的工具。旋转可以是正交或斜交。它通过更清晰的载荷模式重新分配共同度。
选择因子数量
Kaiser 准则是一种分析方法,基于“解释更大方差比例的因子将被选取”。特征值是确定因子数量的良好依据。一般而言,特征值大于 1 的因子会被选中。
图形法基于因子特征值的可视化表示,也称为碎石图(scree plot)。碎石图帮助我们在曲线出现“肘部”的地方确定因子数量。
来源
因子分析 vs. 主成分分析
来源
使用 factor_analyzer 包在 Python 中进行因子分析
导入所需库
加载数据
让我们对 BFI(基于人格评估项目的数据集)进行因子分析,该数据集使用 6 点量表收集:1 非常不准确,2 较不准确,3 稍微不准确,4 稍微准确,5 较准确,6 非常准确。您也可以通过以下链接下载该数据集:https://vincentarelbundock.github.io/Rdatasets/datasets.html
预处理数据
5 行 × 25 列
适用性检验
在执行因子分析之前,您需要评估数据集的“可因子化性”。可因子化性意味着“我们能在数据集中找到因子吗?”。有两种方法来检验因子化或抽样适度:
Bartlett 球形度检验使用观测相关矩阵与单位矩阵进行比较,检查观测变量之间是否存在相互相关性。如果检验结果在统计上不显著,则不应进行因子分析。
在此 Bartlett 检验中,p 值为 0。检验在统计上显著,表明观测相关矩阵不是单位矩阵。
Kaiser-Meyer-Olkin(KMO)检验衡量数据是否适合进行因子分析。它既评估每个观测变量的适度性,也评估完整模型的适度性。KMO 估计所有观测变量之间的方差比例。比例越低越适合进行因子分析。KMO 取值范围为 0 到 1,若小于 0.6 则被认为不适合。
我们数据的整体 KMO 为 0.84,表现非常好。这表明您可以继续进行计划中的因子分析。
选择因子数量
在选择因子数量时,您可以使用 Kaiser 准则和碎石图。两者都基于特征值。
这里可以看到,只有 6 个因子的特征值大于 1。这意味着我们只需选择 6 个因子(或不可观测变量)。
碎石图方法为每个因子及其特征值绘制折线。特征值大于 1 的数量被视为因子数量。
这里可以看到,只有 6 个因子的特征值大于 1。这意味着我们只需选择 6 个因子(或不可观测变量)。
执行因子分析
让我们对 5 个因子执行因子分析。
5 个因子累计解释了总方差的 42%。
因子分析的优缺点
因子分析可探索大型数据集并发现相互关联的关系。它将观测变量归纳为少数不可观测变量,或识别相互关联变量的分组,帮助市场研究人员简化市场情境,并找出消费者口味、偏好与文化影响之间的隐藏关系。同时,它也有助于改进未来调查问卷。因子使数据解释更为自然。
因子分析的结果可能存在争议。其解释具有可辩性,因为同一组数据因子可能有不止一种解释。在识别因子并命名之后,仍需要相关领域知识。
结论
恭喜您读到本教程的最后!
在本教程中,您学习了什么是因子分析、因子分析的不同类型、因子分析如何工作、因子分析的基本术语、如何选择因子数量、主成分分析与因子分析的比较、如何在 Python 中使用 FactorAnalyzer 包实现因子分析,以及因子分析的优缺点。
期待您的反馈或问题。您可以留言提问,我会尽力回答。
如果您想进一步学习 Python 中的因子分析,请参加 DataCamp 的《Python 无监督学习》课程。