Geschichtete Zufallsstichprobe mit BigQuery?


Felipe Hoffa

Wie kann ich mit BigQuery geschichtete Stichproben erstellen?

Zum Beispiel wollen wir eine 10% proportionale geschichtete Stichprobe, bei der die category_id als Schicht verwendet wird. Wir haben bis zu 11000 category_ids in einigen unserer Tabellen.

Felipe Hoffa

Mit #standardSQL, lassen Sie uns unseren Tisch und einige Statistiken darüber definieren:

WITH table AS (
  SELECT *, subreddit category
  FROM `fh-bigquery.reddit_comments.2018_09` a
), table_stats AS (
  SELECT *, SUM(c) OVER() total 
  FROM (
    SELECT category, COUNT(*) c 
    FROM table
    GROUP BY 1 
    HAVING c>1000000)
)

In diesem Setup:

  • subreddit wird unsere Kategorie sein
  • Wir wollen nur Subreddits mit mehr als 1000000 Kommentaren

Wenn wir also 1% jeder Kategorie in unserer Stichprobe haben möchten:

SELECT COUNT(*) samples, category, ROUND(100*COUNT(*)/MAX(c),2) percentage
FROM (
  SELECT id, category, c  
  FROM table a
  JOIN table_stats b
  USING(category)
  WHERE RAND()< 1/100 
)
GROUP BY 2

Geben Sie hier die Bildbeschreibung ein

Oder nehmen wir an, wir wollen ~ 80.000 Proben - aber proportional zu allen Kategorien ausgewählt:

SELECT COUNT(*) samples, category, ROUND(100*COUNT(*)/MAX(c),2) percentage
FROM (
  SELECT id, category, c  
  FROM table a
  JOIN table_stats b
  USING(category)
  WHERE RAND()< 80000/total
)
GROUP BY 2

Geben Sie hier die Bildbeschreibung ein

Wenn Sie nun die gleiche Anzahl von Proben aus jeder Gruppe erhalten möchten (sagen wir 20.000):

SELECT COUNT(*) samples, category, ROUND(100*COUNT(*)/MAX(c),2) percentage
FROM (
  SELECT id, category, c  
  FROM table a
  JOIN table_stats b
  USING(category)
  WHERE RAND()< 20000/c
)
GROUP BY 2

Geben Sie hier die Bildbeschreibung ein

Wenn Sie genau 20.000 Elemente aus jeder Kategorie möchten:

SELECT ARRAY_LENGTH(cat_samples) samples, category, ROUND(100*ARRAY_LENGTH(cat_samples)/c,2) percentage
FROM (
  SELECT ARRAY_AGG(a ORDER BY RAND() LIMIT 20000) cat_samples, category, ANY_VALUE(c) c
  FROM table a
  JOIN table_stats b
  USING(category)
  GROUP BY category
)

Geben Sie hier die Bildbeschreibung ein

Wenn Sie genau 2% von jeder Gruppe wollen:

SELECT COUNT(*) samples, sample.category, ROUND(100*COUNT(*)/ANY_VALUE(c),2) percentage
FROM (
  SELECT ARRAY_AGG(a ORDER BY RAND()) cat_samples, category, ANY_VALUE(c) c
  FROM table a
  JOIN table_stats b
  USING(category)
  GROUP BY category
), UNNEST(cat_samples) sample WITH OFFSET off
WHERE off<0.02*c
GROUP BY 2

Geben Sie hier die Bildbeschreibung ein


Wenn Sie diesen letzten Ansatz wünschen, können Sie feststellen, dass er fehlschlägt, wenn Sie tatsächlich Daten herausholen möchten. Eine frühe, LIMITähnlich der größten Gruppengröße, stellt sicher, dass nicht mehr Daten als erforderlich sortiert werden:

SELECT sample.*
FROM (
  SELECT ARRAY_AGG(a ORDER BY RAND() LIMIT 105000) cat_samples, category, ANY_VALUE(c) c
  FROM table a
  JOIN table_stats b
  USING(category)
  GROUP BY category
), UNNEST(cat_samples) sample WITH OFFSET off
WHERE off<0.02*c

Verwandte Artikel


Geschichtete Zufallsstichprobe mit einer Selektionsrate von 50%

Darko Ich habe ein Problem, das vielleicht ein großes Problem darstellt, und bin mir nicht sicher, ob es über den Rahmen dieses Threads hinausgeht, dachte aber, ich würde es versuchen. Ich arbeite derzeit an einem Datensatz, der die ID des Befragten (von denen

Geschichtete Zufallsstichprobe in R.

Lorenna Van Munnecom Ich habe Probleme, eine geschichtete Stichprobe der Größe 100 unter Verwendung einer geschichteten Zufallsstichprobe mit 3078 Beobachtungen zu erstellen. Die Bedingungen, die die geschichtete Zufallsstichprobe erfüllen muss, sind: FARMS92

Geschichtete Zufallsstichprobe aus Daten frame_follow up

user11806155 Ich versuche, 50% der Daten für jede Gruppe nach einer geschichteten Zufallsstichprobe aus dem Datenrahmen zufällig abzutasten . Ein reproduzierbares Beispiel mit dem mtcars-Datensatz in R sieht wie folgt aus. Was ich nicht verstehe ist, dass der

Zufallsstichprobe in Google BigQuery

David M Smith: Ich habe gerade festgestellt, dass die RAND () -Funktion, obwohl sie nicht dokumentiert ist, in BigQuery funktioniert. Ich konnte eine (scheinbar) zufällige Stichprobe von 10 Wörtern aus dem Shakespeare-Datensatz generieren, indem ich: SELECT wo

Geschichtete Permutation mit Bootstrap

Giac Ich habe Probleme beim Versuch, Permutationen zu schichten. Meine Daten sehen folgendermaßen aus: gender party value 1 F Democrat 762 2 M Democrat 484 3 F Independent 327 4 M Independent 239 5

Geschichtete Probenahme mit Pyspark

user3245256 Ich habe einen Funken DataFramemit einer Spalte, die viele Nullen und sehr wenige Einsen enthält (nur 0,01% von Einsen). Ich würde gerne eine zufällige, aber geschichtete Teilstichprobe nehmen, damit das Verhältnis von 1 zu 0 in dieser Spalte erhal

Geschichtete Kreuzvalidierung mit Pytorch

elenaby Mein Ziel ist es, eine binäre Klassifizierung mithilfe eines neuronalen Netzwerks vorzunehmen. Das Problem ist, dass der Datensatz nicht ausgeglichen ist. Ich habe 90% der Klassen 1 und 10 der Klasse 0. Um damit umzugehen, möchte ich die geschichtete K