如何使用熵值法分组计算核心指标权重,并为项目打分 您所在的位置:网站首页 熵值法计算权重为0 如何使用熵值法分组计算核心指标权重,并为项目打分

如何使用熵值法分组计算核心指标权重,并为项目打分

2024-07-09 09:10| 来源: 网络整理| 查看: 265

计算核心指标权重是一种常见的分析方法,常见的计算权重的方法的原理及使用条件可参考https://baijiahao.baidu.com/s?id=1661019965038118642&wfr=spider&for=pc。

在实际工作中,需要结合数据的特征情况选择权重计算方法。我在B端项目分析中更多考虑的是数据所携带的信息量,故选择了熵值法。本次权重计算的不同之处在于,项目具有较强的行业属性,须按照行业进行数据分组,然后计算不同行业的核心指标权重及项目得分。

由于数据涉及公司信息,本文仅介绍python的实现过程。

第一步:数据读取及清洗 import pandas as pd import numpy as np import math #数据读取 project=pd.read_csv('.../项目核心指标0618.csv',encoding='utf-8') #选择总金额不为空的样本数据,并将样本中所有空值替换为0 project_clean=(project[project['总金额']!='(null)']).replace('(null)',0) #将指标由object转化为float类型 project_clean.iloc[:,4:]=(project_clean.iloc[:,4:]).astype('float') #新增指标 project_clean['x3']=project_clean.apply(lambda x:x['二级获客']/x['总获客数'],axis=1) project_clean['x4']=project_clean.apply(lambda x:x['三级获客']/x['总获客数'],axis=1) #数据转化为三位小数 project_clean.iloc[:,[8,9,16,17]]=round(project_clean.iloc[:,[8,9,16,17]],3)

空值填充也可使用fillna()函数,需要按照数据实际情况来选择。

第二步:定义熵值法函数

考虑到按照项目分组后可能会出现指标取单一值的情况,故在指标标准化计算中加入if函数

def cal_weight(df): '''熵值法计算变量的权重''' # 标准化 df= df.apply(lambda x: ((x - np.min(x)) / (np.max(x) - np.min(x))) if np.max(x) != np.min(x) else 1) df=pd.DataFrame(df) # 求k rows = df.index.size # 行 cols = df.columns.size # 列 k = 1.0 / math.log(rows) # print('k:',k) lnf = [[None] * cols for i in range(rows)] # 矩阵计算-- # 信息熵 # p=array(p) df = np.array(df) lnf = [[None] * cols for i in range(rows)] lnf = np.array(lnf) for i in range(0, rows): for j in range(0, cols): if df[i][j] == 0: lnfij = 0.0 else: p = df[i][j] / df.sum(axis=0)[j] # print('p:',p) # print('i:',i) # print('j:',j) lnfij = math.log(p) * p * (-k) lnf[i][j] = lnfij lnf = pd.DataFrame(lnf) E = lnf # 计算冗余度 d = 1 - E.sum(axis=0) # 计算各指标的权重 w = [[None] * 1 for i in range(cols)] for j in range(0, cols): wj = d[j] / sum(d) w[j] = wj # 计算各样本的综合得分,用最原始的数据 w = pd.DataFrame(w) return w

第三步:计算不同行业下核心指标权重,得到权重矩阵

#提取行业及指标 project_ind=project_clean.iloc[:,[3,8,9,16,17]] #分组调用权重函数 grouped=project_ind.groupby(['INDUSTRY']).apply(cal_weight).reset_index() grouped1 = pd.pivot(grouped, index=['INDUSTRY'], columns="level_1", values=0) #权重数据重命名 new_columns=['w1','w2','w3','w4'] grouped1.columns=new_columns

第四步:将清洗后的项目矩阵及权重矩阵按照行业分组

#权重矩阵按行业分组 grouped_industry=grouped1.groupby('INDUSTRY') grouped_industry1=pd.DataFrame(columns=grouped.columns) for key,value in grouped_industry: grouped_industry1=pd.concat([grouped_industry1,value]) #项目矩阵按行业分组 project_industry=project_ind.groupby('INDUSTRY') grouped_industry=grouped.groupby('INDUSTRY') project_industry1=pd.DataFrame(columns=project_ind.columns) for key,value in project_industry: project_industry1=pd.concat([project_industry1,value])

第五步:项目矩阵及权重矩阵相乘,计算不同行业下各B端项目分值

#定义矩阵相乘函数 def func(df): df_sub=df.iloc[:,1:].values for i in df.iloc[:,0]: w=grouped1.loc[i].values s=np.matmul(df_sub,w) return s #调用矩阵函数,计算项目得分 score=func(project_industry1) score=pd.DataFrame(score) score.index=project_industry1.index score.columns=['score'] #将项目得分与项目矩阵拼接 result=pd.merge(project_clean,g,how='inner',left_on=project_clean.index,right_on=g.index)

第六步:同行业项目按照分值降序排列,并输出excel文件

def func(df): return df.sort_values(by='score',ascending=False) result1=result.groupby('INDUSTRY').apply(func) result1.to_excel('/Users/saizhang/Desktop/项目分值(按照行业).xlsx')

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有