1. 项目背景
1.1订单数据准备
数据源:某平台提供的 2020年5月25日大家电-家用电器-冰箱 抽样数据(可供学习)
数据量:70k+
订单数据介绍
2. 订单数据的分析思路
对于订单数据,在业务中最常见的是使用可视化报表来监测订单关键性指标的变化,并在一定维度上进行下钻。
3. 结论
从宏观角度,把握当天订单状况。订单总数中,有71.15%是未取消订单,在未取消订单中,有效订单(有效订单衡量标准为订单有效标志为1且实际支付金额>0)
在订单价格分布中,一天中近80%的订单支付金额都小于3000元。
在订单的微观分析中,根据以上订单分析思路,将订单分为四个维度去考虑,时间维度,地区维度,品牌维度,店铺维度。
1) 时间维度
结论1:0时刻(表示客户在0:00-1:00下单)是订单数量和客单价最高的时间段,有效订单量4024单,超过其他时段一倍以上;
结论2:10:00和20:00为一天中的小高峰期,订单数量2000+;
结论3: 订单量较高的时段可能因为在此期间有优惠促销活动导致;
2)地域维度
结论4: 广东,北京,上海,四川,江苏为京东家电(冰箱)类的头部市场;
结论5: 广东为全国省份中订单总量最多的地区;
结论6: 上海地区人均购买力更强;
结论7: 上海地区具有较强的品牌偏好性
3) 品牌维度
结论8: 海尔、容声、美的、康佳、至高为冰箱产品中的头部品牌,其中海尔占据绝大部分市场份额;
3) 品牌维度
结论8: 海尔、容声、美的、康佳、至高为冰箱产品中的头部品牌,其中海尔占据绝大部分市场份额;
4) 店铺维度
结论9: 非自营店铺订单数量和客单价大幅度低于自营店铺
结论10:原因可能是非自营店铺主要集中于单价很低的品牌,缺少单价较高的品牌
4. 数据处理
4.1 分析工具
开发语言:Python(数据分析:Numpy/Pandas 数据可视化:Matplotlib)
开发环境:Jupternotebook
4.2 数据导入
为方便理解,把英文字段改为中文。
4.3 数据清洗
该数据清洗分为三个部分,缺失值处理、数据逻辑错误、内容格式的一致性方面。
第一,缺失值处理
用户城市和省份信息有部分缺失,分析其原因是部分用户隐藏了IP地址,不影响分析。
部分订单的订单时间是空值,分析其原因可能是订单尚未支付,可以将其赋特殊值比如-1或者不做任何处理,不影响分析。
第二,数据逻辑错误
有用户城市ID为-1。优惠前冰箱最低价格为300,数据中存在大量低价订单,其中绝大部分是保修,返现等无价值订单,一小部分是异常订单,可以忽略。
第三,格式内容一致性
此数据一致性较好,不需要特殊处理。
df.info()
查看整体数据索引,在支付时间,订单有效标志,订单取消标注均有缺失值,需要进行缺失值处理,并且所有数据都是object,故需要对id,time等进行数据类型转化。
· 数据类型转换
对数据类型进行转换,标注类数据只有0,1,故更改为整型(int型),对价格金额类的数据更改为浮点型(float型),对于时间日期类更改为datatime
· 数据缺失值处理
df.isnull().sum().sort_values(ascending=False)
查看缺失的数据,并按缺失数据多少进行排序,用户所在城市编号有38190个缺失值,用户所在省份编号有38033个缺失值,支付时间有23271个缺失值
· 填充缺失值
· 异常值处理
定义异常值处理规则:冰箱的优惠前单价最低为300元,低于该价格的订单设定为异常。
通过以上分析可知,共有15133条冰箱优惠前价格大于300的异常数据,剔除异常值。
· 重复值处理
df.订单号.duplicated() 语句查看订单号是否有重复值
发现订单号有重复现象(检验为true),故需要对重复的订单号进行处理。根据京东订单规则,若订单号重复,保留第一个重复值。
5. 订单数据的宏观分析
5.1 有效订单率
计算取消订单数,计算订单取消标志为1的订单数量为取消订单数,17782
计算订单数,计算总订单数为61536
通过绘制饼图,可知有效订单占总订单的比率为71.10%
有效订单筛选条件,订单有效标志=1,订单取消标志=0,优惠前单价不等于0
已支付的订单占总体订单的85%
5.2 订单价格分布
通过订单价格分布可得知80%的订单都在3000以下。
通过生成直方图函数,hist,bin_edges分别代表各个区间统计数值和区间端点,hist_sum表示累积订单量,hist_per为计算出的累积百分比。
画出折线图
6. 订单数据的微观分析
6.1 时间维度
通过对时间维度进行深挖,我们发现0时刻是订单数量最多的时间,在这个小时内我们有超过4000个订单,远远超过其他任何时间的订单数。
6.1.1 有效订单量
除了0时刻外,上午十点和晚上八点也是订单高峰期,考虑到0时订单量可能是因为异常值出现,如某几个顾客下了很多的订单,基于以上考虑,这里可以对人均有效订单量做一个分析。
从直方图中,可明显获知0时刻有效订单数4000+,是全天最高的时刻,除此之外,10:00与20:00订单量是一天中的小高峰期。
人均有效订单量折线图,从数据来看,0时刻的人均有效订单量的确偏高,但低于峰值(1时刻的1.08)和11时刻的人均有效订单量,这说明了0时刻并非因为某个异常高的单人订单量造成订单量最高的现象。
6.1.2 客单价&平均订单价
客单价与平均订单价的定义如下:
客单价=销售额/顾客数
平均订单价=销售额/订单数
同样应用groupby与agg订单实际支付价格按照时间段分类,并取sum进行求和,得到每一个时间段总销售额,再根据公式求得客单价和平均订单价,并画出曲线图。
6.1.3 不同时段订单价格对比
从时间维度来对订单进行拆分,把0时刻订单价格累计分布图和20时刻(除0时刻以外订单数量最多的时间)价格累计分布来进行对比。
0时刻:约25%的用户订单在2000元以下
20时刻:约75%的用户订单在2000元以下
说明0时的用户并不只是有一小部分订单价格更高,而是大部分下单用户都具有较高的客单价。
避免重复操作,这里定义价格累计分布折线图绘制函数,后续计算各个时刻可直接调用函数
分别调用函数,得到0时刻与20时刻订单价格累计分布折线图。
6.1.4 优惠订单占比
6.2 地域维度
6.2.1 不同地域订单量对比
计算各个用户省份编号的订单总量,删掉not given即没有省份信息的数据,并更改用户所在省份编号字段为整型。
下一步读取城市等级数据表,同样设置数据类型,由于city_level存储了各个省份城市的信息,但我们分析时只需要统计到省份即可,所以这里需要简化,每一个省份留一个数据即可。
删除不必要的信息,只保留用户所在省份编号和省份名称两列数据,且按照城市编号大小顺序排序,由于下一步要通过pd.merge()对表进行拼接,所以需要将该表省份字段provinve_id更改为“用户所在省份编号”,与order_area进行匹配。
通过pd.merge()对表进行拼接,这时省份名称和订单数据就有相对应关系了。
与前面画图方法相同,将各个地区订单量进行可视化,如图所示,订单量排在前三名的城市为广东,北京,江苏。其中广东和北京的日订单量都在1000+。。
当然,也可以通过绘制饼图来查看每一个省份订单量占比,广东订单量约占全部订单的20.55%,北京约占13.29%。
6.2.2 客单价&平均订单价
此外,之前我们在时间维度考虑客单价和平均订单价,在地域维度也可采用同样的方式进行分析。这里就不详细赘述,代码如图。
6.3 品牌维度
把地区维度和品牌维度结合起来,可以让我们更清楚的看到不同地区品牌偏好性和市场渗透率。因为不同品牌有不同定价和营销策略,通过不同地区用户品牌偏好,我们也可以在产品定价和营销策略上发现洞察。
6.3.1 头部品牌
第一步同样应用groupby按照品牌名称进行分组,并统计支付价格总量和商品数量总量(sum),按照支付价格有多到少的顺序进行排序,代码如图。
从品牌整体销售情况可以得知,海尔,容声,西门子,美的,海信为销量前五大品牌。
6.3.2 头部省份四个品牌市场渗透率
品牌渗透率:该品牌订单数/所有品牌总订单数
这里选取刚刚地域分析中有效订单量排在前五的五个省份,北京、上海、江苏、广东、四川,首先用海尔品牌进行分析,统计出海尔品牌在这几个城市编号的商品数量和实际支付价格。
根据上述公式,计算渗透率还需要所有品牌的订单数,所以采用merge将两个df连接在一起,并计算渗透率。其他品牌操作一致,所以这里定义一个计算渗透率的函数,方便后续调用。
通过定义不同颜色来区分不同的品牌,黄色代表海尔,红色代表容声,蓝色代表西门子,绿色代表美的。由不同地域的品牌分布可知,上海用户具有较强的品牌偏好性。
6.3.3 各个品牌单价
6.4 店铺维度
首先从自营店铺与非自营店铺有效订单量方面来进行宏观分析,其代码逻辑与订单数据宏观分析中的有效订单率分析基本一致。
如上图所示,自营店铺与非自营店铺的有效订单比约为7:3,自营店铺的有效订单数占总订单数的主要部分。
除了订单数量差异之外,非自营店铺的客单价也要远远低于自营的店铺。
接下来,从品牌角度来进行分析,并分别将自营店铺与非自营店铺的订单量前五的品牌绘制饼图进行对比。
由以上饼图可知,在自营店铺中,头部品牌是海尔、容声、西门子、海信、美的。在非自营店铺中,头部品牌是志高、海尔、奥克斯、现代、美的(按日订单总量排序),不难发现,非自营订单主要集中于价格较低的品牌,极大可能是非自营店铺订单数量和客单价均大幅低于自营店铺的主要原因。