一、因子分析
序言
因子分析是一种统计方法,用于探索观察变量之间的潜在关系。它旨在确定观察变量之间的共同变异,并将它们归因于较少数量的未观察到的变量,称为因子。因子分析假设观察到的变量是由一组潜在的因子所决定的,这些因子无法直接观察到,但可以通过观察到的变量的变异来推断。 通过因子分析,可以将大量的变量简化成较少数量的因子,从而更好地理解数据集中的结构和模式。这种方法通常用于数据降维、变量选择、探索数据结构、构建指标等领域。
定义
假设存在很多变量,因子分析即找出几个关键的未观察到的变量(即因子,它们之间存在某种相关性),这些因子可以解释大部分的观察变量之间的相关性。进而帮助我们理解众多表面现象背后可能隐藏的几个共同的影响因素
步骤&原理
基本模型可用以下表示公式:x=Λf+ϵ
其中 是观察变量的向量,Λ 是因子载荷矩阵(它描述了每个观察变量和每个因子之间的关系),f 是潜在因子的向量,而 ϵ 是特定于每个观察变量的误差项。
1、计算相关性系数矩阵
其中:
是第 ( i ) 个变量和第 ( j ) 个变量之间的相关系数
是第 ( i ) 个变量 ( X_i ) 和第 ( j ) 个变量 ( X_j ) 的协方差
和
分别是第 ( i ) 个变量 ( X_i ) 和第 ( j ) 个变量 ( X_j ) 的标准差
2、进行特征值和特征向量的计算
求解 ∣R−λI∣=0,其中 ∣R−λI∣ 为行列式, I 是单位矩阵, λ 是特征值
3、估计因子载荷矩阵和特定因子的方差
-
因子载荷矩阵估计:
因子载荷矩阵 ( \Lambda ) 用于表示观察变量与潜在因子之间的线性关系。通常,因子载荷估计是通过最大似然估计或最小残差方法来进行的。在最大似然估计中,通过最大化样本协方差矩阵的似然函数来估计因子载荷。在最小残差方法中,通过最小化观察变量与估计的潜在因子之间的残差平方和来估计因子载荷。
-
特定因子的方差估计:
特定因子的方差表示该因子解释了多少观察变量的方差。特定因子的方差通常通过以下方式之一来估计:
-
常量因子模型:假设所有因子的方差相等,并且等于1。在这种情况下,特定因子的方差就是因子的共同方差。
-
自由因子模型:允许每个因子的方差独立估计。特定因子的方差等于其载荷平方和。这种模型更灵活,但通常需要更多的参数。
-
标准化因子模型:将因子方差固定为特定值(通常为1),并调整因子载荷以确保每个因子的方差等于该值
-
4、选择 λ>1的因子
5、因子旋转
-
正交旋转:
- 矩阵旋转:如变最大方差旋转(Varimax)和最小残差旋转(Quartimax)等。这些方法旋转后的因子是正交的,即彼此之间不相关。
- 直角旋转:如Procrustes旋转等,保持因子间的直角关系。
-
斜交旋转:
- 斜交旋转:如斜交Varimax旋转等。这些方法旋转后的因子可能是相关的,但它们更具有解释性。
旋转的目标是使得因子载荷矩阵具有更简单的结构,即每个变量更加倾向于与一个或少数几个因子相关联,而不是与所有因子相关联。这有助于解释潜在因子所代表的含义。
6、因子载荷解释
-
理解因子载荷矩阵:查看因子载荷矩阵,该矩阵显示了每个观察变量与每个潜在因子之间的载荷值。通常,载荷值的范围在 -1 到 1 之间,值越接近 1 表示变量与因子之间的正相关性越强,值越接近 -1 表示变量与因子之间的负相关性越强,而值接近 0 则表示变量与因子之间的相关性较弱。
-
识别高载荷值:在因子载荷矩阵中,寻找与某个因子相关性较高的观察变量,通常会关注载荷值绝对值大于 0.3 或 0.4 的观察变量,因为这些变量可能与该因子有较强的关联。
-
解释载荷模式:分析载荷模式有助于理解因子所代表的含义。例如,如果一个因子上有多个变量的载荷值较高,这些变量可能共同反映了一个概念或特征。通过观察这些载荷模式,可以尝试为每个因子命名或解释其含义。
-
考虑交叉载荷:除了查看单个因子上的载荷之外,还要考虑变量在多个因子上的载荷情况。如果某个变量在多个因子上都有较高的载荷值,可能表明该变量不够明确,或者存在多个潜在因子共同影响它。
简易代码
python
import pandas as pd
from factor_analyzer import FactorAnalyzer
import matplotlib.pyplot as plt
data = pd.read_csv('data.csv')
# 创建因子分析对象,指定因子个数
fa = FactorAnalyzer(n_factors=3, rotation='varimax')
# 拟合数据
fa.fit(data)
# 获取因子载荷
loadings = fa.loadings_
# 打印因子载荷矩阵
print("Factor Loadings:\n", loadings)
# 绘制因子载荷图
plt.figure(figsize=(8, 6))
plt.title('Factor Loadings')
plt.xlabel('Variables')
plt.ylabel('Loadings')
plt.xticks(range(len(data.columns)), data.columns)
plt.bar(range(len(data.columns)), loadings.T)
plt.grid(True)
plt.show()
代码解释:
拟现有若干条数据,其中包含若干个特征,通过规定n_factors=3设置要提取的因子数为3,随后进行拟合数据与获取因子载荷,最后可视化展示获取的三个因子的载荷图。
FactorAnalyzer中的超参数
-
n_factors:要提取的因子数量。这指定了要拟合的潜在因子的数量
-
rotation:因子旋转方法。可选的旋转方法包括 varimax、promax、quartimax、和 oblimin 等。默认是 'promax'
-
method:拟合因子分析模型时使用的方法。可选的方法包括 'minres'、'ml'(最大似然法)、'principal' 和 'uls'(最小残差法)等。默认是 'minres'
-
is_corr_matrix:指示输入数据是否为相关矩阵。如果为 True,则假设输入数据是相关矩阵,而不是原始数据。默认是 False。
二、层次分析法(AHP)
序言
AHP(Analytic Hierarchy Process,层次分析法)是一种常用的多指标决策方法,适用于同时存在定性分析 与定量分析的问题。它通过将复杂问题分解为不同层次,并对各指标进行两两比较,从而确定各因素的相对重要性,最终得到综合评价结果。
AHP特别适合用于方案选择、综合评价、权重确定等场景,在数学建模中的评价与决策类问题中应用十分广泛。
定义
层次分析法是将决策问题划分为若干层次,一般包括:
-
目标层:最终要解决的问题
-
准则层:影响目标的主要因素
-
方案层:可供选择的方案
其核心思想是:通过构造判断矩阵,比较各因素之间的重要程度,再计算得到每个因素的权重,并进行一致性检验,以保证判断结果具有合理性。
步骤&原理
1、建立层次结构模型
首先将问题分为多个层次。典型结构如下:
-
目标层:选择最优方案
-
准则层:若干评价指标
-
方案层:候选方案
这种分层方式能够将复杂问题条理化,便于后续分析。
2、构造判断矩阵
对于同一层中各因素,相对于上一层某一因素的重要性进行两两比较,构造判断矩阵:
其中:
-
表示因素 i 相对于因素 j 的重要程度
-
当
时,表示 i 比 j 更重要
-
-
通常采用 1~9 标度法:
-
1:同等重要
-
3:略微重要
-
5:明显重要
-
7:强烈重要
-
9:极端重要
-
2、4、6、8:中间值
判断矩阵建立后,需要计算各指标的权重。常用方法有特征向量法、几何平均法等。
设权重向量为:
并满足:
其中 λmax 为判断矩阵的最大特征值。
将权重向量归一化后,即可得到各指标的相对权重。
4、一致性检验
由于判断矩阵来自人为比较,可能存在前后不一致的问题,因此需要进行一致性检验。
先计算一致性指标:
再计算一致性比率:
其中:
-
n 为矩阵阶数
-
RI 为随机一致性指标
一般认为:
时,判断矩阵具有满意的一致性;否则应适当调整判断矩阵。
5、综合排序
当各层权重确定后,可以逐层合成,最终得到方案层对目标层的综合权重,并据此进行排序,选出最优方案。
AHP的特点
-
结构清晰:能够把复杂问题分层表示,逻辑性强。
-
定性与定量结合:既可以体现专家经验,也可以给出数值化结果。
-
适用范围广:适用于评价、排序、决策、优选等多种问题。
-
主观性较强:判断矩阵依赖人工打分,因此结果会受到主观判断影响。
python
import numpy as np
# 构造判断矩阵
A = np.array([
[1, 3, 5],
[1/3, 1, 2],
[1/5, 1/2, 1]
])
# 计算特征值和特征向量
eigvals, eigvecs = np.linalg.eig(A)
# 找到最大特征值对应的特征向量
max_index = np.argmax(eigvals.real)
max_eigval = eigvals[max_index].real
weights = eigvecs[:, max_index].real
# 归一化权重
weights = weights / weights.sum()
# 一致性检验
n = A.shape[0]
CI = (max_eigval - n) / (n - 1)
# 3阶矩阵的 RI 值通常取 0.58
RI = 0.58
CR = CI / RI
print("最大特征值 λ_max =", round(max_eigval, 4))
print("权重向量 W =", np.round(weights, 4))
print("CI =", round(CI, 4))
print("CR =", round(CR, 4))
if CR < 0.1:
print("判断矩阵一致性可以接受")
else:
print("判断矩阵一致性较差,建议调整")
代码解释:
假设有 3 个评价指标,先构造它们的判断矩阵,然后通过特征值法求出各指标权重,并进一步进行一致性检验。若 CR<0.1,则说明该判断矩阵具有较好的合理性,可以用于后续决策分析。
常见应用场景
-
方案优选问题
-
综合评价问题
-
指标权重确定问题
-
风险评估与决策分析问题
三、TOPSIS法
序言
TOPSIS(Technique for Order Preference by Similarity to Ideal Solution,逼近理想解排序法)是一种常见的多指标综合评价方法。它的基本思想是:评价对象越接近最优解、越远离最劣解,则该对象越优。
TOPSIS法计算过程清晰、结果直观,在数学建模中的方案排序、综合评价、优选决策等问题中应用非常广泛。
定义
TOPSIS法通过对多个评价对象在多个指标上的表现进行分析,构造出:
-
正理想解:各指标都达到最优的虚拟方案
-
负理想解:各指标都达到最差的虚拟方案
然后分别计算每个评价对象与正理想解、负理想解之间的距离,并根据相对接近程度进行排序。
步骤&原理
1、构造原始评价矩阵
设有 n 个评价对象,m 个评价指标,则原始数据矩阵为:
其中:
- xij 表示第 i 个评价对象在第 j 个指标上的取值
2、对指标进行正向化与标准化
由于不同指标的量纲和性质可能不同,需要先进行正向化处理,再标准化。
常用向量标准化公式为:
标准化后得到规范化矩阵:
3、确定正理想解与负理想解
对每个指标,取最优值组成正理想解,取最差值组成负理想解:
其中:
对于效益型指标:
4、计算与正负理想解的距离
设第 i 个评价对象到正理想解的距离为 ,到负理想解的距离为
,则:
5、计算综合得分并排序
定义第 i 个评价对象的相对接近度为:
其中:
-
0≤Ci≤1
-
Ci 越大,说明该评价对象越接近正理想解,综合表现越好
据此即可对各对象进行排序。
TOPSIS法的特点
-
思路直观:通过"接近最优、远离最劣"来评价方案优劣。
-
适用性强:适合多指标综合评价和排序问题。
-
计算简洁:实现过程清晰,便于编程。
-
依赖指标处理方式:标准化方法和权重设置会影响最终结果。
python
import numpy as np
# 3个方案,3个指标
X = np.array([
[80, 70, 90],
[85, 65, 88],
[78, 82, 85]
], dtype=float)
# 标准化
Z = X / np.sqrt((X ** 2).sum(axis=0))
# 确定正理想解和负理想解
Z_plus = Z.max(axis=0)
Z_minus = Z.min(axis=0)
# 计算距离
D_plus = np.sqrt(((Z - Z_plus) ** 2).sum(axis=1))
D_minus = np.sqrt(((Z - Z_minus) ** 2).sum(axis=1))
# 计算接近度
C = D_minus / (D_plus + D_minus)
print("各方案接近度:", np.round(C, 4))
print("排序结果(从优到劣):", np.argsort(-C) + 1)
代码解释:
假设有 3 个方案、3 个评价指标,先对数据进行标准化,再求出正理想解和负理想解,接着计算每个方案与理想解的距离,最后通过接近度 Ci 进行排序,接近度越大说明方案越优。
常见应用场景
-
综合评价问题
-
多方案优选问题
-
城市竞争力评价
-
企业绩效评价
四、熵权法
序言
熵权法是一种常用的客观赋权方法。它利用指标数据本身的离散程度来确定权重,避免了人为主观赋权带来的偏差。
在评价与决策类模型中,熵权法常与 TOPSIS、灰色关联分析等方法结合使用,用于确定各评价指标的客观权重。
定义
熵权法的核心思想是:如果某个指标在不同评价对象之间差异越大,说明该指标提供的信息越多,其权重应越大;反之,如果某指标取值差异很小,则说明其区分能力较弱,权重应越小。
因此,熵权法通过计算各指标的信息熵来反映其有效信息量,并进一步确定指标权重。
步骤&原理
1、构造原始数据矩阵
设有 n 个评价对象,m 个评价指标,原始矩阵为:
其中:
表示第 i 个对象在第 j 个指标上的取值
2、数据标准化
由于各指标量纲不同,需要先将数据进行标准化处理。
对于正向指标,常用极差标准化公式为:
若出现 zij=0 的情况,通常可做微小平移处理,以避免后续取对数时出现问题。
3、计算指标比重
将标准化后的数据转化为各指标下的比重:
其中:
- pij 表示第 i 个对象在第 j 个指标下的比重
4、计算信息熵
第 j 个指标的信息熵为:
因此 ej 的取值范围通常在 0 到 1 之间。
5、计算差异系数
定义第 j 个指标的差异系数为:
6、计算权重
将差异系数归一化,得到各指标权重:
其中:
-
wj 为第 j 个指标的权重
-
且满足:
熵权法的特点
-
客观性较强:权重由数据本身决定,减少人为主观影响。
-
适合指标赋权:尤其适用于多指标评价问题中的权重确定。
-
计算简单:步骤规范,易于实现。
-
对数据较敏感:若样本数据异常或差异不明显,可能影响赋权结果。
python
import numpy as np
# 3个方案,3个指标
X = np.array([
[80, 70, 90],
[85, 65, 88],
[78, 82, 85]
], dtype=float)
# 极差标准化
Z = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
# 防止出现 log(0)
Z = Z + 1e-12
# 计算比重
P = Z / Z.sum(axis=0)
# 计算熵值
n = X.shape[0]
k = 1 / np.log(n)
E = -k * np.sum(P * np.log(P), axis=0)
# 计算差异系数和权重
D = 1 - E
W = D / D.sum()
print("各指标熵值:", np.round(E, 4))
print("各指标权重:", np.round(W, 4))
代码解释:
假设有 3 个方案、3 个评价指标,先对原始数据做极差标准化,再计算各指标在不同方案下的比重,进一步求出信息熵、差异系数和最终权重。权重越大,表示该指标在区分方案优劣时所起的作用越明显。
常见应用场景
-
指标客观赋权问题
-
综合评价模型中的权重确定
-
与 TOPSIS 结合的综合评价问题
-
经济、管理、工程类评价分析问题