用户行为分析模型实践(一)—— 路径分析模型

一、需求背景

在互联网数据化运营实践中,有一类数据分析应用是互联网行业所独有的——路径分析。路径分析应用是对特定页面的上下游进行可视化展示并分析用户在使用产品时的路径分布情况。比如:当用户使用某APP时,是怎样从【首页】进入【详情页】的,用户从【首页】分别进入【详情页】、【播放页】、【下载页】的比例是怎样的,以及可以帮助我们分析用户离开的节点是什么。

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

1.1 应用场景

通常用户在需要进行路径分析的场景时关注的主要问题:

  • 按转换率从高至低排列在APP内用户的主要路径是什么;

  • 用户在离开预想的路径后,实际走向是什么?

  • 不同特征的用户行为路径有什么差异?

通过一个实际的业务场景我们可以看下路径分析模型是如何解决此类问题的;

【业务场景】

分析“活跃用户”到达目标落地页[小视频页]的主要行为路径(日数据量为十亿级,要求计算结果产出时间1s左右)

【用户操作】

  1. 选择起始/结束页面,添加筛选条件“用户”;

  2. 选择类型“访问次数”/“会话次数”;

  3. 点击查询,即时产出结果。

二、基本概念

在进行具体的数据模型和工程架构设计前,先介绍一些基础概念,帮助大家更好的理解本文。

2.1 路径分析

路径分析是常用的数据挖据方法之一, 主要用于分析用户在使用产品时的路径分布情况,挖掘出用户的频繁访问路径。与漏斗功能一样,路径分析会探索用户在您的网站或应用上逗留的过程中采取的各项步骤,但路径分析可随机对多条路径进行研究,而不仅仅是分析一条预先设定的路径。

2.2 Session和Session Time

不同于WEB应用中的Session,在数据分析中的Session会话,是指在指定的时间段内在网站上发生的一系列互动。本模型中的Session Time的含义是,当两个行为间隔时间超过Session Time,我们便认为这两个行为不属于同一条路径。

2.3 桑基图

桑基图(Sankey diagram),即桑基能量分流图,也叫桑基能量平衡图。它是一种特定类型的流程图,图中延伸的分支的宽度对应数据流量的大小。如图4.1-1所示,每条边表示上一节点到该节点的流量。一个完整的桑基图包括以下几个内容:节点数据及节点转化率(下图红框部分)、边数据及边转化率(下图黑框部分)。转化率的计算详见【3.5. 转化率计算】。

2.4 邻接表

构造桑基图可以简化为一个图的压缩存储问题。图通常由几个部分组成:

  • 边(edge)

  • 点(vertex)

  • 权重(weight)

  • 度(degree)

本模型中,我们采用邻接表进行存储。邻接表是一种常用的图压缩存储结构,借助链表来保存图中的节点和边而忽略各节点之间不存在的边,从而对矩阵进行压缩。邻接表的构造如下:

(a)中,左侧为顶点节点,包含顶点数据及指向第一条边的指针;右侧为边节点,包含该边的权重、出入度等边信息以及指向下一条边的指针。一个完整的邻接表类似于Hashmap的结构,如图(b),左侧是一个顺序表,保存的是(a)中的边节点;每个边节点对应一个链表存储与该节点相连接的边。页面路径模型中,为了适应模型的需要,我们对顶点节点和边节点结构做了改造,详情请见【4.1】节。

2.5  树的剪枝

剪枝是树的构造中一个重要的步骤,指删去一些不重要的节点来降低计算或搜索的复杂度。页面路径模型中,我们在剪枝环节对原始数据构造的树进行修整,去掉不符合条件的分支,来保证树中每条根节点到叶节点路径的完整性。

2.6 PV和SV

PV即Page View,访问次数,本模型中指的是一段时间内访问的次数;SV即Session View,会话次数,本模型中指出现过该访问路径的会话数。如,有路径一:A → B → C → D → A → B和路径二:A → B → D,那么,A → B的PV为2+1=3,SV为1+1=2。

 三、 数据模型设计

本节将介绍数据模型的设计,包括数据流向、路径划分、ps/sv计算以及最终得到的桑基图中路径的转化率计算。

3.1 整体数据流向

数据来源于统一的数据仓库,通过Spark计算后写入Clickhouse,并用Hive进行冷备份。数据流向图见图3.1-1。

图3.1-1

3.2  技术选型

Clickhouse不是本文的重点,在此不详细描述,仅简要说明选择Clickhouse的原因。

选择的原因是在于,Clickhouse是列式存储,速度极快。看下数据量级和查询速度(截止到本文撰写的日期):

图3.2-1

最后得到的千亿数据查询速度是这样,

图3.2-2

3.3 数据建模

3.3.1 获取页面信息,划分session

