当前位置:   article > 正文

【Python】电商用户行为数据可视化分析实战

python实现用户上网行为展示
本文中,云朵君将和大家一起从多个角度使用多个可视化技术,根据各种因素跟踪客户在电子商务网站的花费时间。

关于数据集

数据集来自kaggle -- Machine Hack。

先进电子商务的用户数量激增,而包括买家浏览电子商务商店而花费大量时间等信息被,店主们还计划利用各种算法来吸引顾客,试图研究和利用顾客行为模式来增加营收。

跟踪客户活动也是了解客户行为并找出如何更好地为他们服务的好方法。机器学习和人工智能已经在设计各种推荐引擎方面发挥了重要作用,通过预测顾客的购买模式来吸引他们。

属性说明

  • session_id - 每行的唯一标识符

  • session_number - 会话类型标识符

  • client_agent - 客户端软件详细信息

  • device_details - 客户端设备详细信息

  • date - 会话的时间戳

  • purchased - 是否完成任何购买的二分类

  • added_in_cart - 是否加入购物车的二分类值

  • checked_out - 是否成功结账离开的二分类值

  • time_spent - 以秒为单位的总时间 (目标列)

会话是指用户在一定的时间段内与您的网站进行的一组互动。例如,一次会话可以包含多个网页浏览、事件、社交互动和电子商务交易。

会话就相当于一个容器,其中包含了用户在网站上执行的操作。

fd13bed1de540064b248a4381aa4a3fc.png

加载必要的包

  1. import pandas as pd
  2. import numpy as np
  3. import seaborn as sns
  4. import matplotlib.pyplot as plt
  5. import matplotlib.colors as mcolors
  6. import calplot

这里使用了常规的数据处理库,pandas、numpy、seabron、matplotlib,同时为了加强昨天介绍的日历热图,使用calplot库在实际问题中的应用。

导入训练集与测试集

  1. train = pd.read_csv("../ParticipantData_BTPC/Train.csv")
  2. test = pd.read_csv("../ParticipantData_BTPC/Test.csv")

查看训练集与测试集的数据结构

train.info()
  1. <class 'pandas.core.frame.DataFrame'>
  2. RangeIndex: 5429 entries, 0 to 5428
  3. Data columns (total 9 columns):
  4. # Column Non-Null Count Dtype
  5. --- ------ -------------- -----
  6. 0 session_id 5429 non-null object
  7. 1 session_number 5429 non-null int64
  8. 2 client_agent 5269 non-null object
  9. 3 device_details 5429 non-null object
  10. 4 date 5429 non-null object
  11. 5 purchased 5429 non-null int64
  12. 6 added_in_cart 5429 non-null int64
  13. 7 checked_out 5429 non-null int64
  14. 8 time_spent 5429 non-null float64
  15. dtypes: float64(1), int64(4), object(4)
  16. memory usage: 297.0+ KB
test.info()
  1. <class 'pandas.core.frame.DataFrame'>
  2. RangeIndex: 2327 entries, 0 to 2326
  3. Data columns (total 8 columns):
  4. # Column Non-Null Count Dtype
  5. --- ------ -------------- -----
  6. 0 session_id 2327 non-null object
  7. 1 session_number 2327 non-null int64
  8. 2 client_agent 2268 non-null object
  9. 3 device_details 2327 non-null object
  10. 4 date 2327 non-null object
  11. 5 purchased 2327 non-null int64
  12. 6 added_in_cart 2327 non-null int64
  13. 7 checked_out 2327 non-null int64
  14. dtypes: int64(4), object(4)
  15. memory usage: 109.1+ KB

查看训练集与测试集部分样本

train.head()
633d10a8ae0f3f88882d18c00dbf6d70.png
test.head()
9803737ef03f7cbdd501226c642b3eab.png

探索性数据分析

目标变量(time_spent)

