基尼系数简单算法举例说明_趣学python算法100例

基尼系数简单算法举例说明_趣学python算法100例1912年意大利经济学家基尼,设计了一个测度社会贫富差距的方法沿用至今,成为国际通用的标准。文章中通过python,公式法以及面积法计算2008年美国收入情况的基尼系数。并补充列表推导式相关介绍使用。

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

Jetbrains全系列IDE稳定放心使用

前些天听了南京大学周耿老师关于“基尼系数计算”的直播课,需要时间好好消化,便有了整理此篇文章的想法。

1 基尼系数

1.1 简介

1912年意大利经济学家基尼,设计了一个测度社会贫富差距的方法沿用至今,成为国际通用的标准。

基尼系数最大为“1”,最小等于“0”。基尼系数越接近0表明收入分配越是趋向平等。国际上并没有一个组织或教科书给出最适合的基尼系数标准。但有不少人认为基尼系数小于0.2时,居民收入过于平均,0.2-0.3之间时较为平均,0.3-0.4之间时比较合理,0.4-0.5时差距过大,大于0.5时差距悬殊。
在这里插入图片描述

世界部分国家基尼系数排行1970-2019

1.2 定义

基尼系数有好几种定义方式,老师在课上公式法中运用的是下面第二张图中的公式,还有其他的一些公式,感兴趣的也可以自己通过代码实现,用来对比不同算法之间的差异。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F2mfW2uU-1625838881521)(【0701】python基尼系数计算实践(案例+代码).assets/image-20210709205553354.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1YZG6aNE-1625838881541)(【0701】python基尼系数计算实践(案例+代码).assets/image-20210709205651303.png)]

2 实践

2.1 公式法

G = ∑ i = 1 n ∑ j = 1 n ∣ x i − x j ∣ 2 ∑ i = 1 n ∑ j = 1 n x j = ∑ i = 1 n ∑ j = 1 n ∣ x i − x j ∣ 2 n ∑ i = 1 n x i G=\frac{\sum_{i=1}^{n} \sum_{j=1}^{n}\left|x_{i}-x_{j}\right|}{2 \sum_{i=1}^{n} \sum_{j=1}^{n} x_{j}}=\frac{\sum_{i=1}^{n} \sum_{j=1}^{n}\left|x_{i}-x_{j}\right|}{2 n \sum_{i=1}^{n} x_{i}} G=2∑i=1n​∑j=1n​xj​∑i=1n​∑j=1n​∣xi​−xj​∣​=2n∑i=1n​xi​∑i=1n​∑j=1n​∣xi​−xj​∣​

代码如下:

def gini(L):
    s1=0  #分子
    s2=0  #分母
    for i in L:
        s2+=2*len(L)*i
        for j in L:
            s1+=abs(i-j)
    return s1/s2

gini(r)   # 这里的r是老师通过random模块paretovar()方法构造的帕累托分布,大家也可以自己生成数据测试代码效果

我们同样用美国2008年收入数据来检验下公式法。

代码如下:

#生成列表,带入函数计算
df=pd.read_csv('usa_income.csv')
L=[]
for i in df.index:
    L=L+[ df.loc[i,'income'] for j in range(int(df.loc[i,'people']/10000))] #列表推导式
gini(L)
# out:0.5979213459691597

2.2 估算美国2008年基尼系数

2.2.1 读取数据并计算

代码如下:

#读取数据
df=pd.read_csv('usa_income.csv')
df['all_income']=df['people']*df['income']
df['people_cum']=df['people'].cumsum()
df['people_ratio']=df['people']/df['people'].sum()*100
df['people_ratio_cum']=df['people_cum']/df['people_cum'].max()*100
df['all_income_cum']=df['all_income'].cumsum()
df['Lorenz curve']=df['all_income_cum']/df['all_income_cum'].max()*100 #洛伦茨曲线
df

效果如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7dN2u6uv-1625838881543)(【0701】python基尼系数计算实践(案例+代码).assets/image-20210709212335453.png)]

2.2.2 画洛伦兹曲线

代码如下:

df['avg']=df['people_ratio_cum']  #绝对平均线
df.plot(x='people_ratio_cum', y=['Lorenz curve','avg']) #画图

效果如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ULIpAvvZ-1625838881548)(【0701】python基尼系数计算实践(案例+代码).assets/image-20210709213234571.png)]

2.2.3 按图形面积计算
#面积A+B=100*100*0.5=5000
#面积B
s=0
for i in df.index[1:]:
    people1=df.loc[i-1,'Lorenz curve'] #梯形的下底
    people2=df.loc[i,'Lorenz curve'] #梯形的上底
    people_ratio=df.loc[i,'people_ratio']
    s+=(people1+people2)*people_ratio*0.5
