简介 #
解释
- 对特定页面的上下游进行可视化展示
- 分析用户在使用产品时的路径分布情况
需要解决的问题
- 按转换率从高至低排列在APP内用户的主要路径是什么
- 用户在离开预想的路径后,实际走向是什么
- 不同特征的用户行为路径有什么差异
基本思路
- 将访问数据根据session划分,挖掘出用户频繁访问的路径
- 功能上
- 允许用户即时查看所选节点相关路径
- 支持用户自定义设置路径的起点或终点
- 支持按照业务新增用户/活跃用户查看不同目标人群在同一条行为路径上的转化结果分析,满足精细化分析的需求
基本概念 #
路径分析
- 分析用户在使用产品时的路径分布情况
- 挖掘出用户的频繁访问路径
- 探索用户在网站或应用上逗留的过程中采取的各项步骤
Session
- 在指定的时间段内在网站上发生的一系列互动
Session Time
- 当两个行为间隔时间超过Session Time,便认为这两个行为不属于同一条路径
桑基图
- 桑基能量分流图,也叫桑基能量平衡图,一种数据可视化技术或流程图,强调从一种状态到另一种状态或从一个时间到另一个时间的流动/移动/变化。
- 图中延伸的分支的宽度对应数据流量的大小
- 每条边表示上一节点到该节点的流量
- 组成部分
- 节点数据及节点转化率
- 边数据及边转化率
邻接表
- 顶点结构
- 边节点结构
树的剪枝
- 删去一些不重要的节点来降低计算或搜索的复杂度
PV / SV
- PV:访问次数,一段时间内访问的次数
- SV:会话次数,出现过该访问路径的会话数
- 例:
- A -> B -> C -> D -> A -> B
- A -> B -> D
- PV:2 + 1 = 3
- SV:1 + 1 = 2
桑基图(clickhouse) #
数据表 #
create table crm_activity_logs
(
crm_id UInt64,
first_type String,
type String,
created_at DateTime64(3, 'Asia/Shanghai')
)
engine = MergeTree PARTITION BY crm_id
ORDER BY crm_id;
1.获取路径基础数据(行为串) #
-- 获取路径基础数据(行为串)
with
minIf(created_at, type = 'browse') as start_time
select crm_id,
arrayCompact(
arrayMap(
x -> x.2,
arraySort(
x -> (x.1),
arrayFilter(
x -> (x.1 >= start_time),
groupArray((created_at, type))
)
)
)
) as sorted_events
from crm_activity_logs
where created_at > toDateTime64('2021-12-01 00:00:00', 3, 'Asia/Shanghai')
and type in ('browse', 'source.email_marketing', 'source.direct_traffic', 'form')
group by crm_id
having sorted_events[1] = 'browse'
and start_time <> toDateTime('1970-01-01 08:00:00.000', 3, 'Asia/Shanghai')
-- 获取路径基础数据(行为串)
with
maxIf(created_at, type = 'browse') as end_time,
arrayLast(
x -> (x = 'browse'),
sorted_events
) as last
select crm_id,
end_time,
arrayCompact(
arrayMap(
x -> x.2,
arraySort(
x -> (x.1),
arrayFilter(
x -> (x.1 <= end_time),
groupArray((created_at, type))
)
)
)
) as sorted_events,
last
from crm_activity_logs
where created_at > toDateTime64('2021-12-01 00:00:00', 3, 'Asia/Shanghai')
and type in ('browse', 'source.email_marketing', 'source.direct_traffic', 'form')
group by crm_id
having end_time > toDateTime64('1970-01-01 08:00:00.000', 3, 'Asia/Shanghai')
and last = 'browse'
2.获取桑基图基础数据 #
-- 获取桑基图的基础数据
with
arrayEnumerate(sorted_events) as sorted_event_idxs,
arrayPopBack(
arrayMap(
x -> (x, x + 1),
sorted_event_idxs
)
) AS source_target_idx,
arrayPopBack(
arrayMap(
x -> (sorted_events[x], sorted_events[x + 1]),
sorted_event_idxs
)
) AS source_target_event
select sorted_events,
uniqCombined(crm_id) as user_count,
arrayZip(source_target_idx, source_target_event) as source_target
from (
-- 获取路径基础数据(行为串)(见上面)
)
group by sorted_events
3.桑基图 #
select arrayJoin(source_target) as t,
(t.1).1 as idx_source,
(t.2).1 as event_source,
(t.1).2 as idx_target,
(t.2).2 as event_target,
sum(user_count) as value
from (
-- 获取桑基图的基础数据
)
group by t
order by (t.1).1;