11 votos

¿Tratando de calcular el índice de Gini en la distribución de reputación StackOverflow?

Estoy tratando de calcular el índice de Gini en la reputación de distribución usando el Explorador de Datos. La ecuación estoy tratando de implementar es este: $$ G(S)=\frac{1}{n-1}\left(n+1-2\left(\frac{\sum^n_{i=1}(n+1-i)y_i}{\sum^n_{i=1}y_i}\right)\right) $$ Donde: $n$ = número de usuarios en el sitio; $i$ = usuario serial id (1 - 1,225,000); $y_i$ = la reputación del usuario $i$.

Esta es la forma en que he implementado (copiado de aquí):

DECLARE @numUsers int
SELECT @numUsers = COUNT(*) FROM Users
DECLARE @totalRep float
SELECT @totalRep = SUM(Users.Reputation) FROM Users
DECLARE @giniNominator float
SELECT @giniNominator = SUM( (@numUsers + 1 - CAST(Users.Id as Float)) * 
                              CAST(Users.Reputation as Float)) FROM Users
DECLARE @giniCalc float
SELECT @giniCalc = (@numUsers + 1 - 2*(@giniNominator / @totalRep)) / @numUsers
SELECT @giniCalc

Mi resultado es (actualmente) -0.53, pero no tiene sentido: no estoy seguro de que incluso la forma en que podría haberse convertido en negativo, e incluso en abs valor, yo habría esperado que la desigualdad es mucho más cercano a 1, teniendo en cuenta cómo la reputación crece cuanto más se tiene.

Soy yo, sin saberlo, ignorando algunas hipótesis acerca de la distribución de la reputación/usuarios?

¿Qué hago mal?

12voto

Jeff Davis Puntos 1999

No puedo leer la SQL código muy fácilmente, pero si ayuda, si se va a calcular el coeficiente de Gini, esto es lo que yo haría (en inglés).

  1. Averiguar el $n$ $x$ (es decir. el número de personas con representante en ESO)
  2. Sort $x$ de menor a mayor
  3. Resumir cada uno de los $x$ multiplicado por su orden en el rango (es decir. si hay 10 personas, el representante de la persona con el menor rep se multiplica por 1 y el representante de la persona con el mayor representante se multiplica por 10)
  4. Tomar ese valor y se divide por el producto de $n$ y la suma de $x$ (es decir. $n \times \sum $ rep) y luego multiplicar ese resultado por 2
  5. Tomar ese resultado y restar el valor de $1-(1/n)$ a partir de ella.
  6. Voila!

Me tomó los pasos de la muy sencillo código en la R de la función (en el ineq paquete) para el cálculo del coeficiente de Gini. Para el registro, aquí está el código:

> ineq::Gini
function (x) 
{
    n <- length(x)
    x <- sort(x)
    G <- sum(x * 1:n)
    G <- 2 * G/(n * sum(x))
    G - 1 - (1/n)
}
<environment: namespace:ineq>

Parece algo similar a su SQL código, pero como he dicho, realmente no puedo leer muy fácilmente!

4voto

StasK Puntos 19497

Hay, creo, cuatro formulaciones equivalentes del índice de Gini. Para mí, el más natural es una U-estadística: $$ G = \frac 2 {\mu n(n-1)} \sum_ {i\neq j} | x_i - x_j | $$ $\mu$ Dónde está la media de $x$'s. Usted puede comprobar sus cálculos con esta fórmula. Obviamente, el resultado debe ser no negativo. Por lo que sé sobre índices de Gini, la distribución de reputación el CV debe tener el índice de Gini por encima de 0.9; Si 0.98 hace mucho sentido o no, no puedo decir si.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X