页面路径模型基于各种事件id切割获取到对应的页面id,来进行页面路径分析。Session的概念可见第2.2节,这里不再赘述。目前我们使用更加灵活的Session划分,使得用户可以查询到在各种时间粒度(5,10,15,30,60分钟)的Session会话下,用户的页面转化信息。

假设有用户a和用户b,a用户当天发生的行为事件分别为 E1, E2, E3... , 对应的页面分别为P1, P2, P3... ,事件发生的时间分别为T1, T2, T3... ,选定的session间隔为tg。如图所示T4-T3>tg,所以P1,P2,P3被划分到了第一个Session,P4,P5被划分到了第二个Session,同理P6及后面的页面也被划分到了新的Session。

伪代码实现如下:

def splitPageSessions(timeSeq: Seq[Long], events: Seq[String], interval: Int)
                     (implicit separator: String): Array[Array[Array[String]]] = {
  // 参数中的events是事件集合,timeSeq是相应的事件发生时间的集合
  if (events.contains(separator))
    throw new IllegalArgumentException("Separator should't be in events.")
  if (events.length != timeSeq.length)
    throw new Exception("Events and timeSeq not in equal length.")
  val timeBuf = ArrayBuffer[String](timeSeq.head.toString) // 存储含有session分隔标识的时间集合
  val eventBuf = ArrayBuffer[String](events.head) // 存储含有session分隔标识的事件集合
  if (timeSeq.length >= 2) {
    events.indices.tail.foreach { i =>
      if (timeSeq(i) - timeSeq(i - 1) > interval * 60000) { // 如果两个事件的发生时间间隔超过设置的时间间隔,则添加分隔符作为后面划分session的标识
        timeBuf += separator;
        eventBuf += separator
      }
      timeBuf += timeSeq(i).toString;
      eventBuf += events(i)
    }
  }
  val tb = timeBuf.mkString(",").split(s",\\$separator,").map(_.split(",")) // 把集合通过标识符划分成为各个session下的时间集合
  val eb = eventBuf.mkString(",").split(s",\\$separator,").map(_.split(",")) // 把集合通过标识符划分成为各个session下的事件集合
  tb.zip(eb).map(t => Array(t._1, t._2)) // 把session中的事件和发生时间对应zip到一起,并把元组修改成数组类型,方便后续处理
}

3.3.2 相邻页面去重

不同的事件可能对应同一页面,临近的相同页面需要被过滤掉,所以划分session之后需要做的就是相邻页面去重。

图3.3-2

相邻页面去重后得到的结果是这样

图3.3-3

3.3.3 获取每个页面的前/后四级页面

然后对上述数据进行窗口函数分析,获取每个session中每个页面的前后四级页面,其中sid是根据用户标识ID和session号拼接而成,比如,针对上述的用户a的第一个session 0会生成如下的7条记录,图中的page列为当前页面,空页面用-1表示

图3.3-4

计算剩下的,会得到一共7+7+6+4+5=29条记录。得到全部记录如下

3.3.4 统计正负向路径的pv/sv

取page和page_id_previous1, page_id_previous2, page_id_previous3 ,page_id_previous4得到负向五级路径(path_direction为2),取page和page_id_next1, page_id_next2, page_id_next3, page_id_next4得到正向五级路径(path_direction为1),分别计算路径的pv和sv(按照sid去重),得到如下数据dfSessions,

直接看上面的数据可能比较茫然,所以这里拆出两条数据示例,第一条结果数据

图3.3-4

这是一条正向的(path_direction为1)路径结果数据,在下图中就是从左到右的路径,对应的两个路径如下

图3.3-5

第二条结果数据

图3.3-6

也是一条正向的路径结果数据,其中pv为2,对应的两个路径如下,sv为1的原因是这两条路径的sid一致,都是用户a在S1会话中产生的路径

图3.3-7

3.3.5 统计计算各级路径的pv/sv

然后根据dfSessions数据,按照page_id_lv1分组计算pv和sv的和,得到一级路径的pv和sv,一级路径特殊地会把path_direction设置为0

然后类似地分别计算二三四五级路径的pv和sv,合并所有结果得到如下

3.4 数据写入

通过Spark分析计算的结果数据需要写入Clickhouse来线上服务,写入Hive来作为数据冷备份,可以进行Clickhouse的数据恢复。

Clickhouse表使用的是分布式(Distributed)表结构,分布式表本身不存储任何数据,而是作为数据分片的透明代理,自动路由到数据到集群中的各个节点,所以分布式表引擎需要配合其他数据表引擎一起使用。用户路径分析模型的表数据被存储在集群的各个分片中,分片方式使用随机分片,在这里涉及到了Clickhouse的数据写入,我们展开讲解下。

