python计算基尼系数_PHP算法

python计算基尼系数_PHP算法什么是基尼系数基尼系数是指国际上通用的、用以衡量一个国家或地区居民收入差距的常用指标。是20世纪初意大利经济学家基尼,于1922年提出的定量测定收入分配差异程度的指标。它是根据洛伦兹曲线找出了判断分配平等程度的指标(如下图)。设实际收入分配曲线和收入分配绝对平等曲线之间的面积为A,实际收入分配曲线右下方的面积为B。并以A除以A+B的商表示不平等程度。这个数值被称为基尼系数或称洛伦茨系…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

 什么是基尼系数

基尼系数是指国际上通用的、用以衡量一个国家或地区居民收入差距的常用指标。是20世纪初意大利经济学家基尼,于1922年提出的定量测定收入分配差异程度的指标。它是根据洛伦兹曲线找出了判断分配平等程度的指标(如下图)。

python计算基尼系数_PHP算法

设实际收入分配曲线和收入分配绝对平等曲线之间的面积为A,实际收入分配曲线右下方的面积为B。并以A除以A+B的商表示不平等程度。这个数值被称为基尼系数或称洛伦茨系数。如果A为零,基尼系数为零,表示收入分配完全平等;如果B为零则系数为1,收入分配绝对不平等。该系数可在零和1之间取任何值。收入分配越是趋向平等,洛伦茨曲线的弧度越小,基尼系数也越小,反之,收入分配越是趋向不平等,洛伦茨曲线的弧度越大,那么基尼系数也越大。如果个人所得税能使收入均等化,那么,基尼系数即会变小。
 

基尼系数最大为“1”,最小等于“0”。基尼系数越接近0表明收入分配越是趋向平等。国际惯例把0.2以下视为收入绝对平均,0.2-0.3视为收入比较平均;0.3-0.4视为收入相对合理;0.4-0.5视为收入差距较大,当基尼系数达到0.5以上时,则表示收入悬殊。

 基尼系数的计算公式推导

 

python计算基尼系数_PHP算法

 A+B的面积=1/2*100%*100%=1/2

其次计算B的面积的话,由于洛伦茨曲线是一条不规则的曲线,无法直接计算B的面积,因此采用近似梯形的面积来代替。

假定全部人口平均分为n组,已累积到第i组人口总收入占全部人口总收入的比重Wi为下底,已累计的第i-1组人口总收入收入占全部人口总收入的比重Wi-1为上底,以每组人口占全部人口的比例即1/n为高,计算一个个小梯形的面积,并加总,即得到近似B的面积:

    python计算基尼系数_PHP算法

python计算基尼系数_PHP算法

因此基尼系数的计算公式为:

python计算基尼系数_PHP算法

例子:用户补贴从小到大排列,均分n=100份,前1%用户的总补贴,(0%-2.0%) 用户的总补贴,。。。 0%-100%用户的总补贴为:[1,1+2,1+2+3,…,1+2+…+100]

           1、全部用户总补贴累计为1+2+3+…+100=5050

           2、每一组已累计补贴占用比重分别为[1/5050,(1+2)/5050,(1+2+3)/5050,…,(1+2+…+100)/5050],假设分别对应到y轴上的高为a,b,c,d, … ,ma,max,a=1/5050,……,max=(1+2+…+100)/5050

           3、B的面积就是计算每一个小梯形面积之后进行累加,梯形的高均为1/n,面积累加就是1/n*[(0+a)/2+(a+b)/2+(b+c)/2+……(ma+max)/2] = 1/n*[(b+c+…+ma+max) – max/2]   

第一个小梯形实际是个三角形,面积是1/n*[(0+a)/2],注意最后一个梯形的下底只加了一次max/2,最后汇总完之后会减去一个max/2

B的面积=[(1)+(1+2)+(1+2+3)+……+(1+2+3+……+100) – (1+2+3+……+100)/2 ]/5050/100

           4、基尼系数G=1-2B=1-2[(1)+(1+2)+(1+2+3)+……+(1+2+3+……+100) – (1+2+3+……+100)/2 ]/5050/100

代码实现

Python实现

