Как получить точки для графика кривой Лоренца с SQL? - PullRequest
0 голосов
/ 25 января 2020

Я работаю с BigQuery, и меня интересует построение кривой Лоренца (для неравенства, связанного с коэффициентом Джини).

Как можно получить данные для такого графика с помощью SQL?

enter image description here

Кривая представляет собой график, показывающий долю общего дохода или богатства, предполагаемую нижним% населения, хотя это не совсем верно для конечного населения (см. ниже). Он часто используется для представления распределения доходов, где он показывает для нижних x% домохозяйств, какой процент (y%) от общего дохода у них есть. Процент домохозяйств нанесен на ось X, процент дохода на оси Y. Он также может быть использован для отображения распределения активов. При таком использовании многие экономисты считают это мерой социального неравенства. https://en.wikipedia.org/wiki/Lorenz_curve

1 Ответ

0 голосов
/ 25 января 2020

Сначала определите ваши данные - в моем случае это все страницы в Википедии и их количество просмотров (также удаляются специальные страницы):

WITH wiki_prefixes AS (SELECT ['File:', 'Talk:', 'Template_talk:', 'Wikipedia:', 'Category:', 'User_talk:', 'Page:', 'Template:', 'Category_talk:' , 'User:', 'Author:', 'Portal:', 'Wikipedia_talk:', 'Portal_talk:', 'File_talk:', 'Draft:', 'Help:', 'Draft_talk:', 'en:', 'Book_talk:', 'Module:', 'MOS:', 'Special:', 'Book:'] x)

, data AS (
  SELECT *
  FROM `fh-bigquery.wikipedia_extracts.201912_en_totals`
  WHERE title NOT IN ('-', 'Main_Page')
  AND (
    title NOT LIKE '%:%'
    OR REGEXP_EXTRACT(title, '[^:]*:') NOT IN UNNEST((SELECT(x) FROM wiki_prefixes))
  )
)

Как только у вас есть данные, которые вы хотите построить, затем Вы можете получить каждую строку в одном из 100 или 1000 сегментов плюс суммарный процент от общего числа, которое каждый представляет в этом запросе:


SELECT ROUND(100*cum_views/total_views,3) cum_percent, *
FROM (
  SELECT SUM(views) OVER(ORDER BY bucket) cum_views, *, SUM(views) OVER() total_views
  FROM (
    SELECT 1+fhoffa.x.int(rn/(SELECT (1+COUNT(*))/1000 FROM data)) bucket, COUNT(*) pages, SUM(views) views
      , STRING_AGG(title ORDER BY views DESC LIMIT 3) sample_titles
    FROM (
      SELECT title, views, ROW_NUMBER() OVER (ORDER BY views) rn
      FROM data
    )
    GROUP BY 1
  ) 
)

enter image description here

Если вы хотите визуализировать его в Data Studio, проверьте следующие шаги:

...