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

计算核心指标权重是一种常见的分析方法,常见的计算权重的方法的原理及使用条件可参考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')

 

你可能感兴趣的:(python学习,数据运营,python,数据分析)