用户行为数据分析

news2025/1/31 8:03:41

文章目录

  • 用户行为数据分析
    • 1 项目描述
    • 2 项目需求
    • 3 数据准备
      • 1、创建user_data数据表用于导入user_data.csv中的数据
      • 2、加载user_data.csv中的数据到user_data表
      • 3、接下来进行数据清洗,包括:删除重复值,时间戳格式化,删除异常值。
    • 4 统计分析
      • 1、查询总访问量PV,总用户量UV
      • 2、查询日均访问量,日均用户量
      • 3、查询每个用户的购物情况
      • 4、根据user_behavior_count的结果查询复购率
      • 5、统计转化率
      • 6、统计一天内活跃时段点击数、收藏数、加购物车数、购买数的分布
      • 7、统计周用户点击数、收藏数、加购物车数、购买数的活跃分布
      • 8、统计用户最近一次的购买时间,降序排序只显示前10条记录
      • 9、统计消费频率最高的前10名用户

用户行为数据分析

1 项目描述

user_data.csv是一份用户行为数据,时间区间为2017-11-25到2017-12-03,总计29132493条记录,大小为1.0G,包含5个字段。数据集的每一行表示一条用户行为,由用户ID、商品ID、商品类目ID、行为类型和时间戳组成,并以逗号分隔。关于数据集中每一列的详细描述如下:

列名称字段名数据类型说明
用户IDuser_idstring用户ID
商品IDitem_idstring商品ID
商品类目IDcategory_idstring商品类目ID
行为类型behavior_typestring行为类型,包括(pv, buy, cart, fav)
时间戳create_timeint行为时间戳

用户行为类型共有四种,它们分别是

行为类型说明
pv商品详情页pv,等价于点击
buy商品购买
cart将商品加入购物车
fav收藏商品

2 项目需求

1、查询总访问量PV,总用户量UV

2、查询日均访问量,日均用户量

3、查询每个用户的购物情况(统计点击、商品购买、加入购物车、收藏的次数),统计结果放入表user_behavior_count

4、根据user_behavior_count的结果查询复购率:产生两次或两次以上购买的用户占购买用户的比例

5、统计用户各环节行为转化率,分别统计从“点击”到“(加购物车+收藏)”的转化率,和从“(加购物车+收藏)”到“购买”的转化率

6、统计一天内活跃时段点击数、收藏数、加购物车数、购买数的分布

7、统计周用户击数、收藏数、加购物车数、购买数的活跃分布

8、统计用户最近一次的购买时间,降序排序只显示前10个记录

9、统计消费频率最高的前10名用户

3 数据准备

将数据加载到hive,然后通过hive对数据进行处理

1、创建user_data数据表用于导入user_data.csv中的数据

-- 创建表
create table if not exists user_data
(
    user_id       string COMMENT '用户ID',
    item_id       string COMMENT '商品ID',
    category_id   string COMMENT '商品类目ID',
    behavior_type string COMMENT '行为类型',
    create_time   int COMMENT '行为时间戳'
) row format delimited fields terminated by ','
    stored as textfile;

image-20230610101711932

2、加载user_data.csv中的数据到user_data表

上传user_data.csv到虚拟机:

image-20230610102205530

加载数据到user_data表:

load data local inpath '/root/data/user_data.csv' into table user_data;

image-20230610102459617

测试数据是否导入:

select * from user_data limit 10;

结果为:

image-20230610102723535

3、接下来进行数据清洗,包括:删除重复值,时间戳格式化,删除异常值。

(1)user_data表中的create_time是int类型,是时间戳字段。在实际使用时时间戳字段使用不方便,为了使用方便需要把时间戳字段改为日期时间字符串。创建user_data_new表,把其中的create_time字段数据类型从int改为string类型,用于存储日期时间字符串。

