Saltar al contenido

calcular el coeficiente de Gini en Python / numpy

Solución:

Esto es de esperar. Una muestra aleatoria de una distribución uniforme no da como resultado valores uniformes (es decir, valores relativamente cercanos entre sí). Con un poco de cálculo, se puede demostrar que el esperado valor (en el sentido estadístico) del coeficiente de Gini de una muestra de la distribución uniforme en [0, 1] es 1/3, por lo que es razonable obtener valores alrededor de 1/3 para una muestra determinada.

Obtendrá un coeficiente de Gini más bajo con una muestra como v = 10 + np.random.rand(500). Todos esos valores se acercan a 10,5; los relativo la variación es menor que la muestra v = np.random.rand(500). De hecho, el valor esperado del coeficiente de Gini para la muestra base + np.random.rand(n) es 1 / (6 * base + 3).

Aquí hay una implementación simple del coeficiente de Gini. Utiliza el hecho de que el coeficiente de Gini es la mitad de la diferencia absoluta media relativa.

def gini(x):
    # (Warning: This is a concise implementation, but it is O(n**2)
    # in time and memory, where n = len(x).  *Don't* pass in huge
    # samples!)

    # Mean absolute difference
    mad = np.abs(np.subtract.outer(x, x)).mean()
    # Relative mean absolute difference
    rmad = mad/np.mean(x)
    # Gini coefficient
    g = 0.5 * rmad
    return g

Aquí está el coeficiente de Gini para varias muestras de la forma v = base + np.random.rand(500):

In [80]: v = np.random.rand(500)

In [81]: gini(v)
Out[81]: 0.32760618249832563

In [82]: v = 1 + np.random.rand(500)

In [83]: gini(v)
Out[83]: 0.11121487509454202

In [84]: v = 10 + np.random.rand(500)

In [85]: gini(v)
Out[85]: 0.01567937753659053

In [86]: v = 100 + np.random.rand(500)

In [87]: gini(v)
Out[87]: 0.0016594595244509495

Una implementación un poco más rápida (usando la vectorización numpy y solo calculando cada diferencia una vez):

def gini_coefficient(x):
    """Compute Gini coefficient of array of values"""
    diffsum = 0
    for i, xi in enumerate(x[:-1], 1):
        diffsum += np.sum(np.abs(xi - x[i:]))
    return diffsum / (len(x)**2 * np.mean(x))

Nota: x debe ser una matriz numpy.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *