因子分析 (FA) 是一种探索性数据分析方法,用于从一组观测变量中搜索有影响力的基础因子或潜在变量。它通过减少变量的数量来帮助数据解释。它从所有变量中提取最大公共方差,并将它们放入一个公共分数中。
因子分析广泛用于市场研究,广告,心理学,金融和运筹学。市场研究人员使用因素分析来识别对价格敏感的客户,识别影响消费者选择的品牌特征,并帮助了解分销渠道的渠道选择标准。
在本教程中,您将介绍以下主题:
- 因子分析
- 因子分析的类型
- 确定因素数
- 因子分析与主成分分析
- Python 中的因子分析
- 充分性测试
- 解释结果
- 因子分析的优缺点
- 结论
因子分析
因子分析是一种线性统计模型。它用于解释观测变量之间的方差,并将一组观测变量浓缩为称为因子的未观测变量。观测变量建模为因子和误差项(源)的线性组合。因子或潜在变量与多个观测到的变量相关联,这些变量具有共同的响应模式。每个因子解释观测变量中特定量的方差。它通过减少变量的数量来帮助数据解释。
因子分析是一种用于调查感兴趣的变量 X1、X2,......., Xl 是否与较少数量的不可观测因子 F1、F2 呈线性关系的方法,........, Fk.
来源:此图像是根据我在因子分析注释中找到的图像重新创建的。该图像提供了因子分析的完整视图。
假设:
- 数据中没有异常值。
- 样本数量应大于因子。
- 不应该有完美的多重共线性。
- 变量之间不应存在同质性。
因子分析的类型
- 探索性因素分析:它是社会和管理研究人员中最受欢迎的因素分析方法。它的基本假设是,任何观测到的变量都与任何因子直接相关。
- 验证性因素分析(CFA):其基本假设是每个因素都与一组特定的观测变量相关联。CFA确认了基本面上的预期。
因子分析如何工作?
因子分析的主要目的是减少观测变量的数量并找到不可观测的变量。这些未观察到的变量有助于市场研究人员完成调查。观测变量到未观测变量的这种转换可以通过两个步骤实现:
- 因子提取:在该步骤中,使用方差划分方法选择的因子数量和方法进行提取,例如主成分分析和公共因子分析。
- 因子旋转:在此步骤中,旋转尝试将因子转换为不相关的因子 - 此步骤的主要目标是提高整体可解释性。有许多旋转方法可用,例如:Varimax旋转方法,Quartimax旋转方法和Promax旋转方法。
术语
什么是因素?
因子是描述观测变量数量之间关联的潜在变量。最大因子数等于观测变量数。每个因子都解释了观测变量中的特定方差。方差量最低的因子被丢弃。因子也称为潜在变量或隐藏变量或未观测变量或假设变量。
什么是因子载荷?
因子加载是一个矩阵,它显示每个变量与基础因子的关系。它显示了观测变量和因子的相关系数。它显示了由观测变量解释的方差。
什么是特征值?
特征值表示从总方差中解释每个因子的方差。它也被称为特征根。
什么是社区?
共性是每个变量的平方载荷之和。它表示公共方差。它的范围从 0-1,接近 1 的值表示更多的方差。
什么是因子旋转?
旋转是更好地解释因子分析的工具。旋转可以是正交的,也可以是倾斜的。它以清晰的加载模式重新分布了共性。
选择因素数量
凯撒准则是一种分析方法,它基于由因子解释的较大比例的方差将被选中。特征值是确定因子数的良好标准。通常,大于 1 的特征值将被视为要素的选择标准。
图形方法基于因子特征值(也称为碎石图)的可视化表示。此碎石图有助于我们确定曲线构成肘部的因素数量。
因子分析与主成分分析
- PCA 分量解释最大方差量,而因子分析解释数据中的协方差。
- PCA 分量彼此完全正交,而因子分析则不要求因子正交。
- PCA分量是观测变量的线性组合,而在FA中,观测变量是未观测变量或因子的线性组合。
- PCA 组件是不可解释的。在 FA 中,基础因素是可标记和可解释的。
- PCA是一种降维方法,而因子分析是潜变量方法。
- PCA是一种因子分析。PCA是观察性的,而FA是一种建模技术。
使用factor_analyzer包的python中的因子分析
导入所需的库
# Import required libraries
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')
# Dropping unnecessary columns
df.drop(['gender', 'education', 'age'],axis=1,inplace=True)
# Dropping missing values rows
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()
答1 | 答2 | 解答3 | 答4 | 解答5 | C1 | 二、低温 | C3型 | C4型 | C5型 | ... | N1 | N2 | N3 | N4型 | N5型 | O1型 | 氧气 | 氧气 | 氧气 | 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 |