DEMATEL方法Python代码(识别关键影响因素)

说明:

  1. DEMATEL法过程中,使用行最大值法进行了标准化。
  2. 代码运行后得到的权重(即归一化后的中心度)应该不能直接理解成影响因素的重要性;关键影响因素的确定应该综合考虑中心度、原因度、影响度和被影响度,具体确认方法可以参考《情报科学》上的一些论文,例如:DOI,10.13833/j.issn.1007-7634.2023.09.006

代码包含了绘制因果关系图的功能。具体代码(python)如下:
使用方法是:将analytic_matrix修改成自己的直接影响矩阵就行。

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]=["Songti SC"] #设置字体,注意Windows这里可以换成SimHei。(主要是换成自己系统有的字体)
plt.rcParams["axes.unicode_minus"]=False #正常显示负号

def dematel(analytic_matrix):
    """
    执行DEMATEL分析。

    参数:
    - analytic_matrix: numpy数组,表示元素间的直接关系矩阵。

    返回值:
    - D: 表示总关系矩阵行和的numpy数组,指示影响程度。
    - R: 表示总关系矩阵列和的numpy数组,指示被影响程度。
    - D_plus_R: 表示元素的总重要性的numpy数组;中心度
    - D_minus_R: 表示元素间因果关系的numpy数组;原因度
    - priority: 权重,D+R的归一化 (注:这个权重应该不能直接理解成重要性;关键影响因素的确定应该综合考虑中心度、原因度、影响度和被影响度,具体确认方法可以参考《情报科学》上的一些论文,例如:DOI,10.13833/j.issn.1007-7634.2023.09.006)
    - status: 字符串,指示分析的成功或失败状态。
    """

    # 步骤1: 标准化矩阵
    # 对每一行求和,找到和的最大值
    max_row_sum = np.max(analytic_matrix.sum(axis=1))
    print(max_row_sum)
    # 使用最大行和的值进行标准化
    normalized_matrix = analytic_matrix / max_row_sum
    
    # 步骤2: 计算总关系矩阵
    identity_matrix = np.eye(len(normalized_matrix))  # 与分析矩阵同维度的单位矩阵
    print(identity_matrix)
    try:
        inv_matrix = np.linalg.inv(identity_matrix - normalized_matrix)  # 计算逆矩阵
        total_relation_matrix = np.dot(normalized_matrix, inv_matrix)  # 计算总关系矩阵
    except np.linalg.LinAlgError:
        return None, None, None, None, "矩阵求逆失败。提供的矩阵可能不可逆。"
    
    # 步骤3: 计算 D, R, D+R, D-R
    D = total_relation_matrix.sum(axis=1)  # 行和,影响程度
    R = total_relation_matrix.sum(axis=0)  # 列和,被影响程度
    D_plus_R = D + R  # 中心度
    priority = D_plus_R/D_plus_R.sum() # 权重
    D_minus_R = D - R  # 原因度
    
    return D, R, D_plus_R, priority, D_minus_R, "成功"

# 示例使用

analytic_matrix = np.array([
    [0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
    [0, 1, 0, 1, 1, 2, 0, 0, 0, 1],
    [0, 0, 0, 0, 2, 0, 0, 1, 1, 1],
    [0, 0, 0, 2, 0, 0, 0, 0, 0, 1],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [0, 0, 0, 1, 1, 0, 0, 1, 0, 1],
    [0, 0, 0, 1, 1, 2, 0, 0, 3, 1],
    [0, 0, 0, 0, 0, 2, 0, 0, 0, 0],
    [0, 0, 0, 1, 1, 0, 0, 2, 1, 0]
])


D, R, D_plus_R, priority, D_minus_R, status = dematel(analytic_matrix)

if status == "成功":
    print("影响度 (D):", D)
    print("被影响度 (R):", R)
    print("中心度 (D+R):", D_plus_R)
    print("权重priority:",priority)
    print("原因度 (D-R):", D_minus_R)
else:
    print(status)

# 绘制中心度-原因度因果关系图

# 绘制因果关系图
plt.figure(figsize=(8, 6))
plt.scatter(D_plus_R, D_minus_R, color='blue') # 绘制点

# 标注每个点的因素编号(可选)
for i, (x, y) in enumerate(zip(D_plus_R, D_minus_R), start=1):
    plt.text(x, y, f'F{i}', fontsize=9)

# 添加轴标签
plt.xlabel('中心度')
plt.ylabel('原因度')

# 绘制中心度和因果度的平均值线(可选)
plt.axvline(x=np.mean(D_plus_R), color='red', linestyle='--')
plt.axhline(y=np.mean(D_minus_R), color='red', linestyle='--')

# 设置图表标题
plt.title('因果图 (Causal Diagram)')

# 显示图表
plt.grid(True)
plt.show()

    
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值