Skip to main content

path analysis

·323 words·2 mins
😈long && 😻liang
Author
😈long && 😻liang
A IT worker with PHP/GO as the main technology stack
work - This article is part of a series.
Part 1: This Article

简介
#


解释


  • 对特定页面的上下游进行可视化展示
  • 分析用户在使用产品时的路径分布情况

需要解决的问题


  • 按转换率从高至低排列在APP内用户的主要路径是什么
  • 用户在离开预想的路径后,实际走向是什么
  • 不同特征的用户行为路径有什么差异

基本思路


  • 将访问数据根据session划分,挖掘出用户频繁访问的路径
  • 功能上
    • 允许用户即时查看所选节点相关路径
    • 支持用户自定义设置路径的起点或终点
    • 支持按照业务新增用户/活跃用户查看不同目标人群在同一条行为路径上的转化结果分析,满足精细化分析的需求

基本概念
#


路径分析


  • 分析用户在使用产品时的路径分布情况
  • 挖掘出用户的频繁访问路径
  • 探索用户在网站或应用上逗留的过程中采取的各项步骤

Session


  • 在指定的时间段内在网站上发生的一系列互动

Session Time


  • 当两个行为间隔时间超过Session Time,便认为这两个行为不属于同一条路径

桑基图


  • 桑基能量分流图,也叫桑基能量平衡图,一种数据可视化技术或流程图,强调从一种状态到另一种状态或从一个时间到另一个时间的流动/移动/变化。
  • 图中延伸的分支的宽度对应数据流量的大小
  • 每条边表示上一节点到该节点的流量
  • 组成部分
    • 节点数据及节点转化率
    • 边数据及边转化率

alt 桑基图

邻接表


  • 顶点结构

alt 顶点结构

  • 边节点结构

alt 边节点结构

树的剪枝


  • 删去一些不重要的节点来降低计算或搜索的复杂度

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;
work - This article is part of a series.
Part 1: This Article