11 giugno 2007

Indice di concentrazione di Gini in Excel

Download del file xls con la relativa funzione.


Tra le funzioni statistiche di excel non mi risulta disponibile l'indice di concentrazione di Gini e ho sviluppato la relativa funzione in vba.
La formula a cui mi riferisco è la seguente, dove le x_(i) sono ordinate in senso non decrescente:
Ai fini computazionali, mi è risultato conveniente esplicitare la formula nel seguente formato:

ossia come rapporto tra l'indice di disuguaglianza senza ripetizione (ossia con il denominatore pari a n(n-1) invece che n^2):


ed il suo massimo:

Inizialmente avevo optato per la seguente forma:

ma essa si base sull'ordinamento di un array che prevederebbe un po' di codice per essere effettuato, non essendo già prevista una relativa funzione standard in vba. Per l'indice di concentrazione in R si faccia riferimento alla libreria ineq. Ho anche avviato una discussione sulla mailing-list per dei chiarimenti sulla formula utilizzata (l'indice infatti non fornisce il valore 1 in caso di massima concentrazione), ma la risposta stava nella differenza tra indice distorto e non distorto.
Riporto di seguito il codice della funzione in vba :
'********************************************
Public Function gini(x As Range) As Double

Dim tb As Variant
Dim h As Long
Dim k As Long
Dim i As Long
Dim j As Long
Dim num As Double
Dim den As Double

tb = x.Value
num = 0
den = 0
For h = 1 To UBound(tb, 1)
For k = 1 To UBound(tb, 2)
If IsNull(tb(h, k)) Then
tb(h, k) = 0
End If
den = den + tb(h, k)
For i = 1 To UBound(tb, 1)
For j = 1 To UBound(tb, 2)
num = num + Abs(tb(h, k) - tb(i, j))
Next j
Next i
Next k
Next h

'INDICE DI DISUGUAGLIANZA
num = num / (UBound(tb, 1) * UBound(tb, 2)* _
(UBound(tb, 1) * UBound(tb, 2) - 1))

'MASSIMO DELL'INDICE DI DISUGUAGLIANZA
den = 2 * den / (UBound(tb, 1) * UBound(tb, 2))

If den = 0 Then
gini = 1
Else
gini = num / den
End If
End Function
'********************************************