import numpy as np
n = 100
wealths = [i for i in range(1,101)] #[1,2,3…100]
cum_wealths = np.cumsum(sorted(np.append(wealths, 0))) #加上0,再排序,再计算cumsum
max = cum_wealths[-1]  # 取最后一个,也就是原数组的和
print(np.sum(cum_wealths)) #np.sum(cum_wealths) 是将所有元素求和
print(1-2*((np.float(np.sum(cum_wealths))-max/2)/max/n) #代入基尼系数公式

 

其他的Python实现方式可参考:  http://www.pianshen.com/article/85166463/

SQL实现

with userdaystat as (
    select COALESCE(total_cash,0) total_cash
        ,ntile(100) over(order by COALESCE(total_cash,0) asc ) as bucket_id --按补贴升序的顺序平均分成100份 
    --  Ntile:是一个窗口函数,它把有序的数据集合 平均分配 到 指定的数量(num)个桶中, 将桶号分配给每一行。如果不能平均分配,则优先分配较小编号的桶,并且各个桶中能放的行数最多相差1。
    from sync_mongo_box.extract_source__userdaystat
    where pt = '2019-09-01'
) , subsidy_rank as (
    select bucket_id
        ,avg(total_cash) total_cash_avg --按照分组分别计算每一组补贴的平均值
    from userdaystat
    group by bucket_id
)
select 1-(sum(total_cash_avg * (101-bucket_id))-sum(total_cash_avg)/2)/sum(total_cash_avg)/50  --代入基尼系数公式
from subsidy_rank


--最后结果公式约分后
 
with userdaystat as (
    select COALESCE(total_cash,0) total_cash
        ,ntile(100) over(order by COALESCE(total_cash,0) asc ) as bucket_id --按补贴升序的顺序平均分成100份 
    --  Ntile:是一个窗口函数,它把有序的数据集合 平均分配 到 指定的数量(num)个桶中, 将桶号分配给每一行。如果不能平均分配,则优先分配较小编号的桶,并且各个桶中能放的行数最多相差1。
    from sync_mongo_box.extract_source__userdaystat
    where pt = '2019-09-01'
)
select 1-(sum(total_cash * (101-bucket_id))-sum(total_cash)/2)/sum(total_cash)/50
from userdaystat;

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/184862.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • springcloud和dubbo区别「建议收藏」

    springcloud和dubbo区别「建议收藏」最大区别SpringCloud抛弃了Dubbo的RPC通信,采用的是基于HTTP的REST方式。这两种方式各有优劣。虽然从一定程度上来说,后者牺牲了服务调用的性能,但也避免了上面提到的原生RPC带来的问题。而且REST相比RPC更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的强依赖,这在强调快速演化的微服务环境下,显得更加合适。…

  • 小爱同学app官方网站(小爱同学唤醒app)

    小爱同学app是一款以连接小爱同学享受人工智能乐趣生活为核心卖点的软件,超多种类的手机都能够使用,无论是苹果亦或是华为小米等,都能够完美的配适,并且还能使用手机唤醒小爱同学,帮它联网,教他各种不同的知识,之后还能和你愉快的聊天!小爱同学app特色听听音乐,看看各种笑话,休闲无比放松逗小爱,即时你是孤身一人也不再会孤单!远程操控你的各种智能设备,远距离控制不再是问题,解决所有的难题!自带语音识别的功…

  • Oracle恢复某个时间之前的数据「建议收藏」

    Oracle恢复某个时间之前的数据「建议收藏」如果数据进行的误删除,我们需要回到删除之前的数据,可以进行恢复操作。第一步:查询这个时间点的数据查询这个时间点的数据,看是否是自己需要的数据。select*fromtablenameasoftimestampto_timestamp(‘2018-05-0413:30:00′,’yyyy-MM-ddhh24:mi:ss’)第二步:核对数据库系统时间有可能因为系统时间和数据库时间不一致查不出数据所以先查询数据库的时间。selectto_char(sysdate,’yyyy-

  • Vue(4)Vue指令的学习1

    Vue(4)Vue指令的学习1前言Vue官网一共有提供了14个指令,分别如下v-textv-htmlv-showv-if☆☆☆v-else☆☆☆v-else-if☆☆☆v-for☆☆☆v-on☆☆☆v

  • matlab维纳滤波器函数_无源定位matlab源程序

    matlab维纳滤波器函数_无源定位matlab源程序维纳滤波器fir滤波器程序clear;clc;%输入信号A=1;%信号的幅值f=1000;%信号的频率fs=10^5;…

  • endnote参考文献改为文字(参考文献endnote格式)

    最简单的,自动下载style:打开endnote—-edit—-outputstyles—-openstylemaneger—-在新打开的界面中点击中部的getmoreontheweb,此时自动连接endnote官网,在网页中部的搜索窗口输入目标杂志名称,点击search,然后在弹出的resultsfound下方点击搜索结果后方的download,下载文件,之…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号