今回のテーマ
SQLを使用したチャットボット内のユーザーの行動分析
前提条件
- 使用するデータウェアハウスはBigquery
- チャットボットで記録されるデータは
- session id:チャットボット起動時に記録される一意のID(String型)
- createtime:データが作成された日時(datetime型)
- scenario text:チャットボット内でどのボタンが押下されたか判別できるString型データ
今回分析したい内容
- シナリオごとのユーザー数
シナリオごとのユーザー数
- 方法1:シナリオ単位でグループ化をし、session idをdistinctでcountしてあげる
- 方法2:STRING_AGGを使用してセッションごとにscenario textをまとめる方法
方法1については基礎的な部分なので割愛する。
方法2については以下のSQLで取得可能
with A as(
select
session_id
,STRING_AGG(scenario_text) as scenario
from xx /*チャットボット内の行動が記録されているテーブル*/
group by 1
)
select
case
when REGEXP_CONTAINS(scenario, "シナリオ1") IS TRUE THEN "シナリオ1"
when REGEXP_CONTAINS(scenario, "シナリオ2") IS TRUE THEN "シナリオ2"
when ...
end as scenario
,count(distinct session_id)
from A
group by 1
Aテーブルは以下のようになる
session_id | scenario |
---|---|
a | シナリオ1,シナリオ2,...,シナリオn |
b | シナリオ1,シナリオ2,...,シナリオm |
... | ... |
REGEXP_CONTAINSで含まれているシナリオを抽出しグループ化を行う。
方法2のメリットとしては、方法1とは違い複数のシナリオを経由したユーザーを把握することが可能である。
例えば、シナリオ1→シナリオ2→シナリオ4の行動を行ったユーザー数などを簡単に絞り込むことができる。
この場合、SQLは以下の通りになる。
with A as(
select
session_id
,STRING_AGG(scenario_text) as scenario
from xx /*チャットボット内の行動が記録されているテーブル*/
group by 1
)
select
case
when
REGEXP_CONTAINS(scenario, "シナリオ1") IS TRUE
AND REGEXP_CONTAINS(scenario, "シナリオ2") IS TRUE
AND REGEXP_CONTAINS(scenario, "シナリオ4") IS TRUE
THEN "シナリオ1→2→4"
end as scenario
,count(distinct session_id)
from A
group by 1