通过近似的方法,如何在sql中计算基尼系数。
如何在python中实现基尼系数计算的两种方法,可以查看我的另一篇文章。两篇文章取数相同,可以结合去看。
如果想加深对基尼系数计算的逻辑:可查看文章基尼系数计算方法 – longwind09 – 博客园。
本文中采用的近似方法,如何建立近似计算公式、如何简化推导公式可查看文章,本文基于这篇文章进行注释
http://www.360doc.com/content/14/0911/13/87990_408644530.shtml
————————————————————————————————-
近似的精确度取决于分组数量。如果样本数量为100个,如果分组数量为100,近似的方法取得的结果跟实际值相等。
但随着分组数量的减少,精确度也减少。
本文是在hive中实现,需要使用到hive中的over函数。
包括如何使用over函数进行分组、计算每组的总和以及取得累计加和等等。
使用文章中的近似公式推导简化,最后得到下面的公式。
select * from gini;
-- gini为table名称。
-- gini中的100个数据如下,字段名为wealth。
/*
346, 559, 198, 420, 39, 709, 225
, 731, 708, 369, 519, 46, 48, 446
, 117, 127, 905, 652, 528, 832, 217
, 536, 942, 608, 37, 802, 422, 884
, 746, 959, 759, 397, 245, 83, 542
, 907, 128, 933, 740, 506, 458, 830
, 874, 570, 914, 592, 585, 574, 636
, 462, 86, 321, 174, 238, 670, 690
, 456, 918, 70, 801, 695, 908, 57, 497
, 605, 334, 265, 255, 235, 199, 739, 81
, 131, 68, 229, 602, 390, 571, 733, 440
, 528, 409, 222, 55, 876, 606, 906, 549
, 487, 552, 796, 454, 301, 914, 635, 304, 503, 688, 631, 705
*/
-- 计算基尼系数时候先进行cumsum或者是先进行分组都可以。
-- 这里由于over函数计算cumsum的特殊性,先进行分组。
-- 这里显示的是分成9组
-- 9出现在两个地方:第二行,最后的计算公式中,还有就是出现在ntile之后,分成9组的时候。
-- 第二行中:计算最后的结果时候,跟推导出来的公式有所补桶。外面的sum之前多做了一个处理,减掉了1。
-- 而且上面的文章中也提到:分成了n组的情况下,1至n-1的w是需要加和的,而第n的w是不加入计算的。
-- 这是因为最后一个样本数据的cumsum是占全部的样本的总和的100%,这个数据需要去掉。
-- cum_sum_1和cum_sum_2的结果是相同的,目前简单的数据上如此,复杂之后可能不是,需要确认。
-- 在样本数量不能被分组数量整除的时候,ntile的处理,可以搜索一下hive是怎么做的。
select
(1 - (1/9) * (2*(sum(cum_sum_1)/sum(bar_sum) - 1) + 1))
from
(
select bar
, sum(wealth) as bar_sum
-- 即使bar_sum最后不需要用,也不能省略,下面的cum_sum的生成需要它,不然会报错。
-- , sum(sum(wealth)) over (order by bar rows between unbounded preceding and current row) as cum_sum_2
, sum(sum(wealth)) over(order by bar) as cum_sum_1
from
(
select wealth
, ntile(9) over (order by wealth) as bar
-- 分成9组
from gini
) a
group by bar
order by bar
limit 1000
) b
;
-- 一些结果
100组
0.310964174
-- 这个跟使用相同数据,在python上精确的求曲线下方面积的结果是相等的。
-- 可见我的另一片使用pyhton计算基尼系数的文章。
20组
0.31025484587225693
9组
0.300356286353766
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/183550.html原文链接:https://javaforall.cn