在线销售数据分析–人货场三维分析角度
文章目录
一、数据来源及理解
此次分析数据来源于第二届Power BI 可视化大赛样例数据,共有四个表,分别为sales
,store,item,district,一共有七十万左右的数据。
二、分析思路
按照人-货-场三维分析角度进行分析,分析导图:
三、数据处理
数据预处理
整个数据包括四张表,三十九个不同字段,但在实际分析过程中我们只用到了十五个字段,为了让数据分析更高效,所以我复制了一份并对其进行一个整合,成为一张表。
数据清洗
利用Python语言进行数据分析,开发工具有Jupyter Notebook,利用的包主要是pandas、numpy,matplotlib.pyplot。
import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline #coding=utf-8 file_name = 'D:\\Analysis.xlsx' xls = pd.ExcelFile(file_name) xs = xls.parse('salesdata',dtype='object') plt.rcParams['font.sans-serif']=['SimHei'] #显示中文 plt.rcParams['axes.unicode_minus']=False #允许显示负数 xs.info()
数据总共为327047 条,包含15个特征,接下对数据进行观察并做数据清洗处理。本次数据集比较“干净”,不存在缺失值。另外有些特征的属性需要更改,例如金额及销量的数据类型。
数据转换
数据类型全为object类型,转换数据类型为数值型
xs['Sum_GrossMarginAmount']=pd.to_numeric(xs['Sum_GrossMarginAmount'], errors='coerce').fillna(0) ##数据文本型转换为数值型 xs['Sum_Regular_Sales_Dollars']=pd.to_numeric(xs['Sum_Regular_Sales_Dollars'], errors='coerce').fillna(0) xs['Sum_Markdown_Sales_Dollars']=pd.to_numeric(xs['Sum_Markdown_Sales_Dollars'], errors='coerce').fillna(0) xs['Sum_Regular_Sales_Units']=pd.to_numeric(xs['Sum_Regular_Sales_Units'], errors='coerce').fillna(0) xs['Sum_Markdown_Sales_Units']=pd.to_numeric(xs['Sum_Markdown_Sales_Units'], errors='coerce').fillna(0) xs['SellingAreaSize']=pd.to_numeric(xs['SellingAreaSize'], errors='coerce').fillna(0)
由于在本次数据集中没有明确的时间字段,所以我们在这不做时间维度的分析,如果要做时间维度的分析还需要对时间字段做一个类型转换。
四、数据描述性统计
xs[['Sum_GrossMarginAmount','Sum_Regular_Sales_Dollars','Sum_Markdown_Sales_Dollars','Sum_Regular_Sales_Units','Sum_Markdown_Sales_Units']].describe()
可以看到在销售金额中存在着负数,这可能是退货的订单,需要进行筛选。可以看出各字段的平均值都在百分之75的订单之下,表明存在了一些购买力极强的用户。我们可以将图做出来会更加明显。以’Sum_Regular_Sales_Dollars’字段为例:
plt.subplot(341) xs['Sum_Regular_Sales_Dollars'].hist(figsize=(10,6),bins=100,color='c') plt.subplot(342) xs[xs['Sum_Regular_Sales_Dollars']<1000]['Sum_Regular_Sales_Dollars'].hist(figsize=(10,6),bins=10,color='c') plt.subplot(343) xs[xs['Sum_Regular_Sales_Dollars']>3150]['Sum_Regular_Sales_Dollars'].hist(figsize=(10,6),bins=10,color='c') plt.subplot(344) xs[xs['Sum_Regular_Sales_Dollars']<0]['Sum_Regular_Sales_Dollars'].hist(figsize=(10,6),bins=10,color='c')
在第一张图中可以看出很明显的长尾效应,取了销售金额小于1000的数据可以看出大部分的销售金额都集中在0到250美元,另外,还存在几条销售金额大于3150美元订单。退货订单金额基本上在100美元以内,其具体原因后续可做具体分析(先找出退货的订单用户,查用户在退货之后是否有购物情况,是否为第一次购买就退货等)
将其打印出来可以看到是来自itemid为155579、及183620的订单,而其购买的原因不得而知,如果有相关的数据可以进行分析是否为异常数据。
xs[xs['Sum_Regular_Sales_Dollars']>3150]
五、三维分析-人
用户质量分析
通过二八原则,去寻找关键的那20%决定性因素!
# 计算高质量用户贡献了多少份额(28倾向) user_amount = xs.groupby('Buyer')['Sum_Regular_Sales_Dollars'].sum().sort_values(ascending=False).reset_index() user_amount['amount_cumsum'] = user_amount['Sum_Regular_Sales_Dollars'].cumsum() amount_total = user_amount['amount_cumsum'].max() user_amount['percentage'] = user_amount['amount_cumsum'] / amount_total #统计销量 user_count = xs.groupby('Buyer')['Sum_Regular_Sales_Units'].sum().sort_values(ascending=False).reset_index() user_count['count_cumsum'] = user_count['Sum_Regular_Sales_Units'].cumsum() count_total = user_count['count_cumsum'].max() user_count['percentage'] = user_count['count_cumsum'] / count_total #画图 plt.rc('font', family='simhei', size=9) plt.subplot(221) plt.title('零售消费额占比') plt.ylabel("累计比率") plt.plot(user_amount['percentage']) plt.grid(color='#95a5a6', linestyle='--', linewidth=1, alpha=0.4) plt.subplot(222) plt.title('零售销量占比') plt.ylabel("累计比率") plt.plot(user_count['percentage']) plt.grid(color='#95a5a6', linestyle='--', linewidth=1, alpha=0.4) plt.show() user_amount.head(20)
用户类别分析
用户类别分析,看各类别用户占比分别为多少,针对不同类别推出不同的方案,提升销售额。
#用户类别分析 fig1 = plt.subplot(131) category=xs.groupby('Category').Sum_Regular_Sales_Dollars.sum()/xs.Sum_Regular_Sales_Dollars.sum() category.plot.pie(figsize=(12,10),autopct='%1.1f%%',shadow=True,startangle=90) plt.title('零售分类占比') fig2 = plt.subplot(133) category=xs.groupby('Category').Sum_Markdown_Sales_Dollars.sum()/xs.Sum_Markdown_Sales_Dollars.sum() category.plot.pie(figsize=(12,10),autopct='%1.1f%%',shadow=True,startangle=90) plt.title('折扣分类占比')
DM(管理者)排名分析
各DM管理下销量情况,按降序排列输出
order_DM = xs.groupby('DM')['Sum_Regular_Sales_Dollars'].sum().sort_values(ascending=False).plot.bar()
六、三维分析-货
销售金额及销量分布情况
零售销售额与数量情况,打折销售额与数量情况
plt.figure(figsize=(12,4)) plt.subplot(121) plt.scatter(x = 'Sum_Regular_Sales_Dollars', y = 'Sum_Regular_Sales_Units',data=xs) plt.xlabel('每笔零售订单消费金额') plt.ylabel('每笔零售订单购买数量') plt.subplot(122) plt.scatter(x = 'Sum_Markdown_Sales_Dollars',y = 'Sum_Markdown_Sales_Units',data = xs) plt.xlabel('每位折扣消费金额') plt.ylabel('每位折扣购买数量') plt.show()
观察散点图各点的分布发现呈现一个高度的集中,零散几个极值,符合零售行业规律,相比而言折扣消费的分布更具规律,初步估计这家店应该是按照金额数或者订单数进行一个折扣销售。
商品退货率
#零售商品退货率% xs[xs['Sum_Regular_Sales_Dollars']<0]['Sum_Regular_Sales_Dollars'].sum()/xs['Sum_Regular_Sales_Dollars'].sum()*(-100)
#折扣商品退货率% xs[xs['Sum_Markdown_Sales_Dollars']<0]['Sum_Markdown_Sales_Dollars'].sum()/xs['Sum_Markdown_Sales_Dollars'].sum()*(-100)
产品的加起来退货率不足1%,在能接受的范围以内,没有前后的一个退货率进行一个对比,有对比的话更能做好总结。
七、三维分析-场
城市
1)城市销售前十
#各城市零售销售排名前十 xs.groupby('City Name')['Sum_Regular_Sales_Dollars'].sum().sort_values(ascending=False).head(10) #各城市折扣销售排名前十 xs.groupby('City Name')['Sum_Markdown_Sales_Dollars'].sum().sort_values(ascending=False).head(10)
2)退货率排名前十的城市
#各城市零售退货率排名前十的城市 fail=xs[xs['Sum_Regular_Sales_Dollars']<0].groupby('City Name')['Sum_Regular_Sales_Dollars'].sum()/xs['Sum_Regular_Sales_Dollars'].sum()*(-100) fail.sort_values(ascending=False).head(10) #各城市折扣退货率排名前十的城市 fail1=xs[xs['Sum_Markdown_Sales_Dollars']<0].groupby('City Name')['Sum_Markdown_Sales_Dollars'].sum()/xs['Sum_Markdown_Sales_Dollars'].sum()*(-100) fail1.sort_values(ascending=False).head(10)
区域
1)区域排名
#区域零售销售排名 xs.groupby('Territory')['Sum_Regular_Sales_Dollars'].sum().sort_values(ascending=False) #区域折扣销售排名 xs.groupby('Territory')['Sum_Markdown_Sales_Dollars'].sum().sort_values(ascending=False)
折扣销售跟零售销售的排名区域是一模一样的,存在很强的正向相关。符合销售规律:购买越多,所享受的折扣越多
2)商店大小与销售额
#区域大小与零售销售额 xs.groupby('SellingAreaSize')['Sum_Regular_Sales_Dollars'].sum().sort_values(ascending=False) #区域大小与折扣销售额 xs.groupby('SellingAreaSize')['Sum_Markdown_Sales_Dollars'].sum().sort_values(ascending=False)
销售额跟商店大小没有很明显的相关关系,猜想对销售影响更多的可能是区域
3)区域质量分析
# 计算高质量区域用户贡献了多少份额(28倾向)零售 territory_amount = xs.groupby('Territory')['Sum_Regular_Sales_Dollars'].sum().sort_values(ascending=False).reset_index() territory_amount['amount_cumsum'] = territory_amount['Sum_Regular_Sales_Dollars'].cumsum() amount_total = territory_amount['amount_cumsum'].max() territory_amount['percentage'] = territory_amount['amount_cumsum'] / amount_total #折扣 territory_amount = xs.groupby('Territory')['Sum_Markdown_Sales_Dollars'].sum().sort_values(ascending=False).reset_index() territory_amount['amount_cumsum'] = territory_amount['Sum_Markdown_Sales_Dollars'].cumsum() amount_total = territory_amount['amount_cumsum'].max() territory_amount['percentage'] = territory_amount['amount_cumsum'] / amount_total #画图 plt.rc('font', family='simhei', size=9) plt.subplot(221) plt.title('区域零售消费额占比') plt.ylabel("累计比率") plt.plot(territory_amount['percentage']) plt.grid(color='#95a5a6', linestyle='--', linewidth=1, alpha=0.4) plt.rc('font', family='simhei', size=9) plt.subplot(222) plt.title('区域折扣消费额占比') plt.ylabel("累计比率") plt.plot(territory_amount['percentage']) plt.grid(color='#95a5a6', linestyle='--', linewidth=1, alpha=0.4) territory_amount.head(20)
结合图表可知:五个区域左右贡献了80%以上的销售额,还有很多区域市场等待开发,后续可关注一下高质量区域是否市场饱和。
4)新老店分析
1)新老店分类分析 #新老店分析 fig1 = plt.subplot(131) category=xs.groupby('Store Type').Sum_Regular_Sales_Dollars.sum()/xs.Sum_Regular_Sales_Dollars.sum() category.plot.pie(figsize=(12,10),autopct='%1.1f%%',shadow=True,startangle=90) plt.title('零售分类占比') fig2 = plt.subplot(133) category=xs.groupby('Store Type').Sum_Markdown_Sales_Dollars.sum()/xs.Sum_Markdown_Sales_Dollars.sum() category.plot.pie(figsize=(12,10),autopct='%1.1f%%',shadow=True,startangle=90) plt.title('折扣分类占比') ```![店类型](https://img-blog.csdnimg.cn/20191215142031860.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTg4Mjg5MA==,size_16,color_FFFFFF,t_70) 2)新老店退货率 ```python #新老店的退货率 fail1=xs[xs['Sum_Markdown_Sales_Dollars']<0].groupby('Store Type')['Sum_Markdown_Sales_Dollars'].sum()/xs['Sum_Markdown_Sales_Dollars'].sum()*(-100) fail1.sort_values(ascending=False)
新店的销售占比很小,可以大力开发一下新店的价值。新老店的退货率中,新店退货率显然更高,找一下原因,提升服务,增加粘性,思考打优质服务战还是高性价比产品。
八、总结
在本次分析中,主要利用了人货场分析思路进行分析,对退货率,用户质量等指标进行了量化分析。对数据的分布、对比进行了分析,由于缺少了时间维度无法对其进行变化、预测分析。
- 点赞
- 收藏
- 分享
- 文章举报
- 阿里云发布Quick BIV3.0,人人都能轻松进行在线数据分析
- 数值分析Matlab绘制三维数据曲面图
- 使用pandas对医院药房销售数据进行数据分析
- 销售数据分析之客户究竟集中在哪里?
- 小白学数据分析----->解析在线平高比
- Excel VBA高效办公应用-第五章-销售数据的处理与分析-Part1(自动插入多张图表)
- 【数据处理】各门店销售库存数据分析
- Google Visualization API 与在线数据分析
- BDP个人版产品体验报告:在线数据分析使用心得
- 利用SQL进行BlackFriday销售数据分析(附PPT)
- 推荐一些在线效率工具汇总(数据分析,舆情监测、图片语义识别等)
- 从用户角度看BI系统中数据分析模型的层次
- wxPython + PyOpenGL 打造三维数据分析的利器!| CSDN 博文精选
- 大数据从百万级别数据的分析角度,数据库如何选择?
- appstore软件销售数据统计分析软件Prismo
- 大数据Spark“蘑菇云”行动第56课:在线广告点击黑名单分析和实现
- 我看到的在线广告解决方案演化-广告数据分析基础
- 基于Echarts的销售企业经营数据分析-散点图
- 【大数据】海量数据实时在线分析Quick BI入门
- 从源码的角度分析Volley加载数据的过程