このケースでは、Databend Cloud を使用して、 Tianchi Lab からのTaobao ユーザーのショッピング行動データセットを分析し、興味深いショッピング行動を一緒に発見します。
このデータ セットは CSV 形式であり、2017 年 11 月 25 日から 2017 年 12 月 3 日までに行動した約 100 万人のランダム ユーザーのすべての行動 (クリック、購入、追加購入、いいね! を含む) が含まれています。データセットの各行はユーザーの行動を表し、カンマで区切られた次の 5 つの列で構成されます。
列名 | 説明する |
---|---|
ユーザーID | 整数型、シリアル化されたユーザー ID |
製品番号 | 整数型、シリアル化されたプロダクト ID |
製品カテゴリID | 整数型、シリアル化された製品カテゴリ ID |
行動タイプ | 文字列、列挙タイプ。「pv」: 製品詳細ページの pv、クリックに相当。「カート」: 製品をショッピング カートに追加。 |
タイムスタンプ | 動作が発生したときのタイムスタンプ |
準備
データセットをダウンロードする
- Taobao ユーザーのショッピング行動データ セットをローカル コンピューターにダウンロードし、次のコマンドを使用して解凍します。
unzip UserBehavior.csv.zip
- 解凍されたデータ セット ファイル (UserBehavior.csv) を gzip 形式に圧縮します。
gzip UserBehavior.csv
外部ステージを作成する
- Databend Cloud にログインし、新しいワークスペースを作成します。
- ワークスペースで次の SQL ステートメントを実行して、Alibaba Cloud 上に「mycsv」という名前の外部ステージを作成します。
CREATE STAGE mycsv URL = 's3://<YOUR_BUCKET_NAME>'
CONNECTION = (
ACCESS_KEY_ID = '<YOUR_ACCESS_KEY_ID>',
SECRET_ACCESS_KEY = '<YOUR_SECRET_ACCESS_KEY>',
ENDPOINT_URL = '<YOUR_ENDPOINT_URL>',
ENABLE_VIRTUAL_HOST_STYLE = TRUE
)
FILE_FORMAT = (
TYPE = CSV
COMPRESSION = AUTO
);
- 次の SQL ステートメントを実行して、Databend Cloud が外部ステージにアクセスできるかどうかを確認します。
LIST @mycsv;
データセットを外部ステージにアップロードする
BendSQLを使用して 、圧縮データ セット ファイル (UserBehavior.csv.gz) を外部ステージにアップロードします。計算クラスタの接続情報を取得するには、計算クラスタへの接続を参照してください。
(base) eric@Erics-iMac ~ % bendsql --host tenantID--YOUR_WAREHOUSE.gw.aliyun-cn-beijing.default.databend.cn \
--user=cloudapp \
--password=<YOUR_PASSWORD> \
--database="default" \
--port=443 --tls
Welcome to BendSQL 0.9.3-db6b232(2023-10-26T12:36:55.578667000Z).
Connecting to tenantID--YOUR_WAREHOUSE.gw.aliyun-cn-beijing.default.databend.cn:443 as user cloudapp.
Connected to DatabendQuery v1.2.183-nightly-1ed9a826ed(rust-1.72.0-nightly-2023-10-28T22:10:15.618365223Z)
cloudapp@tenantID--YOUR_WAREHOUSE.gw.aliyun-cn-beijing.default.databend.cn:443/default> PUT fs:///Users/eric/Documents/UserBehavior.csv.gz @mycsv
PUT fs:///Users/eric/Documents/UserBehavior.csv.gz @mycsv
┌─────────────────────────────────────────────────────────────────┐
│ file │ status │ size │
│ String │ String │ UInt64 │
├───────────────────────────────────────────┼─────────┼───────────┤
│ /Users/eric/Documents/UserBehavior.csv.gz │ SUCCESS │ 949805035 │
└─────────────────────────────────────────────────────────────────┘
1 file uploaded in 401.807 sec. Processed 1 file, 905.80 MiB (0.00 file/s, 2.25 MiB/s)
データのインポートとクリーニング
テーブルの作成
ワークスペースで次の SQL ステートメントを実行して、データセットのテーブルを作成します。
CREATE TABLE `user_behavior` (
`user_id` INT NOT NULL,
`item_id` INT NOT NULL,
`category_id` INT NOT NULL,
`behavior_type` VARCHAR,
`ts` TIMESTAMP,
`day` DATE );
データのクリーンアップとインポート
-
次の SQL ステートメントを実行して、データをテーブルにインポートし、同時にクリーニングを完了します。
- タイムゾーン外の無効なデータを削除する
- データ重複排除
- 追加のデータ列を生成する
INSERT INTO user_behavior
SELECT $1,$2,$3,$4,to_timestamp($5::bigint) AS ts, to_date(ts) day
FROM @mycsv/UserBehavior.csv.gz WHERE day BETWEEN '2017-11-25' AND '2017-12-03'
GROUP BY $1,$2,$3,$4,ts;
- 次の SQL ステートメントを実行して、データのインポートが成功したかどうかを確認します。このステートメントはテーブルから 10 行のデータを返します。
SELECT * FROM user_behavior LIMIT 10;
データ分析
事前準備とデータインポートが完了し、正式にデータ分析を開始しました。
ユーザートラフィックと買い物状況の分析
総訪問者数とユーザー数
SELECT SUM(CASE WHEN behavior_type = 'pv' THEN 1 ELSE 0 END) as pv,
COUNT(DISTINCT user_id) as uv
FROM user_behavior;
1 日あたりの平均訪問者数とユーザー数
SELECT day,
SUM(CASE WHEN behavior_type = 'pv' THEN 1 ELSE 0 END) AS pv,
COUNT(DISTINCT user_id) AS uv
FROM user_behavior
GROUP BY day
ORDER BY day;
ダッシュボード関数を使用して折れ線グラフを生成することもできます 。
各ユーザーのショッピング状況をカウントし、新しいテーブル user_behavior_count を生成します。
create table user_behavior_count as select user_id,
sum(case when behavior_type = 'pv' then 1 else 0 end) as pv, --点击数
sum(case when behavior_type = 'fav' then 1 else 0 end) as fav, --收藏数
sum(case when behavior_type = 'cart' then 1 else 0 end) as cart, --加购物车数
sum(case when behavior_type = 'buy' then 1 else 0 end) as buy --购买数
from user_behavior
group by user_id;
再購入率: 購入したユーザーのうち、2 回以上購入したユーザーの割合
select sum(case when buy > 1 then 1 else 0 end) / sum(case when buy > 0 then 1 else 0 end)
from user_behavior_count;
ユーザー行動のコンバージョン率
クリック/(カートに追加 + コレクション)/購入、各リンクのコンバージョン率
select a.pv,
a.fav,
a.cart,
a.fav + a.cart as `fav+cart`,
a.buy,
round((a.fav + a.cart) / a.pv, 4) as pv2favcart,
round(a.buy / (a.fav + a.cart), 4) as favcart2buy,
round(a.buy / a.pv, 4) as pv2buy
from(
select sum(pv) as pv, --点击数
sum(fav) as fav, --收藏数
sum(cart) as cart, --加购物车数
sum(buy) as buy --购买数
from user_behavior_count
) as a;
1 時間以内に閲覧→ショッピングへの追加→支払いを完了したユーザーをカウントします
SELECT
count_if(level>=1) as pv, count_if(level>=2) as cart, count_if(level>=3) as buy
FROM
(
SELECT
user_id,
window_funnel(3600000000)(ts, behavior_type = 'pv',behavior_type = 'cart',behavior_type = 'buy') AS level
FROM user_behavior
GROUP BY user_id
);
ユーザーの行動習慣
ユーザーの日常的な買い物行動
select to_hour(ts) as hour,
sum(case when behavior_type = 'pv' then 1 else 0 end) as pv, --点击数
sum(case when behavior_type = 'fav' then 1 else 0 end) as fav, --收藏数
sum(case when behavior_type = 'cart' then 1 else 0 end) as cart, --加购物车数
sum(case when behavior_type = 'buy' then 1 else 0 end) as buy --购买数
from user_behavior
group by hour
order by hour;
ダッシュボード関数を使用して折れ線グラフを生成することもできます 。
毎週のユーザーのショッピング行動
select to_day_of_week(day) as weekday,day,
sum(case when behavior_type = 'pv' then 1 else 0 end) as pv, --点击数
sum(case when behavior_type = 'fav' then 1 else 0 end) as fav, --收藏数
sum(case when behavior_type = 'cart' then 1 else 0 end) as cart, --加购物车数
sum(case when behavior_type = 'buy' then 1 else 0 end) as buy --购买数
from user_behavior
where day between '2017-11-27' and '2017-12-03'
group by weekday,day
order by weekday;
ダッシュボード関数を使用してヒストグラムを生成することもできます 。
RFM モデルに基づいて価値のあるユーザーを見つける
RFM モデルは、顧客価値と顧客の収益能力を測定するための重要なツールおよび手段であり、データ分析に最適な指標を構成します。
- R-Recency (最終購入時間)
- F-Frequency(消費周波数)
- M-Money(消費額)
R-Recency (最近の購入時間): R 値が高いほど、ユーザーはよりアクティブであることを示します。
select user_id,
to_date('2017-12-04') - max(day) as R,
dense_rank() over(order by (to_date('2017-12-04') - max(day))) as R_rank
from user_behavior
where behavior_type = 'buy'
group by user_id
limit 10;
F 周波数 (消費周波数): F 値が高いほど、ユーザーの忠誠度が高くなります。
select user_id,
count(1) as F,
dense_rank() over(order by count(1) desc) as F_rank
from user_behavior
where behavior_type = 'buy'
group by user_id
limit 10;
ユーザーのグループ化
購入行動のあるユーザーはランキングに従ってグループ化され、次の 5 つのグループに分類されます。
- 上位 1/5 ユーザーに 5 ポイントを付与
- 上位 1/5 ~ 2/5 ユーザーには 4 ポイントが付与されます
- 上位 2/5 ~ 3/5 ユーザーには 3 ポイントが付与されます
- 最初の 3/5 ~ 4/5 のユーザーには 2 ポイントが付与されます
- 残りのユーザーはスコア 1 を付けます
このルールに従って、ユーザーの時間間隔ランキングと購入頻度ランキングがそれぞれスコアリングされ、最終的に 2 つのスコアが組み合わされてユーザーの最終スコアとなります。
with cte as(
select user_id,
to_date('2017-12-04') - max(day) as R,
dense_rank() over(order by (to_date('2017-12-04') - max(day))) as R_rank,
count(1) as F,
dense_rank() over(order by count(1) desc) as F_rank
from user_behavior
where behavior_type = 'buy'
group by user_id)
select user_id, R, R_rank, R_score, F, F_rank, F_score, R_score + F_score AS score
from(
select *,
case ntile(5) over(order by R_rank) when 1 then 5
when 2 then 4
when 3 then 3
when 4 then 2
when 5 then 1
end as R_score,
case ntile(5) over(order by F_rank) when 1 then 5
when 2 then 4
when 3 then 3
when 4 then 2
when 5 then 1
end as F_score
from cte
) as a
order by score desc
limit 20;
製品寸法分析
売れ筋商品
select item_id ,
sum(case when behavior_type = 'pv' then 1 else 0 end) as pv, --点击数
sum(case when behavior_type = 'fav' then 1 else 0 end) as fav, --收藏数
sum(case when behavior_type = 'cart' then 1 else 0 end) as cart, --加购物车数
sum(case when behavior_type = 'buy' then 1 else 0 end) as buy --购买数
from user_behavior
group by item_id
order by buy desc
limit 10;
最も売れている製品カテゴリー
select category_id ,
sum(case when behavior_type = 'pv' then 1 else 0 end) as pv, --点击数
sum(case when behavior_type = 'fav' then 1 else 0 end) as fav, --收藏数
sum(case when behavior_type = 'cart' then 1 else 0 end) as cart, --加购物车数
sum(case when behavior_type = 'buy' then 1 else 0 end) as buy --购买数
from user_behavior
group by category_id
order by buy desc
limit 10;
ユーザー維持分析
開始する前に、テーブル「day_users」を作成し、データを挿入します。
create table day_users(
day date,
users bitmap);
insert into day_users select day, build_bitmap(list(user_id::UInt64)) from user_behavior group by day;
日々の紫外線量の統計
select day,bitmap_count(users) from day_users order by day;
相対的な保持率
ここでは、11 月 23 日と比較して、12 月 2 日にまだタオバオを使用しているユーザーを計算します。
select bitmap_count(bitmap_and(a.users, b.users))
from (select users from day_users where day='2017-11-25') a ,
(select users from day_users where day='2017-12-02') b;
比較的新しい
select bitmap_count(bitmap_not(b.users, a.users)) from (select users from day_users where day='2017-11-25') a ,
(select users from day_users where day='2017-12-02') b;