StackOverflowレピュテーション分布でGiniインデックスを計算しようとしていますか?


11

SOデータエクスプローラーを使用してSOレピュテーション分布のGiniインデックスを計算しようとしています。私が実装しようとしている方程式はこれです: ここで:n=サイト上のユーザー数。i=ユーザーのシリアルID(1-1,225,000); yi=ユーザーiの評判。

G(S)=1n1(n+12(i=1n(n+1i)yii=1nyi))
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ですが、意味がありません。それがどのようにマイナスになる可能性があるのか​​さえわかりません。また、abs値でさえ、不平等は1に非常に近いと予想されていました。あなたがそれを持っているほど成長します。

知らず知らずのうちに、レピュテーション/ユーザーの分布に関するいくつかの仮定を無視していますか?

何が悪いのでしょうか?


あなたは正しいですが、なぜこれが計算に影響を与えるのかわかりませんか?
ヨッセル2012

3
あなたの質問は、Giniインデックスの性質と計算についてであり、SQLでそれを実装する方法についてではないと思います(私が間違っている場合は修正してください)。後者の場合、これをSOに移行する必要があります。私の想定を続けて、SEデータサイトからコードをコピーしましたが、SQLをうまく読み込めない可能性がある人のために、疑似コードでコードを書き直すこともできます。
ガン-モニカを復活させる

@gungありがとう-SQLの実装ではなく、計算について質問します。私はそれを疑似コードで
書き直し

回答:


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. nx
  2. ソートx
  3. x
  4. nxn×
  5. 1(1/n)
  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コードにいくらか似ていますが、私が言ったように、私はそれを本当に簡単に読むことができません!


どうもありがとうございました!仕分け部分が抜けました!それは多くを説明します...
ヨッセル

素晴らしい。値が何か知りたいので、計算したらコメントを残してください。
smillig 2012

さて、値を集計すると(つまり、1、3、または5ポイントの10人の場合、ランクは3つだけあります(1:3、2:5、3:10)。そのスコアで)*スコア*(スコアのランク)-0.98を取得しました。しかし、私は確かにどのように私の小さなショートカット効果ジニ規模じゃない
yossale

3×24×3.5

4

G=2μn(n1)ij|xixj|
μx

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)と同じです。


; WITH AS(SELECT CAST(income 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 tt
Chris
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.