有关于这一点,在模型初期我们使用的是写分布式表的方式来写入数据,具体的写入流程如下所示:

  1. 客户端和集群中的A节点建立jdbc连接,并通过HTTP的POST请求写入数据;

  2. A分片在收到数据之后会做两件事情,第一,根据分片规则划分数据,第二,将属于当前分片的数据写入自己的本地表;

  3. A分片将属于远端分片的数据以分区为单位,写入目录下临时bin文件,命名规则如:/database@host:port/[increase_num].bin;

  4. A分片尝试和远端分片建立连接;

  5. 会有另一组监听任务监听上面产生的临时bin文件,并将这些数据发送到远端分片,每份数据单线程发送;

  6. 远端分片接收数据并且写入本地表;

  7. A分片确认完成写入。

通过以上过程可以看出,Distributed表负责所有分片的数据写入工作,所以建立jdbc连接的节点的出入流量会峰值极高,会产生以下几个问题:

  1. 单台节点的负载过高,主要体现在内存、网卡出入流量和TCP连接等待数量等,机器健康程度很差;

  2. 当业务增长后更多的模型会接入Clickhouse做OLAP,意味着更大的数据量,以当前的方式来继续写入的必然会造成单台机器宕机,在当前没有做高可用的状况下,单台机器的宕机会造成整个集群的不可用;

  3. 后续一定会做ck集群的高可用,使用可靠性更高的ReplicatedMergeTree,使用这种引擎在写入数据的时候,也会因为写分布式表而出现数据不一致的情况。

针对于此数据端做了DNS轮询写本地表的改造,经过改造之后:

  • 用于JDBC连接的机器的TCP连接等待数由90下降到25,降低了72%以上;

  • 用于JDBC连接的机器的入流量峰值由645M/s降低到76M/s,降低了88%以上;

  • 用于JDBC连接的机器因分发数据而造成的出流量约为92M/s,改造后这部分出流量清零。

另外,在Distributed表负责向远端分片写入数据的时候,有异步写和同步写两种方式,异步写的话会在Distributed表写完本地分片之后就会返回写入成功信息,如果是同步写,会在所有分片都写入完成才返回成功信息,默认的情况是异步写,我们可以通过修改参数来控制同步写的等待超时时间。

def splitPageSessions(timeSeq: Seq[Long], events: Seq[String], interval: Int)
                     (implicit separator: String): Array[Array[Array[String]]] = {
  // 参数中的events是事件集合,timeSeq是相应的事件发生时间的集合
  if (events.contains(separator))
    throw new IllegalArgumentException("Separator should't be in events.")
  if (events.length != timeSeq.length)
    throw new Exception("Events and timeSeq not in equal length.")
  val timeBuf = ArrayBuffer[String](timeSeq.head.toString) // 存储含有session分隔标识的时间集合
  val eventBuf = ArrayBuffer[String](events.head) // 存储含有session分隔标识的事件集合
  if (timeSeq.length >= 2) {
    events.indices.tail.foreach { i =>
      if (timeSeq(i) - timeSeq(i - 1) > interval * 60000) { // 如果两个事件的发生时间间隔超过设置的时间间隔,则添加分隔符作为后面划分session的标识
        timeBuf += separator;
        eventBuf += separator
      }
      timeBuf += timeSeq(i).toString;
      eventBuf += events(i)
    }
  }
  val tb = timeBuf.mkString(",").split(s",\\$separator,").map(_.split(",")) // 把集合通过标识符划分成为各个session下的时间集合
  val eb = eventBuf.mkString(",").split(s",\\$separator,").map(_.split(",")) // 把集合通过标识符划分成为各个session下的事件集合
  tb.zip(eb).map(t => Array(t._1, t._2)) // 把session中的事件和发生时间对应zip到一起,并把元组修改成数组类型,方便后续处理
}

3.5 转化率计算

在前端页面选择相应的维度,选中起始页面:

后端会在Clickhouse中查询,

  • 选定节点深度(node_depth)为1和一级页面(page_id_lv1)是选定页面的数据,得到一级页面及其sv/pv,

  • 选定节点深度(node_depth)为2和一级页面(page_id_lv1)是选定页面的数据,按照sv/pv倒序取前10,得到二级页面及其sv/pv,

  • 选定节点深度(node_depth)为2和一级页面(page_id_lv1)是选定页面的数据,按照sv/pv倒序取前20,得到三级页面及其sv/pv,

  • 选定节点深度(node_depth)为2和一级页面(page_id_lv1)是选定页面的数据,按照sv/pv倒序取前30,得到四级页面及其sv/pv,

  • 选定节点深度(node_depth)为2和一级页面(page_id_lv1)是选定页面的数据,按照sv/pv倒序取前50,得到五级页面及其sv/pv,

转化率计算规则:

页面转化率:

假设有路径 A-B-C,A-D-C,A-B-D-C,其中ABCD分别是四个不同页面

计算三级页面C的转化率:

(所有节点深度为3的路径中三级页面是C的路径的pv/sv和)÷(一级页面的pv/sv) 

路径转化率

假设有A-B-C,A-D-C,A-B-D-C,其中ABCD分别是四个不同页面

计算A-B-C路径中B-C的转化率:

(A-B-C这条路径的pv/sv)÷(所有节点深度为3的路径中二级页面是B的路径的pv/sv和)

 四、工程端架构设计

本节将讲解工程端的处理架构,包括几个方面:桑基图的构造、路径合并以及转化率计算、剪枝。

4.1 桑基图的构造

从上述原型图可以看到,我们需要构造桑基图,对于工程端而言就是需要构造带权路径树。

简化一下上图,就可以将需求转化为构造带权树的邻接表。如下左图就是我们的邻接表设计。左侧顺序列表存储的是各个节点(Vertex),包含节点名称(name)、节点代码(code)等节点信息和一个指向边(Edge)列表的指针;每个节点(Vertex)指向一个边(Edge)链表,每条边保存的是当前边的权重、端点信息以及指向同节点下一条边的指针。

‍图4.1-2‍

图4.1-3 

图4.1-2就是我们在模型中使用到的邻接表。这里在2.4中描述的邻接表上做了一些改动。在我们的桑基图中,不同层级会出现相同名称不同转化率的节点,这些节点作为路径的一环,并不能按照名称被看作重复节点,不构成环路。如果整个桑基图用一个邻接表表示,那么这类节点将被当作相同节点,使得图像当中出现环路。因此,我们将桑基图按照层级划分,每两级用一个邻接表表示,如图4.1-2,Level 1表示层级1的节点和指向层级2的边、Level 2表示层级2的节点指向层级3的边,以此类推。

4.2 路径的定义

首先,我们先回顾一下桑基图:

图4.2-1

观察上图可以发现,我们需要计算四个数据:每个节点的pv/sv、每个节点的转化率、节点间的pv/sv、节点间的转化率。那么下面我们给出这几个数据的定义:

  • 节点pv/sv = 当前节点在当前层次中的pv/sv总和

  • 节点转化率 = ( 节点pv/sv ) / ( 路径起始节点pv/sv )

  • 节点间pv/sv = 上一级节点流向当前节点的pv/sv

  • 节点间转化率 = ( 节点间pv/sv ) / ( 上一级节点pv/sv )

再来看下存储在Clickhouse中的路径数据。先来看看表结构:

(
  `node_depth` Int8 COMMENT '节点深度,共5个层级深度,枚举值1-2-3-4-5' CODEC(T64, LZ4HC(0)),
  `page_id_lv1` String COMMENT '一级页面,起始页面' CODEC(LZ4HC(0)),
  `page_id_lv2` String COMMENT '二级页面' CODEC(LZ4HC(0)),
  `page_id_lv3` String COMMENT '三级页面' CODEC(LZ4HC(0)),
  `page_id_lv4` String COMMENT '四级页面' CODEC(LZ4HC(0)),
  `page_id_lv5` String COMMENT '五级页面' CODEC(LZ4HC(0))
)

上述为路径表中比较重要的几个字段,分别表示节点深度和各级节点。表中的数据包含了完整路径和中间路径。完整路径指的是:路径从起点到退出、从起点到达指定终点,超出5层的路径当作5层路径来处理。中间路径是指数据计算过程中产生的中间数据,并不能作为一条完整的路径。

路径数据:

(1)完整路径

(2)不完整路径

那么我们需要从数据中筛选出完整路径,并将路径数据组织成树状结构。

4.3 设计实现

4.3.1 整体框架

图4.3-1

后端整体实现思路很明确,主要步骤就是读取数据、构造邻接表和剪枝。那么要怎么实现完整/非完整路径的筛选呢?我们通过service层剪枝来过滤掉不完整的路径。以下是描述整个流程的伪代码:

// 1-1: 分层读取原始数据
// 1-1-1: 分层构造Clickhouse Sql
    for( int depth = 1; depth <= MAX_DEPTH; depth ++){
        sql.append(select records where node_depth = depth)
    }
// 1-1-2: 读取数据
    clickPool.getClient();
    records = clickPool.getResponse(sql);
// 2-1: 获取节点之间的父子、子父关系(双向edge构造)
    findFatherAndSonRelation(records);
    findSonAndFathRelation(records);
// 3-1: 剪枝
// 3-1-1: 清除孤立节点
    for(int depth = 2; depth <= MAX_DEPTH; depth ++){
        while(hasNode()){
            node = getNode();
            if node does not have father in level depth-1:
                cut out node;
        }
    }
// 3-1-2: 过滤不完整路径
    for(int depth = MAX_DEPTH - 1; depth >= 1; depth --){
        cut out this path;
    }
// 3-2: 构造邻接表
    while(node.hasNext()){
        sumVal = calculate the sum of pv/sv of this node until this level;
        edgeDetails = get the details of edges connected to this node and the end point connected to the edges;
        sortEdgesByEndPoint(edgeDetails);
        path = new Path(sumVal, edgeDetails);
    }

4.3.2 Clickhouse连接池

页面路径中我们引入了ClickHouse,其特点在这里不再赘述。我们使用一个简单的Http连接池连接ClickHouse Server。连接池结构如下:

图4.3-2

4.3.3 数据读取

如2中描述的,我们需要读取数据中的完整路径。

(
  `node_depth` Int8 COMMENT '节点深度,枚举值',
  `page_id_lv1` String COMMENT '一级页面,起始页面',
  `page_id_lv2` String COMMENT '二级页面',
  `page_id_lv3` String COMMENT '三级页面',
  `page_id_lv4` String COMMENT '四级页面',
  `page_id_lv5` String COMMENT '五级页面',
  `val` Int64 COMMENT '全量数据value'
)

在上述表结构中可以看到,写入数据库的路径已经是经过一级筛选,深度≤5的路径。我们需要在此基础上再将完整路径和不完整路径区分开,根据需要根据node_depth和page_id_lvn来判断是否为完整路径并计算每个节点的value。

完整路径判断条件:

  • node_depth=n, page_id_lvn=pageId (n < MAX_DEPTH)

  • node_depth=n, page_id_lvn=pageId || page_id_lvn=EXIT_NODE (n = MAX_DEPTH)

完整路径的条件我们已经知道了,那么读取路径时有两种方案。方案一:直接根据上述条件进行筛选来获取完整路径,由于Clickhouse及后端性能的限制,取数时必须limit;方案二:逐层读取,可以计算全量数据,但是无法保证取出准确数量的路径。

通过观察发现,数据中会存在重复路径,并且假设有两条路径:

A → B → C → D → EXIT_NODE

A → B → E → D → EXIT_NODE

当有以上两条路径时,需要计算每个节点的value。而在实际数据中,我们只能通过不完整路径来获取当前节点的value。因此,方案一不适用。

那么方案二就可以通过以下伪代码逐层读取:

for(depth = 1; depth <= MAX_DEPTH; depth++){
    select
        node_depth as nodeDepth,
        ...,
        sum(sv) as val
    from
        table_name
    where
        ...
        AND (toInt16OrNull(pageId1) = 45)
        AND (node_depth = depth)
        ...
    group by
        node_depth,
        pageId1,
        pageId2,
        ...
    ORDER BY
        ...
    LIMIT
        ...
}

读取出的数据如下:

那么,node1_A_val = 10+20,node2_B_val = 9+15 以此类推。

4.3.4 剪枝

根据4.3.3,在取数阶段我们会分层取出所有原始数据,而原始数据中包含了完整和非完整路径。如下图是直接根据原始数据构造的树(原始树)。按照我们对完整路径的定义:路径深度达到5且结束节点为退出或其它节点;路径深度未达到5且结束节点为退出。可见,图中标红的部分(node4_lv1 → node3_lv2)是一条不完整路径。

另外,原始树中还会出现孤立节点(绿色节点node4_lv2)。这是由于在取数阶段,我们会对数据进行分层排序再取出,这样一来无法保证每层数据的关联性。因此,node4_lv2节点在lv2层排序靠前,而其前驱、后继节点排序靠后无法选中,从而导致孤立节点产生。

图4.3-3

因此,在我们取出原始数据集后,还需要进行过滤才能获取我们真正需要的路径。

在模型中,我们通过剪枝来实现这一过滤操作。

// 清除孤立节点
    for(int depth = 2; depth <= MAX_DEPTH; depth ++){
        while(hasNode()){
            node = getNode();
            if node does not have any father and son: // [1]
                cut out node;
        }
    }
// 过滤不完整路径
    for(int depth = MAX_DEPTH - 1; depth >= 1; depth --){
        cut out this path; // [2]
    }

在前述的步骤中,我们已经获取了双向edge列表(父子关系和子父关系列表)。因此在上述伪代码[1]中,借助edge列表即可快速查找当前节点的前驱和后继,从而判断当前节点是否为孤立节点。

同样,我们利用edge列表对不完整路径进行裁剪。对于不完整路径,剪枝时只需要关心深度不足MAX_DEPTH且最后节点不为EXIT_NODE的路径。那么在上述伪代码[2]中,我们只需要判断当前层的节点是否存在顺序边(父子关系)即可,若不存在,则清除当前节点。

 五、写在最后

基于平台化查询中查询时间短、需要可视化的要求,并结合现有的存储计算资源以及具体需求,我们在实现中将路径数据进行枚举后分为两次进行合并,第一次是同一天内对相同路径进行合并,第二次是在日期区间内对路径进行汇总。本文希望能为路径分析提供参考,在使用时还需结合各业务自身的特性进行合理设计,更好地服务于业务。

方案中涉及到的Clickhouse在这里不详细介绍,感兴趣的同学可以去深入了解,欢迎和笔者一起探讨学习。

浪尖聊大数据-浪尖
关注 关注
  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
路径分析模型
实践求真知
02-13 1826
一什么是漏斗分析模型 漏斗分析模型是用来观察用户在使用过程中,多个关键行为之间的转化及流失。 二什么是路径分析模型 观察某个人或某个样本群体在访问产品或平台时,针对每个页面和不同路径的访问次数及顺序进行数据统计与分析的模型。 关键词 某个人:指个体用户 某个样本群体:指在某种条件下的抽样群体 次数:访问频次 顺序:访问的先后顺序 统计与分析:基于前期准备,通过统计与分析得出结论 三路径分析模型的价值 全局路径与流失节点观察 1了解个体和群体的整体路径 通过对用户使用路径的...
用户行为路径分析
weixin_43287260的博客
10-27 2777
移动APP产品用户行为路径分析 一、用户行为路径分析目标是什么 二、实施过程: 1.确定关键节点事件名: 2.获取事件数据: 3.可视化: 三、结论:
用户行为分析之用户行为路径计算模型
ChengYanan的博客
08-02 1094
前提 什么是用户行为路径? 1 用户路径分析,顾名思义,用户在APP或网站中的访问行为路径。为了衡量网站优化的效果或营销推广的效果,以及了解用户行为偏好,时常要对访问路径的转换数据进行分析。 以电商为例,买家从登录网站/APP到支付成功要经过首页浏览、搜索商品、加入购物车、提交订单、支付订单等过程。而在用户真实的选购过程是一个交缠反复的过程,例如提交订单后,用户可能会返回首页继续搜索商品,也可能去取消订单,每一个路径背后都有不同的动机。与其他分析模型配合进行深入分析后,能为找到快速用户动机,从而引领用户走向
常见用户行为分析模型解析(4)——用户行为路径分析模型
bcdk1188的博客
12-21 1584
用户行为路径分析同样是重要的数据分析模型,它为企业实现理想的数据驱动与布局调整提供科学指导,对精准勾勒用户画像也有重要参考价值。用户访问APP/网络,如同参观画展,观众是感受和传达画展参展方和展品的目的受众体,图画的展现布局不同,每一位观众根据自身喜好形成特有的参观顺序。为让观众沿着最优访问路径前进,需要策展者结合观众需求进行布局调整。这种自主式的数据分析方法,让业务人员都能科学进行数据分析。 什么是用户行为路径? 用户路径分析,顾名思义,用户在APP或网站中的访问行为路径。为了衡量网站优化的..
用户行为分析模型——路径分析(一)
素质云笔记
07-01 3904
在网页或者营销渠道中,用户行为模型有比较多,基于渠道的,笔者觉得有: 渠道类型 渠道重要性 渠道跳转与流失 单渠道,多节点 路径分析,漏斗功能 多渠道 归因分析 这里多渠道指的是,单渠道多节点的场景比较好理解,就是进入某个web \ 小程序,在不同页面之间进行跳转,多渠道这里比较多的就是,同一用户在不同的较大的场景下的流转,比如在小红书种草 -> 微信好友推荐 -> 淘宝上买了。 归因分析是通过一定的逻辑方法,计算每个渠道、或者触点对最终结果贡献程度的方法。有一套合理
交互设计用户心智模型建模方法——以老年人互联网约车出行APP为例.pdf
08-26
交互设计用户心智模型建模方法——以老年人互联网约车出行APP为例 本文从数据、过程、内容和方法三个方面阐述心智模型(Mental model)的复杂特性,并通过链接表分解心智模型节点,结合不同节点的链接关系,通过EC...
数据分析之实战项目——电商用户行为分析
热门推荐
天阑之蓝的博客
06-07 3万+
电商用户行为分析 分析背景和目的 随着互联网和电商的发展,人们习惯于网上购物。在国内,电商平台深受欢迎,每年的双11,双12活动,大量的用户在淘宝平台浏览商品,或收藏或加入购物车或直接购买。通过对用户的行为分析,探索用户购买的规律,了解商品的受欢迎程度,结合店铺的营销策略,实现更加精细和精准的运营,让业务获得更好的增长。
人工智能自主性的行为主义路径与问题——以布鲁克斯的行为主义为例.pdf
07-10
人工智能自主性的行为主义路径与问题——以布鲁克斯的行为主义为例 一、行为主义与人工智能自主性 行为主义在人工智能领域是一种研究方法论,主张将智能行为的产生归因于机器与外部环境的交互作用。行为主义的基本...
基于ArcgIs api for js 的路径分析例子
08-20
基于ArcgIs api for js 的路径分析例子,使用百度瓦片地图作为底图,将相关服务地址路径进行更换,即可。
常见用户行为分析模型:用户分群
12-12 1493
用户分群是企业精细化,数据化运营的第一步。 用户分群数据分析方法是进行用户画像的关键数据分析模型,这是企业进行数据分析、精细化运营的第一步。用户分群即用户信息标签化,通过用户的历史行为路径、行为特征、偏好等属性,将具有相同属性的用户划分为一个群体,并进行后续分析。 漏斗分析关注阶段差异,用户分群关注群体差异 前面的文章我们讲了漏斗分析模型。通过漏斗分析模型,运营人员可以看到,用户在不同阶段所表现出的行为是不同的,譬如新用户的关注点在哪里?已购用户什么情况下会再次付费?然而,由于群体特征不同,行为会.
用户行为分析模型实践路径分析模型
qq_654603797
03-19 877
什么是用户行为路径? 路径分析,是对用户在APP或网站页面中的上下游访问行为路径分布情况进行分析,挖掘出用户的频繁访问路径(探索用户在网站或应用APP上逗留的过程中采取的各项步骤,可随机对多条路径进行研究,不仅仅是分析一条预先设定的路径)并采用桑基图可视化展示。 比如:当用户使用某APP时,是怎样从【首页】进入【详情页】的,用户从【首页】分别进入【详情页】、【播放页】、【下载页】的比例是怎样的,以及可以帮助我们分析用户离开的节点是什么. Session和Session Time: Session会话
常见的用户行为路径分析方法
最新发布
CoCode888的博客
08-01 1249
常见的用户行为路径分析方法,CoCode 需求条目化和需求分析工具有助于提高用户需求分析质量和效率。
AMOS分析技术:路径分析的非递归模型
SPSS生活统计学
01-11 1万+
基础回顾草堂君在前面介绍过如何使用SPSS进行路径分析,也介绍了如何使用Amos进行路径分析,可以点击下方文章链接回顾:数据分析方法:路径分析入门;数据分析需要剥丝抽茧的耐心!AMOS分析技术:路径分析;用SPSS做路径分析麻烦?那就用AMOS分析吧上方文章介绍的路径分析都属于递归模型,属于路径分析中最基本的模型形式,今天草堂君将介绍另一种模型路径分析模型形式,非递归模型路径分析首先回顾一下,
用户行为分析模型-(行为事件分析、用户留存分析、漏斗分析、行为路径分析、用户分群、点击分析)
黄饱饱
04-12 6116
最近有些忙,但是看到了很好的分析模型也要跟大家分享的,这篇博客有些粗糙,主要是po上一些链接供大家学习,有时间的话,我也会写出自己关于用户行为分析的理解的。 下面是关于用户行为分析常见的分析维度,有助于为新手入门找到方向。 1.行为事件分析模型 行为事件分析法来研究某行为事件的发生对企业组织价值的影响以及影响程度。企业借此来追踪或记录的用户行为或业务过程,如用户注册、浏览产品详情页、成功投资...
解析用户行为路径的5个场景,数据驱动产品增长
HarmonyOS SDK闭源开放能力技术团队
06-28 1703
什么是用户行为路径分析? 用户行为路径分析,是追踪用户在App使用过程中的起始事件到结束事件所经历的所有路径,能清晰展现用户做了哪些操作,以及操作后续的行为流向,通过分析用户流转的特点,频繁访问的路径,以及在哪些环节发生了流失,真实还原用户行为特点,从而有针对性地优化产品,提升用户体验和转化。 *华为路径分析报告示意图 下面将会详细介绍用户行为路径的5个应用场景,了解用户行为路径在产品优化和用户增长的价值。 场景一:寻找价值功能点,优化产品布局,实现用户增长 验证产品规划中设计的用户行为路
路径分析如何操作?模型如何修正?
m0_37228052的博客
04-02 5783
一、研究场景 路径分析,也称通径分析(有时也称结构方程模型,一般情况下如果包括测量模型和结构模型,则称为结构方程模型;如果只包括结构模型,则称为路径分析)。路径分析在于研究模型影响关系,用于对模型假设进行验证。比如下图的模型框架:希望研究工作条件,人际关系对于公司满意度的影响;同时还希望研究公司满意度和机会感知对于离职倾向的影响。路径有一共有4条(即4对影响关系),路径分析可以同时研究此4对影响关系。 二、SPSSAU操作 1.SPSSAU上传数据 登录账号后进入SPSSAU页面,点击右上角..
自动驾驶路径跟踪控制——驾驶员预瞄模型
06-08
好的,你的问题是关于自动驾驶路径跟踪控制中的驾驶员预瞄模型。那么,驾驶员预瞄模型是什么呢? 驾驶员预瞄模型是指在驾驶过程中,驾驶员对车辆行驶路线的预先观察和分析能力。这种能力可以帮助驾驶员提前发现路面上的障碍物、路标、路口等信息,并根据这些信息做出相应的驾驶决策。在自动驾驶系统中,也需要类似的驾驶员预瞄模型来实现路径跟踪控制。 具体而言,自动驾驶路径跟踪控制中的驾驶员预瞄模型通常包括以下几个方面: 1. 路径规划:根据地图信息和导航目标规划车辆行驶路径。 2. 感知模型:通过车载传感器获取周围环境信息,如车道线、障碍物、交通信号灯等。 3. 预测模型:根据感知模型获取的环境信息,对未来路况进行预测,如预测障碍物运动轨迹、预测红绿灯变化等。 4. 控制模型:根据路径规划和预测模型的结果,制定相应的控制策略,如制动、加速、转向等,实现路径跟踪控制。 总之,驾驶员预瞄模型在自动驾驶系统中起着至关重要的作用,它不仅能够提高路径跟踪控制的精度和安全性,还能够使车辆行驶更加平稳、舒适。
写文章

