首页 > 编程知识 正文

基尼系数的计算公式,python是什么

时间:2023-05-03 19:58:44 阅读:126188 作者:3375

采用两种方法,用python计算基尼系数。

如何用sql计算基尼系数,可以在我的另一篇文章里看到。 两篇文章取数相同,可以搭配看。

文章中方法1的代码来自()包含注释且易于理解)。 为了正确计算。

如果不太清楚基尼系数的概念,可以看到原文的第一部分。

基尼系数计算方法- longwind09 -博客公园

方法2和3参考资料:方法2和3为近似算法。 其中方法3:只适用于一些特殊情况。

3358 www.360doc.com/content/14/0911/13/87990 _ 408644530.shtml

------------- -请参阅

方法一:

#方法1 importnumpyasnpimportpandasaspdimportmatplotlibasmplimportmatplotlib.pyplotasplfromscipy.integrateimportodeintdeintdefgini配置559、198、420、39、709、225、731、708、369、519、46、48、446、117、127、905、652 802、422、884、746、… 592、552 690、456、918、70、801、695、908、57、497、605、334、265、255、235、199、739、81、131、68、229、6669 共有100个数字#wealths=[1.5、2、3.5、10 ] 9.7、1.7、2.3、3.8、1.7、2.3、2.3、4.3、12 ] cum _ wealths=nn 也就是说,原始阵列之和sum_wealths=cum_wealths[-1] #倒数第一个#人数的累计占有率#按每个点计算出横坐标xarray=NP.array(range(0, len(cum_Wealths ) (/NP.float ) len ) cum_Wealths均衡收入曲线)是指45度曲线upper=xarray #收入累计占有率Yarray=cum_Wealths yarray ) pl.plot ) xarray,upper ) #上45度线#ax.plot ) xarray, yarray ) #ax.plot ) (xaaarrray ) ) )的upper ) ax.set_xlabel(u '人数累计占有率) ) ax.set_xlabel(u '收入累计占有率) ) 计算曲线下面积的常用方法b=NP.trapz ) Yarrray x=xarray(#总面积0.5a=0.5-bg=a/) ab ) print(g ) #执行函数输出结果gini ) ) #结果0.310964173535555550

方法二:

近似的求上图中的面积,将其分割成多个梯形,通过近似计算多个梯形面积,将其加

和得到蓝色线条线条下面的面积。

通过简化推到多个梯形面积求和公式,得到一个比较简单的公式,就是链接2中结尾的公式。

如果分组的数量跟样本数量相同,就可以得到精确的数字,计算出来的基尼系数跟上面方法1的结果相等。

如果分组数量降低,获得的基尼系数将稍低于准确的基尼系数,因为更多的将非直线的曲线假设成了直线,即梯形的一边。

# 第二个方法# 接着上面的定义# 可能会出现样本数量不能被分组数量均分的情况,所以需要借助python自己包含的分布数组pd.cut# 分成n个组n = 100m = pd.cut(pd.Series(range(1, len(cum_wealths))), bins = n, labels = False)# 将1到样本数量的整数,分成‘均匀’的n个组# labels = false生成一些组数,表示这个位置原来的值属于1到n的哪个组y = m.groupby(by = m).size().cumsum()# 得到每个分组中的最后一个数的位置在哪里# size表示每个组里面有多少个元素# cumsum之后显示每个组里面最后一个元素的位置#就是图中分为点的位置t = yarray[y[:]]#取得在yarray上的值#就是图中w0 w1 w2等的值g = 1 - (1/n)*(2*(sum(t)-1)+1)# 跟文档中的有一点不一样,在最后的计算中减去了1# 但其实是一致的,文档中分成了5组,w1到w5,求和的是4个y轴值的和,即为w1-w4,是到n-1的和# 所以可改写成(不要刻意减去1,按照公式,加总到n-1)g = 1 - (1/n)*(2*(sum(t[0:n-1]))+1)g# 结果为0.3109641735512395# 相同的计算,只是起始位置稍有不同# 上面是从1开始,这里是从0开始# 如果是从0开始,如果第一组中有6个元素,需要取第6个元素,在python中的index是5,所以需要减去1n = 100m = pd.cut(pd.Series(range(0, len(cum_wealths))), bins = n, labels = False)y = m.groupby(by = m).size().cumsum() - 1t = yarray[y[:]]g = 1 - (1/n)*(2*(sum(t)-1)+1)#或者是g = 1 - (1/n)*(2*(sum(t[0:n-1]))+1)g# 结果为0.3109641735512395n = 19m = pd.cut(pd.Series(range(1, len(cum_wealths))), bins = n, labels = False)y = m.groupby(by = m).size().cumsum()t = yarray[y[:]]g = 1 - (1/n)*(2*(sum(t)-1)+1)g# 结果为0.3133532456894873n = 9m = pd.cut(pd.Series(range(1, len(cum_wealths))), bins = n, labels = False)y = m.groupby(by = m).size().cumsum()t = yarray[y[:]]g = 1 - (1/n)*(2*(sum(t)-1)+1)g#结果为0.300356286353766n = 20m = pd.cut(pd.Series(range(1, len(cum_wealths))), bins = n, labels = False)y = m.groupby(by = m).size().cumsum()t = yarray[y[:]]g = 1 - (1/n)*(2*(sum(t[0:n-1]))+1)g#结果为0.31025484587225693

 -----------------------------------------------------------------------------------------------------------------------------------------------------------------------

最初开始计算时候做的比较简单的思路,但是并不适用于样本数量不能被分组数整除的情况。但可能有助于对基尼系数近似计算的理解,所以放在了这里。

方法三

样本数量能够被分组数均匀分配的情况(仅适用于这个情况),更好的方法详见方法二。

数据的精确度可能还会受样本量和分组量的关系。本文中采用的100个样本和分成100/20/50都是可均匀分配的情况。如果不能均匀分配,可能取m的方式需要优化,应该采取python内含的最大力度均匀分组的函数。

# 第二个方法#只适用于样本数量能够被分组数量整除的情况# 接着上面的定义n = 100#分成100个组,100个数据分成100个组,每个点和点之间的梯形都计算其面积,‘最精确的近似‘m = round(len(wealths) / n)#每个组之间的距离y = yarray[range(0, len(wealths), m)]#在y轴上选择那些矩形底部x轴相对应的y轴值g = 1 - (1/100)*(2*sum(y)+1)g# 结果为0.3109641735512395#与上面计算的图形下面的面积相等# 分成20个组n = 20m = round(len(wealths) / n)# 每个组的距离y = yarray[range(0, len(wealths), m)]# 这些点的y坐标g = 1 - (1/n)*(2*sum(y)+1)g# 结果为0.31025484587225693n = 50m = round(len(wealths) / n)y = yarray[range(0, len(wealths), m)]g = 1 - (1/n)*(2*sum(y)+1)g# 结果为0.3108691564481606# 当样本量不能被分组数量均匀分配,会出现比较大的偏差。需优化,见方法3。n = 40m = round(len(wealths) / n)y = yarray[range(0, len(wealths), m)]g = 1 - (1/n)*(2*sum(y)+1)g# 结果为0.13858644556020072# 不准确n = 9m = round(len(wealths) / n)y = yarray[range(0, len(wealths), m)]g = 1 - (1/n)*(2*sum(y)+1)g# 结果为0.1003202798725994

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。