0

我正在使用 BigQuery,我有兴趣绘制洛伦兹曲线(用于不平等,与基尼系数有关)。

如何使用 SQL 为这样的绘图生成数据?

在此处输入图像描述

该曲线是显示底层 x% 的人所承担的总收入或财富比例的图表,尽管这对于有限的人口来说并不严格(见下文)。它通常用于表示收入分配,其中显示了最低 x% 的家庭,他们拥有的总收入的百分比 (y%)。家庭百分比绘制在 x 轴上,收入百分比绘制在 y 轴上。它也可以用来显示资产的分布。在这种用途中,许多经济学家认为它是衡量社会不平等的指标。https://en.wikipedia.org/wiki/Lorenz_curve

4

1 回答 1

0

首先定义您的数据 - 在我的情况下,这些是维基百科中的所有页面及其浏览量(也删除特殊页面):

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

在此处输入图像描述

如果您想在 Data Studio 中将其可视化,请检查以下步骤:

于 2020-01-25T01:51:17.663 回答