【Python】电商用户行为数据可视化分析实战
本文中,云朵君将和大家一起从多个角度使用多个可视化技术,根据各种因素跟踪客户在电子商务网站的花费时间。
关于数据集
数据集来自kaggle -- Machine Hack。
先进电子商务的用户数量激增,而包括买家浏览电子商务商店而花费大量时间等信息被,店主们还计划利用各种算法来吸引顾客,试图研究和利用顾客行为模式来增加营收。
跟踪客户活动也是了解客户行为并找出如何更好地为他们服务的好方法。机器学习和人工智能已经在设计各种推荐引擎方面发挥了重要作用,通过预测顾客的购买模式来吸引他们。
属性说明
session_id - 每行的唯一标识符
session_number - 会话类型标识符
client_agent - 客户端软件详细信息
device_details - 客户端设备详细信息
date - 会话的时间戳
purchased - 是否完成任何购买的二分类值
added_in_cart - 是否加入购物车的二分类值
checked_out - 是否成功结账离开的二分类值
time_spent - 以秒为单位的总时间 (目标列)
会话是指用户在一定的时间段内与您的网站进行的一组互动。例如,一次会话可以包含多个网页浏览、事件、社交互动和电子商务交易。
会话就相当于一个容器,其中包含了用户在网站上执行的操作。
加载必要的包
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import calplot
这里使用了常规的数据处理库,pandas、numpy、seabron、matplotlib,同时为了加强昨天介绍的日历热图,使用calplot库在实际问题中的应用。
导入训练集与测试集
train = pd.read_csv("../ParticipantData_BTPC/Train.csv")
test = pd.read_csv("../ParticipantData_BTPC/Test.csv")
查看训练集与测试集的数据结构
train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5429 entries, 0 to 5428
Data columns (total 9 columns):# Column Non-Null Count Dtype
--- ------ -------------- ----- 0 session_id 5429 non-null object 1 session_number 5429 non-null int64 2 client_agent 5269 non-null object 3 device_details 5429 non-null object 4 date 5429 non-null object 5 purchased 5429 non-null int64 6 added_in_cart 5429 non-null int64 7 checked_out 5429 non-null int64 8 time_spent 5429 non-null float64
dtypes: float64(1), int64(4), object(4)
memory usage: 297.0+ KB
test.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2327 entries, 0 to 2326
Data columns (total 8 columns):# Column Non-Null Count Dtype
--- ------ -------------- ----- 0 session_id 2327 non-null object1 session_number 2327 non-null int64 2 client_agent 2268 non-null object3 device_details 2327 non-null object4 date 2327 non-null object5 purchased 2327 non-null int64 6 added_in_cart 2327 non-null int64 7 checked_out 2327 non-null int64
dtypes: int64(4), object(4)
memory usage: 109.1+ KB
查看训练集与测试集部分样本
train.head()
test.head()
探索性数据分析
目标变量(time_spent)
首先查看目标变量的分布状况。
plt.figure(figsize=(10,8))
sns.despine(left=True, bottom=True)
sns.set_theme(style="ticks")
sns.set(font_scale=1.4)
ax=sns.histplot(train["time_spent"],log_scale=10,kde=True,color="green")
plt.title("Time Spent distribution")
ax.set(ylabel='')
ax.set(xticklabels='')
ax.set(yticklabels="")
上面目标变量所花的时间分布是高度右偏的。值得注意的是,为了更好的可视化,绘图时使用了log刻度。
使用箱限图查看目标变量分布
sns.boxplot(data=train, x="time_spent",color="green")
从上面箱限图中显示,在 Quartile-3
之上有许多离散异常点。如果在后续分析中,需要额外注意。
目标变量的描述性统计
train["time_spent"].describe()
count 5429.000000
mean 663.194292
std 1713.671664
min 14.400000
25% 22.699000
50% 98.312000
75% 600.463000
max 38494.025000
Name: time_spent, dtype: float64
会话类型(session_number)
会话类型描述性统计
train["session_number"].describe()
count 5429.000000
mean 1072.835329
std 1436.351474
min 11.000000
25% 121.000000
50% 517.000000
75% 1397.000000
max 7722.000000
Name: session_number, dtype: float64
直方图看会话类型的分布
sns.histplot(train["session_number"])
全年中具有最多前10的会话类型
train["session_number"].value_counts().head(10)
11 437
22 192
33 132
44 101
55 93
66 92
77 79
110 73
88 70
99 66
Name: session_number, dtype: int64
客户端信息(device_details)
访问网站的都有哪些设备和应用程序
sns.countplot(y="device_details",data=train,order= train["device_details"].value_counts().index)
train["device_details"].value_counts()
iPhone - iOS 1515
Desktop - Chrome 815
iPhone - Web 665
Android Phone - Android 326
Desktop - Safari 313
Desktop - IE 292
iPad - Web 289
iPhone - MobileWeb 277
Desktop - Firefox 234
Android Tablet - Web 203
Other - Other 185
Unknown - MobileWeb 87
Android Phone - Web 86
iPad - iOS 77
Android Phone - MobileWeb 54
Android Tablet - Android 9
Android Tablet - MobileWeb 2
Name: device_details, dtype: int64
上面的图表显示,iphone用户占据大多数。
客户在网站上时长与不同设备之间的关系
device_timespent = sns.violinplot(data=train, inner="point",y="device_details", x="time_spent",scale="width")
小提琴图清晰展示了使用苹果设备的用户花在网站上的时间比其他人更多。
会话的时间(date)
date属性是日期格式,所以需要将日期分成日、月、年,探索客户在网站上花的时长是如何随着时间变化的。
日期格式转换
在拆分日期之前,应使用pandas.to_datetime()
函数将日期转换为datetime
格式。
train['date'] = pd.to_datetime(train['date'], errors='coerce')
拆分年月日
train['day'] = train['date'].dt.day
train['day_label'] = train['date'].dt.day_name()
train['day_number'] = train['date'].dt.dayofweek
train['month_number'] = train['date'].dt.month
train['month_label'] = train['date'].dt.strftime('%b')
train['year_quarter'] = train['date'].dt.quarter
train['week_of_year'] = train['date'].dt.week
train['year'] = train['date'].dt.year
train.head(2)
重新排列年月日列
train=train.iloc[:,np.r_[0:5,9:17,5:9]]
train.head(2)
min(train["date"]),max(train["date"])
(Timestamp('2019-05-06 00:00:00'),Timestamp('2020-04-23 00:00:00'))
从2019年5月6日到2020年4月23日在网站上花费的时间可视化
time_spent_year = sns.lineplot(x="date",y="time_spent",data=train)
有图可知,2019年7月和9月是客户花费时间最多的月份。
2019年和2020年每个月客户在网站上花费的时间总和
在2019年,只有5月至12月的记录。
在2020年,只有1月到4月的记录。
创建按年月统计的时间花费数据框架,并使用使用折线图可视化其变化趋势。
month_year_spent = train.groupby(["year","month_label",'month_number']).agg({'time_spent':["sum"]})
month_year_spent.columns = ['time_spent']
month_year_spent= month_year_spent.reset_index()
month_year_spent=month_year_spent.sort_values("month_number", ascending=True)
month_year_spent
time_spent_year = sns.FacetGrid(month_year_spent,despine=True, row="year",hue="year",sharey=True, sharex=False, height=15,aspect = 2)
time_spent_year.map(sns.lineplot,"month_label","time_spent",linewidth = 6,sort=True)
上图显示,2019年9月是该网站客户活跃度最高的月份。
在2020年,最高的客户活动记录出现在1月和2月。2月份以后,顾客活动逐渐减少。
在2019年和2020年内哪一周的客户活动记录最高
week_year_spent = train.groupby(["year",'week_of_year']).agg({'time_spent':["sum"]})
week_year_spent.columns = ['time_spent']
week_year_spent= week_year_spent.reset_index()
week_year_spent=week_year_spent.sort_values("week_of_year", ascending=True)
week_year_spent.head()
plt.figure(figsize=(15,10))
time_spent_week_year = sns.FacetGrid(week_year_spent,despine=True,row="year", hue="year",sharey=True, sharex=False, height=15, aspect = 2)
time_spent_week_year.map(sns.lineplot,"week_of_year","time_spent",linewidth = 6)
time_spent_week_year.set(xticks=(np.arange(1,52,3)))
上图显示,在2019年,客户活动量最高记录在37周。2020年,第2周、第4周、第5周的客户活跃度最高。
在2019年和2020年的每个月,每周的哪一天客户活动最多
day_week_spent = train.groupby(["year",'month_label','month_number','day_number','day_label']).agg({'time_spent':["sum"]})
day_week_spent.columns = ['time_spent']
day_week_spent= day_week_spent.reset_index()
day_week_spent=day_week_spent.sort_values(["month_number","day_number"], ascending=True)
day_week_spent
time_spent_dayweek = sns.FacetGrid(day_week_spent,despine=True,row="year", hue="day_label",sharey=True, sharex=False, height=15, aspect = 2)
time_spent_dayweek.map(sns.lineplot,"month_label","time_spent",linewidth = 6).set(yscale = 'log')
time_spent_dayweek.add_legend()
上图显示,在2019年,9月每周的每一天都有最高的客户活动量记录。在2020年,4月周六的客户活动记录最低,2月周日的客户活动记录最高。
一年中哪个季度的客户活动记录最高
quart_year_spent = train.groupby(["year",'year_quarter']).agg({'time_spent':["sum"]})
quart_year_spent.columns = ['time_spent']
quart_year_spent= quart_year_spent.reset_index()
quart_year_spent=quart_year_spent.sort_values("year_quarter", ascending=True)
quart_year_spent
quarter_spent = sns.FacetGrid(quart_year_spent,despine=True, row="year", hue="year",sharey=True,sharex=False, height=15, aspect = 2)
quarter_spent.map(sns.lineplot,"year_quarter","time_spent",linewidth = 6).set(yscale = 'log')
quarter_spent.set(xticks=(np.arange(1,4,1)))
上图中说明,2019年第三季度客户活动有所增加。2020年,第二季度的客户网站活动比2019年第二季度最低。
创建一个日历图,看看客户在网站上花了多长时间。
events = pd.Series(train["time_spent"].values, index=train["date"])
events
date
2020-01-22 236.886
2020-02-27 1277.455
2019-08-01 21.704
2019-12-30 455.201
2019-09-10 1164.877...
Length: 5429, dtype: float64
通过日历图来看看客户在网站上花费的时间
cal_plot=calplot.calplot(events,edgecolor="red",yearcolor="black",cmap='twilight',linewidth=5,yearlabel_kws = {"fontsize":"medium"},figsize=(40,20))
消费行为
与消费行为相关的三个属性,purchase、added_in_cart和checked_out,结下来探索这三个非重复排列组合,一共有多少组情况。
train.groupby(["purchased","added_in_cart","checked_out"], as_index=False).size()
从结果看,一共有8种不同的组合。
根据组合创建一个category列
conditions= [(train["purchased"]==0) & (train["added_in_cart"]==0) &(train["checked_out"]==0),(train["purchased"]==0) & (train["added_in_cart"]==0) &(train["checked_out"]==1),(train["purchased"]==0) & (train["added_in_cart"]==1) &(train["checked_out"]==0),(train["purchased"]==0) & (train["added_in_cart"]==1) &(train["checked_out"]==1),(train["purchased"]==1) & (train["added_in_cart"]==0) &(train["checked_out"]==0),(train["purchased"]==1) & (train["added_in_cart"]==0) &(train["checked_out"]==1),(train["purchased"]==1) & (train["added_in_cart"]==1) &(train["checked_out"]==0),(train["purchased"]==1) & (train["added_in_cart"]==1) &(train["checked_out"]==1)]values = ['no_activity', 'chk', 'add', 'add_chk','purc','purc_chk','purc_add','purc_add_chk']
使用numpy选择函数创建一个类别列
train['customer_activity'] = np.select(conditions, values)
客户行为分类
客户的活动在网站上是如何分类的
cust_activity = sns.countplot(y="customer_activity",data=train,order= train["customer_activity"].value_counts().index)
train['customer_activity'].value_counts()
no_activity 3847
add 682
purc 679
purc_add 126
purc_add_chk 47
add_chk 25
purc_chk 12
chk 11
Name: customer_activity, dtype: int64
上述结果说明,大多数客户只是浏览网站,并无实际消费行为。
客户在网站上花的时间,及其在各种活动中的变化
device_timespent = sns.violinplot(data=train, inner="point",y="customer_activity",x="time_spent",scale="width"
)
上面的情节解释了客户花费更多的时间仅仅是为了将产品添加到他们的购物车中,仅仅是为了访问站点。
客户的活动是如何随时间变化的
cust_activity_my=train.groupby(["year",'month_number','month_label','customer_activity']).agg({'customer_activity':['count']})
cust_activity_my.columns = ['activity_count']
cust_activity_my= cust_activity_my.reset_index()
cust_activity_my=cust_activity_my.sort_values("month_number", ascending=True)
cust_activity_my
cust_activity_my_plot = sns.FacetGrid(cust_activity_my, despine=True, row="year", hue="customer_activity",sharey=True, sharex=False, height=15, aspect = 2)cust_activity_my_plot.map(sns.lineplot,"month_label","activity_count",linewidth = 6)
cust_activity_my_plot.add_legend()
此前曾看到,客户活动最高的是2019年9月。他们中的大多数人只是访问网站。2020年的1月和2月也是如此。
2020年4月,各类客户活动数量下降至100以下。
客户端设备信息(device_details)
各种客户端设备上的客户活动
cust_activity_device=train.groupby(['device_details','customer_activity']).agg({'customer_activity':['count']})
cust_activity_device.columns = ['activity_count']
cust_activity_device= cust_activity_device.reset_index()
cust_activity_device=cust_activity_device.sort_values("activity_count", ascending=False)
cust_activity_device
cust_activity_dev = sns.FacetGrid(cust_activity_device,despine=True, col="customer_activity", hue="customer_activity",sharey=False, sharex=False,height=15, col_wrap = 2)
cust_activity_dev.map(sns.barplot,"activity_count","device_details")
上面的图表说明购买最多的是iPhone用户。
写在最后
至此,本次数据可视化分析也告一段落,对于本次数据集,当然还有很多工作可以做,如对用户花费时间进行时间序列分析和预测等。
往期精彩回顾适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑
AI基础下载机器学习交流qq群955171419,加入微信群请扫码:
【Python】电商用户行为数据可视化分析实战相关推荐
- 电商用户行为和可视化分析
分析用户行为和可视化展现 利用用户在这个商品子集上的行为数据,往往还需要利用更丰富的用户行为数据. 文章目录 分析用户行为和可视化展现 一.数据源说明 二.查看数据 1.引入库 2.读取数据,并查看数 ...
- 电商用户消费数据RFM分析
1. 导入数据, 查看数据信息 import pandas as pd import numpy as np import matplotlib.pyplot as plt #import datet ...
- 基于Python的淘宝行为数据可视化分析
项目背景&总结: 项目背景 完成如下商业分析任务,通过数据分析和可视化展示,充分挖掘数据的价值,让数据更好地为业务服务: 流量分析:PV/UV是多少,通过分析PV/UV能发现什么规律? 漏斗分 ...
- 基于Python语言的PUBG游戏数据可视化分析系统
[success]写于2019年大作业[/success] 博客链接:https://www.iamzlt.com/?p=299 代码链接请到博客链接内查看. 摘要 随着网络技术的兴起和普及,网络游戏 ...
- Python学习笔记——数据分析之数据可视化工具实战案例:世界高峰数据可视化
世界高峰数据可视化 (World's Highest Mountains) 参考:https://www.kaggle.com/alex64/d/abcsds/highest-mountains/le ...
- 如何用SQL分析电商用户行为数据(案例)
叮当之前主要是做增长方向的,平时工作中主要基于问题做数据分析,大部分时候都是怎么快怎么来. 很少有各种工具,各种分析方法全来一遍的,所以本次借分析"淘宝用户行为数据集&qu ...
- python电商用户购买力分析_Python + pandas + 不同客户购买力图形显示
数据源:Kaggle网站上一个"blackFriday.csv"文件(Kaggle网站是一个流行的数据科学竞赛平台),下载下来的数据字段如下: 2020-10-19 13:13:2 ...
- python 豆瓣评论数据分析_Python数据可视化分析--豆瓣电影Top250
Python数据分析–豆瓣电影Top250 利用Python爬取豆瓣电影TOP250并进行数据分析,对于众多爬虫爱好者,应该并不陌生.很多人都会以此作为第一个练手的小项目.当然这也多亏了豆瓣的包容,没 ...
- 基于python爬虫天气象大数据可视化分析系统
https://b23.tv/sxy54Qn flask web框架,数据使用requests模块爬取数据,使用bs4模块解析数据,并且存入数据库.数据库使用sqlite数据库.使用flask_sql ...
最新文章
- Ubuntu下,Java中利用JNI调用codeblocks c++生成的动态库的使用步骤
- Java之于Kotlin对比(Android)
- 分布式消息系统:Kafka
- mysql+误操作怎么恢复_Mysql误操作恢复流程
- 真正的程序员,从来不会告诉你这些事!
- php环境苹果搭建,mac下搭建php环境
- c语言 a 0,[整理]C语言中的a,a和a[0]
- ubuntu 重装 nvidia_时隔三个月 NVIDIA为何再次打破AI推理性能记录
- css 圆点样式 优惠券样子
- H5上传文件又双叒叕开测了!
- 华为鸿蒙os内测,华为“鸿蒙OS”内测信息曝光:界面与EMUI有6个明显不同
- 小学算术运算测试c语言,c语言小学算术运算测试.doc
- 猜数字游戏(c语言实现)
- xshell卸载不干净导致无法安装
- MySQL 8 OCP备考1Z0-908--启动篇--不急于求成、不懈怠
- 二战漫画爬虫(爱漫画网)
- 电子学会python三级笔记
- python绘制正六边形
- mysql json官方文档,10分钟了解MySQL5.7对原生JSON的支持与用法
- 微信小程序一键登录功能,使用uni-app和springboot(JWT鉴权)
热门文章
- 干货|2021年以后人工智能的几点思考?
- 自己组装高档游戏型计算机表格,推荐高端笔记本配置表和完整的高配置计算机物理检查...
- 产品有感之拼多多——社交更优惠的电商平台
- 电脑硬盘分区太多?如何合并分区?
- Dell笔记本 BIOS改硬盘模式Raid改为ahci,开机蓝屏0xc0000001
- Jetson Xavier NX系统安装至 nvme 硬盘
- [irisctf 2023] rev
- 插上移动硬盘计算机没反应,usb硬盘插上电脑没反应怎么办,手把手教你怎么解决...
- 鸿蒙2.0 134个仓库扼要说明
- 寺庙公众号开发:vue实现祈福牌位的前端部分