热门文章

  • Java中定义常量(Constant) 的几种方法 51005
  • 最近做大数据面试官的感想 23849
  • 请别再问我Spark的MLlib和ML库的区别 23485
  • 读懂Word2Vec之Skip-Gram 19440
  • Facebook数据泄露事件解读 19122

分类专栏

  • spark 98篇
  • flink 98篇
  • 数据仓库 127篇
  • kafka 63篇
  • hbase 47篇
  • hive 41篇
  • hadoop 16篇
  • kylin 25篇
  • java面试题 83篇
  • linux 32篇
  • flume 3篇

最新评论

  • 一文学完所有的Hive SQL(两万字最全详解)

    angry猫: 学完了,用到再回来查表情包

  • 一文精通flinkOnYarn

    gggidt: 一个集群中如何启动多个yarn session 呢? 我启动2个后,其中一个状态是running ,另外一个一直是ACCEPTED, 这是什么意思呢

  • 一文精通flinkOnYarn

    gggidt: 我使用的1.17版本,yarn-session.sh 中没有 -n参数了。

  • Flink 1.15 新功能架构解析:高效稳定的通用增量 Checkpoint

    sss punch: 不敢上生产,1.15还是老实用普通的增量ckp吧

  • 讲一些关于Spark的Broadcast你不知道的细节

    韭菜盒子123: 请问一下,broadcast和cache在功能上有什么区别呢

