Bạn đang cố gắng tính chỉ số Gini trên bản phân phối danh tiếng StackOverflow?


11

Tôi đang cố gắng tính toán chỉ số Gini trên bản phân phối danh tiếng SO bằng SO Data Explorer. Phương trình tôi đang cố thực hiện là: Trong đó: = số người dùng trên trang web; = id nối tiếp người dùng (1 - 1.225.000); = danh tiếng của người dùng .niyii

G(S)=1n1(n+12(i=1n(n+1i)yii=1nyi))
niyii

Đây là cách tôi triển khai nó (được sao chép từ đâ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

Kết quả của tôi là (hiện tại) -0,53, nhưng không có ý nghĩa gì: Tôi không chắc nó thậm chí có thể trở nên tiêu cực như thế nào, và thậm chí ở giá trị abs, tôi đã dự đoán sự bất bình đẳng sẽ gần hơn với 1, vì mức độ nổi tiếng càng phát triển bạn càng có nó.

Tôi có vô tình bỏ qua một số giả định về việc phân phối danh tiếng / người dùng không?

Tôi làm gì sai?


Bạn nói đúng, nhưng tôi không chắc tại sao điều này lại ảnh hưởng đến việc tính toán?
yossale

3
Tôi đoán rằng câu hỏi của bạn là về bản chất & tính toán của chỉ số Gini, chứ không phải về cách triển khai điều đó trong SQL (sửa tôi nếu tôi sai). Nếu sau này, chúng ta nên chuyển cái này sang SO. Tiếp tục với giả định của tôi, tôi đã sao chép mã của bạn từ trang dữ liệu SE, nhưng nó có thể hữu ích nếu bạn cũng có thể viết lại bằng mã giả cho những người không đọc được SQL.
gung - Phục hồi Monica

@gung cảm ơn - Tôi hỏi về tính toán, không phải triển khai SQL. Tôi sẽ viết lại bằng mã giả
yossale

Câu trả lời:


1

Đây là cách bạn có thể tính toán với 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

Giải thích tại đây https://medium.com/@medvedev1088/calculating-gini-coffic-in-bigquery-3bc162c82168


12

Tôi không thể đọc SQLmã rất dễ dàng, nhưng nếu nó giúp, nếu tôi định tính hệ số Gini, đây là điều tôi sẽ làm (bằng tiếng Anh đơn giản).

  1. nx
  2. x
  3. x
  4. nxn×
  5. 1(1/n)
  6. Voila!

Tôi đã thực hiện các bước đó từ mã chuyển tiếp đáng chú ý trong Rhàm (trong gói ineq ) để tính hệ số Gini. Đối với hồ sơ, đây là mã:

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

Nó trông hơi giống với SQLmã của bạn , nhưng như tôi đã nói, tôi thực sự không thể đọc nó rất dễ dàng!


Cảm ơn bạn rất nhiều! Tôi đã bỏ lỡ phần sắp xếp! điều đó giải thích rất nhiều ...
yossale

Siêu. Tôi muốn biết giá trị là gì nên có thể để lại nhận xét khi bạn thực hiện phép tính!
smillig

Chà, khi tôi tổng hợp các giá trị (nghĩa là nếu có 10 người, với 1,3 hoặc 5 điểm, thì tôi chỉ có 3 cấp bậc: 1: 3,2: 5,3: 10) và nhân lên (bao nhiêu với số điểm đó) * điểm * (thứ hạng của điểm số) Tôi nhận được -0,98, điều đó sẽ có ý nghĩa nếu không có dấu hiệu sai. Nhưng tôi không chắc cách phím tắt nhỏ của mình ảnh hưởng đến thang đo
gini

3×24×3.5

4

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

1

Thêm vào câu trả lời @smillig, dựa trên phương trình được cung cấp:

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

Đã cho tôi vào bộ thử nghiệm của mình:

0.45503253636587840

Giống như thư viện ineq của R Gini (x)


; VỚI T AS (CHỌN CAST (thu nhập NHƯ FLOAT) AS x TỪ #data), tt AS (CHỌN *, ROW_NUMBER () QUÁ (ĐẶT HÀNG B xNG NHƯ i TỪ) COUNT (x) * SUM (x)) - 1.0- (1.0 / COUNT (x)) NHƯ gini Tt
Chris
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.