首先查看目标变量的分布状况。

  1. plt.figure(figsize=(10,8))
  2. sns.despine(left=True, bottom=True)
  3. sns.set_theme(style="ticks")
  4. sns.set(font_scale=1.4)
  5. ax=sns.histplot(train["time_spent"],
  6.                 log_scale=10,
  7.                 kde=True,
  8.                 color="green")
  9. plt.title("Time Spent distribution")
  10. ax.set(ylabel='')
  11. ax.set(xticklabels='')
  12. ax.set(yticklabels="")
457ee28494010ff141613a6acc42e875.png

上面目标变量所花的时间分布是高度右偏的。值得注意的是,为了更好的可视化,绘图时使用了log刻度。

使用箱限图查看目标变量分布
  1. sns.boxplot(data=train, 
  2.             x="time_spent",
  3.             color="green")
093729741c5ca1a341c749df279865fc.png

从上面箱限图中显示,在 Quartile-3 之上有许多离散异常点。如果在后续分析中,需要额外注意。

目标变量的描述性统计
train["time_spent"].describe()
  1. count 5429.000000
  2. mean 663.194292
  3. std 1713.671664
  4. min 14.400000
  5. 25% 22.699000
  6. 50% 98.312000
  7. 75% 600.463000
  8. max 38494.025000
  9. Name: time_spent, dtype: float64

会话类型(session_number)

会话类型描述性统计
train["session_number"].describe()
  1. count 5429.000000
  2. mean 1072.835329
  3. std 1436.351474
  4. min 11.000000
  5. 25% 121.000000
  6. 50% 517.000000
  7. 75% 1397.000000
  8. max 7722.000000
  9. Name: session_number, dtype: float64
直方图看会话类型的分布
sns.histplot(train["session_number"])
7bc0d2e5e073ab3e821985177a4f503a.png
全年中具有最多前10的会话类型
train["session_number"].value_counts().head(10)
  1. 11 437
  2. 22 192
  3. 33 132
  4. 44 101
  5. 55 93
  6. 66 92
  7. 77 79
  8. 110 73
  9. 88 70
  10. 99 66
  11. Name: session_number, dtype: int64

客户端信息(device_details)

访问网站的都有哪些设备和应用程序
  1. sns.countplot(y="device_details",
  2.              data=train,
  3.              order= train["device_details"].value_counts().index)
d13649b3780fdc7fb60f45f0ecff2db9.png
train["device_details"].value_counts()
  1. iPhone - iOS 1515
  2. Desktop - Chrome 815
  3. iPhone - Web 665
  4. Android Phone - Android 326
  5. Desktop - Safari 313
  6. Desktop - IE 292
  7. iPad - Web 289
  8. iPhone - MobileWeb 277
  9. Desktop - Firefox 234
  10. Android Tablet - Web 203
  11. Other - Other 185
  12. Unknown - MobileWeb 87
  13. Android Phone - Web 86
  14. iPad - iOS 77
  15. Android Phone - MobileWeb 54
  16. Android Tablet - Android 9
  17. Android Tablet - MobileWeb 2
  18. Name: device_details, dtype: int64

上面的图表显示,iphone用户占据大多数。

客户在网站上时长与不同设备之间的关系
  1. device_timespent = sns.violinplot(
  2.     data=train, inner="point",
  3.     y="device_details"
  4.     x="time_spent",scale="width")
93c606dbda9b18dda30f07a93da4a56c.png

小提琴图清晰展示了使用苹果设备的用户花在网站上的时间比其他人更多。

会话的时间(date)

date属性是日期格式,所以需要将日期分成日、月、年,探索客户在网站上花的时长是如何随着时间变化的。

日期格式转换

在拆分日期之前,应使用pandas.to_datetime()函数将日期转换为datetime格式。

  1. train['date'] = pd.to_datetime(
  2.     train['date'], errors='coerce')
拆分年月日
  1. train['day'] = train['date'].dt.day
  2. train['day_label'] = train['date'].dt.day_name()
  3. train['day_number'] = train['date'].dt.dayofweek
  4. train['month_number'] = train['date'].dt.month
  5. train['month_label'] = train['date'].dt.strftime('%b')
  6. train['year_quarter'] = train['date'].dt.quarter
  7. train['week_of_year'] = train['date'].dt.week
  8. train['year'] = train['date'].dt.year
  9. train.head(2)
