灰色关联分析及实践
1 背景
近期需要针对某省份十大关心的产业进行一个产业协同分析,从而分析出不同产业之间的关联程度,以及单独产业的上中下游情况,最后可以通过全产业分析得出警示名单~在中美竞争的大格局下,全产业链的分析显得尤为重要!
本文主要阐述第一层:不同产业之间的关联程度,用到的统计分析方法是灰色关联分析(Grey Relation Analysis,GRA)。
2 灰色关联分析
2.1 定义
何为灰色关联分析?
通过查询,官方定义为:灰色关联分析是指对一个系统发展变化态势的定量描述和比较的方法,其基本思想是通过确定参考数据列和若干个比较数据列的几何形状相似程度来判断其联系是否紧密,它反映了曲线间的关联程度。 在系统发展过程中,若两个因素变化的趋势具有一致性,即同步变化程度较高,即可谓二者关联程度较高;反之,则较低。
2.2 名称起源
为什么叫【灰色】?
-
灰色系统这个概念的提出是相对于白色系统和黑色系统而言的。
-
这个概念最初是由控制科学与工程的教授邓聚龙提出的。
按照控制论的惯例,颜色一般代表的是对于一个系统我们已知的信息的多少,比如一个力学系统: -
白色就代表信息充足,元素之间的关系都是能够确定的,这就是一个白色系统
-
而黑色系统代表我们对于其中的结构并不清楚的系统,通常叫做黑箱或黑盒的就是这类系统。
-
灰色介于两者之间,表示我们只对该系统有部分了解
2.3 思想
根据不同序列曲线几何形状的相似程度来判断其联系是否紧密。曲线越接近,相应序列之间的关联度就越大,反之就越小。
2.4 作用
灰色关联分析主要有两个作用:
-
系统分析,判断影响系统发展的因素的重要性
-
综合评价,给出研究对象或者方案的优劣排名
本文介绍主要是上述第二个作用,即综合评价不同因素之间互相影响的大小,给出排名~
2.5 算法步骤
- 确定参考序列(要研究的目标列)和比较序列(影响目标列的众多影响因素列)
- 归一化处理。包括标准化/0-1归一化等等
- 计算灰色关联系数。具体见下:
- 计算关联系数的均值,得到关联度(对于每个因素而言)
2.6 评价标准
计算得到的关联度(协同度)系数后,多大才算优质协同?多少又是非常不协同(严重失调)?下表可以作为一个参考:
2.7 应用
应用1: 旅游业发展程度的影响因子
结合上表的数据,第一行【旅游总收入】代表了旅游发展的程度,剩余的因素均是我们分析的范围,最终通过【灰色关联分析】可以得到如下结果表:
应用2:哪一种产业对GDP总量影响最大?
下表为某一地区国内生产总值的统计数据(单位:百万元),问该地区从2000年到2005年之间哪一种产业对GDP总量影响最大?
最终通过灰色关联分析,得到关联度的结果为:
- 第一列表示灰色关联分析公式中的分辨系数的取值(一般位于[0,1]之间,往往取0.5)
- 可以看到第三产业同GDP的关联度是最高的,说明该地区00-05年 第三产业对GDP影响最大!
应用3:不同产业之间的协同度(关联度)
不同产业之间在同一范围内的同一指标数据(销售额或用电量),分析不同产业之间的协同度(关联度),即得到哪些产业之间关联性(协同性)比较强
本部分案例将会在接下来的Python实现部分进行演示。
3 Python实现
3.1 读入数据
gra_data = df1.iloc[:5,:5]
gra_data['年份'] = range(2000,2005)
gra_data = gra_data[['年份', '数字安防', '集成电路', '网络通信', '智能计算', '生物医药']]
gra_data
年份 | 数字安防 | 集成电路 | 网络通信 | 智能计算 | 生物医药 | |
---|---|---|---|---|---|---|
0 | 2000 | 0.094003 | 0.065841 | 0.107861 | 0.051384 | 0.042548 |
1 | 2001 | 0.106776 | 0.072375 | 0.124079 | 0.060716 | 0.045762 |
2 | 2002 | 0.133319 | 0.096361 | 0.150813 | 0.075517 | 0.055757 |
3 | 2003 | 0.059536 | 0.052358 | 0.068300 | 0.044976 | 0.045501 |
4 | 2004 | 0.049794 | 0.043851 | 0.047127 | 0.022645 | 0.034666 |
3.2 确定参考序列和比较序列
上面数据中,
- 参考序列为第一列—数字安防
- 比较序列为【集成电路、网络通信、智能计算和生物医药】
目的是看这些产业哪一个和【数字安防】产业链协同最高?
import copy
df = copy.deepcopy(gra_data.iloc[:,1:])
df
数字安防 | 集成电路 | 网络通信 | 智能计算 | 生物医药 | |
---|---|---|---|---|---|
0 | 0.094003 | 0.065841 | 0.107861 | 0.051384 | 0.042548 |
1 | 0.106776 | 0.072375 | 0.124079 | 0.060716 | 0.045762 |
2 | 0.133319 | 0.096361 | 0.150813 | 0.075517 | 0.055757 |
3 | 0.059536 | 0.052358 | 0.068300 | 0.044976 | 0.045501 |
4 | 0.049794 | 0.043851 | 0.047127 | 0.022645 | 0.034666 |
i = 0
#区分参考序列和比较序列
ref=df.iloc[:,i]#为参考序列
print(ref)
com=df.drop(list(df)[i],axis=1)#为比较序列
print(com)
0 0.094003
1 0.106776
2 0.133319
3 0.059536
4 0.049794
Name: 数字安防, dtype: float64
集成电路 网络通信 智能计算 生物医药
0 0.065841 0.107861 0.051384 0.042548
1 0.072375 0.124079 0.060716 0.045762
2 0.096361 0.150813 0.075517 0.055757
3 0.052358 0.068300 0.044976 0.045501
4 0.043851 0.047127 0.022645 0.034666
#计算比较序列矩阵的行列
m=com.shape[0]
n=com.shape[1]
print(m,n)
5 4
3.3 归一化处理
上表中数据已经做过了归一化处理,所以跳过
3.4 计算灰色关联系数
import numpy as np
#与参考序列比较,相减
a=np.zeros([m,n])
for i in range(m):
for j in range(n):
a[i,j]=abs(com.iloc[i,j]-ref[i])
a
array([[0.02816244, 0.01385809, 0.04261892, 0.05145495],
[0.03440162, 0.017303 , 0.04606022, 0.06101445],
[0.03695806, 0.0174945 , 0.05780182, 0.07756191],
[0.00717776, 0.00876366, 0.01456014, 0.01403498],
[0.00594268, 0.00266634, 0.02714887, 0.01512727]])
#取出数组中最大值与最小值
a_max=np.max(a)
a_min=np.min(a)
print(a_max, a_min)
0.0775619109705818 0.0026663364003993995
#计算灰色关联系数
key=np.zeros([m,n])
for i in range(m):
for j in range(n):
key[i,j]=(a_min+0.5*a_max)/(a[i,j]+0.5*a_max)
key
array([[0.61913933, 0.78738691, 0.50918124, 0.45932151],
[0.56635468, 0.73902225, 0.48852802, 0.41532263],
[0.54723829, 0.7365075 , 0.42913751, 0.35625125],
[0.90183748, 0.87175572, 0.77702369, 0.78474976],
[0.92674251, 1. , 0.62865768, 0.76884916]])
3.5 计算灰色关联度
# 计算灰色关联度
result=np.zeros(n)
for i in range(n):
result[i]=np.mean(key[:,i])
result=result.tolist()
result
[0.712262459001454, 0.8269344752760619, 0.5665056298663332, 0.5568988632058057]
3.6 结论
- 【网络通信】产业链和【数字安防】产业链的协同度最高,
- 而【生物医药】和【数字安防】协同度最低。
4 总结
- GRA算法本质上来讲就是提供了一种度量两个向量之间距离的方法,对于有时间性的因子,向量可以看成一条时间曲线,而GRA算法就是度量两条曲线的形态和走势是否相近。
- 为了避免其他干扰,凸出形态特征的影响,GRA先做了归一化,将所有向量矫正到同一个尺度和位置,然后计算每个点的距离。最后,通过min min 和max max 的矫正,使得最终输出的结果落在0到1之间,从而符合系数的一般定义。rho调节不同关联系数之间的差异,换句话说,就是输出的分布,使其可以变得更加稀疏或者紧密。
- 以数学角度要言之,该算法即度量已归一化的子向量与母向量的每一维度的l1-norm距离的倒数之和,并将其映射到0~1区间内,作为子母向量的关联性之度量的一种策略。
5 参考
- https://blog.csdn.net/edogawachia/article/details/85330067
- https://zhuanlan.zhihu.com/p/161536409
- https://zhuanlan.zhihu.com/p/217939656