本文来源公众号“戎易大数据”,仅用于学术分享,侵权删,干货满满。
原文链接:数据分析实操篇:基于MySQL和Tableau的淘宝用户购物行为数据分析
1项目介绍
为提高平台GMV和实现精细化运营,本项目首先使用MySQL(实际上是用Navicat Premium连接了MySQL,方便数据导入)对来自某电商的数据集进行数据预处理,然后通过多维度拆解,从用户和商品两个大的角度分别进行分析,最后借助Tableau搭建仪表盘实现数据可视化。
2工具使用
Navicat、MySQL、Tableau
3理解数据
本数据集包含了2017年11月25日至2017年12月3日之间,有行为的约一百万随机用户的所有行为(行为包括点击、购买、加购、喜欢)。数据集的组织形式和MovieLens-20M类似,即数据集的每一行表示一条用户行为,由用户ID、商品ID、商品类目ID、行为类型和时间戳组成,并以逗号分隔。关于数据集中每一列的详细描述如下:
4数据处理
4.1导入数据
4.1.1命令提示符
在命令提示符中打开MySQL
4.1.2数据导入
打开Navicat,点击左上角连接MySQL,点击下一步
打开连接,右键新建数据库
双击数据库,点击右边有一行‘导入向导’,选择CSV文件,除了下图的这一步修改字段名称行为0,第一个数据行为1,都直接跳过就行,这里注意,最后一个数据行这个选项需要根据电脑水平量力而行,原数据有10000w条,我第一次的时候查询800w条的SQL电脑就会直接蓝屏,最后只用了700w条:
4.2数据预处理
4.2.1修改列名
ALTER TABLE userbehavior CHANGE f1 user_id INT,
CHANGE f2 item_id INT,
CHANGE f3 category_id INT,
CHANGE f4 behavior_type VARCHAR ( 5 ),
CHANGE f5 time_stamp INT;
4.2.2查找空值
SELECT
FROM
userbehavior
WHERE
user_id IS NULL
OR item_id IS NULL
OR category_id IS NULL
OR behavior_type IS NULL
OR time_stamp IS NULL;
没有返回值,说明不存在null值。
4.2.3重复值
思路是按照user_id和item_id和time_stamp分组,通过count()查看是否只有一条记录(因为一个用户在某一时间查看某个商品必定是唯一的):
SELECT
user_id,item_id,time_stamp
FROM
userbehavior
GROUP BY
user_id,item_id,time_stamp
HAVING
count(*)>1
出现了5条返回值。
下一步去重的思路是给表增加一列id,并设置为自增的主键,这样重复的记录会有很多个id值,只保留最大值即可:
ALTER TABLE userbehavior ADD id INT FIRST;
ALTER TABLE userbehavior MODIFY id INT PRIMARY KEY auto_increment;
删除重复值:
DELETE userbehavior
FROM
userbehavior,
(
SELECT
user_id,
item_id,
time_stamp,
max( id ) AS max_id
FROM
userbehavior
GROUP BY
user_id,
item_id,
time_stamp
HAVING
count(*) > 1
) AS df1
WHERE
userbehavior.user_id = df1.user_id
AND userbehavior.item_id = df1.item_id
AND userbehavior.time_stamp = df1.time_stamp
AND userbehavior.id < df1.max_id;
4.2.4处理异常值&字段调整
将超过时间范围的异常数据删除,即只保留2017-11-25 00:00:00至2017-12-03 23:59:59的数据。
为此我们将时间戳拆开方便后续使用,下面我新增了一列datetimes,数据类型是timestamp,(0)的意思是到秒为止不包括毫秒那些;另外from_unixtime()有两个参数,第二个格式参数我没写,如果为空默认会使用%Y-%m-%d %H:%i:%s的格式:
ALTER TABLE userbehavior ADD datetimes TIMESTAMP ( 0 );
UPDATE userbehavior
SET datetimes = from_unixtime( time_stamp );
DELETE
FROM
userbehavior
WHERE
datetimes > '2017-12-03 23:59:59'
OR datetimes < '2017-11-25 00:00:00';
另外,考虑到后面需要对用户在不同时段做了什么进行分析,利用substring将具体的日期和小时提取出来新增两列:
ALTER TABLE userbehavior ADD dates CHAR ( 10 );
ALTER TABLE userbehavior ADD hours CHAR ( 2 );
UPDATE userbehavior
SET dates = substring( datetimes, 1, 10 ),
hours = substring( datetimes, 12, 2 );