分层随机样本以匹配 BigQuery 中的不同表

Posted

技术标签:

【中文标题】分层随机样本以匹配 BigQuery 中的不同表【英文标题】:Stratified random sample to match a different table in BigQuery 【发布时间】:2020-02-10 21:50:33 【问题描述】:

这应该是this question的简单扩展,但是我的结果不正确,我想不通。我希望我从中绘制的表格中的比例与另一张表格的比例相匹配。我也想把它分为两类。我认为应该是这样的:

WITH table AS (
  SELECT *
  FROM `another_table` a
), table_stats AS (
  SELECT *, SUM(c) OVER() total 
  FROM (
    SELECT cat1, cat2, COUNT(*) c 
    FROM table
    GROUP BY cat1, cat2
    HAVING c>1000000)
)

SELECT COUNT(*) samples, cat1, cat2, ROUND(100*COUNT(*)/MAX(c),2) percentage
FROM (
  SELECT id, cat1, cat2, c  
  FROM table `fh-bigquery.reddit_comments.2018_09`
  JOIN table_stats b
  USING(cat1, cat2)
  WHERE RAND()< 1000/total
)
GROUP BY 2, 3

这应该给出大约 1000 行,但结果要高得多,并且百分比计算已关闭。

【问题讨论】:

【参考方案1】:

我认为您的 rand() 比较不适用:

WITH table AS (
      SELECT a.*
      FROM `another_table` a
     ),
    table_stats AS (
       SELECT cc.*, SUM(c) OVER () as total 
       FROM (SELECT cat1, cat2, COUNT(*) as c 
             FROM table
             GROUP BY cat1, cat2
             HAVING c > 1000000
            ) cc
      )
SELECT COUNT(*) as num_samples, cat1, cat2, ROUND(100*COUNT(*)/MAX(c),2) percentage
FROM (SELECT id, cat1, cat2, c  
      FROM (select t.*, COUNT(*) OVER () as t_total,
                   COUNT(*) OVER (PARTITION BY cat1, cat2) as tcc_total
            from table `fh-bigquery.reddit_comments.2018_09` t
           ) t JOIN
           table_stats b
           USING (cat1, cat2)
      WHERE RAND() < (1000.0 / t.t_total) * (c / total) / (tcc_total / t_total)
     ) t
GROUP BY 2, 3;

请注意,您需要 second 表的总大小才能使样本大小(大约)正确。

这也是随机的。如果你真的想要一个分层样本,那么你应该在一个订单集上做一个 nth 样本。如果您对此感兴趣,请提出一个问题,并附上适当的样本数据、期望的结果和解释。

【讨论】:

以上是关于分层随机样本以匹配 BigQuery 中的不同表的主要内容,如果未能解决你的问题,请参考以下文章

SPSS可以做分层区组随机化的随机分组表吗

如何在 Redshift 中做分层随机样本?

BigQuery 表的架构与配方不匹配

分层区组随机化及R语言实现(blockrand包)

SQL BigQuery - 比较两个表的总计数

在 BigQuery 中订购大型时间序列数据集以进行导出