徒然なるままにデータサイエンス

データアナリストの実務で得た知識を書いていきます

【BigQuery】#3 組み合わせごとに会員数(ID数)をカウントする【組み合わせ分析】

facilityの組み合わせごとの会員数をカウントする

前回作成したfacilityの組み合わせ(set_facility)を使って、facilityの組み合わせ毎に会員数がどのくらいいるのかカウントします。
SQLのコードは下記です。

SELECT
  set_facility,
  COUNT(DISTINCT ID) AS ID_count
FROM 
  `table_name`
GROUP BY 
  set_facility
COUNT( [数えたい要素] )

今回は[数えたい要素]をIDとすることで会員数をカウントしています。
またCOUNT関数内にDISTINCTを入れることでIDを重複せずにカウントすることができます。
またGROUP BY句でset_facilityを指定することで、set_facility毎に会員数を数えるようにしています。

BigQueryでのクエリ結果

それではBigQuery上で実際にクエリを実行します。

クエリ
SELECT
  set_facility,
  COUNT(DISTINCT ID) AS ID_count
FROM 
  `table_name`
GROUP BY 
  set_facility
ORDER BY 
  ID_count DESC

分かりやすく表示するために、ORDER BY句で会員数の多い順にデータを表示するようにしています。

クエリ実行結果

f:id:funi_ds:20220310120225p:plain
facilityの組み合わせ毎に会員数をカウントすることができました!
ジムが5人と一番多くなっていることがわかります。

まとめ

1~#3までのコードをまとめると以下のようになります。

WITH tbl_time AS (--time-stampをYYYY-MM表記に変換
SELECT  
  FORMAT_DATE("%Y-%m", DATE(TIMESTAMP_SECONDS(time_stamp))) AS date,
  record_number,
  ID,
  facility
FROM 
 `table_name`
)

, tbl_set AS (--ID毎にfacilityの組み合わせを作成
SELECT 
  ID,
  STRING_AGG(DISTINCT facility ORDER BY facility asc) as set_facility
FROM 
  tbl_time
GROUP BY 
  ID
)

SELECT
  time0.date,
  set0.set_facility,
  COUNT(DISTINCT set0.ID) AS ID_count
FROM 
  tbl_set AS set0
  INNER JOIN 
  tbl_time AS time0
  ON 
  (
      set0.ID = time0.ID
  )
GROUP BY 
  time0.date,
  set0.set_facility
ORDER BY 
  ID_count DESC

WITH句を使用して複数テーブルを作成しています。
また最後にINNER JOIN句を用いて、facilityの組み合わせ(set_facility)とdateをIDをキーに結合しています。
(今回はdateは「2022-02」のみのためtbl_setの中にdateを組み込んでもいいのですが、もしdateが複数ある場合はこのように最後に結合させる必要があります。)

クエリ実行結果

f:id:funi_ds:20220310122243p:plain
このデータ処理を行うことで組み合わせ分析がいろいろとできそうですね!