Erlo

Python数分实战|从六个视角分析了58万条电商用户行为数据

2020-08-14 15:00:19 发布   249 浏览  
页面报错/反馈
收藏 点赞

点击上方“Python学习与数据挖掘”,关注公众号

设为“星标”,好文章不错过!

原创 |  文末附入群方式

数据分析无外乎于方法论与实践。在之前的一篇文章《一文详解八大数据分析方法,数据分析必备》中,我们从方法论的视角介绍了数据分析常用的八种方法,今天我们以电商用户行为数据为例,手把手教大家进行数据分析实战。

数据集为英国在线零售商在2010年12月1日至2011年12月9日间发生的所有网络交易订单信息,共计581587条,感兴趣的同学公众号后台回复“电商数据”,即可获取完整数据集,做更多有趣探索分析。

本文将按照如下流程进行讲解:

数据预处理数据分析及可视化小结

数据预处理

数据展示

在进行数据预处理之前,我们需要对数据字段进行说明:

我们知道数据预处理对于整个数据分析至关重要的,在本文中将要使用列名称重命名、数据一致化处理、缺失值处理、删除重复值等操作。详情代码如下,共计获得524878条可用数据。

# 读入数据sales_df = pd.read_excel('./Online Retail.xlsx', sheet_name='Online Retail')# 列名重命名sales_df.rename(columns={'InvoiceDate': 'InvoiceTime'}, inplace=True)# 删除重复值rows_before = sales_df.shape[0]sales_df.drop_duplicates(inplace=True)rows_after = sales_df.shape[0]# 填充空值sales_df['CustomerID'].fillna('0', inplace=True)# 增添新列sales_df['InvoiceTime'] = pd.to_datetime(sales_df['InvoiceTime'], errors='coerce')sales_df['Date'] = pd.to_datetime(sales_df['InvoiceTime'].dt.date, errors='coerce')sales_df['Month'] = sales_df['InvoiceTime'].dt.month# 数据类型转换sales_df['Quantity'] = sales_df['Quantity'].astype('int32')sales_df['UnitPrice'] = sales_df['UnitPrice'].astype('float')sales_df['CustomerID'] = sales_df['CustomerID'].astype('int32')sales_df['InvoiceNo'] = sales_df['InvoiceNo'].astype('str')# 计算总价sales_df['SumPrice'] = sales_df['Quantity'] * sales_df['UnitPrice']# 拆分订单query_c = sales_df['InvoiceNo'].str.contains('C')# 只含取消订单sales_cancel = sales_df.loc[query_c, :].copy()# 只含成功订单sales_success = sales_df.loc[-query_c, :].copy()# 增加原订单号sales_cancel['SrcInvoiceNo'] = sales_cancel['InvoiceNo'].str.split('C', expand=True)[1]new_data = pd.merge(sales_cancel, sales_success, left_on='SrcInvoiceNo',right_on='InvoiceNo')query_free = sales_success['UnitPrice'] == 0# 只含免费订单sales_free = sales_success.loc[query_free, :].copy()# 只含普通订单sales_success = sales_success.loc[-query_free, :]query_minus = sales_success['UnitPrice'] sales_success = sales_success.loc[-query_minus, :]

数据分析及可视化

1、销售情况的描述性统计

1.1 订单维度

首先将sales_success按订单号分组,对Quantity商品数量和SumPrice总价分组求和,通过describe()函数获得笔单价(每笔订单的平均交易金额)和连带率(每笔订单平均购买的产品件数)。

数据描述

根据统计数据,我们可以看到共产生有效订单19960笔,笔单价为533.17英镑,连带率约为279件,说明以批发性质的订单为主。订单交易金额和订单内商品件数,其均值都高于中位数;订单交易金额的均值甚至高于Q3分位数。说明订单总体差异大,存在部分购买力极强的客户。

接下来绘制订单交易金额的分布图,通过数据分析,我们发现部分订单交易金额过大,影响图表的可读性,筛除1000英镑及以上的订单。

筛去1000英镑及以上的订单

订单金额集中在400英镑内,三个峰值分别为20英镑内、100-230英镑、300-320英镑。其中300-320英镑的订单数量特别多。

对订单内商品数量的分布同样绘制柱形图,并筛2000件及以上的订单

商品数量的分布

订单内的商品数量呈现出很典型的长尾分布,大部分订单的商品数量在250件内,商品数量越多,订单数相对越少。为了进一步探究订单交易金额与订单内商品件数的关系,我们绘制散点图:

