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

语言: CN / TW / HK

「深度学习福利」大神带你进阶工程师,立即查看>>>


点击上方“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'] < 0sales_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 客户的留存情况

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

我这里将3天、7天、30天、60天、90天、180天作为区间端点,并新增字段DateDiffBin来存放,其中DateDiffBin代表客户该笔订单的消费时间距其首次消费属于哪个时间段。因为计算的是留存,如果客户仅消费了一次,我们认为该客户是流失了的,这里DateDiff=0,并不会被划分入(0, 3]天的开闭区间内。

为了方便直观感受,绘制为柱形图:

从上图我们可以看到,只有3.2%在第一次消费的次日至3天内有过消费,6.6%的客户在4-7天有过消费。分别有40.5%和37.4%的客户在首次消费后的第二个月内和第三个月内有过购买行为。将时间范围继续放宽,有高达67%的客户在90天至半年内消费过。

上述数据说明该电商网站的客户群体,其采购并非高频行为,但留存下来的老客户忠诚度却极高。如果能够把首次购买行为的客户留下来,将会带来很高的收益。

2..3 客户的购买周期

接下来计算客户的购买周期,思路是对其相邻两次消费日期相减,下面我们进行数据处理,画出柱形图。

购买周期柱形图

这是一个典型的长尾分布,大部分购买行为的消费间隔比较短。但这是所有订单的购买周期分布,并不是对客户个体为统计单位的购买周期分布。故对客户编号进行分组:

对客户编号进行分组

一个右偏分布,峰值在15-70天,说明大部分留存客户的购买周期集中于此。建议可以每隔40天左右对客户进行些优惠活动的信息推送,比较符合大部分老客户的购买周期。

小结

本篇文章从订单维度、商品维度、时间维度、客户生命周期、客户留存、客户购买周期等维度进行数据分析实战。数据分析的方法很多,除了上述介绍外,之前文章中也提及过一些,比如用户分层、用户的行为分析等。如果你对数据分析、数据挖掘等感兴趣,欢迎分享和收藏,持续关注我!

推荐阅读

一文详解八大数据分析方法,数据分析必备

精美汉服,送女友必备,Python百行代码带你玩转汉服圈!Python分析了5年的沪指数据,这茬韭菜没那么容易被割Python办公自动化|只需三秒,一键生成数据分析报告!从入门到进阶,那些让你看了以后大呼过瘾的数据分析六件套真香!Python可以让画的图舞动起来 !英伟达小姐姐的7大Python技巧合集,Github点赞量高达2500+

End


目前群已满2000+人,旨在促进技术交流,可申请加入细分方向技术群,细分方向已涵盖:Python、数据分析、爬虫、算法、互助群(新增),已在群内成员请勿重复申请。一定要备注:研究方向+学校/公司(如数据分析+上交),根据格式备注,可更快被通过且邀请进群

▲长按加微信群

▲长按关注公众号

喜欢文章,欢迎“ 在看、点赞、分享


本文分享自微信公众号 - Python学习与数据挖掘(Python_CaiNiao)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

分享到: