Python数分实战|从六个视角分析了58万条电商用户行为数据
点击上方“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'] < 0
sales_success = sales_success.loc[-query_minus, :]
数据分析及可视化
1、销售情况的描述性统计
1.1 订单维度
首先将sales_success按订单号分组,对Quantity商品数量和SumPrice总价分组求和,通过describe()函数获得笔单价(每笔订单的平均交易金额)和连带率(每笔订单平均购买的产品件数)。
根据统计数据,我们可以看到共产生有效订单19960笔,笔单价为533.17英镑,连带率约为279件,说明以批发性质的订单为主。订单交易金额和订单内商品件数,其均值都高于中位数;订单交易金额的均值甚至高于Q3分位数。说明订单总体差异大,存在部分购买力极强的客户。
接下来绘制订单交易金额的分布图,通过数据分析,我们发现部分订单交易金额过大,影响图表的可读性,筛除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个分组的柱形图,横坐标代表生命周期的天数区间,纵坐标为区间内的客户数。
许多客户仅消费过一次,没有留存下来,需要更加重视客户初次购买的体验感,可以考虑通过网站内服务评价、客服电询等方式获知新客对于购买流程中不满意之处,针对性地加以改进;同时应该对新客采取吸引其二次购买的手段,如发放有时限的优惠券等。
有趣的是在350天左右出现一个次高峰,不妨将生命周期为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+
目前群已满2000+人,旨在促进技术交流,可申请加入细分方向技术群,细分方向已涵盖:Python、数据分析、爬虫、算法、互助群(新增),已在群内成员请勿重复申请。一定要备注:研究方向+学校/公司(如数据分析+上交),根据格式备注,可更快被通过且邀请进群
▲长按加微信群
▲长按关注公众号
本文分享自微信公众号 - Python学习与数据挖掘(Python_CaiNiao)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
SQL 中为什么经常要加NOLOCK?
点击关注上方“SQL数据库开发”, 设为“置顶或星标”,第一时间送达干货 刚开始工作的时候,经常听同事说在SQL代码的表后面加上WITH(NOLOCK)会好一些,后来仔细研究测试了一下,终于知道为什么了。 那么加与不加到底有什么区别呢? SQL在每次新建一个查询,就相当于创建了一个会话。在不同的查询窗口操作,会影响到其他会话的查询。当某张表正在写数据时,这时候去查询很可能就会一直处于阻塞状态,哪怕你只是一个很简单的SELECT也会一直等待。 我们这里使用事务来往某张表里写数据,我们知道事务在写完表必须提交(COMMIT)或回滚(ROLLBACK)才能释放表,否则会一直处于阻塞状态。 在插入过程中,我们写一个简单的查询语句,在不添加WITH(NOLOCK)和添加WITH(NOLOCK)的情况下,看会发生什么。 示例数据 如下表A,是我们新建的一个非常简单的表。 下面我们创建一个往里面写数据的事务(使用BEGIN TRAN就可以开始一个事务了) 我们发现有1行受影响了,注意这里的会话ID是59(左上角黄色标签上的数字) 不添加NOLOCK 我们新建一个查询窗口,然后查询A表 从上面的查询可...
- 下一篇
新人手册系列:多面手之性能测试
阿里巴巴质量技术新人手册又更新了!本期分享的最常用的性能测试,买买买,也要服务器稳稳稳! 概念&目的 本周分享的性能测试,主要面向的是服务端的性能测试。 性能测试是从业务中提取压测模型,然后利用压测工具按照模型制造压测流量,并对目标应用集群进行施压,在施压过程中观察应用集群的性能表现和发掘性能瓶颈的测试行为。 当前性能测试主要分为线上压测和线下压测。线上压测主要通过全链路压测执行,线下压测是单机(或者小集群)压测。全链路压测请看全链路压测章节,本节主要讨论通用性能测试方案和流程。 常用指标 1. 虚拟用户 虚拟用户,模拟真实业务逻辑步骤的虚拟用户,虚拟用户模拟的操作步骤都被记录在压测脚本里。压测脚本用于描述虚拟用户在场景中执行的操作。 2. Transaction压测事务 事务是性能测试脚本的一个重要特性。要度量服务器的性能,需要定义事务,每个事务都包含事务开始和事务结束标记。事务用来衡量脚本中一行代码或多行代码的执行所耗费的时间。可以将事务开始放置在脚本中某行或者多行代码的前面,将事务结束放置在该行或者多行代码的后面,在该脚本的虚拟用户运行时,这个事务将衡量该...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS关闭SELinux安全模块
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长