变异系数法是直接利用各项指标所包含的信息,通过计算得到指标的权重。是一种客观赋权的方法。此方法的基本做法是:在评价指标体系中,指标取值差异越大的指标,也就是越难以实现的指标,这样的指标更难反映被评价单位的差距。
由于评价指标体系中的各项指标的量纲不同,不宜直接比较其差别程度。为了消除各项评价指标的量纲不同的影响,需要用各项指标的变异系数来衡量各项指标取值的差异程度。各项指标的变异系数公式如下:
算法步骤总结:
1、先计算每个指标的所有平均值,标准差
2、然后计算每个指标的变异系数。
3、然后计算每个指标的权重。
4、然后计算每个部落的总分。
5、然后对总分进行max-min归一化。
6、然后将总分值映射成0-100之间的分数作为部落的热度值。
7、然后对所有热度值从大到小排序。
变异系数确定权重源代码实现:
# -*- encoding=utf-8 -*-
import pandas as pd
import numpy as np
# 自定义归一化函数
def autoNorm(data):
"""
:param data: 列表
:return: 归一化列表
"""
arr = np.asarray(data)
norm_list=[]
for x in arr:
x = round(float(x - np.min(arr)) / ((np.max(arr) - np.min(arr))+0.001),4)
norm_list.append(x)
return norm_list
# 自定义热度值计算函数
def get_hot_value(context_train_data):
"""
:param context_train_data:数据框
:return: 热度值分数
"""
# 求相关列均值与标准差
context_train_mean = context_train_data.mean(axis=0)
context_train_std = context_train_data.std(ddof=0)
# 求变异系数
context_train_cof_var = context_train_std/context_train_mean
# 对变异系数求和
sum_context_train_cof_var = context_train_cof_var.sum()
# 得出权重
context_train_wi = context_train_cof_var/sum_context_train_cof_var
# 将权重转换为矩阵
cof_var = np.mat(context_train_wi)
# 将数据框转换为矩阵
context_train_data = np.mat(context_train_data)
# 权重跟自变量相乘
last_hot_matrix = context_train_data * cof_var.T
last_hot_matrix = pd.DataFrame(last_hot_matrix.T)
# 累加求和得到总分
last_hot_score =list(last_hot_matrix.apply(sum))
# max-min 归一化
last_hot_score_autoNorm=autoNorm(last_hot_score)
# 部落的热度值映射成分数(0-100分)
last_hot_score_result=[i*100 for i in last_hot_score_autoNorm]
return last_hot_score_result
if __name__ == '__main__':
# 读取数据
# context_train_data=pd.DataFrame(np.arange(24).reshape(4,6),columns=['x1','x2','x3','x4','x5','x6'])
data=pd.read_excel('C:\\Users\\xiaohu\\Desktop\\文本挖掘\\部落的热度算法\\data.xlsx')
# 拿出所有自变量数据(不包含部落id,部落名称)
context_train_data=data.iloc[:,2:16]
print(context_train_data)
# 调用热度值计算函数
last_hot_score_result =get_hot_value(context_train_data)
# 增加一列部落名
context_train_data['tribe_name']=data['tribe_name']
# 增加一列热度值
context_train_data['tribe_hot_value']=last_hot_score_result
# 然后对数据框按热度值从大到小排序
result=context_train_data.sort_values(by = 'tribe_hot_value',axis = 0,ascending = False)
result['rank']=range(1,len(result)+1)
print(result)
# 输出excel
# 写出csv数据
result.to_csv('C:\\Users\\xiaohu\\Desktop\\文本挖掘\\部落的热度算法\\result.csv', index=False)