7545307d8b3a358909c1d305b65c9cd4.png cbdc2a83b0ff4d55dabdfb3b7205cf3d.png
重新排列年月日列
  1. train=train.iloc[:,np.r_[0:5,9:17,5:9]]
  2. train.head(2)
52dbd093582d7ad5b431f83549f4d0e0.png
min(train["date"]),max(train["date"])
  1. (Timestamp('2019-05-06 00:00:00'),
  2. Timestamp('2020-04-23 00:00:00'))
从2019年5月6日到2020年4月23日在网站上花费的时间可视化
  1. time_spent_year = sns.lineplot(
  2.               x="date",
  3.               y="time_spent",
  4.              data=train)
30d5de61c7adb4e0ab648b41b3d33720.png

有图可知,2019年7月和9月是客户花费时间最多的月份。

2019年和2020年每个月客户在网站上花费的时间总和

在2019年,只有5月至12月的记录。
在2020年,只有1月到4月的记录。

创建按年月统计的时间花费数据框架,并使用使用折线图可视化其变化趋势。

  1. month_year_spent = train.groupby(
  2.                 ["year","month_label",'month_number']
  3.                 ).agg({'time_spent':["sum"]})
  4. month_year_spent.columns = ['time_spent']
  5. month_year_spent= month_year_spent.reset_index()
  6. month_year_spent=month_year_spent.sort_values("month_number", ascending=True)
  7. month_year_spent
287201019c70d098e3fe0545f63cb13a.png
  1. time_spent_year = sns.FacetGrid(month_year_spent,
  2.                                 despine=True, row="year",
  3.                                 hue="year",sharey=True, 
  4.                                 sharex=False, height=15,
  5.                                 aspect = 2)
  6. time_spent_year.map(sns.lineplot,
  7.                     "month_label",
  8.                     "time_spent",
  9.                     linewidth = 6,sort=True)
eab03336d46b3a2f7a5f742094108761.png

上图显示,2019年9月是该网站客户活跃度最高的月份。

在2020年,最高的客户活动记录出现在1月和2月。2月份以后,顾客活动逐渐减少。

在2019年和2020年内哪一周的客户活动记录最高
  1. week_year_spent = train.groupby(["year",'week_of_year']
  2.                                ).agg({'time_spent':["sum"]})
  3. week_year_spent.columns = ['time_spent']
  4. week_year_spent= week_year_spent.reset_index()
  5. week_year_spent=week_year_spent.sort_values("week_of_year", ascending=True)
  6. week_year_spent.head()
b620ad1406ba56b15c8c83a4e0fa1daf.png
  1. plt.figure(figsize=(15,10))
  2. time_spent_week_year = sns.FacetGrid(week_year_spent,
  3.                                      despine=True,
  4.                                      row="year", hue="year",
  5.                                      sharey=True, sharex=False, 
  6.                                      height=15, aspect = 2)
  7. time_spent_week_year.map(sns.lineplot,
  8.                          "week_of_year",
  9.                          "time_spent",
  10.                          linewidth = 6)
  11. time_spent_week_year.set(xticks=(np.arange(1,52,3)))
4c12e529a539b4f78e17d32d684cce9c.png

上图显示,在2019年,客户活动量最高记录在37周。2020年,第2周、第4周、第5周的客户活跃度最高。

在2019年和2020年的每个月,每周的哪一天客户活动最多
  1. day_week_spent = train.groupby(["year",'month_label','month_number','day_number','day_label']
  2.                               ).agg({'time_spent':["sum"]})
  3. day_week_spent.columns = ['time_spent']
  4. day_week_spent= day_week_spent.reset_index()
  5. day_week_spent=day_week_spent.sort_values(["month_number","day_number"]
  6.                                           , ascending=True)
  7. day_week_spent
