超市零售数据可视化分析(Plotly 指南)

CSDN 上不能插入 HTML,可以在 GitHub Page 上查看: https://paradiseeee.github.io/2022/07/30/超市零售数据可视化分析/

项目首次发布于 Kesci 上 – 超市零售数据分析。感兴趣的可以直接上去 Fork 之后自己做。由于上面只能用 Jupyter Notebook,而且还没有权限 DIY 工作环境,于是线下重新做一下。

项目数据来自 Kaggle:https://www.kaggle.com/jr2ngb/superstore-data,包含全球范围内的大型超市四年间的零售订单数据,有 24 个字段,5w+ 条订单记录。下面将详细了解数据内容,进行数据清洗以及可视化分析。
在这里插入图片描述

一、数据理解和数据清洗

首先导入数据。从 Kaggle 下载的数据集文件的行尾序列为 CRLF ,直接使用 pandas 导入会编码错误,需要转换为 LF 行尾(或者使用 ISO-8859-1 编码)。本项目中的数据集已经转换。

项目数据比较规整,简单清洗一下即可,重点在于后续的取数运算和可视化分析。

import pandas as pd
import warnings
warnings.filterwarnings('ignore')df = pd.read_csv('./superstore_dataset2011-2015.csv')
df.info(verbose=False)
print('\nAll columns: ' + ' | '.join(list(df.columns)))

在这里插入图片描述

# 将列名中的空格和横杠转换为下划线
df.columns = df.columns.str.replace(' ', '_').str.replace('-', '_')
# 将日期字符串转换为 datetime 对象
df['Order_Date'] = pd.to_datetime(df.Order_Date)
# Post Code 字段含有很多缺失值,删掉
df.dropna(axis=1, how='any', inplace=True)
# 增加用于分组的字段
df['year'] = df.Order_Date.dt.year
df['month'] = df.Order_Date.dt.month
df['months'] = df.year.astype(str) + '-' + df.month.astype(str)

二、绘图环境

不关心这部分的读者可以直接跳到 第三节

以下的绘图主要使用 Plotly,在线绘图需要在 Chart Studio 上注册账号获取 API,然后再在本地的配置文件中设定 API。具体可以参考 简书上的文章 。需要注意到在线绘图功能已经从 Plotly 中分离到独立的库 chart_studio,原先的 plotly.plotly 现在是 chart_studio.plotly 。(另外在 Kesci 的 K-Lab 上是 python3.6 + plotly3.x,现在最新的已经是 4.6.0 了。需要自己在 Conda 环境中配置)

然后还用到 Cufflinks 这个库,这货的文档支持相当不丰富,所以写这篇东西主要想给自己留下个操作指南。比如使用 cufflinks.pd.DataFrame.ta_plot 的时候就会出现 **kwargs 被无视的情况,也找不到相关提示,最后在 Github 上发现这是一个 Bug,而且已经有一个未 merge 的 PR :
在这里插入图片描述
查看具体的 Changes,发现竟然只是在某个函数中写漏了个参数,所以直接 cd 到 %PYTHON_HOME%/Lib/site-packages/cufflinks 里面改一下对应的文件就好了:
在这里插入图片描述
然后绘图结果是交互式的,体现为文件是带有 plotly.js 的 HTML 文件。有多种显示方式:

  • 嵌入在 Notebook 中显示
  • 输出离线 HTML 文件(带 js 脚本,不小于 3M)
  • 使用 dash 搭建 localhost 服务本地查看
  • 直接 plot 到 chart-studio.plotly.com 的服务器上面
  • Cufflinks 绘图时输出的 HTML 文件中会贴心地带上一个 API 的链接,直接点击它就可以 export 到 Plotly 的服务器上
  • 输出图片、svg 等其他没什么用的格式

所以要先了解一下不同的显示方法,因为它输出的是网页式的图表,所以会跟 Matplotlib 完全不一样,按照 Matplotlib 的路子去理解就会一脸蒙。其实搞得这么复杂主要是因为我不想用 Jupyter Notebook,在 Notebook 上搞其实很简单,就是导入 plotly.offline 设置一下就好了,绘图结果就会自动嵌入到输出区了。

