概念python
基尼係數是指國際上通用的、用以衡量一個國家或地區居民收入差距的經常使用指標。基尼係數介於0-1之間,基尼係數越大,表示不平等程度越高。算法
通用計算方法數組
赫希曼根據洛倫茨曲線提出的判斷分配平等程度的指標。設實際收入分配曲線和收入分配絕對平等曲線之間的面積爲A,實際收入分配曲線右下方的面積爲B。並以A除以(A+B)的商表示不平等程度。這個數值被稱爲基尼係數或稱洛倫茨係數。若是A爲零,基尼係數爲零,表示收入分配徹底平等;若是B爲零則係數爲1,收入分配絕對不平等。收入分配越是趨向平等,洛倫茨曲線的弧度越小,基尼係數也越小,反之,收入分配越是趨向不平等,洛倫茨曲線的弧度越大,那麼基尼係數也越大。另外,能夠參看帕累託指數(是指對收入分佈不均衡的程度的度量)。
國內很多學者對基尼係數的具體計算方法做了探索,提出了十多個不一樣的計算公式。山西農業大學經貿學院張建華先生提出了一個簡便易用的公式:假定必定數量的人口按收入由低到高順序排隊,分爲人數相等的n組,從第1組到第i組人口累計收入佔所有人口總收入的比重爲wi,則說明:該公式是利用定積分的定義將對洛倫茨曲線的積分(面積B)分紅n個等高梯形的面積之和獲得的。app
應用spa
經過這個指標,咱們能夠看一項內容的分佈是否均衡,或者分佈區間的走向。舉個例子,假如咱們須要看推薦算法一日推薦出來的商品的類目的分佈,咱們能夠先統計出各個類目的一個數量,而後計算基尼係數,這樣就能夠看出來的分佈是否均衡。固然在推薦的過程當中,也不能徹底看這個指標,由於有些場景可能就但願推薦一些頭部商品,因此在使用這個指標的時候須要靈活處理。code
代碼blog
下面是python的一段實現代碼:排序
#-*- coding:utf-8 -*- #!/usr/bin/python import numpy as np from matplotlib import pyplot as pl # 繪圖用 fig, ax = pl.subplots() # 繪製 def Drawing(xarray, yarray): # 繪製洛倫茲曲線 ax.plot(xarray, yarray) # 繪製均衡直線 ax.plot(xarray, xarray) ax.set_xlabel(u'橫座標') ax.set_ylabel(u'縱座標') pl.show() # 計算基尼係數 def Gini(): # 計算數組累計值,從 0 開始 # 原始數據 numlist = [1.5, 2, 3.5, 10, 4.2, 2.1, 1.1, 2.2, 3.1, 5.1, 9.5, 9.7, 1.7, 2.3, 3.8, 1.7, 2.3, 5, 4.7, 2.3, 4.3, 12] # 按照個數累計統計後,分別求總數,獲得一個平均分的一列座標。例如5的話,獲得的值是[0,1,2,3,4]/4 # 獲得的是洛倫茲曲線上方的均衡直線 xarray = np.array(range(0, len(numlist)+1)) / np.float(len(numlist)) #print "xarray", xarray # 計算基尼係數,第一個數字須要從 0 開始;先排序 numsort = sorted(np.append(numlist, 0)) #print "numsort", numsort # 累加值計算 csum_numlist = np.cumsum(numsort) #print "csum_numlist", csum_numlist # 取最後一個,也就是原數組的和 sum_num = csum_numlist[-1] # 獲得洛倫茲曲線 yarray = csum_numlist / sum_num #print "yarray", yarray # 計算曲線下面積的通用方法 B = np.trapz(yarray, x=xarray) # 總面積 0.5 A = 0.5 - B G = A / (A + B) # 繪製圖像 Drawing(xarray, yarray) return G a = Gini() print 'Gini:', a
最終獲得 0.37025408173123364utf-8
繪製的圖爲:class