StackOverflow प्रतिष्ठा वितरण पर गिन्नी सूचकांक की गणना करने की कोशिश कर रहा है?


11

मैं SO डेटा एक्सप्लोरर का उपयोग करके SO प्रतिष्ठा वितरण पर Gini सूचकांक की गणना करने की कोशिश कर रहा हूं। मैं जिस समीकरण को लागू करने का प्रयास कर रहा हूं वह यह है: कहां: = साइट पर उपयोगकर्ताओं की संख्या; = उपयोगकर्ता क्रमांक आईडी (1 - 1,225,000); = उपयोगकर्ता की प्रतिष्ठा ।niyii

जी(एस)=1n-1(n+1-2(Σमैं=1n(n+1-मैं)yमैंΣमैं=1nyमैं))
nमैंyमैंमैं

इस तरह मैंने इसे लागू किया ( यहाँ से कॉपी किया गया ):

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 के करीब होने की उम्मीद कर सकता हूं, जिसे प्रतिष्ठा दी गई है जितना अधिक आपके पास होता है।

क्या मैं अनजाने में प्रतिष्ठा / उपयोगकर्ताओं के वितरण के बारे में कुछ धारणा की अनदेखी कर रहा हूं?

मुझसे क्या गलती हुई है?


आप सही हैं, लेकिन मुझे यकीन नहीं है कि मैं देख सकता हूं कि इस गणना को क्यों प्रभावित करना चाहिए?
12:25 पर yossale

3
मैं अनुमान लगा रहा हूं कि आपका प्रश्न गिन्नी इंडेक्स की प्रकृति और गणना के बारे में है, और एसक्यूएल में इसे लागू करने के तरीके के बारे में नहीं (मुझे गलत होने पर सही करें)। यदि उत्तरार्द्ध, हमें इसे एसओ में स्थानांतरित करना चाहिए। डब्ल्यू / मेरी धारणा को जारी रखते हुए, मैंने आपके कोड को एसई डेटा साइट से कॉपी किया है, लेकिन यह मदद कर सकता है यदि आप इसे उन लोगों के लिए छद्म कोड में फिर से लिख सकते हैं जो 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-gin-coefficient-in-bigquery-3bc162c82168


12

मैं SQLकोड को बहुत आसानी से नहीं पढ़ सकता, लेकिन अगर यह मदद करता है, अगर मैं गिन्नी गुणांक की गणना करने जा रहा था, तो मैं यही करूँगा (सादे अंग्रेजी में)।

  1. बाहर चित्रा की एक्स (यानी। इतने पर प्रतिनिधि के साथ लोगों की संख्या)nएक्स
  2. सबसे कम से लेकर उच्चतम तक क्रमबद्ध करेंएक्स
  3. एक्स
  4. nएक्सn×Σ
  5. 1-(1/n)
  6. देखा!

मैंने गिनी गुणांक की गणना के लिए 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

उत्तम। मुझे यह जानने में दिलचस्पी है कि मूल्य क्या है इसलिए जब आपने गणना की है तो एक टिप्पणी छोड़ दें!
स्माइलिग

खैर, जब मैंने मूल्यों को एकत्र किया (अर्थात यदि १० लोग हैं, या तो १,३, या ५ अंक हैं, तो मेरे पास सिर्फ ३ रैंक हैं: १: ३,२: ५,३: १०) और गुणा (कितने उस स्कोर के साथ) * स्कोर * (स्कोर का रैंक) मुझे -0.98 मिला, जो गलत संकेत के लिए नहीं होता। लेकिन मुझे यकीन नहीं है कि मेरे छोटे शॉर्टकट gini पैमाने पर कैसे असर करते हैं
yossale

3×24×3.5

4

जी=2μn(n-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

मुझे मेरे परीक्षण सेट पर दिया:

.45503253636587840

जो कि आर के अयोग्य पुस्तकालयों Gini (x) के समान है


; T as के साथ (SELAST CAST (आय से FLOAT) AS x FROM #data) के रूप में, tt AS (SELECT *, ROW_NUMBER () OVER (ORDER BY x) AS I FROM t) सेलेक्ट सिम 2.0 / SUM (x * i) / ( COUNT (x) * SUM (x)) - 1.0- (1.0 / COUNT (x)) AS gini से tt
क्रिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.