上面完全是凭着个人理解信口雌黄,以作备忘。请小白参考更多的文档,请大神不吝赐教指出错误。

完成以上一大堆乱七八糟的配置和排错,就可以愉快地绘图了:

import plotly as py
import chart_studio
import plotly.offline
import plotly.graph_objs as go
import cufflinks as cf# 这一堆是使用 Jupyter Notebook 的时候需要设置的
# (好像不是全部需要,whatever)
'''
%matplotlib inline
plotly.offline.init_notebook_mode(connected=True)
cf.go_offline()
'''

三、可视化分析

关注以下问题:

  • 关键指标的计算:销售额、利润
  • 各指标的地域性差异
  • 不同产品类别的指标差异
  • 时间上的纵向对比

(1)总体销售额和利润率

# 按月份分组计算总销售额
months_sales = df.groupby('months').Sales.sum().sort_index()
months_sales.index = pd.to_datetime(months_sales.index)# 由于后续需要进行优化,使用 asFigure 参数生成字典对象以更新参数
# 也可以直接把 iplot 的参数写进 ta_plot,一步到位
fig = months_sales.sort_index().ta_plot(asFigure=True, study='sma', periods=[3, 6], study_colors=['lightblue', 'blue'], title='Sales Trend with Moving Average', theme='solar')
# 更新线型(如果直接使用 interpolation 参数所有的线型将会一样,不易区分)
fig['data'][0].update(line={'color': 'rgba(255, 153, 51, 1.0)', 'dash': 'dot', 'shape': 'hv', 'width': 1.5})
cf.iplot(fig, filename='Sales Trend with Moving Average.html', asUrl=True)

在 Chart Studio 上查看:https://chart-studio.plotly.com/~Paradiseeee/15.embed
在这里插入图片描述
通过以一季度和半年为周期的移动平均,可以明确看到销售额的变化趋势和周期性

# 按月分组计算总利润
months_profits = df.groupby('months').Profit.sum().sort_index()
months_profits.index = pd.to_datetime(months_profits.index)
# 计算利润率
months_rates = months_profits / months_sales
months_rates.name = 'Profit-Rates'months_rates.sort_index().ta_plot(asFigure=True, study='sma', periods=[3, 6], study_colors=['lightblue', 'blue'], title='Profit-Rates Trend with Moving Average',vspan={'x0':'2013-02', 'x1':'2013-10', 'color':'lightblue', 'fill':True, 'opacity':.1},theme='solar')
fig['data'][0].update(line={'color': 'rgba(255, 153, 51, 1.0)', 'dash': 'dot', 'shape': 'hv', 'width': 1.5})
cf.iplot(fig, filename='Sales Trend with Moving Average.html', asUrl=True)

在 Chart Studio 上查看:https://chart-studio.plotly.com/~Paradiseeee/17.embed
在这里插入图片描述
利润率以不同的规律在震荡,其中季度周期性明显;2013 年利润率大幅下降

(2)各大市场的销售额和利润对比

# 各市场订单总数
counts = df.Market.value_counts().reset_index().rename({'index': 'Market', 'Market': 'Counts'}, axis=1)
# 各市场订单均价
argprice = df.groupby('Market').Sales.sum() / df.Market.value_counts()fig = py.subplots.make_subplots(1, 2, subplot_titles=['All-Order Counts', 'All-Order Average Price'])
fig.append_trace(go.Bar(x=counts.Market, y=counts.Counts, name='Counts'), 1, 1)
fig.append_trace(go.Bar(x=argprice.index, y=argprice.values, name='Prices'), 1, 2)
fig.update_layout({'template': 'plotly_dark'})
chart_studio.plotly.iplot(fig, filename='Overviews of Markets', sharing='public')

在 Chart Studio 上查看:https://chart-studio.plotly.com/~Paradiseeee/19.embed
在这里插入图片描述
总体销售情况速览:亚太、欧盟区的客单价明显高于其他地区