d6ad4606bca96c3ee6496cf1ce3bcfee.png
  1. time_spent_dayweek = sns.FacetGrid(day_week_spent,
  2.                                    despine=True,
  3.                                    row="year"
  4.                                    hue="day_label",
  5.                                    sharey=True, 
  6.                                    sharex=False, 
  7.                                    height=15
  8.                                    aspect = 2)
  9. time_spent_dayweek.map(sns.lineplot,"month_label",
  10.                        "time_spent",linewidth = 6
  11.                       ).set(yscale = 'log')
  12. time_spent_dayweek.add_legend()
cd7262a413b402a8c06126766fc05488.png

上图显示,在2019年,9月每周的每一天都有最高的客户活动量记录。在2020年,4月周六的客户活动记录最低,2月周日的客户活动记录最高。

一年中哪个季度的客户活动记录最高
  1. quart_year_spent = train.groupby(["year",'year_quarter']
  2.                                 ).agg({'time_spent':["sum"]})
  3. quart_year_spent.columns = ['time_spent']
  4. quart_year_spent= quart_year_spent.reset_index()
  5. quart_year_spent=quart_year_spent.sort_values(
  6.             "year_quarter", ascending=True)
  7. quart_year_spent
30af344e9cd2db2ef1cf2b62324f9fbd.png
  1. quarter_spent = sns.FacetGrid(quart_year_spent,
  2.                               despine=True, row="year"
  3.                               hue="year",sharey=True,
  4.                               sharex=False, height=15, aspect = 2)
  5. quarter_spent.map(sns.lineplot,
  6.                  "year_quarter",
  7.                  "time_spent",
  8.                  linewidth = 6
  9.                  ).set(yscale = 'log')
  10. quarter_spent.set(xticks=(np.arange(1,4,1)))
e45f4e336663206da77a20711b587b32.png

上图中说明,2019年第三季度客户活动有所增加。2020年,第二季度的客户网站活动比2019年第二季度最低。

创建一个日历图,看看客户在网站上花了多长时间。
  1. events = pd.Series(train["time_spent"].values, index=train["date"])
  2. events
  1. date
  2. 2020-01-22 236.886
  3. 2020-02-27 1277.455
  4. 2019-08-01 21.704
  5. 2019-12-30 455.201
  6. 2019-09-10 1164.877
  7. ...
  8. Length: 5429, dtype: float64
通过日历图来看看客户在网站上花费的时间
  1. cal_plot=calplot.calplot(events,edgecolor="red",
  2.                          yearcolor="black",
  3.                          cmap='twilight',
  4.                          linewidth=5,
  5.                          yearlabel_kws = {"fontsize":"medium"},
  6.                          figsize=(40,20))

e0533c75fa4652d9548e43345f1d8164.png

消费行为

与消费行为相关的三个属性,purchase、added_in_cart和checked_out,结下来探索这三个非重复排列组合,一共有多少组情况。

  1. train.groupby(["purchased",
  2.                "added_in_cart",
  3.                "checked_out"], 
  4.                as_index=False).size()
0f66e18d798eefb1cef542b66744f63e.png

从结果看,一共有8种不同的组合。

根据组合创建一个category列
  1. conditions= [(train["purchased"]==0) & (train["added_in_cart"]==0) &(train["checked_out"]==0),
  2.            (train["purchased"]==0) & (train["added_in_cart"]==0) &(train["checked_out"]==1),
  3.            (train["purchased"]==0) & (train["added_in_cart"]==1) &(train["checked_out"]==0),
  4.            (train["purchased"]==0) & (train["added_in_cart"]==1) &(train["checked_out"]==1),
  5.            (train["purchased"]==1) & (train["added_in_cart"]==0) &(train["checked_out"]==0),
  6.            (train["purchased"]==1) & (train["added_in_cart"]==0) &(train["checked_out"]==1),
  7.            (train["purchased"]==1) & (train["added_in_cart"]==1) &(train["checked_out"]==0),
  8.            (train["purchased"]==1) & (train["added_in_cart"]==1) &(train["checked_out"]==1)]
  9. values = ['no_activity''chk''add''add_chk','purc','purc_chk','purc_add','purc_add_chk']
