calcul du coefficient de Gini en Python/numpy
je suis calcul Coefficient de Gini (similaire à: Python - coefficient de Gini de calcul à l'aide de Numpy) mais j'ai une drôle de résultat. pour une distribution uniforme échantillonnés à partir de np.random.rand()
, le coefficient de Gini est de 0,3, mais j'aurais attendu qu'elle soit proche de 0 (égalité parfaite). ce qui ne va pas ici?
def G(v):
bins = np.linspace(0., 100., 11)
total = float(np.sum(v))
yvals = []
for b in bins:
bin_vals = v[v <= np.percentile(v, b)]
bin_fraction = (np.sum(bin_vals) / total) * 100.0
yvals.append(bin_fraction)
# perfect equality area
pe_area = np.trapz(bins, x=bins)
# lorenz area
lorenz_area = np.trapz(yvals, x=bins)
gini_val = (pe_area - lorenz_area) / float(pe_area)
return bins, yvals, gini_val
v = np.random.rand(500)
bins, result, gini_val = G(v)
plt.figure()
plt.subplot(2, 1, 1)
plt.plot(bins, result, label="observed")
plt.plot(bins, bins, '--', label="perfect eq.")
plt.xlabel("fraction of population")
plt.ylabel("fraction of wealth")
plt.title("GINI: %.4f" %(gini_val))
plt.legend()
plt.subplot(2, 1, 2)
plt.hist(v, bins=20)
pour l'ensemble donné de nombres, le code ci-dessus calcule la fraction du total du secteur de la distribution des valeurs dans chaque centile de la corbeille.
le résultat:
des distributions uniformes devraient être à proximité d'une "égalité parfaite" de sorte que la courbe de lorenz de flexion est éteint.
Quelle est la relation entre
Gini(v)
et G(v)
?
OriginalL'auteur mvd | 2016-09-15
Vous devez vous connecter pour publier un commentaire.
Ce n'est à prévoir. Un échantillon aléatoire à partir d'une distribution uniforme n'a pas pour résultat des valeurs uniformes (c'est à dire des valeurs qui sont tous relativement proches les uns des autres). Avec un peu de calcul, il peut être montré que la devrait valeur (au sens statistique) du coefficient de Gini d'un échantillon de la distribution uniforme sur [0, 1] est de 1/3, afin d'obtenir des valeurs autour de 1/3 pour un échantillon donné est raisonnable.
Vous aurez un plus faible coefficient de Gini auprès d'un échantillon comme
v = 10 + np.random.rand(500)
. Ces valeurs sont proches de 10.5; la relative variation est inférieure à celle de l'échantillonv = np.random.rand(500)
.En fait, la valeur du coefficient de Gini pour l'échantillon
base + np.random.rand(n)
est de 1/(6*base + 3).Voici une implémentation simple du coefficient de Gini. Il utilise le fait que le coefficient de Gini est la moitié de la moyenne relative de la valeur absolue de la différence.
Voici le coefficient de Gini pour plusieurs échantillons de la forme
v = base + np.random.rand(500)
:gini(np.random.rand(500))
? est-il une erreur dans mon de la mise en œuvre ou est-il dans le bruit des méthodes de calcul différentes (j'utilise trapz côté)?Vous êtes le calcul du coefficient de Gini d'une random exemple. La valeur sera différente pour différents échantillons.
"est-il une erreur dans mon œuvre..." Essayez les données indiquées ici: peterrosenmai.com/... obtenez-vous 0.7202 pour le coefficient de Gini?
Pour info voici un O(n) de la mise en œuvre du coefficient de Gini, qui prend également en poids: stackoverflow.com/a/48999797/1840471
Nice. Je vois
sxw = np.argsort(x)
là, ce qui signifie que la fonction est, au mieux, O(n*log(n)), mais c'est toujours mieux que O(n**2)!OriginalL'auteur Warren Weckesser
Coefficient de Gini est l'aire sous la Lorence courbe, généralement calculé pour l'analyse de la répartition des revenus dans la population. https://github.com/oliviaguest/gini fournit une mise en œuvre simple pour le même à l'aide de python.
OriginalL'auteur bhartii