熵权法原理及操作方法

熵权法

数据波动越大,信息量就越大。 举例:语文成绩与数学成绩,通过不同努力程度,语文成绩提升变化不大,但是数学努力前后会有较大的变化。

熵权法赋权步骤

  1. 数据标准化 目的:让不同类型的数据可以进行比较 举例:第一组数 1001、1200、1300… 第二组数 0.0001、0.0002、0.0003… 2.求各个指标的信息熵

3.确定各指标权重

excel操作

初始数据,波动分别为小、大、中 进行标准化 对所有的数据除以100 求p,用每一个标准化的数值除以总计数值 把0改为0.000001,避免之后取对数出错,误差很小可以忽略不记。 求plnp,直接计算 如果不改0的花可以在计算结果出来后,手动将计算结果改成0 求e值,将所有plnp加起来乘 -k 即e = -SUM(plnp)/LN(6) 求d值,d = 1-e 计算权重w,w = di / SUM(di)

stata操作

模板代码如下

//cd "C:UsersAdministratorDesktop"
//import excel using experiencedata.xlsx,first clear x16 x17 x18 x19 x23 x24
///标准差标准化
global positive_var x1 x4 x6 x7 x8 x10 x12 x14 x15 
global negative_var x2 x3 x5 x9 x11 x13

//下面的不变,包括正负项指标
global all_var $positive_var $negative_var
	foreach i in $positive_var {
		qui sum `i
		gen x_`i=(`i-r(min))/(r(max)-r(min))
	}
	foreach i in $negative_var {
		qui sum `i
		gen x_`i=(r(max)-`i)/(r(max)-r(min))
	}
	//计算各指标的比重
	foreach i in $all_var {
		egen `i_sum=sum(x_`i)
		gen y_`i=x_`i/`i_sum
	}
	
	//根据比重计算各分量的信息熵
	gen n=_N

	foreach i in $all_var {
		gen y_lny_`i=y_`i*ln(y_`i)
		replace y_lny_`i=0 if x_`i==0
	}
	//求和
	foreach i in $all_var {
		egen y_lny_`i_sum=sum(y_lny_`i)
	}
	//计算各指标的贡献总量。熵值ej
	foreach i in $all_var {
		gen E_`i= -1/ln(n)*y_lny_`i_sum
	}
	//计算各指标的权重,差异系数d
	foreach i in $all_var {
		gen d_`i= 1-E_`i
	}
	
	egen d_sum = rowtotal(d_*)
	foreach i in $all_var {
		gen W_`i= d_`i/d_sum
		
	}
	egen W=rowtotal(W_*)
	//计算综合得分
	foreach i in $all_var {
		gen Score_`i= x_`i*W_`i
	}
	egen Score=rowtotal(Score_*)

在上述语数英成绩的代码使用如下:

global positive_var C M E
global all_var $positive_var
	foreach i in $positive_var {
		qui sum `i
		gen x_`i=(`i-r(min))/(r(max)-r(min))
	}
	foreach i in $all_var {
		egen `i_sum=sum(x_`i)
		gen y_`i=x_`i/`i_sum
	}
	gen n=_N

	foreach i in $all_var {
		gen y_lny_`i=y_`i*ln(y_`i)
		replace y_lny_`i=0 if x_`i==0
	}
	foreach i in $all_var {
		egen y_lny_`i_sum=sum(y_lny_`i)
	}
	foreach i in $all_var {
		gen E_`i= -1/ln(n)*y_lny_`i_sum
	}
	//计算各指标的权重,差异系数d
	foreach i in $all_var {
		gen d_`i= 1-E_`i
	}
	
	egen d_sum = rowtotal(d_*)
	foreach i in $all_var {
		gen W_`i= d_`i/d_sum
		
	}
	egen W=rowtotal(W_*)
	//计算综合得分
	foreach i in $all_var {
		gen Score_`i= x_`i*W_`i
	}
	egen Score=rowtotal(Score_*)
经验分享 程序员 微信小程序 职场和发展