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