-- 创建表
create table if not exists user_data_new
(
    user_id       string COMMENT '用户ID',
    item_id       string COMMENT '商品ID',
    category_id   string COMMENT '商品类目ID',
    behavior_type string COMMENT '行为类型',
    create_time   string COMMENT '行为时间戳'
) row format delimited fields terminated by ','
    stored as textfile;

结果为:

image-20230610121309791

(2)对user_data进行数据清洗,去掉完全重复的数据。分组操作可以达到去重的目的,对谁去重就对谁分组。

查看去重前数据量:

select count(1) from user_data;

结果为:

image-20230610121409487

数据去重:

insert overwrite table user_data
select user_id, item_id, category_id, behavior_type, create_time
from user_data
group by user_id, item_id, category_id, behavior_type, create_time;

image-20230610121725971

查看去重后数据量:

select count(1) from user_data;

结果为:

image-20230610121800339

(3)对user_data进行数据清洗,int类型的时间戳格式化成日期时间字符串,新数据存于user_data_new表中。使用函数from_unixtime进行日期时间格式化。

insert overwrite table user_data_new
select user_id, item_id, category_id, behavior_type, from_unixtime(create_time, 'yyyy-MM-dd HH:mm:ss')
from user_data;

image-20230610122410710

查看数据是否格式化成功:

select * from user_data_new limit 10;

image-20230610122529819

(4)查看user_data_new表中create_time字段是否有异常值,为NULL的或不在统计时间范围内的

方法一:直接查找

select *
from user_data_new
where date(create_time) not between '2017-11-25' and '2017-12-03'
   or create_time is null;

发现有异常值:

image-20230610123949949

我们发现异常数据也是比较大的,不太容易观察。

方法二:根据group分组聚合

select date(create_time) as day
from user_data_new
group by date(create_time)
having day not between '2017-11-25' and '2017-12-03'
    or day is null
order by day;

结果为:

image-20230610124748835

image-20230610124702065

发现异常值还是比较多的。

(5)对user_data_new表进行数据清洗,去掉时间异常的数据。把create_time处于’2017-11-25’ 和 '2017-12-03’之间的数据认为是正常数据。

cast(create_time as date)可以把日期时间字符串转为日期

insert overwrite table user_data_new
select user_id, item_id, category_id, behavior_type, create_time
from user_data_new
where cast(create_time as date) between '2017-11-25' and '2017-12-03';

image-20230610125619410

检查一下是否还有异常数据:

image-20230610125717470

create_time 没有异常数据了。

(6)查看 user_data_new表中behavior_type 是否有异常值,可用分组运算查看behavior_type的值

select behavior_type from user_data_new group by behavior_type;

image-20230610125833958

behavior_type 发现没有异常值。

4 统计分析

1、查询总访问量PV,总用户量UV

select sum(if(behavior_type = 'pv', 1, 0)) as pv,
       count(distinct user_id)             as uv
from user_data_new;

结果为:

image-20230610130637224

2、查询日均访问量,日均用户量

日期比较函数: datediff

语法: datediff(string enddate, string startdate)

返回值: int

说明: 返回结束日期减去开始日期的天数。

-- datediff(string enddate, string startdate)得到的天数需要加1
select sum(if(behavior_type = 'pv', 1, 0)) / (datediff('2017-12-03', '2017-11-25') + 1) as avg_pv,
       count(distinct user_id) / (datediff('2017-12-03', '2017-11-25') + 1)             as avg_uv
from user_data_new;

结果为:

image-20230610162341760

每日访问量,每日用户量:

select date(create_time)                   as day,
       sum(if(behavior_type = 'pv', 1, 0)) as pv,
       count(distinct user_id)             as uv
from user_data_new
group by date(create_time)
order by day;

结果为;

image-20230610174357540

3、查询每个用户的购物情况

查询每个用户的购物情况(统计点击、商品购买、加入购物车、收藏的次数),统计结果放入表user_behavior_count。

