页面转化率统计分析及简单实现

本文介绍了一种基于Spark的页面转化率计算方法。首先通过session进行页面访问排序,并利用滑动窗口或配对方式获取前后页面的访问关系,再计算目标页面的转化率。最后给出了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、需求分析

页面转化率?
当前页面–>访问下一个页面的次数 / 访问当前页面的总次数
思路如下:
1.访问是基于页面访问session来统计,每个session都是一次系统访问
2.统计需要统计的每个页面访问的总次数(分母)
3.分子统计:
3.1.按照每个session分组,访问页面时间排序,获取访问页面的顺序列表
3.2.使用sliding 或是zip来连起来,获取前一个页面与后一个页面的访问连接
3.3.过滤掉非统计的访问页面
3.4.聚合所有页面连接访问的次数
4.把页面连接访问次数中第一个page从每个页面总次数中获取,计算访问率

二、代码实现

代码如下(示例):

object PageTransformTest2 {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("PageTransFormTest")
    val sc = new SparkContext(sparkConf)
    //通常,是有指定的页面统计页面转化率的
    val list=List[Long](1,2,3,4,5,6,7)
    val zipList: List[(Long, Long)] = list.zip(list.tail)

    val textRDD = sc.textFile("data/user_visit_action.txt")
    val userVisitActionRDD = textRDD.map {
      case str => {
        val datas = str.split("_")
        UserVisitAction(
          datas(0),
          datas(1).toLong,
          datas(2),
          datas(3).toLong,
          datas(4),
          datas(5),
          datas(6).toLong,
          datas(7).toLong,
          datas(8),
          datas(9),
          datas(10),
          datas(11),
          datas(12).toLong
        )
      }
    }

    userVisitActionRDD.cache()

    //TODO 先获取分母
    // (页面转化)/当前页面
    val fenmuRDD: RDD[(Long, Long)] = userVisitActionRDD.map {
      case t => {
        (t.page_id, 1L)
      }
    }.filter{         //过滤非统计指标
      case (key,value)=>{
        list.init.contains(key) //init 查找集合除最后一个的所有元素
      }
    }.reduceByKey(_ + _)
    //需要行动算子才能执行
    val fenmMap: Map[Long, Long] = fenmuRDD.collect().toMap


    //根据session分组
    val groupSession: RDD[(String, Iterable[UserVisitAction])] = userVisitActionRDD.groupBy(_.session_id)

    //TODO
    //1.每个session中,根据访问时间排序
    //2.排序后转换结构
    //3.sliding
    // zip 使用zip联合页面到下一个页面的访问
    val pageFlowers: RDD[(Long, Long)] = groupSession.mapValues {
      case list => {
        list.toList.sortBy(_.action_time)
      }
    }.flatMap {
      case (key, value) => {
        val list: List[Long] = value.map(_.page_id)
        val tuples: List[(Long, Long)] = list.zip(list.tail)
        tuples
      }
    }.filter{ //filter 去除不是需要的页面跳转
      case t =>{
        zipList.contains(t)
      }
    }

    //分子聚合
    val reduceFz: RDD[((Long, Long), Long)] = pageFlowers.map {
      case (k, v) => {
        ((k, v), 1L)
      }
    }.reduceByKey(_ + _)

    val fenzMap: Map[(Long, Long), Long] = reduceFz.collect().toMap

    fenzMap.foreach{
      case ((page1,page2),sum)=>{
        val l = fenmMap.getOrElse(page1,0L)
        println(s"页面${page1}跳转至页面${page2}的跳转率为:"+(sum/(l.toDouble)))
      }
    }

    sc.stop()
  }
}

case class UserVisitAction(
                            date: String,//用户点击行为的日期
                            user_id: Long,//用户的 ID
                            session_id: String,//Session 的 ID
                            page_id: Long,//某个页面的 ID
                            action_time: String,//动作的时间点
                            search_keyword: String,//用户搜索的关键词
                            click_category_id: Long,//某一个商品品类的 ID
                            click_product_id: Long,//某一个商品的 ID
                            order_category_ids: String,//一次订单中所有品类的 ID 集合
                            order_product_ids: String,//一次订单中所有商品的 ID 集合
                            pay_category_ids: String,//一次支付中所有品类的 ID 集合
                            pay_product_ids: String,//一次支付中所有商品的 ID 集合
                            city_id: Long
                          )//城市 id

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值