今回は、BigQueryで組み合わせ数の算出方法を紹介します。
例として下記のような購買データを使用します。ブランドの購入組み合わせ数(UU数)を算出してみましょう。
購入ID | 購入日 (sync_date) | ユーザーID (user_id) | ブランド (brand) | 商品名 (item) | 個数 (quantity) | 値段 (price) |
---|---|---|---|---|---|---|
1 | 2024/1/1 | yamada_hanako | brand_A | カーディガン | 1 | 1980 |
2 | 2024/1/1 | yamada_hanako | brand_B | スカート | 1 | 2980 |
3 | 2024/1/2 | tanaka_taro | brand_A | Yシャツ | 1 | 1980 |
4 | 2024/1/2 | tanaka_taro | brand_B | スラックス | 1 | 2980 |
5 | 2024/1/2 | tanaka_taro | brand_C | 靴下 | 1 | 980 |
6 | 2024/1/3 | sato_jiro | brand_A | ネクタイ | 1 | 1980 |
7 | 2024/1/3 | sato_jiro | brand_C | Tシャツ | 1 | 2980 |
8 | 2024/1/3 | sato_jiro | brand_D | ベルト | 1 | 1980 |
-- まずは必要なデータだけ取得する
WITH brand_list AS (
SELECT
sync_date
, user_id
, brand
FROM
buy_data
)
-- 日付・ユーザーでグループ化し、ブランドを配列化
, brand_list_by_user AS (
SELECT
sync_date
, user_id
, ARRAY_AGG(brand) AS brand_arr
FROM
brand_list
GROUP BY
sync_date, user_id
)
-- 組み合わせを列挙(UU数の算出のためDISTINCTを入れている)
, brand_comb AS (
SELECT DISTINCT
user_id
, brand
, brand_together
FROM
brand_list_by_user
, UNNEST(brand_arr) AS brand
, UNNEST(brand_arr) AS brand_together
WHERE
brand < brand_together
UNION ALL
SELECT DISTINCT
user_id
, brand
, brand_together
FROM
brand_list_by_user
, UNNEST(brand_arr) AS brand
, UNNEST(brand_arr) AS brand_together
WHERE
brand_together < brand
)
-- brandとbrand_togetherでグループ化し、UU数を算出
SELECT
brand
, brand_together
, COUNT(*) AS uu
FROM
brand_comb
GROUP BY
brand, brand_together
このクエリを実行すると下記のようなデータを得ることができます。
ブランド (brand) | 一緒に購入されたブランド (brand_together) | ユニークユーザー数 (uu) |
---|---|---|
brand_A | brand_B | 2 |
brand_A | brand_C | 2 |
brand_A | brand_D | 1 |
brand_B | brand_A | 2 |
brand_B | brand_C | 1 |
brand_C | brand_A | 2 |
brand_C | brand_B | 1 |
brand_C | brand_D | 1 |
brand_D | brand_A | 1 |
brand_D | brand_C | 1 |
組み合わせを全パターン出すクエリになっています。
(brand_A, brand_B)があれば、(brand_B, brand_A)の組み合わせは必要ない場合は、brand_combの中に記述しているUNION ALL以下を消せばOKです。
この方法がわかっていれば、商品名の組み合わせ数を出すことも容易ですね。
どんどん使っていきましょう!