create table user_behavior_count as
select user_id,
       sum(if(behavior_type = 'pv', 1, 0))   pv,
       sum(if(behavior_type = 'buy', 1, 0))  buy,
       sum(if(behavior_type = 'cart', 1, 0)) cart,
       sum(if(behavior_type = 'fav', 1, 0))  fav
from user_data_new
group by user_id;

image-20230610152033151

查看数据是否导入表中:

select * from user_behavior_count limit 10;

结果为:

image-20230610152351796

4、根据user_behavior_count的结果查询复购率

复购率:产生两次或两次以上购买的用户占购买用户的比例

select sum(if(buy > 1, 1, 0)) / sum(if(buy > 0, 1, 0)) rate
from user_behavior_count;

结果为:

image-20230610153210750

5、统计转化率

统计用户各环节行为转化率,分别统计从“点击”到“(加购物车+收藏)”的转化率,和从“(加购物车+收藏)”到“购买”的转化率。

select round(sum(cart + fav) / sum(pv), 4), round(sum(buy) / sum(cart + fav), 4)
from user_behavior_count;

结果为:

image-20230610154617689

从“点击”到“(加购物车+收藏)”的转化率为0.0946,比较低,可能由于多种因素导致,以下是一些常见的原因:

  • 网站设计不够吸引人:用户在点击进入网站后,如果网站布局、颜色、文字排版等没有吸引力,用户可能会失去兴趣,不再进行后续的操作;

  • 目标用户不明确:如果网站的推广广告或者流量来源渠道不够明确,会吸引一些不符合目标用户要求的人群,他们不会对网站感兴趣,因此不会进行加购物车或收藏操作;

  • 商品的价格过高或者质量不好:如果网站商品的价格过高或者质量不好,用户可能会选择不进行购买、加购物车或者收藏的操作;

  • 用户体验不佳:如果进行加购物车或者收藏的流程复杂、页面加载时间较长等,会影响用户体验,导致用户放弃操作;

  • 流量质量差:如果网站的流量质量较差,也会导致用户没有进行加购物车或收藏的行为。

从“(加购物车+收藏)”到“购买”的转化率为0.2377,相对较高,可能是因为进行加购物车和收藏的都是对商品感兴趣的,他们购买商品的意愿更强烈。

6、统计一天内活跃时段点击数、收藏数、加购物车数、购买数的分布

select date(create_time)                     day,
       hour(create_time)                     hour,
       sum(if(behavior_type = 'pv', 1, 0))   pv,
       sum(if(behavior_type = 'buy', 1, 0))  buy,
       sum(if(behavior_type = 'cart', 1, 0)) cart,
       sum(if(behavior_type = 'fav', 1, 0))  fav
from user_data_new
group by date(create_time), hour(create_time) -- 不能使用别名
order by day, hour
limit 10;

结果为:

image-20230610161448290

也可以使用字符串函数截取,然后分组聚合。

7、统计周用户点击数、收藏数、加购物车数、购买数的活跃分布

如何计算周几?

方法一:这样得到的周日为第0天。

pmod(int a, int b),pmod(double a, double b):返回a除b的余数的绝对值。

datediff(endDate, startDate):返回startDate到endDate相差的天数

计算create_time所代表的日期是星期几,pmod(datediff(create_time, ‘1920-01-01’) - 3, 7)

方法二:这样得到的周日为第7天。

select dayofweek('2017-11-25');

以第一种方法为例:

select month(create_time)                               month,
       pmod(datediff(create_time, '1920-01-01') - 3, 7) weekday,
       sum(if(behavior_type = 'pv', 1, 0))              pv,
       sum(if(behavior_type = 'fav', 1, 0))             fav,
       sum(if(behavior_type = 'cart', 1, 0))            cart,
       sum(if(behavior_type = 'buy', 1, 0))             buy
from user_data_new
group by month(create_time), pmod(datediff(create_time, '1920-01-01') - 3, 7)
order by month, weekday;

结果为:

image-20230610171037242