大家在看

  • 12.仿真篇——模拟机械臂URDF过程
  • java+vue计算机毕设二手车交易平台【源码+开题+论文+程序】 588
  • 2024/9/21黑马头条跟学笔记(十一) 最有含金量的一集,大数据权重计算推送 613
  • java+vue计算机毕设二手社区交易app【源码+开题+论文+程序】
  • 代码随想录Day 52|题目:101.孤岛的面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿

最新文章

  • 调优宝典 | SparkSQL性能优化10大技巧与实战指南,附案例
  • 数据指标体系搭建与行业实践
  • Apache Doris设计思想与应用场景介绍
2024
09月 1篇
08月 5篇
06月 5篇
05月 1篇
04月 18篇
03月 14篇
02月 10篇
01月 10篇
2023年51篇
2022年311篇
2021年494篇
2020年437篇
2019年258篇
2018年329篇
2017年31篇

目录

目录

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司白银网站优化推广眉山优化网站多少钱江都网站排名优化提升网站优化排名前提北京网站的优化提高网站访问速度的优化方案沁阳网站自然优化收费情况乳山网站seo优化青岛网站有哪些优化外贸网站优化怎么出效果鞍山网站优化排名哪家好网站优化哪个效果好宜昌网站seo优化推广冷水江网站排名优化网站外链优化三江网站优化福山区行业网站优化公司罗湖国内网站优化方式有哪些宝山区正规网站优化价格手机端的网站优化优化网站帮你火21星热情口碑好的网站排名优化效果好沁阳网站排名优化方案网站优化培训之七种方法中科宁波网站优化公司福建省给网站优化一般需要多少钱安徽百度网站优化运营网站做优化都选d火11星黄石网站优化多少钱吴桥网站优化费用歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化