Я пытаюсь вычислить индекс Джини для распределения репутации SO с помощью SO Data Explorer. Уравнение, которое я пытаюсь реализовать, таково: Где: = количество пользователей на сайте; = серийный идентификатор пользователя (1 - 1 225 000); = репутация пользователя .niyii
Вот как я это реализовал (скопировано отсюда ):
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
Мой результат (в настоящее время) -0,53, но это не имеет смысла: я не уверен даже, как это могло бы стать отрицательным, и даже в значении абс, я бы ожидал, что неравенство будет намного ближе к 1, учитывая, как репутация растет, чем больше у вас есть.
Я неосознанно игнорирую некоторые предположения о распределении репутации / пользователей?
Что я делаю не так?
Ответы:
Вот как вы можете рассчитать это с помощью SQL:
Объяснение здесь https://medium.com/@medvedev1088/calculation-gini-coefficient-in-bigquery-3bc162c82168
источник
Я не могу прочитать
SQL
код очень легко, но если он поможет, если я собираюсь рассчитать коэффициент Джини, это то, что я бы сделал (на простом английском языке).Я сделал эти шаги из поразительно простого кода в
R
функции (в пакете ineq ) для вычисления коэффициента Джини. Для записи вот этот код:Это похоже на ваш
SQL
код, но, как я уже сказал, я не могу прочитать это очень легко!источник
источник
Добавление к ответу @smillig на основе приведенного уравнения:
Дали мне на моем тестовом наборе:
+0,45503253636587840
Который так же, как и R библиотеки Inq Gini (x)
источник