8、统计用户最近一次的购买时间,降序排序只显示前10条记录

select user_id, max(create_time) latest_date
from user_data_new
where behavior_type = 'buy' --指定行为为buy
group by user_id
order by latest_date desc
limit 10;

结果为:

image-20230610165257843

9、统计消费频率最高的前10名用户

select user_id, buy
from user_behavior_count
order by buy desc
limit 10;

结果为:

image-20230610163657371

参考文章:

https://blog.csdn.net/weixin_46436010/article/details/129732809?spm=1001.2014.3001.5502

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/631746.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenGL光照之基础光照

文章目录 环境光照漫反射光照计算漫反射光照镜面光照代码 现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是我们有限的计算能力所无法模拟的。因此OpenGL的光照使用的是简化的模型,对现实的情况进行近似,这样处理起来会…

MyBatis-Plus(2.0)

ActiveRecord ActiveRecord(简称AR)一直广受动态语言(PHP、Ruby等)的喜爱,而java作为准静态语言,对于ActiveRecord往往只能感叹器优雅 什么是ActiveRecord? ActiveRecord也属于ORM(对象关系映射)层,由Rail…

视频|人人能看懂的苹果visionOS空间设计课程

本周的重磅消息无疑是苹果Vision Pro以及对应的visionOS,考虑到苹果头显硬件上当前以第一方App为主,因此本届WWDC的一个重点就是释放visionOS和相关能力给开发者,让开发者尽快打造出更多、更优质的第三方App阵容。 与此同时,苹果也…

【vue3】10-vue组件化额外知识补充(下)-动态组件-组件缓存-v-model在组件上的应用

组件化-额外知识补充(下) 动态组件的使用(了解)keep-alive(理解)认识keep-alivekeep-alive的使用 异步组件的使用webpack分包处理(了解)Vue中实现异步组件 组件的v-model组件的混入Mixin(了解&a…

阿里云弹性公网EIP收费价格表(按量/包年包月/配置费)

阿里云弹性公网EIP怎么收费?EIP地域不同价格不同,EIP计费模式分为包年包月和按量付费,弹性公网IP可以按带宽收费也可以按使用流量收费,阿里云百科分享阿里云弹性公网IP不同地域、不同计费模式、按带宽和按使用流量详细收费价格表&…

基于springboot+vue技术的在线考试系统源码数据库

源码看这里 https://download.csdn.net/download/2301_76965813/87881785 前台 学生登录: 如果没有账号,首先需要以学生的身份进行注册,即输入姓名、性别、密码以及班级,注册成功之后输入账户名和密码进行登录,进入…

conda虚拟环境配置和系统相关配置

一、conda虚拟环境 首先,尽量别在base中直接安装自己的包。原因有以下两个: 1.base环境是conda运行的基础,没法一键清除,如果损坏base环境要么滚回要么卸载重装,比较麻烦 2.base中很多包并不是项目需要的包&#xff0c…

Spring5

Spring5 文章目录 Spring5一.框架概述二.入门案例三.IOC容器1.IOC概念2.IOC底层原理3.IOC接口 四.IOC操做Bean管理1.Bean管理2.基于xml配置文件方式实现(1).创建对象(2).注入属性第一种注入:set方法第二种注入:有参数的构造p名称空间注入(了解)注入空值和特殊符号外部Bean内部B…

itop-3568开发板驱动学习笔记(27)设备树(六)pinctrl

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录 pinctrl 子系统简介pinctrl 设备树语法pinctrl 客户端pinctrl 服务端瑞星微平台全志平台三星平台iMX 平台 pinctrl 子系统简介 Linux pinctrl 子系统用来管理 GPIO 引脚,它主要完成了以下三种功…

MySQL数据库,从入门到精通:第三篇——MySQL 数据库规范和基础查询语句

MySQL数据库,从入门到精通:第三篇——MySQL 数据库规范和基础查询语句 第三篇_MySQL 数据库规范和基础查询语句1. SQL概述1.1 SQL背景知识1.2 SQL语言排行榜1.3 SQL 分类 2. SQL语言的规则与规范2.2 SQL大小写规范 (建议遵守)2.3 …

设计模式-03.02-创建型-工厂建造者原型

工厂模式【常用】 工厂模式很重要,后面的很多架构设计,都是工厂模式联合着其它设计模式使用。 一般情况下,工厂模式分为三种更加细分的类型:简单工厂、工厂方法和抽象工厂。不过,在 GoF 的《设计模式》一书中&#xff…

docker资源控制cgroup

一、CPU控制 cgroups,是一个非常强大的linux内核工具,他不仅可以限制被namespace隔离起来的资源, 还可以为资源设置权重、计算使用量、操控进程启停等等。所以cgroups (Control groups) 实现了对资源的配额和度量。 cgroups有四大功能: 资源限制:可以…

SpringAOP详解

目录 前言: 相关概念 切点表达式规则 代码演示 SpringAOP实现原理 织入(代理的生成时机) JDK和CGLIB区别 小结: 前言: AOP(Aspect Oriented Programming)是思想(面向切面编程…

文心一言 VS 讯飞星火 VS chatgpt (37)-- 算法导论5.4 1题

一、一个屋子里必须要有多少人,才能让某人和你生日相同的概率至少为1/2? 必须要有多少人,才能让至少两个人生日为 7月 4 日的概率大于 1/2? 文心一言: 一个屋子里必须要有多少人,才能让某人和你生日相同的概率至少为1/2&#…

Linux下ElasticSearch7.9.2安装配置(包含服务器配置、启动停止脚本、开放端口和elasticsearch-head插件的使用)

Linux下ElasticSearch7.9.2安装配置 前言1.下载安装1.1 使用wget的方式下载1.2 官网下载 2.上传到服务器并解压3.修改es配置文件3.1 es目录简介3.2 修改配置文件 4. 创建用户并赋权5. 服务器修改配置5.1 修改文件句柄数和线程数5.2 关闭swapping5.3 修改虚拟内存 6. 启动es6.1 …

“配置DHCP Snooping实验:保护网络中的DHCP服务和防止欺骗攻击“

"配置DHCP Snooping实验:保护网络中的DHCP服务和防止欺骗攻击" 【实验目的】 部署DHCP服务器。熟悉DHCP Snooping的配置方法。验证拓扑。 【实验拓扑】 实验拓扑如图所示。 设备参数如下表所示。 设备 接口 IP地址 子网掩码 默认网关 R1 F0/0 …

腾讯云轻量应用服务器和云服务器区别详细说明

腾讯云轻量应用服务器是什么?腾讯云轻量服务器和云服务器有什么区别?为什么轻量应用服务器费用更低?是因为轻量服务器CPU内存性能比云服务器CVM性能差吗?轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程…

基于SPAD / SiPM技术的激光雷达方案

激光雷达(LiDAR)是一种测距技术,近年来越来越多地用于汽车先进驾驶辅助系统(ADAS)、手势识别和3D映射等应用。尤其在汽车领域,随着传感器融合的趋势,LiDAR结合成像、超声波、毫米波雷达,互为补足,为汽车提供全方位感知…

物联网Lora模块从入门到精通(五)光照与温湿度传感器

一、前言 在程序开发中,光照与温湿度的获取是十分常见与重要的,本文我们主要是使用M21温湿度光照三合一传感器,其中温湿度数据通过协议获取,而光照通过ADC获取。 二、代码实现 本文内容较为简单,且后续文章将在本文基…

网络编程Demo:Java的阻塞与非阻塞模式以及Netty

前言 IO既神秘,双简单 IO是什么 从表面理解,IO是输入(input)、输出(output)的英文首字母的缩写形式,可以简单理解为计算机的输入与输出,描述计算机的数据流动,如使用键盘输入了一个“hello w…