【数学建模】权重生成与评价模型(下)
权重生成与评价模型(下)
5. 模糊综合评价法
模糊综合评价法(Fuzzy Comprehensive Evaluation Method)是一种基于模糊数学的评价方法,常用于处理复杂系统中的模糊性、不确定性和多因素综合评价问题。它通过构建模糊矩阵和隶属度函数,将主观判断转化为数学模型,从而实现对评价对象的全面、客观评价。
5.1 模糊综合分析法的原理
模糊综合分析法的基本原理包括以下几个步骤:
-
确定评价指标体系:根据评价对象的特点,选取若干个评价指标构成评价指标体系。每个指标反映评价对象的某个方面。
-
确定权重:对各评价指标进行权重分配,权重反映了各指标在综合评价中的重要程度。权重可以通过专家打分、AHP(层次分析法)等方法确定。
-
确定隶属度函数:构建各评价指标的隶属度函数,将评价对象的定量或定性数据转换为隶属度。隶属度函数的选择和确定是模糊综合评价中的关键步骤。
-
构建评价矩阵:根据评价对象在各指标上的表现,利用隶属度函数计算隶属度,构建模糊评价矩阵。评价矩阵的元素通常是评价对象在各指标上的隶属度。
-
计算综合评价结果:将评价矩阵与权重向量进行运算,得到评价对象的综合评价结果。常用的运算方法包括加权平均法和模糊运算法。
具体步骤如下:
-
确定评价因素集 U U U 和评价等级集 V V V:
- 评价因素集 U = { u 1 , u 2 , … , u n } U = \{u_1, u_2, \ldots, u_n\} U={u1,u2,…,un}
- 评价等级集 V = { v 1 , v 2 , … , v m } V = \{v_1, v_2, \ldots, v_m\} V={v1,v2,…,vm}
-
确定权重向量 W W W:
- 权重向量 W = ( w 1 , w 2 , … , w n ) W = (w_1, w_2, \ldots, w_n) W=(w1,w2,…,wn),且 ∑ i = 1 n w i = 1 \sum_{i=1}^{n} w_i = 1 ∑i=1nwi=1
-
确定隶属度函数:
- 隶属度函数用于将定量或定性的评价指标数据转化为隶属度值。常见的隶属度函数有三角隶属度函数、梯形隶属度函数和高斯隶属度函数等。
例如,对于价格指标 u 1 u_1 u1,假设评价等级为“优”、“良”、“中”、“差”,可以采用以下三角隶属度函数:
μ 优 ( x ) = { 1 , if x ≤ a 1 b 1 − x b 1 − a 1 , if a 1 < x ≤ b 1 0 , if x > b 1 \mu_{\text{优}}(x) = \begin{cases} 1, & \text{if } x \leq a_1 \\ \frac{b_1 - x}{b_1 - a_1}, & \text{if } a_1 < x \leq b_1 \\ 0, & \text{if } x > b_1 \end{cases} μ优(x)=⎩ ⎨ ⎧1,b1−a1b1−x,0,if x≤a1if a1<x≤b1if x>b1
μ 良 ( x ) = { 0 , if x ≤ a 2 x − a 2 b 2 − a 2 , if a 2 < x ≤ b 2 c 2 − x c 2 − b 2 , if b 2 < x ≤ c 2 0 , if x > c 2 \mu_{\text{良}}(x) = \begin{cases} 0, & \text{if } x \leq a_2 \\ \frac{x - a_2}{b_2 - a_2}, & \text{if } a_2 < x \leq b_2 \\ \frac{c_2 - x}{c_2 - b_2}, & \text{if } b_2 < x \leq c_2 \\ 0, & \text{if } x > c_2 \end{cases} μ良(x)=⎩ ⎨ ⎧0,b2−a2x−a2,c2−b2c2−x,0,if x≤a2if a2<x≤b2if b2<x≤c2if x>c2
μ 中 ( x ) = { 0 , if x ≤ a 3 x − a 3 b 3 − a 3 , if a 3 < x ≤ b 3 c 3 − x c 3 − b 3 , if b 3 < x ≤ c 3 0 , if x > c 3 \mu_{\text{中}}(x) = \begin{cases} 0, & \text{if } x \leq a_3 \\ \frac{x - a_3}{b_3 - a_3}, & \text{if } a_3 < x \leq b_3 \\ \frac{c_3 - x}{c_3 - b_3}, & \text{if } b_3 < x \leq c_3 \\ 0, & \text{if } x > c_3 \end{cases} μ中(x)=⎩ ⎨ ⎧0,b3−a3x−a3,c3−b3c3−x,0,if x≤a3if a3<x≤b3if b3<x≤c3if x>c3
μ 差 ( x ) = { 0 , if x ≤ a 4 x − a 4 b 4 − a 4 , if a 4 < x ≤ b 4 1 , if x > b 4 \mu_{\text{差}}(x) = \begin{cases} 0, & \text{if } x \leq a_4 \\ \frac{x - a_4}{b_4 - a_4}, & \text{if } a_4 < x \leq b_4 \\ 1, & \text{if } x > b_4 \end{cases} μ差(x)=⎩ ⎨ ⎧0,b4−a4x−a4,1,if x≤a4if a4<x≤b4if x>b4 -
构建模糊评价矩阵 R R R:
- 模糊评价矩阵
R
R
R 的元素
r
i
j
r_{ij}
rij 表示因素
u
i
u_i
ui 对应于等级
v
j
v_j
vj 的隶属度,矩阵形式为:
R = ( r 11 r 12 ⋯ r 1 m r 21 r 22 ⋯ r 2 m ⋮ ⋮ ⋱ ⋮ r n 1 r n 2 ⋯ r n m ) R = \begin{pmatrix} r_{11} & r_{12} & \cdots & r_{1m} \\ r_{21} & r_{22} & \cdots & r_{2m} \\ \vdots & \vdots & \ddots & \vdots \\ r_{n1} & r_{n2} & \cdots & r_{nm} \end{pmatrix} R= r11r21⋮rn1r12r22⋮rn2⋯⋯⋱⋯r1mr2m⋮rnm
- 模糊评价矩阵
R
R
R 的元素
r
i
j
r_{ij}
rij 表示因素
u
i
u_i
ui 对应于等级
v
j
v_j
vj 的隶属度,矩阵形式为:
-
进行模糊综合运算:
- 综合评价结果向量
B
B
B:
B = W ⋅ R B = W \cdot R B=W⋅R
- 综合评价结果向量
B
B
B:
5.2 模糊综合分析法的案例
下面是一个模糊综合评价法的实际应用案例:假设我们需要对三个方案 A 1 , A 2 , A 3 A_1, A_2, A_3 A1,A2,A3 进行评价,评价因素集 U U U 包括价格、质量、售后服务三个指标,评价等级集 V V V 包括“优”、“良”、“中”、“差”四个等级。
-
确定评价因素集和评价等级集:
U = { u 1 : 价格 , u 2 : 质量 , u 3 : 售后服务 } U = \{u_1: 价格, u_2: 质量, u_3: 售后服务\} U={u1:价格,u2:质量,u3:售后服务}
V = { v 1 : 优 , v 2 : 良 , v 3 : 中 , v 4 : 差 } V = \{v_1: 优, v_2: 良, v_3: 中, v_4: 差\} V={v1:优,v2:良,v3:中,v4:差} -
确定权重向量:
W = ( 0.3 , 0.5 , 0.2 ) W = (0.3, 0.5, 0.2) W=(0.3,0.5,0.2) -
确定隶属度函数:
- 假设使用三角隶属度函数确定隶属度,具体函数形式根据实际数据确定。
-
构建模糊评价矩阵(假设已经通过专家打分得到):
R 1 = ( 0.1 0.6 0.2 0.1 0.2 0.5 0.2 0.1 0.3 0.4 0.2 0.1 ) R_1 = \begin{pmatrix} 0.1 & 0.6 & 0.2 & 0.1 \\ 0.2 & 0.5 & 0.2 & 0.1 \\ 0.3 & 0.4 & 0.2 & 0.1 \end{pmatrix} R1= 0.10.20.30.60.50.40.20.20.20.10.10.1
R 2 = ( 0.3 0.4 0.2 0.1 0.2 0.5 0.2 0.1 0.1 0.6 0.2 0.1 ) R_2 = \begin{pmatrix} 0.3 & 0.4 & 0.2 & 0.1 \\ 0.2 & 0.5 & 0.2 & 0.1 \\ 0.1 & 0.6 & 0.2 & 0.1 \end{pmatrix} R2= 0.30.20.10.40.50.60.20.20.20.10.10.1
R 3 = ( 0.2 0.5 0.2 0.1 0.3 0.4 0.2 0.1 0.2 0.5 0.2 0.1 ) R_3 = \begin{pmatrix} 0.2 & 0.5 & 0.2 & 0.1 \\ 0.3 & 0.4 & 0.2 & 0.1 \\ 0.2 & 0.5 & 0.2 & 0.1 \end{pmatrix} R3= 0.20.30.20.50.40.50.20.20.20.10.10.1 -
进行模糊综合运算:
-
对于方案 A 1 A_1 A1:
B 1 = W ⋅ R 1 = ( 0.3 , 0.5 , 0.2 ) ⋅ ( 0.1 0.6 0.2 0.1 0.2 0.5 0.2 0.1 0.3 0.4 0.2 0.1 ) = ( 0.21 , 0.51 , 0.2 , 0.1 ) B_1 = W \cdot R_1 = (0.3, 0.5, 0.2) \cdot \begin{pmatrix} 0.1 & 0.6 & 0.2 & 0.1 \\ 0.2 & 0.5 & 0.2 & 0.1 \\ 0.3 & 0.4 & 0.2 & 0.1 \end{pmatrix} = (0.21, 0.51, 0.2, 0.1) B1=W⋅R1=(0.3,0.5,0.2)⋅ 0.10.20.30.60.50.40.20.20.20.10.10.1 =(0.21,0.51,0.2,0.1) -
对于方案 A 2 A_2 A2:
B 2 = W ⋅ R 2 = ( 0.3 , 0.5 , 0.2 ) ⋅ ( 0.3 0.4 0.2 0.1 0.2 0.5 0.2 0.1 0.1 0.6 0.2 0.1 ) = ( 0.21 , 0.5 , 0.2 , 0.1 ) B_2 =W \cdot R_2 = (0.3, 0.5, 0.2) \cdot \begin{pmatrix} 0.3 & 0.4 & 0.2 & 0.1 \\ 0.2 & 0.5 & 0.2 & 0.1 \\ 0.1 & 0.6 & 0.2 & 0.1 \end{pmatrix} = (0.21, 0.5, 0.2, 0.1) B2=W⋅R2=(0.3,0.5,0.2)⋅ 0.30.20.10.40.50.60.20.20.20.10.10.1 =(0.21,0.5,0.2,0.1) -
对于方案 A 3 A_3 A3:
B 3 = W ⋅ R 3 = ( 0.3 , 0.5 , 0.2 ) ⋅ ( 0.2 0.5 0.2 0.1 0.3 0.4 0.2 0.1 0.2 0.5 0.2 0.1 ) = ( 0.22 , 0.49 , 0.2 , 0.1 ) B_3 = W \cdot R_3 = (0.3, 0.5, 0.2) \cdot \begin{pmatrix} 0.2 & 0.5 & 0.2 & 0.1 \\ 0.3 & 0.4 & 0.2 & 0.1 \\ 0.2 & 0.5 & 0.2 & 0.1 \end{pmatrix} = (0.22, 0.49, 0.2, 0.1) B3=W⋅R3=(0.3,0.5,0.2)⋅ 0.20.30.20.50.40.50.20.20.20.10.10.1 =(0.22,0.49,0.2,0.1)
-
最终的综合评价结果 B 1 B_1 B1、 B 2 B_2 B2 和 B 3 B_3 B3 可以用于比较不同方案的优劣。
6. 秩和比分析法
秩和比(Rank-Sum Ratio, RSR)分析法是一种用于多指标综合评价的方法,通过对各评价指标的秩次进行归一化处理,计算秩和比,从而进行综合评价。该方法的基本思想是将各指标的原始数据转换为秩次,计算各个评价对象的秩次和,然后进行归一化处理,最终得到秩和比。
6.1 秩和比分析法原理
秩和比分析法的基本步骤如下:
-
数据标准化:将原始数据进行标准化处理,以消除不同指标的量纲影响。常用的标准化方法有极差标准化、均值标准化和Z-Score标准化。
-
计算秩次:对标准化后的数据按每个指标分别进行排序,赋予秩次(Rank)。秩次可以按从小到大或从大到小的顺序进行分配。
-
计算秩次和:将每个评价对象在各个指标上的秩次进行加总,得到秩次和(Rank Sum)。
-
归一化处理:将秩次和进行归一化处理,得到秩和比(RSR)。归一化公式为:
RSR = R S − R S min R S max − R S min \text{RSR} = \frac{RS - RS_{\min}}{RS_{\max} - RS_{\min}} RSR=RSmax−RSminRS−RSmin
其中, R S RS RS 为某评价对象的秩次和, R S min RS_{\min} RSmin 和 R S max RS_{\max} RSmax 分别为所有评价对象中最小和最大的秩次和。 -
排序与分析:根据秩和比对评价对象进行排序,进行综合评价和分析。
6.2 秩和比分析法案例
为了更好地理解秩和比分析法,我们通过一个具体案例进行详细说明。假设我们对三个产品(A、B、C)在三个指标(价格、质量、售后服务)上进行综合评价,原始数据如下:
产品 | 价格 | 质量 | 售后服务 |
---|---|---|---|
A | 30 | 80 | 70 |
B | 20 | 90 | 60 |
C | 25 | 85 | 80 |
我们使用秩和比分析法对这三个产品进行综合评价。
-
数据标准化:
使用极差标准化方法进行数据标准化:
X ′ = X − X min X max − X min X' = \frac{X - X_{\min}}{X_{\max} - X_{\min}} X′=Xmax−XminX−Xmin标准化后的数据如下:
产品 价格 质量 售后服务 A 0.5 0.5 0.5 B 0.0 1.0 0.0 C 0.25 0.75 1.0 -
计算秩次:
按每个指标分别进行排序并赋予秩次:
产品 价格秩次 质量秩次 售后服务秩次 A 2 3 2 B 1 1 1 C 3 2 3 -
计算秩次和:
产品 秩次和 A 7 B 3 C 8 -
归一化处理:
计算秩和比:
RSR A = 7 − 3 8 − 3 = 0.8 \text{RSR}_A = \frac{7 - 3}{8 - 3} = 0.8 RSRA=8−37−3=0.8
RSR B = 3 − 3 8 − 3 = 0.0 \text{RSR}_B = \frac{3 - 3}{8 - 3} = 0.0 RSRB=8−33−3=0.0
RSR C = 8 − 3 8 − 3 = 1.0 \text{RSR}_C = \frac{8 - 3}{8 - 3} = 1.0 RSRC=8−38−3=1.0 -
排序与分析:
根据秩和比进行排序:
产品 RSR C 1.0 A 0.8 B 0.0 由此可见,产品C综合评价最好,其次是产品A,最后是产品B。
- 代码实现
以下是用Python实现秩和比分析法的代码:
import numpy as np
import pandas as pd
# 原始数据
data = {
'产品': ['A', 'B', 'C'],
'价格': [30, 20, 25],
'质量': [80, 90, 85],
'售后服务': [70, 60, 80]
}
df = pd.DataFrame(data)
# 数据标准化(极差标准化)
def min_max_normalization(series):
return (series - series.min()) / (series.max() - series.min())
df_normalized = df.iloc[:, 1:].apply(min_max_normalization)
# 计算秩次
df_ranks = df_normalized.rank()
# 计算秩次和
df['秩次和'] = df_ranks.sum(axis=1)
# 归一化处理(计算RSR)
RS_min = df['秩次和'].min()
RS_max = df['秩次和'].max()
df['RSR'] = (df['秩次和'] - RS_min) / (RS_max - RS_min)
# 排序
df_sorted = df.sort_values(by='RSR', ascending=False)
print(df_sorted)
运行上述代码,将得到各产品的秩次和、RSR及排序结果。结果如下:
产品 价格 质量 售后服务 秩次和 RSR
2 C 25 85 80 8.0 1.0
0 A 30 80 70 7.0 0.8
1 B 20 90 60 3.0 0.0
从结果可以看出,产品C的RSR最高,综合评价最好,其次是产品A,最后是产品B。这与我们的手工计算结果一致。
6.3 RSR的分布及其计算
这部分内容涉及将RSR的分布映射到正态分布曲线,结合正态分布的划分方法对数据进行分档和排序。这一过程主要是为了更好地对评价对象进行分层,利用正态分布的特性,使得分档结果更具有统计意义和区分度。
确定RSR的分布
为了将RSR映射到正态分布,我们需要以下步骤:
Step 1: 编制RSR频数分布表
首先,我们需要对RSR进行频数统计,并计算各组的累计频数。
Step 2: 确定各组RSR的秩次范围及平均秩次
确定每个RSR的秩次范围,并计算每个范围的平均秩次。
Step 3: 计算累计频率
计算累计频率,公式为:
累计频率
=
∑
f
n
×
100
%
\text{累计频率} = \frac{\sum f}{n} \times 100\%
累计频率=n∑f×100%
为了修正最后一项,可以使用:
修正累计频率
=
1
−
1
4
n
\text{修正累计频率} = 1 - \frac{1}{4n}
修正累计频率=1−4n1
Step 4: 将累计频率换算为Probit值
将累计频率换算为Probit值。Probit值为对应累计频率的标准正态离差(z-score)加5。标准正态离差可以通过正态分布表或利用统计函数计算得到。
计算回归方程
用Probit值作为自变量,RSR值作为因变量,计算回归方程:
RSR
=
a
+
b
×
Probit
\text{RSR} = a + b \times \text{Probit}
RSR=a+b×Probit
检验回归方程的有效性,通常进行以下检验:
- 残差独立性检验:Durbin-Watson检验
- 方差齐性检验:Breusch-Pagan检验和White检验
- 回归系数 b b b的有效性检验:t检验法和置信区间检验法
- 拟合优度检验:决定系数、Pearson相关系数等
示例代码实现
下面是用Python实现上述步骤的代码:
import numpy as np
import pandas as pd
from scipy.stats import norm
from scipy.stats import linregress
# 原始数据
data = {
'产品': ['A', 'B', 'C'],
'价格': [30, 20, 25],
'质量': [80, 90, 85],
'售后服务': [70, 60, 80]
}
df = pd.DataFrame(data)
# 数据标准化(极差标准化)
def min_max_normalization(series):
return (series - series.min()) / (series.max() - series.min())
df_normalized = df.iloc[:, 1:].apply(min_max_normalization)
# 计算秩次
df_ranks = df_normalized.rank()
# 计算秩次和
df['秩次和'] = df_ranks.sum(axis=1)
# 归一化处理(计算RSR)
RS_min = df['秩次和'].min()
RS_max = df['秩次和'].max()
df['RSR'] = (df['秩次和'] - RS_min) / (RS_max - RS_min)
# Step 1: 编制RSR频数分布表,计算累计频数
df['频数'] = 1
df['累计频数'] = df['频数'].cumsum()
# Step 2: 确定RSR秩次范围及平均秩次
df['平均秩次'] = df['累计频数'] / len(df)
# Step 3: 计算累计频率并修正
df['累计频率'] = df['平均秩次']
df['修正累计频率'] = df['累计频率'].apply(lambda x: x if x < 1 else (1 - 1 / (4 * len(df))))
# Step 4: 将累计频率换算为Probit值
df['Probit'] = df['修正累计频率'].apply(lambda x: norm.ppf(x) + 5)
# 计算回归方程
slope, intercept, r_value, p_value, std_err = linregress(df['Probit'], df['RSR'])
# 回归方程:RSR = a + b * Probit
a = intercept
b = slope
# 计算校正RSR值
df['校正RSR'] = a + b * df['Probit']
# 分档排序
df_sorted = df.sort_values(by='校正RSR', ascending=False)
print(df_sorted)
代码解释
- 数据标准化:使用极差标准化方法,将原始数据标准化。
- 计算秩次和:对标准化数据计算秩次和,进而计算RSR值。
- 编制频数分布表:统计频数,计算累计频数和平均秩次。
- 计算累计频率并修正:计算累计频率,并对最后一项进行修正。
- 计算Probit值:利用累计频率计算Probit值。
- 计算回归方程:使用Probit值和RSR值进行线性回归,得到回归方程。
- 计算校正RSR值并分档排序:根据回归方程计算校正RSR值,并对评价对象进行分档排序。
通过上述步骤和代码,我们可以将RSR值映射到正态分布曲线,结合正态分布的划分方法进行分档和排序,从而实现对评价对象的更准确和科学的综合评价。
6.4 秩和比分析法案例2
import pandas as pd
import numpy as np
import statsmodels.api as sm
from scipy.stats import norm
def rsr(data, weight=None, threshold=None, full_rank=True):
Result = pd.DataFrame()
n, m = data.shape
# 对原始数据编秩
if full_rank:
for i, X in enumerate(data.columns):
Result[f'X{str(i + 1)}:{X}'] = data.iloc[:, i]
Result[f'R{str(i + 1)}:{X}'] = data.iloc[:, i].rank(method="dense")
else:
for i, X in enumerate(data.columns):
Result[f'X{str(i + 1)}:{X}'] = data.iloc[:, i]
Result[f'R{str(i + 1)}:{X}'] = 1 + (n - 1) * (data.iloc[:, i].max() - data.iloc[:, i]) / (data.iloc[:, i].max() - data.iloc[:, i].min())
# 计算秩和比
weight = 1 / m if weight is None else np.array(weight) / sum(weight)
Result['RSR'] = (Result.iloc[:, 1::2] * weight).sum(axis=1) / n
Result['RSR_Rank'] = Result['RSR'].rank(ascending=False)
# 绘制 RSR 分布表
RSR = Result['RSR']
RSR_RANK_DICT = dict(zip(RSR.values, RSR.rank().values))
Distribution = pd.DataFrame(index=sorted(RSR.unique()))
Distribution['f'] = RSR.value_counts().sort_index()
Distribution['Σ f'] = Distribution['f'].cumsum()
Distribution[r'\bar{R} f'] = [RSR_RANK_DICT[i] for i in Distribution.index]
Distribution[r'\bar{R}/n*100%'] = Distribution[r'\bar{R} f'] / n
Distribution.iat[-1, -1] = 1 - 1 / (4 * n)
Distribution['Probit'] = 5 - norm.isf(Distribution.iloc[:, -1])
# 计算回归方差并进行回归分析
r0 = np.polyfit(Distribution['Probit'], Distribution.index, deg=1)
print(sm.OLS(Distribution.index, sm.add_constant(Distribution['Probit'])).fit().summary())
if r0[1] > 0:
print(f"\n回归直线方程为:y = {r0[0]} Probit + {r0[1]}")
else:
print(f"\n回归直线方程为:y = {r0[0]} Probit - {abs(r0[1])}")
# 代入回归方程并分档排序
Result['Probit'] = Result['RSR'].apply(lambda item: Distribution.at[item, 'Probit'])
Result['RSR Regression'] = np.polyval(r0, Result['Probit'])
threshold = np.polyval(r0, [2, 4, 6, 8]) if threshold is None else np.polyval(r0, threshold)
Result['Level'] = pd.cut(Result['RSR Regression'], threshold, labels=range(len(threshold) - 1, 0, -1))
return Result, Distribution
def rsrAnalysis(data, file_name=None, **kwargs):
Result, Distribution = rsr(data, **kwargs)
file_name = 'RSR 分析结果报告.xlsx' if file_name is None else file_name + '.xlsx'
Excel_Writer = pd.ExcelWriter(file_name)
Result.to_excel(Excel_Writer, '综合评价结果')
Result.sort_values(by='Level', ascending=False).to_excel(Excel_Writer, '分档排序结果')
Distribution.to_excel(Excel_Writer, 'RSR分布表')
Excel_Writer.save()
return Result, Distribution
data = pd.DataFrame({'产前检查率': [99.54, 96.52, 99.36, 92.83, 91.71, 95.35, 96.09, 99.27, 94.76, 84.80],
'孕妇死亡率': [60.27, 59.67, 43.91, 58.99, 35.40, 44.71, 49.81, 31.69, 22.91, 81.49],
'围产儿死亡率': [16.15, 20.10, 15.60, 17.04, 15.01, 13.93, 17.43, 13.89, 19.87, 23.63]},
index=list('ABCDEFGHIJ'), columns=['产前检查率', '孕妇死亡率', '围产儿死亡率'])
data["孕妇死亡率"] = 1 / data["孕妇死亡率"]
data["围产儿死亡率"] = 1 / data["围产儿死亡率"]
rsr(data)
7. 主成分分析法
主成分分析(Principal Component Analysis, PCA)是一种常用的数据降维技术,用于发现数据集中的主要变化方向,将高维数据转化为低维数据,同时尽可能保留数据的信息。主成分分析可以帮助理解数据的内在结构和模式,常用于数据探索和预处理。
7.1 主成分分析法的原理
主成分分析的基本原理是通过线性变换将原始数据投影到新的坐标系中,新坐标系的选择是为了最大化数据的方差。具体步骤如下:
-
数据标准化:对原始数据进行标准化处理,消除量纲的影响,使得每个变量的均值为0,标准差为1。
-
计算协方差矩阵:计算标准化后数据的协方差矩阵。
协方差矩阵:
Σ = 1 n − 1 X T X \Sigma = \frac{1}{n-1} X^T X Σ=n−11XTX
其中, X X X 是标准化后的数据矩阵, X T X^T XT 是 X X X 的转置, n n n 是样本数量。 -
特征值分解:对协方差矩阵进行特征值分解,得到特征值和对应的特征向量。
特征值和特征向量满足以下关系:
Σ v = λ v \Sigma v = \lambda v Σv=λv
其中, λ \lambda λ 是特征值, v v v 是对应的特征向量。 -
选择主成分:按照特征值的大小选择主成分,特征值越大,说明对应的主成分保留了更多的原始数据方差。
-
投影数据:将原始数据投影到选定的主成分上,得到降维后的数据。
7.2 主成分分析法的案例
为了更好地理解主成分分析法,我们通过一个具体案例进行详细说明。假设我们有一个包含多个指标的数据集,我们使用主成分分析来降低数据维度并分析数据的结构。
案例描述:
假设我们有一个包含以下指标的数据集,用于评估公司的绩效:
- 销售额(万元)
- 利润率(%)
- 市场份额(%)
- 客户满意度指数
我们希望利用主成分分析来将这些指标降维,并理解各主成分对数据解释的贡献。
主成分分析步骤及代码实现:
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
# 原始数据
data = {
'公司': ['A', 'B', 'C', 'D', 'E'],
'销售额': [100, 85, 90, 110, 120],
'利润率': [10, 8, 9, 12, 11],
'市场份额': [15, 12, 14, 16, 18],
'客户满意度': [80, 75, 78, 82, 85]
}
df = pd.DataFrame(data)
# 提取数值数据进行主成分分析
X = df.iloc[:, 1:].values
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 主成分分析
pca = PCA()
pca.fit(X_scaled)
# 主成分贡献度和累计贡献度
explained_variance_ratio = pca.explained_variance_ratio_
cumulative_explained_variance_ratio = np.cumsum(explained_variance_ratio)
# 主成分分析结果
print("主成分贡献度:", explained_variance_ratio)
print("累计贡献度:", cumulative_explained_variance_ratio)
# 提取主成分
components = pca.components_
# 主成分加载量(因子载荷)
loadings = pd.DataFrame(components.T, columns=['PC1', 'PC2', 'PC3', 'PC4'], index=['销售额', '利润率', '市场份额', '客户满意度'])
print("\n主成分加载量(因子载荷):")
print(loadings)
# 计算主成分得分
PC_scores = pca.transform(X_scaled)
PC_scores_df = pd.DataFrame(PC_scores, columns=['PC1', 'PC2', 'PC3', 'PC4'])
print("\n主成分得分:")
print(PC_scores_df)
# 按PC1进行排序
df['PC1'] = PC_scores_df['PC1']
df_sorted = df.sort_values(by='PC1', ascending=False)
print("\n按主成分PC1进行排序:")
print(df_sorted[['公司', 'PC1']])
代码解释:
-
数据标准化:使用
StandardScaler
将原始数据进行标准化处理,确保每个变量具有相同的尺度。 -
主成分分析:使用
PCA
类进行主成分分析,得到主成分贡献度和累计贡献度。 -
主成分加载量:计算并打印每个指标在各主成分上的加载量(因子载荷),加载量表示了每个指标对应主成分的贡献程度。
-
主成分得分:计算每个公司在各主成分上的得分,并打印主成分得分表格。
-
排序:按照第一主成分(PC1)的得分对公司进行降序排序,以理解每个公司在主成分方面的表现。
通过上述代码,我们可以对主成分分析的应用有一个清晰的认识,包括数据标准化、主成分分析的计算、主成分的解释以及如何根据主成分对数据进行分析和排序。主成分分析能够帮助我们识别出主要的数据模式和关系,为进一步的数据分析提供有价值的见解和基础。
运行结果:
主成分贡献度: [9.46267559e-01 4.79791954e-02 5.74537339e-03 7.87178142e-06]
累计贡献度: [0.94626756 0.99424675 0.99999213 1. ]
主成分加载量(因子载荷):
PC1 PC2 PC3 PC4
销售额 -0.508447 -0.170348 -0.832324 -0.140355
利润率 -0.475031 0.870887 0.118985 -0.041755
市场份额 -0.505719 -0.371546 0.487364 -0.607189
客户满意度 -0.509977 -0.272929 0.235701 0.780947
主成分得分:
PC1 PC2 PC3 PC4
0 0.039703 0.013302 0.064994 0.010960
1 2.814293 -0.060797 -0.205440 -0.001276
2 1.324959 -0.123447 0.248704 -0.004909
3 -1.581450 0.765861 -0.034582 -0.002697
4 -2.597505 -0.594919 -0.073677 -0.002078
按主成分PC1进行排序:
公司 PC1
1 B 2.814293
2 C 1.324959
0 A 0.039703
3 D -1.581450
4 E -2.597505
结果解释:
根据=主成分分析结果,我们可以对各个主成分及其对数据的解释进行详细解释。
主成分贡献度和累计贡献度
主成分贡献度: [9.46267559e-01 4.79791954e-02 5.74537339e-03 7.87178142e-06]
累计贡献度: [0.94626756 0.99424675 0.99999213 1. ]
解释:
- PC1:解释了 94.63% 的数据方差。
- PC2:解释了 4.80% 的数据方差。
- PC3:解释了 0.57% 的数据方差。
- PC4:解释了 0.00079% 的数据方差。
累计贡献度表明,前两个主成分(PC1 和 PC2)已经解释了大约 99.42% 的数据方差,前三个主成分(PC3)解释了几乎所有数据方差(99.99%),因此,主要分析前两个主成分即可。
主成分加载量(因子载荷)
主成分加载量(因子载荷):
PC1 PC2 PC3 PC4
销售额 -0.508447 -0.170348 -0.832324 -0.140355
利润率 -0.475031 0.870887 0.118985 -0.041755
市场份额 -0.505719 -0.371546 0.487364 -0.607189
客户满意度 -0.509977 -0.272929 0.235701 0.780947
解释:
- PC1:所有变量(销售额、利润率、市场份额和客户满意度)在 PC1 上的加载量都为负且接近,表明 PC1 是一个综合指标,反映了所有这些指标的总体水平。
- PC2:利润率在 PC2 上有较高的正加载量,市场份额和客户满意度有负加载量,说明 PC2 主要反映了利润率与其他指标(市场份额和客户满意度)的对立关系。
- PC3:销售额在 PC3 上有较高的负加载量,而市场份额有正加载量,说明 PC3 主要反映了销售额和市场份额之间的对立关系。
- PC4:客户满意度在 PC4 上有较高的正加载量,市场份额有较高的负加载量,说明 PC4 主要反映了客户满意度和市场份额之间的对立关系。
Q: 为什么都为负且接近就能说明是综合指标?如果指标都为正呢?
PC1:所有变量(销售额、利润率、市场份额和客户满意度)在 PC1 上的加载量都为负且接近,表明 PC1 是一个综合指标,反映了所有这些指标的总体水平。
在主成分分析中,主成分(PC)的加载量(因子载荷)表示原始变量在该主成分上的投影。因此,加载量的符号和大小可以帮助我们理解每个主成分的含义。
- 为什么都为负且接近能说明是综合指标?
当所有变量在某个主成分上的加载量都为负且接近时,这表示这些变量在该主成分上的变化方向是一致的,即它们共同贡献了该主成分的变异。负号只是一个方向上的标志,如果所有变量的加载量都为正且接近,同样可以说明这是一个综合指标,只不过是反方向的解释。这种情况下,我们可以认为这个主成分是这些变量的综合表现。
- 如果加载量都为正呢?
如果所有变量在某个主成分上的加载量都为正且接近,这同样表明这些变量在该主成分上的变化方向是一致的。主成分的方向只是一个相对的概念,负号和正号本质上是无关紧要的,因为主成分分析的目标是找到变量之间的最大变异方向。
为了更好地说明这一点,我们来看两个例子。
- 例子1:所有加载量为负
假设主成分PC1的加载量如下:
销售额: -0.5
利润率: -0.5
市场份额: -0.5
客户满意度: -0.5
这里,PC1的所有加载量都为负且大小相等。可以理解为,当PC1增加时,所有这些变量(销售额、利润率、市场份额、客户满意度)都减少。反之亦然。这说明PC1反映了这些变量的总体水平,它们的变异方向是一致的,只是符号是负的。
- 例子2:所有加载量为正
假设主成分PC1的加载量如下:
销售额: 0.5
利润率: 0.5
市场份额: 0.5
客户满意度: 0.5
这里,PC1的所有加载量都为正且大小相等。可以理解为,当PC1增加时,所有这些变量(销售额、利润率、市场份额、客户满意度)也都增加。反之亦然。这同样说明PC1反映了这些变量的总体水平,它们的变异方向是一致的,只是符号是正的。
加载量的正负符号在解释主成分时并不重要,重要的是加载量的相对大小和一致性。
如果所有变量在某个主成分上的加载量都为负且接近,或者都为正且接近,这都可以表明这个主成分是一个综合指标,反映了所有这些变量的总体水平。符号只是变异方向的标志,正负号本质上是等效的。
主成分得分
主成分得分:
PC1 PC2 PC3 PC4
0 0.039703 0.013302 0.064994 0.010960
1 2.814293 -0.060797 -0.205440 -0.001276
2 1.324959 -0.123447 0.248704 -0.004909
3 -1.581450 0.765861 -0.034582 -0.002697
4 -2.597505 -0.594919 -0.073677 -0.002078
解释:
- 公司B在 PC1 上得分最高,表明在主要综合指标上表现最好。
- 公司E在 PC1 上得分最低,表明在主要综合指标上表现最差。
- PC2 的得分可以反映利润率与其他指标(市场份额和客户满意度)的对立关系。
- PC3 的得分可以反映销售额与市场份额的对立关系。
- PC4 的得分可以反映客户满意度与市场份额的对立关系。
按PC1进行排序
按主成分PC1进行排序:
公司 PC1
1 B 2.814293
2 C 1.324959
0 A 0.039703
3 D -1.581450
4 E -2.597505
解释:
- 根据 PC1 的得分排序,公司的整体表现从最好到最差依次为:公司B、公司C、公司A、公司D、公司E。
主成分解释
- PC1:综合反映了销售额、利润率、市场份额和客户满意度的总体水平。高PC1得分表示这些指标的综合表现较好。
- PC2:主要反映了利润率与市场份额和客户满意度的对立关系。高PC2得分表示利润率高,但市场份额和客户满意度相对较低。
- PC3:主要反映了销售额与市场份额的对立关系。高PC3得分表示销售额低而市场份额高。
- PC4:主要反映了客户满意度与市场份额的对立关系。高PC4得分表示客户满意度高但市场份额低。
通过以上分析,可以更好地理解每个主成分在数据中的作用,以及每个公司在各个主成分上的表现,从而为业务决策和策略调整提供依据。
8. 因子分析法
主成分分析本身是以线性加权的方式去抽象出新变量,难以对变量背后的东西进行解释。而为了从表象的数据中发现更深层的原因则需要用到因子分析。
8.1 因子分析法的原理
因子分析和主成分分析虽然都是用于评价模型的方法,但二者有很大的不同:
-
原理不同:主成分分析是利用降维(线性变换)的思想,每个主成分都是原始变量的线性组合,使得主成分比原始变量具有某些更优越的性能,从而达到简化系统结构,抓住问题实质的目的。而因子分析更倾向于从数据出发,描述原始变量的相关关系,将原始变量进行分解。
-
线性表示方向不同:主成分分析中是把主成分表示成各变量的线性组合,而因子分析是把变量表示成各公因子的线性组合。说白了,一个是组合,一个是分解。
-
假设条件不同:因子分析需要一些假设。因子分析的假设包括:各个共同因子之间不相关,特殊因子之间也不相关,共同因子和特殊因子之间也不相关。
-
数量不同:主成分分析的主成分的数量是一定的,一般有几个变量就有几个主成分(只是主成分所解释的信息量不等),实际应用时会根据帕累托图提取前几个主要的主成分。而因子分析的因子个数需要分析者指定,指定的因子数量不同而结果也不同。
-
应用范围不同:在实际的应用过程中,主成分分析常被用作达到目的的中间手段,而非完全的一种分析方法,提取出来的主成分无法清晰的解释其代表的含义。而因子分析就是一种完全的分析方法,可确切的得出公共因子。
在进行因子分析之前,需要先进行巴雷特检验或KMO检验。巴雷特特球形检验(Barlett’s Test)是一种统计方法,用于检验多个变量之间是否存在相关性。它的基本思想是,如果多个变量之间彼此独立,那么它们的方差应该与它们的相关系数矩阵的行列式值成正比。如果实际观察到的行列式值与预期的行列式值相差很大,那么可以认为这些变量之间存在相关性。通过比较实际观察到的行列式值与预期的行列式值,我们可以决定是否拒绝零假设,即这些变量是独立的。简单来说,巴雷特特球形检验的作用就是帮助我们判断多个变量之间是否存在相关性,从而决定是否适合进行因子分析。如果得到的统计概率小于0.05,那么它是适合做因子分析的。
KMO检验用于评估一组数据是否适合进行因子分析。它的基本作用是检测数据是否符合因子分析的基本假设,即变量之间应该呈现出一定程度的相关性。KMO检验的基本思想是通过比较变量之间的简单相关系数和偏相关系数来进行评估。简单相关系数描述了两个变量之间的直接关系,而偏相关系数则描述了在控制其他变量影响后,两个变量之间的净关系。KMO检验通过计算这些相关系数的平方和来比较这两种关系,以确定数据是否适合进行因子分析。KMO统计量的取值范围在0-1之间。当KMO值越接近1时,表示变量间的相关性越强,原有变量越适合作因子分析;当KMO值越接近0时,表示变量间的相关性越弱,原有变量越不适合作因子分析。在实际分析中,KMO统计量在0.7以上时效果比较好;当KMO统计量在0.5以下时,则不适合应用因子分析法,可能需要重新设计变量结构或者采用其他统计分析方法。
如果能够通过这两个检验中的一个,就可以开始做因子分析了。它的基本流程如下:
-
选择变量:首先,我们要选出一组变量来进行因子分析。选择的方法有两种:定性和定量。如果原始变量之间的相关性不好,那它们就很难被分解成几个公共因子。所以,原始变量之间应该有较强的相关性。
-
计算相关系数矩阵:接着,我们要计算这些选定的原始变量的相关系数矩阵。这个矩阵能告诉我们各个变量之间的关系是什么样的。这一步特别重要,因为如果变量之间没什么关系,那把它们分解成几个因子就没什么意义了。这个相关系数矩阵也是我们进行因子分析的基础。
-
提取公因子:然后,我们要从这些原始变量中提取出公共因子。具体要提取几个,需要我们来做决定。这个决定可以基于我们的先验知识或者实验假设。不过,通常我们会看提取的因子的累计方差贡献率是多少。一般来说,累计的方差贡献率达到70%或以上,就算是满足了要求。分解的形式如下所示:
X i = a i 1 F 1 + a i 2 F 2 + . . . + a i m F m + e i X_i = a_{i1}F_1 + a_{i2}F_2 + ... + a_{im}F_m + e_i Xi=ai1F1+ai2F2+...+aimFm+ei
其中, X i X_i Xi 是第 i i i 个原始变量, F j F_j Fj 是第 j j j 个因子, a i j a_{ij} aij 是因子载荷, e i e_i ei 是特殊因子。
-
因子旋转:之后,我们要对提取出来的公共因子进行旋转。这样做的目的是为了让因子的意义更明确,更容易理解。常见的旋转方法包括方差最大法(Varimax)、斜交旋转(Oblimin)等。
-
计算因子得分:最后,我们要计算出因子的得分。这些得分可以在后续的研究中使用,比如在因子回归模型中。这样,我们就能更好地理解这些变量的关系,并找出影响结果的关键因素。
因子载荷矩阵是因子分析中的核心概念之一,它描述了变量与因子之间的关系。因子载荷是第 i i i 个变量与第 j j j 个公共因子的相关系数,反映了第 i i i 个变量和第 j j j 个公共因子之间的重要性。绝对值越大,表示相关性的密切程度越高。因子载荷矩阵中各列元素的平方和成为对所有的变量的方差贡献和,衡量了各个公共因子的相对重要性。因子载荷矩阵是可逆的,因此可以用于将原始变量表示为公共因子和特殊因子的线性组合。这使得我们可以利用公共因子解释原始数据的结构和模式,并对其进行解释和分析。因子载荷矩阵在因子分析中具有重要的作用,它不仅用于确定公共因子和特殊因子的数量,还可以用于估计公共因子和特殊因子的系数。在实际中,可以使用主成分分析法等方法估计因子载荷矩阵。
为什么需要进行因子旋转?假设我们有一个市场调研数据集,其中包括了多个产品特性和消费者对产品的评价。通过因子分析,我们希望找出影响消费者评价的公共因子。初始的因子载荷矩阵可能显示出一些不太直观的结果,例如某些产品特性与公共因子之间的关系不太明显。这时,通过因子旋转,我们可以对原始因子进行转换,使得因子载荷矩阵中的因子载荷的绝对值更加接近于1或0。这样,我们可以更清楚地看出哪些产品特性与公共因子有强烈的关联,哪些特性的影响较小。因子旋转的本质就是做一个正交变换,让因子载荷阵的结构得到简化。常见的因子旋转方法包括方差最大法等。
最终得到的因子得分往往比主成分分析更加具有可解释性。它在人文社会科学的问题中有着非常重要的应用。前面学习的一系列方法例如层次分析法、熵权法等把评价的重点放在了指标权重上,TOPSIS分析法等把重点放在了得分折算上。但因子分析走出了第三条路径:通过构造因子,将多个变量进行抽象构造出指标体系(可以理解为,数据中给出的的二级指标,而通过因子分析可以给出一级指标以及指标对应关系)。良好的可解释性就意味着它可以深度地和一些人文社会科学理论融合起来,并具有广阔的后续应用空间。在第9章中我们会再一次提到因子分析的扩展
方法:结构方程。
8.2 因子分析法的案例
为了更好地理解因子分析法,下面我们通过一个案例来进行具体说明。
假设我们有一个包含不同变量的市场调研数据集,我们希望通过因子分析来找出潜在的影响因子,并解释它们的意义。
数据准备
首先,导入必要的库并准备数据:
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import FactorAnalysis
import matplotlib.pyplot as plt
import seaborn as sns
# 生成样本数据
data = {
'销量': [120, 130, 140, 150, 160, 170, 180, 190, 200, 210],
'利润': [12, 14, 16, 18, 20, 22, 24, 26, 28, 30],
'市场份额': [15, 17, 19, 21, 23, 25, 27, 29, 31, 33],
'客户满意度': [3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5],
'广告费用': [10, 12, 14, 16, 18, 20, 22, 24, 26, 28]
}
df = pd.DataFrame(data)
# 标准化数据
scaler = StandardScaler()
Z = scaler.fit_transform(df)
检验适合性
进行KMO和巴雷特检验,检查数据是否适合进行因子分析:
from factor_analyzer.factor_analyzer import calculate_kmo, calculate_bartlett_sphericity
# KMO检验
kmo_all, kmo_model = calculate_kmo(df)
print(f"KMO值: {kmo_model}")
# 巴雷特检验
bartlett_sphericity, p_value = calculate_bartlett_sphericity(df)
print(f"巴雷特检验的卡方值: {bartlett_sphericity}, p值: {p_value}")
因子分析
执行因子分析并提取公共因子:
# 因子分析
fa = FactorAnalysis(n_components=2)
factors = fa.fit_transform(Z)
# 因子载荷矩阵
factor_loadings = fa.components_.T
print(f"因子载荷矩阵: \n{factor_loadings}")
# 因子得分
factor_scores = pd.DataFrame(factors, columns=['因子1', '因子2'])
print(factor_scores)
因子旋转
进行因子旋转以便更好地解释因子:
from factor_analyzer.rotator import Rotator
# 旋转因子载荷矩阵
rotator = Rotator(method='varimax')
rotated_loadings = rotator.fit_transform(factor_loadings)
print(f"旋转后的因子载荷矩阵: \n{rotated_loadings}")
因子分析法通过将变量分解为若干公共因子,能够有效地揭示潜在的结构和模式。与主成分分析相比,因子分析更注重解释数据背后的潜在因素,适用于从表象数据中挖掘深层原因。通过适当的检验和旋转,可以提高因子分析结果的可靠性和可解释性。
9. 数据包络分析法
数据包络分析法(Data Envelopment Analysis,DEA)是一种用于评估多输入多输出决策单元(Decision Making Units, DMUs)相对效率的非参数方法。DEA方法通过构建一个包络面来确定每个DMU相对于其他DMU的效率得分。以下我们详细介绍两种主要的DEA模型:CCR模型和BBC模型,并结合案例进行说明。
9.1 CCR数据包络模型
CCR模型是由Charnes, Cooper和Rhodes在1978年提出的,因此得名CCR模型。它假设规模报酬不变(Constant Returns to Scale, CRS),即输入与输出之间的比例保持不变。CCR模型通过线性规划方法求解,计算各个DMU的效率得分。
CCR模型的数学公式
对于 n n n 个DMU,每个DMU有 m m m 个输入和 s s s 个输出,记第 j j j 个DMU的输入向量为 x j = ( x 1 j , x 2 j , … , x m j ) T x_j = (x_{1j}, x_{2j}, \ldots, x_{mj})^T xj=(x1j,x2j,…,xmj)T,输出向量为 y j = ( y 1 j , y 2 j , … , y s j ) T y_j = (y_{1j}, y_{2j}, \ldots, y_{sj})^T yj=(y1j,y2j,…,ysj)T。
CCR模型的目标是通过选择适当的权重 u i u_i ui 和 v r v_r vr,使得第 k k k 个DMU的效率最大化。数学模型如下:
max θ k = ∑ r = 1 s u r y r k ∑ i = 1 m v i x i k \max \theta_k = \frac{\sum_{r=1}^{s} u_r y_{rk}}{\sum_{i=1}^{m} v_i x_{ik}} maxθk=∑i=1mvixik∑r=1suryrk
约束条件为:
∑ r = 1 s u r y r j ∑ i = 1 m v i x i j ≤ 1 ( j = 1 , 2 , … , n ) \frac{\sum_{r=1}^{s} u_r y_{rj}}{\sum_{i=1}^{m} v_i x_{ij}} \leq 1 \quad (j=1, 2, \ldots, n) ∑i=1mvixij∑r=1suryrj≤1(j=1,2,…,n)
u r , v i ≥ 0 ( r = 1 , 2 , … , s ; i = 1 , 2 , … , m ) u_r, v_i \geq 0 \quad (r=1, 2, \ldots, s; i=1, 2, \ldots, m) ur,vi≥0(r=1,2,…,s;i=1,2,…,m)
可以通过求解这个线性规划问题得到各个DMU的效率得分。
9.2 BBC数据包络模型
BBC模型是由Banker, Charnes和Cooper在1984年提出的,因此得名BBC模型。它假设规模报酬可变(Variable Returns to Scale, VRS),即输入与输出之间的比例可以变化。BBC模型通过增加一个凸性约束来实现规模报酬可变。
BBC模型的数学公式
BBC模型在CCR模型的基础上增加了一个凸性约束。数学模型如下:
max θ k = ∑ r = 1 s u r y r k ∑ i = 1 m v i x i k \max \theta_k = \frac{\sum_{r=1}^{s} u_r y_{rk}}{\sum_{i=1}^{m} v_i x_{ik}} maxθk=∑i=1mvixik∑r=1suryrk
约束条件为:
∑ r = 1 s u r y r j ∑ i = 1 m v i x i j ≤ 1 ( j = 1 , 2 , … , n ) \frac{\sum_{r=1}^{s} u_r y_{rj}}{\sum_{i=1}^{m} v_i x_{ij}} \leq 1 \quad (j=1, 2, \ldots, n) ∑i=1mvixij∑r=1suryrj≤1(j=1,2,…,n)
∑ j = 1 n λ j = 1 \sum_{j=1}^{n} \lambda_j = 1 j=1∑nλj=1
u r , v i ≥ 0 ( r = 1 , 2 , … , s ; i = 1 , 2 , … , m ) u_r, v_i \geq 0 \quad (r=1, 2, \ldots, s; i=1, 2, \ldots, m) ur,vi≥0(r=1,2,…,s;i=1,2,…,m)
λ j ≥ 0 \lambda_j \geq 0 λj≥0
可以通过求解这个线性规划问题得到各个DMU的效率得分。
9.3 数据包络分析法案例
以下是一个使用Python实现DEA分析的案例。我们将使用pyDEA
库来计算DMU的效率得分。
案例数据
假设有5个DMU,每个DMU有2个输入和2个输出,数据如下:
DMU | 输入1 | 输入2 | 输出1 | 输出2 |
---|---|---|---|---|
A | 3 | 5 | 4 | 3 |
B | 4 | 6 | 5 | 4 |
C | 5 | 8 | 6 | 5 |
D | 6 | 7 | 5 | 6 |
E | 7 | 9 | 6 | 7 |
Python代码
import pandas as pd
from pyDEA.main.dea import run_dea
from pyDEA.core.data_processing.read_data import read_data
from pyDEA.core.utils.dea_utils import load_data_from_csv
# 构造数据
data = {
'DMU': ['A', 'B', 'C', 'D', 'E'],
'投入1': [3, 4, 5, 6, 7],
'投入2': [5, 6, 8, 7, 9],
'产出1': [4, 5, 6, 5, 6],
'产出2': [3, 4, 5, 6, 7]
}
# 将数据转换为DataFrame
df = pd.DataFrame(data)
# 保存数据为csv文件
df.to_csv('dea_data.csv', index=False)
# 使用pyDEA库进行DEA分析
input_orient = True
output = run_dea('dea_data.csv', oriented=input_orient)
# 输出结果
print(output)
# 从csv文件加载数据
data, _ = load_data_from_csv('dea_data.csv')
# 读取数据
inputs, outputs, data_name, dmu_name = read_data(data)
# 输出各个DMU的效率得分
for i, dmu in enumerate(dmu_name):
print(f"DMU {dmu} 的效率得分: {output[0][i]:.4f}")
以上代码将会输出各个DMU的效率得分,通过这些得分可以评估每个DMU的相对效率。
10. 一些奇奇怪怪的疑问
1. 如何理解隶属度函数
为了更好地理解上述隶属度函数,我们可以举一个具体的例子,假设我们对某个产品的价格进行评价,价格分为四个等级:“优”(非常便宜)、“良”(比较便宜)、“中”(一般)、“差”(比较贵)。我们使用三角隶属度函数来描述这些等级的模糊性。
假设价格范围为0到100元,我们可以定义各个等级的隶属度函数参数如下:
- 优: a 1 = 0 , b 1 = 20 a_1 = 0, b_1 = 20 a1=0,b1=20
- 良: a 2 = 10 , b 2 = 30 , c 2 = 50 a_2 = 10, b_2 = 30, c_2 = 50 a2=10,b2=30,c2=50
- 中: a 3 = 40 , b 3 = 60 , c 3 = 80 a_3 = 40, b_3 = 60, c_3 = 80 a3=40,b3=60,c3=80
- 差: a 4 = 70 , b 4 = 100 a_4 = 70, b_4 = 100 a4=70,b4=100
根据这些参数,我们可以具体写出隶属度函数:
-
对于“优”:
μ 优 ( x ) = { 1 , if x ≤ 0 20 − x 20 − 0 , if 0 < x ≤ 20 0 , if x > 20 \mu_{\text{优}}(x) = \begin{cases} 1, & \text{if } x \leq 0 \\ \frac{20 - x}{20 - 0}, & \text{if } 0 < x \leq 20 \\ 0, & \text{if } x > 20 \end{cases} μ优(x)=⎩ ⎨ ⎧1,20−020−x,0,if x≤0if 0<x≤20if x>20 -
对于“良”:
μ 良 ( x ) = { 0 , if x ≤ 10 x − 10 30 − 10 , if 10 < x ≤ 30 50 − x 50 − 30 , if 30 < x ≤ 50 0 , if x > 50 \mu_{\text{良}}(x) = \begin{cases} 0, & \text{if } x \leq 10 \\ \frac{x - 10}{30 - 10}, & \text{if } 10 < x \leq 30 \\ \frac{50 - x}{50 - 30}, & \text{if } 30 < x \leq 50 \\ 0, & \text{if } x > 50 \end{cases} μ良(x)=⎩ ⎨ ⎧0,30−10x−10,50−3050−x,0,if x≤10if 10<x≤30if 30<x≤50if x>50 -
对于“中”:
μ 中 ( x ) = { 0 , if x ≤ 40 x − 40 60 − 40 , if 40 < x ≤ 60 80 − x 80 − 60 , if 60 < x ≤ 80 0 , if x > 80 \mu_{\text{中}}(x) = \begin{cases} 0, & \text{if } x \leq 40 \\ \frac{x - 40}{60 - 40}, & \text{if } 40 < x \leq 60 \\ \frac{80 - x}{80 - 60}, & \text{if } 60 < x \leq 80 \\ 0, & \text{if } x > 80 \end{cases} μ中(x)=⎩ ⎨ ⎧0,60−40x−40,80−6080−x,0,if x≤40if 40<x≤60if 60<x≤80if x>80 -
对于“差”:
μ 差 ( x ) = { 0 , if x ≤ 70 x − 70 100 − 70 , if 70 < x ≤ 100 1 , if x > 100 \mu_{\text{差}}(x) = \begin{cases} 0, & \text{if } x \leq 70 \\ \frac{x - 70}{100 - 70}, & \text{if } 70 < x \leq 100 \\ 1, & \text{if } x > 100 \end{cases} μ差(x)=⎩ ⎨ ⎧0,100−70x−70,1,if x≤70if 70<x≤100if x>100
我们可以通过以下例子来具体说明如何使用这些隶属度函数:
假设我们有一个产品的价格为35元,我们可以计算它在每个等级上的隶属度:
-
对于“优”:
μ 优 ( 35 ) = 0 (因为 35 > 20 ) \mu_{\text{优}}(35) = 0 \quad \text{(因为 } 35 > 20) μ优(35)=0(因为 35>20) -
对于“良”:
μ 良 ( 35 ) = { 0 , if x ≤ 10 x − 10 30 − 10 , if 10 < x ≤ 30 50 − x 50 − 30 , if 30 < x ≤ 50 0 , if x > 50 \mu_{\text{良}}(35) = \begin{cases} 0, & \text{if } x \leq 10 \\ \frac{x - 10}{30 - 10}, & \text{if } 10 < x \leq 30 \\ \frac{50 - x}{50 - 30}, & \text{if } 30 < x \leq 50 \\ 0, & \text{if } x > 50 \end{cases} μ良(35)=⎩ ⎨ ⎧0,30−10x−10,50−3050−x,0,if x≤10if 10<x≤30if 30<x≤50if x>50
μ 良 ( 35 ) = 50 − 35 50 − 30 = 15 20 = 0.75 \mu_{\text{良}}(35) = \frac{50 - 35}{50 - 30} = \frac{15}{20} = 0.75 μ良(35)=50−3050−35=2015=0.75 -
对于“中”:
μ 中 ( 35 ) = 0 (因为 35 < 40 ) \mu_{\text{中}}(35) = 0 \quad \text{(因为 } 35 < 40) μ中(35)=0(因为 35<40) -
对于“差”:
μ 差 ( 35 ) = 0 (因为 35 < 70 ) \mu_{\text{差}}(35) = 0 \quad \text{(因为 } 35 < 70) μ差(35)=0(因为 35<70)
通过计算,我们得到价格为35元的产品在“优”、“良”、“中”、“差”四个等级上的隶属度分别为0、0.75、0、0。我们可以看出,这个价格被评价为“良”的程度最大,因此在模糊评价中,它更倾向于被认为是一个“良”价格。
代码实现
以下是用Python实现上述隶属度函数和隶属度计算过程的代码:
def membership_excellent(x):
if x <= 0:
return 1
elif 0 < x <= 20:
return (20 - x) / 20
else:
return 0
def membership_good(x):
if x <= 10:
return 0
elif 10 < x <= 30:
return (x - 10) / 20
elif 30 < x <= 50:
return (50 - x) / 20
else:
return 0
def membership_average(x):
if x <= 40:
return 0
elif 40 < x <= 60:
return (x - 40) / 20
elif 60 < x <= 80:
return (80 - x) / 20
else:
return 0
def membership_poor(x):
if x <= 70:
return 0
elif 70 < x <= 100:
return (x - 70) / 30
else:
return 1
# 示例价格
price = 35
# 计算隶属度
mu_excellent = membership_excellent(price)
mu_good = membership_good(price)
mu_average = membership_average(price)
mu_poor = membership_poor(price)
print("价格", price, "的隶属度:")
print("优:", mu_excellent)
print("良:", mu_good)
print("中:", mu_average)
print("差:", mu_poor)
运行上述代码,可以得到价格为35元的产品在各个评价等级上的隶属度。根据这些隶属度,我们可以进一步进行模糊综合评价。
2. 单个评价的隶属度总和不为1吗
在模糊综合评价法中,某一具体评价对象在各个评价等级上的隶属度之和不一定为1。这是因为每个隶属度函数独立计算其隶属度值,并且这些函数通常不是相互排斥的。也就是说,一个对象可以在多个评价等级中具有较高的隶属度,而这些隶属度的总和不需要为1。
这种情况正常,并且反映了模糊集合的特性。在模糊集合中,一个元素可以部分地属于多个集合,而不像在经典集合中,一个元素只能属于一个集合。
3. 主成分分析第一步的标准化数据需要做正向化处理吗,为什么Z是标准化后的数据矩阵, V 是特征向量矩阵,两者相乘即可得到答案
在主成分分析(PCA)中,第一步的标准化通常是指将数据进行均值为0、标准差为1的标准化处理(也称为Z-score标准化)。这一步并不涉及正向化处理,因为PCA的目标是寻找数据的最大方差方向,而不考虑数据的正负方向。
为什么不需要正向化处理?
正向化处理通常用于多指标综合评价时,使所有指标的高值都代表好的含义。但在PCA中,我们关注的是数据的协方差结构,即变量之间的关系和方差大小,而不是绝对值的大小或正负方向。标准化的目的是消除量纲的影响,使每个变量在同一尺度上进行比较。
为什么Z是标准化后的数据矩阵,V是特征向量矩阵,两者相乘即可得到主成分得分?
在PCA中,标准化后的数据矩阵 Z Z Z 和特征向量矩阵 V V V 的乘积 F = Z V F = ZV F=ZV 可以得到主成分得分。这是因为:
-
标准化数据矩阵 Z Z Z:这是将原始数据矩阵 X X X 进行标准化处理后的结果,使得每个变量的均值为0,标准差为1。
-
特征向量矩阵 V V V:这是从标准化数据的协方差矩阵或相关矩阵中提取的特征向量矩阵。每个特征向量表示一个主成分的方向。
-
主成分得分矩阵 F F F:将标准化数据矩阵 Z Z Z 投影到特征向量矩阵 V V V 上,即 F = Z V F = ZV F=ZV,可以得到每个样本在每个主成分上的得分。这是因为特征向量矩阵 V V V 定义了新的坐标系(主成分),而 Z V ZV ZV 表示将原始数据在这个新坐标系上的投影。
具体过程
-
标准化数据:
将原始数据矩阵 X X X 标准化,得到标准化数据矩阵 Z Z Z:
Z i j = X i j − μ j σ j Z_{ij} = \frac{X_{ij} - \mu_j}{\sigma_j} Zij=σjXij−μj
其中, μ j \mu_j μj 是第 j j j 个变量的均值, σ j \sigma_j σj 是第 j j j 个变量的标准差。 -
计算协方差矩阵:
对标准化数据矩阵 Z Z Z 计算协方差矩阵 C C C:
C = 1 n − 1 Z T Z C = \frac{1}{n-1} Z^T Z C=n−11ZTZ
其中, n n n 是样本数。 -
特征值分解:
对协方差矩阵 C C C 进行特征值分解,得到特征值 λ \lambda λ 和特征向量矩阵 V V V:
C V = V Λ C V = V \Lambda CV=VΛ
其中, Λ \Lambda Λ 是对角矩阵,其对角线上的元素为特征值。 -
计算主成分得分:
将标准化数据矩阵 Z Z Z 与特征向量矩阵 V V V 相乘,得到主成分得分矩阵 F F F:
F = Z V F = Z V F=ZV
其中, F F F 的每一列表示每个样本在对应主成分上的得分。
4. 主成分分析法中,有多少个指标,就会有多少个主成分吗?两者有何种关联
主成分分析法中,主成分的数量和原始指标的数量之间存在一定的关联。
具体来说,主成分的数量等于原始指标的数量或样本数中较小的那个。
主成分数量:
- 在主成分分析中,最多可以提取的主成分数量等于原始指标的数量 p p p。
- 如果样本数 n n n 小于指标数 p p p,则最多只能提取 n − 1 n-1 n−1 个主成分。
主成分的解释:
- 每个主成分是原始指标的线性组合,且各主成分之间是相互正交的(即不相关的)。
- 主成分是按照解释方差的多少来排序的,第一主成分(PC1)解释原始数据中最大方差,第二主成分(PC2)解释剩余方差中的最大部分,以此类推。
5. 主成分分析法和因子分析法的区别
主成分分析法(Principal Component Analysis, PCA)和因子分析法(Factor Analysis, FA)都是用于数据降维和特征提取的多变量统计方法,但它们在目的、原理和具体操作上存在显著的差异。下面详细说明两者的区别:
1) 目的不同
-
主成分分析法 (PCA)
- 目的:PCA的主要目的是通过降维减少数据的复杂性,提取数据中的主要特征,以解释数据的总变异。它将原始变量转化为一组新的、彼此不相关的变量(主成分),这些主成分按解释的方差大小排序。
- 应用:主要用于数据降维、特征提取、数据可视化和去噪等。
-
因子分析法 (FA)
- 目的:FA的主要目的是识别数据中潜在的隐藏因子,解释变量之间的相关结构。FA假设数据由少数几个潜在因子驱动,这些因子可以解释变量之间的相关性。
- 应用:主要用于构建理论模型、验证假设和探索潜在结构。
2) 原理不同
-
主成分分析法 (PCA)
- 原理:PCA通过线性变换将原始变量转换为一组新的变量(主成分),这些主成分是彼此正交(不相关)的,并按解释的方差大小排序。第一个主成分解释数据中最大方差,第二个主成分解释剩余方差中的最大部分,依此类推。
- 数学表示:对于数据矩阵 X X X(每行代表一个样本,每列代表一个变量),PCA通过求解协方差矩阵的特征值和特征向量,将数据投影到新的坐标系中。
-
因子分析法 (FA)
- 原理:FA假设观察到的变量是少数几个潜在因子和特定因子线性组合的结果。潜在因子解释了变量之间的共同方差,而特定因子解释了变量的独特方差。FA通过估计因子载荷矩阵(变量与因子之间的关系)来揭示潜在因子结构。
- 数学表示:对于数据矩阵 X X X,FA模型表示为 X = L F + E X = LF + E X=LF+E,其中 L L L 是因子载荷矩阵, F F F 是因子得分矩阵, E E E 是特定因子矩阵。
3) 假设条件不同
-
主成分分析法 (PCA)
- 假设:PCA假设原始数据是线性可分的,并没有其他具体的分布假设。它不需要假设数据满足正态分布或变量之间的独立性。
- 数据标准化:PCA通常在数据标准化(均值为0,方差为1)后进行,以消除量纲影响。
-
因子分析法 (FA)
- 假设:FA需要假设数据满足正态分布,各潜在因子相互独立,特定因子与潜在因子相互独立。
- 数据标准化:FA通常也在数据标准化后进行,但更注重变量之间的相关性。
4) 线性表示方向不同
-
主成分分析法 (PCA)
- PCA通过将原始变量表示为主成分的线性组合来减少维度。
- 公式: Z = X W Z = XW Z=XW,其中 Z Z Z 是主成分矩阵, X X X 是原始数据矩阵, W W W 是特征向量矩阵。
-
因子分析法 (FA)
- FA通过将原始变量表示为潜在因子的线性组合来解释数据的相关结构。
- 公式: X = L F + E X = LF + E X=LF+E,其中 L L L 是因子载荷矩阵, F F F 是潜在因子矩阵, E E E 是特定因子矩阵。
5) 结果解释不同
-
主成分分析法 (PCA)
- 结果解释:PCA提取的主成分是线性变换后的新变量,难以解释其具体含义。主成分按解释的方差大小排序,前几个主成分通常包含大部分信息。
- 主成分图:可以通过主成分图(PCA图)可视化数据结构,观察样本的分布和聚类情况。
-
因子分析法 (FA)
- 结果解释:FA提取的因子是数据中潜在的隐藏结构,因子载荷矩阵揭示了原始变量与潜在因子之间的关系,因子的具体含义更易解释。
- 因子旋转:为了使因子更易解释,FA通常进行因子旋转(如Varimax旋转),以获得更清晰的因子载荷矩阵。
6) 因子个数选择不同
-
主成分分析法 (PCA)
- 因子个数:PCA提取的主成分个数最多等于原始变量个数,但通常选择能解释大部分方差的前几个主成分。
-
因子分析法 (FA)
- 因子个数:FA需要根据累计方差贡献率、碎石图(Scree Plot)和研究者的先验知识来选择因子个数,因子个数通常少于原始变量个数。
7) 具体应用不同
-
主成分分析法 (PCA)
- 应用领域:广泛应用于数据降维、特征提取、图像处理、信号处理和模式识别等领域。
- 数据集:适用于较大样本量和较高维度的数据集。
-
因子分析法 (FA)
- 应用领域:广泛应用于心理学、社会学、市场研究等领域,特别是用于构建理论模型和验证假设。
- 数据集:适用于变量之间存在较强相关性的中小型数据集。
11. 学习心得
本次学习了多种权重生成的方法:层次分析法、熵权分析法、TOPSIS分析法、CRITIC方法、模糊综合评价法、秩和比分析法、主成分分析法、因子分析法和数据包络法。
其中层次分析法需要较为主观对各层次的指标进行打分,构建判断矩阵(比较矩阵主观地消除量纲影响),最终得到权重。
而熵权分析法和CRITIC方法属于数据驱动的方法,需要数据量支持。
熵权分析法需要对数据进行正向化处理(用熵值和正向化消除了量纲影响),对指标进行熵值赋权。
CRITIC分析法是一种客观的评价方法,其基本原理是综合考虑了对比强度和指标的变异强度,从而为每个指标赋予一个客观的权重。
TOPSIS分析法通过计算每个方案理想解和负理想解的距离来判断优劣。
模糊综合分析法和层次分析法一样是主观评价方法,其优点是不需要有多个同级比较对象,针对单一对象也可以通过隶属度进行评分。
秩和比分析法是一种用于多指标综合评价的方法,通过对各评价指标的秩次进行归一化处理,计算秩和比,从而进行综合评价。该方法的基本思想是将各指标的原始数据转换为秩次,计算各个评价对象的秩次和,然后进行归一化处理,最终得到秩和比。
主成分分析法的核心思想是降维,用较少的变量去解释原来数据中中的大部分变量。主成分分析法需要对数据进行正向化处理,得分越高则说明评价结果越好,越低甚至为负数则评价结果越差。
因子分析法和主成分分析法的线性表示方向不同:主成分分析中是把主成分表示成各变量的线性组合,而因子分析是把变量表示成各公因子的线性组合。在应用场景上,主成分分析主要是为了提取出中间因子对数据进行解释,而因子分析法是一种完全的分析方法,可以提取出确切的公共因子。
数据包络分析法是一系列方法的总称,它指的就是通过分析成本指标和收益指标给出效率评价的一系列方法。其核心思想是通过构建规划模型对问题进行求解。
原文地址:https://blog.csdn.net/weixin_42914989/article/details/140267834
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!