StackOverflow 평판 분포에서 Gini 지수를 계산하려고합니까?


11

SO Data Explorer를 사용하여 SO 평판 분포에서 Gini 지수를 계산하려고합니다. 내가 구현하려는 방정식은 다음과 같습니다 여기서, = 사이트의 사용자 수; = 사용자 일련 ID (1-1,225,000); = 사용자 평판 .

(에스)=11(+12(나는=1(+1나는)와이나는나는=1와이나는))
나는와이나는나는

이것이 내가 구현 한 방법입니다 ( 여기 에서 복사 ).

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에 훨씬 가까울 것으로 예상했을 것입니다. 당신이 그것을 더 많이 성장합니다.

평판 / 사용자 배포에 대한 일부 가정을 모르고 무시하고 있습니까?

내가 뭘 잘못 했니?


당신 말이 맞지만 이것이 왜 계산에 영향을 미치는지 잘 모르겠습니다.
yossale

3
귀하의 질문은 Gini 인덱스의 특성 및 계산에 관한 것이지 SQL에서 구현하는 방법이 아니라고 생각합니다 (잘못된 경우 정정하십시오). 후자의 경우이를 SO로 마이그레이션해야합니다. 내 가정과 함께 SE 데이터 사이트에서 코드를 복사했지만 SQL을 잘 읽지 못하는 사람들을 위해 의사 코드로 코드를 다시 작성할 수 있다면 도움이 될 수 있습니다.
복원

@ gung thanks-SQL 구현이 아니라 계산에 대해 묻습니다. 나는 의사 코드로 다시 작성할 것이다
yossale

답변:


1

SQL로 계산하는 방법은 다음과 같습니다.

with balances as (
    select '2018-01-01' as date, balance
    from unnest([1,2,3,4,5]) as balance -- Gini coef: 0.2666666666666667
    union all
    select '2018-01-02' as date, balance
    from unnest([3,3,3,3]) as balance -- Gini coef: 0.0
    union all
    select '2018-01-03' as date, balance
    from unnest([4,5,1,8,6,45,67,1,4,11]) as balance -- Gini coef: 0.625
),
ranked_balances as (
    select date, balance, row_number() over (partition by date order by balance desc) as rank
    from balances
)
SELECT date, 
    -- (1 − 2B) https://en.wikipedia.org/wiki/Gini_coefficient
    1 - 2 * sum((balance * (rank - 1) + balance / 2)) / count(*) / sum(balance) AS gini
FROM ranked_balances
GROUP BY date
ORDER BY date ASC
-- verify here http://shlegeris.com/gini

설명은 여기 https://medium.com/@medvedev1088/calculating-gini-coefficient-in-bigquery-3bc162c82168


12

SQL코드를 아주 쉽게 읽을 수는 없지만 도움이된다면 지니 계수를 계산하려고하면 이것이 내가 할 일입니다 (일반 영어).

  1. x 을 구하십시오 (예 : SO에 대한 담당자 수)엑스
  2. 를 최저에서 최고로 정렬엑스
  3. 엑스
  4. 엑스×
  5. 1(1/)
  6. 짜잔!

Gini 계수를 계산하기 위해 R함수 ( ineq 패키지) 의 놀랍도록 간단한 코드에서 그 단계를 취했습니다 . 기록을 위해 다음 코드가 있습니다.

> 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>

SQL코드 와 다소 비슷해 보이지만 실제로 말한 것처럼 쉽게 읽을 수는 없습니다!


감사합니다 당신이 아주 많이! 정렬 부분을 놓쳤다! 그것은 많은 설명 ...
yossale

감독자. 값이 무엇인지 알고 싶습니다. 계산을 할 때 의견을 남기십시오!
smillig

글쎄, 내가 값을 집계했을 때 (즉, 1, 3 또는 5 점을 가진 10 명의 사람들이 있다면, 나는 단지 3 등급 : 1 : 3,2 : 5,3 : 10)을 곱하고 (얼마나 많은 그 점수로) * 점수 * (점수 순위) 나는 -0.98을 얻었고, 이는 잘못된 부호가 아니라면 의미가 있습니다. 그러나 나는 확실히 어떻게 내 작은 단축 효과를 지니 규모 아니에요
yossale

×24×3.5

4

=2μ(1)나는제이|엑스나는엑스제이|
μ엑스

1

제공된 방정식을 기반으로 @ smillig 답변에 추가 :

SELECT something AS x into #t FROM sometable
SELECT *,ROW_NUMBER() OVER(ORDER BY x) AS i INTO #tt FROM #t
SELECT 2.0*SUM(x*i)/(COUNT(x)*SUM(x))-1.0-(1.0/COUNT(x)) AS gini FROM #tt

내 테스트 세트를 주셨습니다 :

0.45503253636587840

R의 ineq 라이브러리 Gini (x)와 동일


; (있는 그대로) (선택 CAST (소득 AS FLOAT) AS x FROM #data), tt AS (SELECT *, ROW_NUMBER () OVER (ORDER BY x) AS i FROM t) SELECT 2.0 * SUM (x * i) / ( COUNT (x) * SUM (x))-1.0- (1.0 / COUNT (x)) AS gini FROM
Chris
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.