# 生成需要的数据格式 -- 行观测为不同的月份分组,列为不同类别的特定字段数据
def unpack_months(field, func, first_group='Market'):'''分组聚合流程打包'''group = df.groupby([first_group, 'months'])names = list(df[first_group].value_counts().index)tmp = group[field].apply(func).astype(int)ret = pd.DataFrame(columns=names)for name in names:ret[name] = tmp[name]ret.index = pd.to_datetime(ret.index)return ret.sort_index()
# 各市场按月分组销售额
sales = unpack_months('Sales', sum)
sales.iplot(title='Superstore Sales Grouped by Months and Markets',xTitle='Months', yTitle='Sales', fill=True, theme='solar', interpolation='hv', asUrl=True)

在 Chart Studio 上查看:https://chart-studio.plotly.com/~Paradiseeee/3.embed
在这里插入图片描述
上图显示了世界主要贸易区域的零售销售额时间分布,可点击 Legends 中的标签显示或隐藏某一个市场的曲线
从图中可以看到,销售额最大的依次是亚太地区、欧盟、南美和北美(不相上下)
并且存在较明显的季度和年份周期趋势(与市场交易习惯有关)

# 各市场按月分组利润率
profit_rates = unpack_months('Profit', sum) / sales
profit_rates.iplot(title='Superstore Profit Rates Grouped by Months and Markets',xTitle='Months', yTitle='Rates', fill=True, theme='solar', interpolation='hv', asUrl=True)

在 Chart Studio 上查看:https://chart-studio.plotly.com/~Paradiseeee/5.embed
在这里插入图片描述
可以看到利润率仍保持类似销售额的周期性趋势
其中加拿大的利润率遥遥领先,主要是因为订单总数较少而且地区单一
而非洲和中东地区在特定时间出现较严重的负盈利,且盈利情况波动较大

(3)不同商品类别的销售数据对比

# 计算不同类别的销售额
catsales = unpack_months('Sales', sum, 'Category')
catsales.iplot(title='Sales Grouped by Months of Different Categories',yTitle='Sales', xTitle='Months', theme='solar', kind='bar', barmode='stack', asUrl=True)

在 Chart Studio 上查看:https://chart-studio.plotly.com/~Paradiseeee/7.embed
在这里插入图片描述
三大类商品的销售额数据差异不大,基本平分秋色;Technology 和 Furniture 相对占比较高

# 计算不同类别的利润率
catrates = unpack_months('Profit', sum, 'Category') / catsales
# 均值辅助线
lines = [{'y': catrates.iloc[:,0].mean(), 'color':'orange', 'dash':'dot'},{'y': catrates.iloc[:,1].mean(), 'color':'blue', 'dash':'dot'},{'y': catrates.iloc[:,2].mean(), 'color':'green', 'dash':'dash'}]catrates.iplot(title='Profit-Rates Grouped by Months of Different Categories', yTitle='Rates', xTitle='Months', theme='solar', hline=lines, asUrl=True)

在 Chart Studio 上查看:https://chart-studio.plotly.com/~Paradiseeee/9.embed
在这里插入图片描述
家居市场的销售额和利润绝对值都较大,但是利润率的均值明显偏低

(4)具体到不同国家地区的对比

# 提取不同国家地区的销售额和利润
countries = df.groupby(['Region', 'Country'])['Sales', 'Profit'].sum().reset_index()
# 增加利润率字段
countries['Profit-Rates(%)'] = pd.Series(countries.Profit / countries.Sales * 1e4).round() / 100
# 一共 147 个国家,忽略销售额较小的国家
top_sales = countries.sort_values('Sales', ascending=False).head(20).sort_index()
# 生成颜色表,并对 DataFrame 映射,生成序列用于绘图
colormap = dict(zip(top_sales.Region.value_counts().index, py.tools.DEFAULT_PLOTLY_COLORS))
top_sales['colors'] = top_sales.Region.map(colormap)top_sales.iplot(kind='bubble', x='Country', y='Profit-Rates(%)', size='Sales', title='Profit Rates of Top-20 Countries in Sales',yTitle='Profit Rates (%)',theme='solar', colors=list(top_sales.colors), asUrl=True)

