Próbuję obliczyć indeks Gini dla dystrybucji reputacji SO za pomocą SO Data Explorer. Równanie, które próbuję zaimplementować, jest następujące: Gdzie:n= liczba użytkowników w witrynie; i= identyfikator seryjny użytkownika (1 - 1 225 000); yi= reputacja użytkownikai.
Oto jak to zaimplementowałem (skopiowałem stąd ):
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
Mój wynik wynosi (obecnie) -0,53, ale nie ma sensu: nawet nie jestem pewien, jak mógłby stać się ujemny, a nawet w wartości abs, spodziewałbym się, że nierówność będzie znacznie bliższa 1, biorąc pod uwagę, jak reputacja rośnie, tym więcej masz.
Czy nieświadomie ignoruję pewne założenia dotyczące rozpowszechniania reputacji / użytkowników?
Co robię źle?
Odpowiedzi:
Oto jak możesz to obliczyć za pomocą SQL:
Wyjaśnienie znajduje się tutaj https://medium.com/@medvedev1088/calculating-gini-coefficient-in-bigquery-3bc162c82168
źródło
Nie mogę
SQL
bardzo łatwo odczytać kodu, ale jeśli to pomoże, gdybym miał obliczyć współczynnik Giniego, zrobiłbym to (po prostu po angielsku).Te kroki zacząłem od niezwykle prostego kodu w
R
funkcji (w pakiecie ineq ) do obliczenia współczynnika Giniego. Dla przypomnienia, oto ten kod:Wygląda nieco podobnie do twojego
SQL
kodu, ale tak jak powiedziałem, tak naprawdę nie mogę tak łatwo odczytać!źródło
źródło
Dodanie do odpowiedzi @smillig na podstawie podanego równania:
Dałem mi na moim zestawie testowym:
0,45503253636587840
Który jest taki sam jak ineq bibliotek R Gini (x)
źródło