Gini=round((100*100*0.5-s)/(100*100*0.5),8) # 三角形的面积好求,洛伦兹曲线计算需要思考
Gini    # 计算结果为:0.60257495

不难发现,公式法与面积法计算结果还是比较接近的。

3 列表推导式与条件赋值

学习pandas,列表推导式最好一并掌握。

在生成一个数字序列的时候,在 Python 中可以如下写出:

L = []
def my_func(x):
    return 2*x
for i in range(5):
   L.append(my_func(i))
L
# Out: [0, 2, 4, 6, 8]

事实上可以利用列表推导式进行写法上的简化: [* for i in *] 。其中,第一个 * 为映射函数,其输入为后面 i 指代的内容,第二个 * 表示迭代的对象。

[my_func(i) for i in range(5)]
# Out:[0, 2, 4, 6, 8]

列表表达式还支持多层嵌套,如下面的例子中第一个 for 为外层循环,第二个为内层循环:

[m+'_'+n for m in ['a', 'b'] for n in ['c', 'd']]
# out:['a_c', 'a_d', 'b_c', 'b_d']

除了列表推导式,另一个实用的语法糖是带有 if 选择的条件赋值,其形式为 value = a if condition else b :

value = 'cat' if 2>1 else 'dog'
value

# out: 'cat'

等价于如下的写法:

a, b = 'cat', 'dog'
condition = 2 > 1 # 此时为True
if condition:
    value = a
else:
    value = b

下面举一个例子,截断列表中超过5的元素,即超过5的用5代替,小于5的保留原来的值:

L = [1, 2, 3, 4, 5, 6, 7]
[i if i <= 5 else 5 for i in L]

# out:[1, 2, 3, 4, 5, 5, 5]

References

基尼系数_百度百科 (baidu.com)

How Has the Literature on Gini’s IndexEvolved in the Past 80 Years?

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/182346.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mybatisCodeHelpe离线激活码【2022.01最新】

    (mybatisCodeHelpe离线激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月31日
  • idea 2021 4 永久激活码(破解版激活)「建议收藏」

    idea 2021 4 永久激活码(破解版激活),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
  • leetcode-221. 最大正方形(动态规划)「建议收藏」

    leetcode-221. 最大正方形(动态规划)「建议收藏」在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。示例 1:输入:matrix = [[“1″,”0″,”1″,”0″,”0”],[“1″,”0″,”1″,”1″,”1”],[“1″,”1″,”1″,”1″,”1”],[“1″,”0″,”0″,”1″,”0”]]输出:4示例 2:输入:matrix = [[“0″,”1”],[“1″,”0”]]输出:1示例 3:输入:matrix = [[“0”]]输出:0 提示:m == ma

    2022年8月9日
  • Java基础问题整理「建议收藏」

    备注:针对基本问题做一些基本的总结,不是详细解答!1.HashMap和ConcurrentHashMap区别(必考)2.ConcurrentHashMap的数据结构(必考)3.高并发HashMap的环是如何产生的4.HashMap1.7与HashMap1.8的区别,从数据结构上、Hash值的计算上、链表数据的插入方法、内部Entry类的实现上分析?5.Hash1.7是基于数组…

    2022年4月6日
  • H5请在微信客户端打开链接「建议收藏」

    H5请在微信客户端打开链接「建议收藏」H5判断必须在微信中打开<!DOCTYPEhtml><html><head><metacharset=”utf-8″><title></title></head><body></body><scripttype=”text/j…

    2022年6月7日
  • (收藏)【 数字化客户体验】NPS、CSAT和CES——2020年跟踪的客户满意度指标「建议收藏」

    (收藏)【 数字化客户体验】NPS、CSAT和CES——2020年跟踪的客户满意度指标「建议收藏」你每收到一个顾客的投诉,就有大约26个人对你的公司不满,但是他们选择沉默。如果你不采取适当的行动,你很可能会失去这些客户。除了失去客户和收入之外,客户满意度低也会损害你的品牌形象——尤其是当某些客户投诉在网上疯传时。幸运的是,客户满意度测量工具可以帮助你收集有价值的反馈,这样你就可以做出客户真正要求的改变和改进——所有这些都是为了给他们提供更好的体验和更愉快的客户旅程。为了简单起见,我们应该提到客户满意度指标通常也称为CX指标。CX是什么意思?CX代表客户体验。CX的准确定义将客户体验描

    2022年5月7日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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