在 Chart Studio 上查看:https://chart-studio.plotly.com/~Paradiseeee/11.embed
在这里插入图片描述
上图不同颜色代表不同地区,其中棕色为中国。销售额大且利率高的国家依次有印度、中国、英国

最后利用上面计算得到的表 countries ,借助 Tableau 在地图上绘制具体数据:

在这里插入图片描述
上图颜色代表总利润,数字标签代表利润率;从地图可以看到:
累计利润最大的依次是美国、中国、以及欧洲国家;
中东、非洲以及拉美地区的一些国家出现负的利润;
美国的零售市场总量遥遥领先,但是利润处于下游(拉低了均值)。


END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31432.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超市数据分析

1 业务背景 数据集来源于:kaggle数据集(链接),该数据集记录了某全球超市四年的销售数据,通过分析该超市四年内的销售数据,从不同角度出发,分析经营现状,发掘提高销量的销售策略&…

倒计时四天!第2期大模型讲习班报名中,顶尖专家面授,多角度系统培训

大模型前沿技术讲习班第一季第二期(S01E02)将在2023年4月24日至25日线下召开,我们邀请了来自顶尖科研领域的权威专家联合授课。上海交通大学助理研究员陈露,中国人民大学准聘助理教授李崇轩,中国人民大学准聘助理教授林…

开放报名|顶尖专家联合打造,首个系统化AI大模型前沿技术讲习班

大模型正在引发人工智能研究与应用范式产生重大变革,越来越多的顶级团队和杰出人才纷纷加入这一技术浪潮。作为AI大模型科研先锋,智源研究院聚集了来自高校院所和创新企业的一大批大模型领域卓越学者与工程师,共同致力于推动我国大模型的创新…

提升大模型研究应用技能:第2期前沿讲习班报名,顶尖专家面授,多角度系统培训...

人工智能研究与应用范式正经历一场剧变,越来越多的顶级团队和杰出人才纷纷加入这一变革浪潮。作为AI大模型科研先锋,智源研究院携手一批卓越的学者与工程师,致力于将尖端技术与经验传授给有潜力的学习者,通过高效的学习方式&#…

后端使用phantomjs对页面进行截图

最近碰到这样一些需求,后端需要对某个图表页面进行动态截图,将截图通过邮件发送到指定邮箱进行每日提醒。 这就需要用到无界浏览器进行此类操作。常见的无界浏览器有以下几种,知识来源于chatgpt3.5: Headless Chrome - Google C…

chatgpt赋能python:Python画图空白的解决方法

Python画图空白的解决方法 Python作为一种高效、简洁的编程语言,被广泛应用于数据分析、机器学习、图像处理等领域。其中,常用的Python画图库有matplotlib、seaborn、plotly等。但是,有时候我们会遇到一个奇怪的问题,就是在画图时…

复旦大学郁喆隽:网络制造出人的“幻象”,深度思考如何可能?

“人是什么?”这是亘古以来人们反复追问的一个古老命题。从元宇宙到ChatGPT,这个人人都在讨论、理解和实践互联网的时代,对“人”的自我定义和认知产生了哪些影响?    在3月12日复旦大学-华盛顿大学EMBA项目主办的“复调艺文沙龙”上&am…

用AI智能(DALL.E2)搞一个Logo和绘制坤坤的脚

浅谈ChatGPT和DALL.E2 ChatGPT 最近有个叫chatgpt的玩意老火了,不仅在科技圈刮起一阵骚乱,同时在金融圈也闹的沸沸扬扬,很多板块个股纷纷水涨船高 chatgpt是美国人工智能研究所实验室OpenAi开发的一种全新的聊天机器人模型,当然我…

微软 AI 华人先驱黄学东正式宣布离职,将加入 Zoom 担任 CTO