订单交易金额与订单内商品件数的关系

总体来说订单交易金额与订单内商品件数是正相关的,订单内的商品数越多,订单金额也相对越高。但在Quantity靠近0的位置也有若干量少高价的订单,后续可以深入探究。

1.2 商品维度

根据观察,我们发现相同的商品在不同的订单中单价不同,可知商品的单价会发生波动,所以接下来求每件商品的平均价格。

思路为平均价格=该商品的总销售额 / 该商品的销售数量。具体来说,先按商品编号进行分组,对数量和总价分别求和,即得到对应商品的总销售金额和总销售量,取商即得到平均价格。

通过数据分析,我们发现商品价位基本上全部集中在100英镑内,出现了极少量的天价商品影响观测,将其筛去。

商品价位

峰值是1-2英镑,单价10英镑以上的商品已经很少见,看来该电商的定位主要是价格低的小商品市场。

接下来查看商品单价和商品销量的散点图,可以看出哪种价位的商品更受欢迎。

商品单价和商品销量的散点图

从商品的销量上来看,毫无疑问是低于5英镑的低价区商品大获全胜,受到了客户们的喜爱。

那么是否价格低廉的商品也带来了实际上最多的销售额呢?不妨绘制商品单价和商品总销售额的散点图:

商品单价和商品总销售额

低价区的商品笑到了最后,不仅在销售数量上一骑绝尘,也构成了销售额的主要部分;高价的商品虽然单价高昂,但销量很低,并没有带来太多的销售额。据此,建议平台采购部门可以多遴选售价低于10英镑的产品,来进一步扩充低价区的品类。

1.3 时间维度

以月份为单位进行折线图绘制,这里对Quantity和SumPrice分组求和,代表每月的销量和销售额,对InvoiceNo计数,代表每月的订单数。此处采用双坐标图,销量和销售额为左轴,参数secondary_y = 'InvoiceNo’表示订单数为右轴。

以月份为单位进行折线图绘制

观察到三条折线总体上呈现相近的趋势,除了2011年2月和4月略低外,2010年12月至2011年8月基本维持相近的销售情况;随后在9月-11月连续增长,达到高峰。考虑该电商平台主营礼品,受节日影响可能较大。

将日期设为索引,按日绘制折线图:

按日绘制折线图

可见销量Quantity和销售额SumPrice的趋势是极趋同的,这也和前一节中分析出该电商以低价商品为主相吻合,商品单价低且价位集中,则销售额主要随销量变化而涨跌。

注意到在最后一天(即2011年12月9日),销量、销售额显著激增,我们放大看看:

2011年12月的前8天基本延续了11月下旬的销售趋势,但在12月9日订单量大幅下降时,却创造了样本区间内销量和销售额的历史新高。说明存在某笔或某几笔购买量极大的订单,从而使得销售额大幅上升。

将当日的销售详单拉取出来:

当日的销售详单

破案了,有一个客户,一口气购买了8万余件的纸工艺品,贡献了168469.60英镑的销售额。

2、客户消费行为分析

2.1 客户的生命周期

我们这节研究的客户是指所有成功的普通订单中有CustomerID的客户,不包含未记录CustomerID的客户。下面我们绘制柱形图观察客户生命周期的实际分布,绘制20个分组的柱形图,横坐标代表生命周期的天数区间,纵坐标为区间内的客户数。

20个分组的柱形图

许多客户仅消费过一次,没有留存下来,需要更加重视客户初次购买的体验感,可以考虑通过网站内服务评价、客服电询等方式获知新客对于购买流程中不满意之处,针对性地加以改进;同时应该对新客采取吸引其二次购买的手段,如发放有时限的优惠券等。

有趣的是在350天左右出现一个次高峰,不妨将生命周期为0天的客户排除掉再看看分布:

将生命周期为0天的客户排除

生命周期在0-75天的客户数略高于75-170天,可以考虑加强前70天内对客户的引导。约1/4的客户集中在170天-330天,属于较高质量客户的生命周期。

而在330天以后,则是数量可观的死忠客户,拥有极高的用户粘性。考虑到这些客户中有许多未进行完整的生命周期 ,实际的客户平均生命周期会更长。

2.2 客户的留存情况

客户的生命周期实际上是首次和末次消费的时间差,故无法对客户各月的消费情况获得直观的感受。因此接下来我们对客户的留存情况展开探究。

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认