使用numpy选择函数创建一个类别列
train['customer_activity'] = np.select(conditions, values)

客户行为分类

客户的活动在网站上是如何分类的
  1. cust_activity = sns.countplot(y="customer_activity",
  2.              data=train,
  3.              order= train["customer_activity"].value_counts().index)
e3fece1827ebcdf6fb104bc1726d2c22.png
train['customer_activity'].value_counts()
  1. no_activity 3847
  2. add 682
  3. purc 679
  4. purc_add 126
  5. purc_add_chk 47
  6. add_chk 25
  7. purc_chk 12
  8. chk 11
  9. Name: customer_activity, dtype: int64

上述结果说明,大多数客户只是浏览网站,并无实际消费行为。

客户在网站上花的时间,及其在各种活动中的变化
  1. device_timespent = sns.violinplot(
  2.     data=train, inner="point",
  3.     y="customer_activity",
  4.     x="time_spent",scale="width"
  5. )
e6d391ddd652e49a0e895c21d84d13ae.png

上面的情节解释了客户花费更多的时间仅仅是为了将产品添加到他们的购物车中,仅仅是为了访问站点。

客户的活动是如何随时间变化的
  1. cust_activity_my=train.groupby(["year",'month_number','month_label','customer_activity']).agg({'customer_activity':['count']})
  2. cust_activity_my.columns = ['activity_count']
  3. cust_activity_my= cust_activity_my.reset_index()
  4. cust_activity_my=cust_activity_my.sort_values("month_number", ascending=True)
  5. cust_activity_my
fc90e25f761b59f24f7e00299dca3f9c.png
  1. cust_activity_my_plot = sns.FacetGrid(cust_activity_my, despine=True, 
  2.                                       row="year", hue="customer_activity",
  3.                                       sharey=True, sharex=False, 
  4.                                       height=15, aspect = 2)
  5. cust_activity_my_plot.map(
  6.              sns.lineplot,
  7.             "month_label",
  8.             "activity_count",
  9.             linewidth = 6)
  10. cust_activity_my_plot.add_legend()
2cc828f895c3ac9dffc2913d7215b62d.png

此前曾看到,客户活动最高的是2019年9月。他们中的大多数人只是访问网站。2020年的1月和2月也是如此。

2020年4月,各类客户活动数量下降至100以下。

客户端设备信息(device_details)

各种客户端设备上的客户活动
  1. cust_activity_device=train.groupby(['device_details','customer_activity']).agg({'customer_activity':['count']})
  2. cust_activity_device.columns = ['activity_count']
  3. cust_activity_device= cust_activity_device.reset_index()
  4. cust_activity_device=cust_activity_device.sort_values("activity_count", ascending=False)
  5. cust_activity_device
1a55e768cb18eea2313189084867cda1.png
  1. cust_activity_dev = sns.FacetGrid(
  2.             cust_activity_device,
  3.             despine=True, 
  4.             col="customer_activity"
  5.             hue="customer_activity",
  6.             sharey=False, sharex=False,
  7.             height=15, col_wrap = 2)
  8. cust_activity_dev.map(sns.barplot,
  9.           "activity_count",
  10.           "device_details")

8e4a4fad49283ca1c142dae8ffba7bc9.png

上面的图表说明购买最多的是iPhone用户。

写在最后

至此,本次数据可视化分析也告一段落,对于本次数据集,当然还有很多工作可以做,如对用户花费时间进行时间序列分析和预测等。

 
 
 
 
 
 
 
 
 
 
  1. 往期精彩回顾
  2. 适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑
  3. AI基础下载机器学习交流qq群955171419,加入微信群请扫码:

6fd637a42101169b0a17325982491bda.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/586969
推荐阅读
相关标签
  

闽ICP备14008679号