微软华人 AI 版图上一块不可或缺的拼图,现在也离开了。 作者 | 郭思 编辑 | 陈彩娴 雷峰网独家获悉,微软 AI 华人先驱黄学东近日在社交媒体正式宣布从微软离职,将加入 Zoom 担任 CTO。 上世纪六十年代出生的黄学东是与变化共生、在变化中成长…

马斯克怒了:我要起诉微软!

鱼羊 发自 凹非寺量子位 | 公众号 QbitAI OpenAI还没撕完,马斯克又跟微软杠上了,甚至直接在推特上放话: 我要告微软! 这又是发生了甚么? 原因无它:微软刚刚“封杀”了推特。公告显示,从4月25日&…

生成式AI的价值与机遇,这家云服务商给出了详细解答

从2022年末一直到2023年上半年,许多人亲眼见证了ChatGPT的风靡全球,以及生成式AI与大语言模型的大爆发。 那么对于广大用户来说,生成式AI究竟意味着怎样的机遇?数据在生成式AI应用中扮演着怎样的角色?如何解锁生成式AI…

Mac版R语言入门(三)数据的导入

R语言(三)数据的导入,包括以下几个部分的内容: R语言问题讨论交流,欢迎关注我的新浪微博:Jenny爱学习 1.数据类型介绍 2.数据导入 3.抓取网络数据 一.数据类型 1)Excel、Spreadsheet数据&…

R语言学习笔记——统计结果保存到本地文件(word、txt、csv)

1. 保存为word或txt文件 sink():在代码开始前:sink(“输出文件名.txt”),将结果全部输出到工作文件夹下的名为 "输出文件名.txt" 的文档。这时在R控制台的输出窗口中看不到输出结果,代码结束时用…

R/ggplot2保存图片中文字体至PDF——showtext包一文清除所有障碍

R/ggplot2保存图片中文字体至PDF——showtext包一文清除所有障碍 文章概要1.问题描述2.Showtext包使用流程全注释2.1案例介绍——导入线上的谷歌字体2.2实例测试——导入本地字体,以宋体、新罗马为例 3拓展-新罗马与Serif的不同4.showtextggsave保存图片字体大小设置…

Rstudio读取csv文件

读取csv文件老是失败,就一直在社区找方法,结合了多篇文章,终于成功,我谢 错误类型: 1、Error in file(file, "rt", encoding fileEncoding) : cannot open the connection In addition: Warning message…

利用R处理PDF文件

pdftools pdftools是一个专门用来处理pdf文件的包 pdftools pdf_text() pdf_text()#将pdf每页返回成(return)成一个character vector. > #举个例子 > a <- pdf_text("41375_2012_BFleu2012127_MOESM29_ESM.pdf") > #查看pdf页数 > length(a) [1] 2…

R语言NetCDF格式数据的读写

常用函数&#xff1a; nc_open 打开.nc文档 nc_close 关闭.nc文档 nc_create 新建.nc文档 ncvar_get 读取变量数据 ncatt_get 读取变量属性 ncvar_def 设定变量 ncdim_def 设定维度 ncvar_add 添加变量 ncvar_put 写入变量数据 ncatt_put 写入变量属性 一、读取.nc格…

R语言中的导出为pdf文件或txt文件的注意事项

最近看了下R语言的书&#xff0c;练练手发现一些问题 比如保存图像为pdf文件&#xff0c;我一开始老是显示文件为不含页面&#xff0c;后来才想清楚其中的道理 首先输入 pdf("mypdf.pdf") 然后用source执行一段脚本 source("script2.R") 如果你前面没…

chatgpt赋能Python-pythonmean

Pythonmean: 为什么它是新时代最炙手可热的框架&#xff1f; 什么是Pythonmean&#xff1f; Pythonmean是一个全平台支持的JavaScript全栈框架&#xff0c;其核心框架是AngularJS、Node.js、Express.js和MongoDB的组合。Pythonmean提供了一个快速、统一、易于维护的开发框架&…