Skip to main content

moregeek program

超市零售分析_懒笑翻的博客-多极客编程

一、数据描述

数据集中9994条数据,横跨1237天,销售额为2,297,200.8603美元,利润为286,397.0217美元,他们的库存中有1862件独特的物品,它们被分为3类,所有这些物品都在美国4个地区的49个州销售,来着793位客户的5009个订单。

数据集: ​​Superstore.csv​​ 来源:kaggle

一共21列数据,每一列属性描述如下:

Row ID => 每一行唯一的ID.
Order ID => 每个客户的唯一订单ID.
Order Date => 产品的订单日期.
Ship Date => 产品发货日期.
Ship Mode=> 客户指定的发货模式.
Customer ID => 标识每个客户的唯一ID.
Customer Name => 客户的名称.
Segment => The segment where the Customer belongs.
Country => 客户居住的国家.
City => 客户居住的城市.
State => 客户所在的州.
Postal Code => 每个客户的邮政编码.
Region => “客户”所属地区.
Product ID => 产品的唯一ID.
Category => 所订购产品的类别.
Sub-Category => 所订购产品的子类别.
Product Name => 产品名称
Sales =>产品的销售.
Quantity => 产品数量.
Discount => 提供折扣.
Profit => 已发生的利润/亏损.

1、数据概览

9994行,21列数据

print(df.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9994 entries, 0 to 9993
Data columns (total 21 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Row ID 9994 non-null int64
1 Order ID 9994 non-null object
2 Order Date 9994 non-null object
3 Ship Date 9994 non-null object
4 Ship Mode 9994 non-null object
5 Customer ID 9994 non-null object
6 Customer Name 9994 non-null object
7 Segment 9994 non-null object
8 Country 9994 non-null object
9 City 9994 non-null object
10 State 9994 non-null object
11 Postal Code 9994 non-null int64
12 Region 9994 non-null object
13 Product ID 9994 non-null object
14 Category 9994 non-null object
15 Sub-Category 9994 non-null object
16 Product Name 9994 non-null object
17 Sales 9994 non-null float64
18 Quantity 9994 non-null int64
19 Discount 9994 non-null float64
20 Profit 9994 non-null float64
dtypes: float64(3), int64(3), object(15)
memory usage: 1.6+ MB
None

二、问题提出

1、年销售额增长情况

2、年销量增强情况

3、

三、数据预处理

1、列名命名规范化

从数据概览中我们发现有些列有空格或者-,我们换成下划线

df.rename(columns=lambda x: x.replace(' ', '_').replace('-', '_'), inplace=True)  # 列名规范化 重命名
print(df.columns)

重命名后的列名:

Index(['Row_ID', 'Order_ID', 'Order_Date', 'Ship_Date', 'Ship_Mode',
'Customer_ID', 'Customer_Name', 'Segment', 'Country', 'City', 'State',
'Postal_Code', 'Region', 'Product_ID', 'Category', 'Sub_Category',
'Product_Name', 'Sales', 'Quantity', 'Discount', 'Profit'],
dtype='object')
2、数据类型处理

把日期转为日期格式

df['Order_Date'] = pd.to_datetime(df['Order_Date'])
df['Ship_Date'] = pd.to_datetime(df['Ship_Date'])
3、新增列

为便于分析每年和每月的销售情况,增加年份列和月份列

df['year'] = df["Order_Date"].dt.year
df['month'] = df['Order_Date'].values.astype('datetime64[M]')
4、缺失值处理

没有缺失值

print(df.isnull().sum())
Row_ID           0
Order_ID 0
Order_Date 0
Ship_Date 0
Ship_Mode 0
Customer_ID 0
Customer_Name 0
Segment 0
Country 0
City 0
State 0
Postal_Code 0
Region 0
Product_ID 0
Category 0
Sub_Category 0
Product_Name 0
Sales 0
Quantity 0
Discount 0
Profit 0
year 0
month 0
dtype: int64
5、异常值处理

没有发现明显的异常值

print(df.describe())
            Row_ID   Postal_Code  ...       Profit         year
count 9994.000000 9994.000000 ... 9994.000000 9994.000000
mean 4997.500000 55190.379428 ... 28.656896 2015.722233
std 2885.163629 32063.693350 ... 234.260108 1.123555
min 1.000000 1040.000000 ... -6599.978000 2014.000000
25% 2499.250000 23223.000000 ... 1.728750 2015.000000
50% 4997.500000 56430.500000 ... 8.666500 2016.000000
75% 7495.750000 90008.000000 ... 29.364000 2017.000000
max 9994.000000 99301.000000 ... 8399.976000 2017.000000
[8 rows x 7 columns]
6、重复值处理

没有重复值

print(df.duplicated().sum())
0

四、数据可视化

1、构造整体销售情况的数据集

包含:Order_Date Sales Quantity Profit year month

sales_data = df[['Order_Date', 'Sales', 'Quantity', 'Profit', 'year', 'month']]
2、按照年、月进行分组求和
sales_year = sales_data.groupby(['year', 'month']).sum()
3、对分组后数据按年进行拆分
y14 = sales_year.loc[(2014, slice(None)), :].reset_index()
y15 = sales_year.loc[(2015, slice(None)), :].reset_index()
y16 = sales_year.loc[(2016, slice(None)), :].reset_index()
y17 = sales_year.loc[(2017, slice(None)), :].reset_index()
4、销售额分析
4.1 构建销售表
sales = pd.concat([y14['Sales'], y15['Sales'], y16['Sales'], y17['Sales']], axis=1)
4.2 列名 行名 重命名
sales.columns = ['Sales-2011', 'Sales-2012', 'Sales-2013', 'Sales-2014']
sales.index = ['Jau', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
4.3 绘制折线图
x_data = sales.index.astype(str).tolist()
fig = plt.figure() # 生成一个图框,但是这个图框还不能用来画图,画图需要在子图(subplot)或者轴域(Axes)中作图,fig = plt.figure()就是生成了一个画板
ax0 = fig.add_subplot(111) # 添加子图 add_subplot()详解:http://8e9.cn/7fr8f
plt.title('2014-2017年月销售额') # 图表标题
for y in [y14, y15, y16, y17]:
ax0.plot(x_data, y['Sales'], label=y['year'][0])
leg = ax0.legend(loc="upper left", bbox_to_anchor=[0, 1], ncol=2, shadow=True, title="yearSales", fancybox=True)
plt.grid()
plt.savefig(r'.\result\2014_2017年月销售额.png')
plt.show()

上图可以看出,大致情况是每一年下半年销售额比上半年高,并且随着年份的增大,销售额也有明显的增加,说明销售情况良好,发展可观。

4.4 年销售总额
sales_sum = sales.sum()
sales_sum.plot(kind='bar', alpha=0.8)
plt.title('2014-2017年销售总额')
plt.subplots_adjust(bottom=0.2)
plt.grid()
plt.savefig(r'.\result\2014_2017年销售总额.png')
plt.show()
4.5 销售额年增长率
rise_15 = sales_sum[1] / sales_sum[0] - 1
rise_16 = sales_sum[2] / sales_sum[1] - 1
rise_17 = sales_sum[3] / sales_sum[2] - 1
rise_rate = [0, rise_15, rise_16, rise_17]
sales_sum = pd.DataFrame({'sales_sum': sales_sum})
sales_sum['rise_rate'] = rise_rate
sales_sum.to_excel(r'.\result\rise_rate.xlsx')

可以看出,后两年的销售额增长率达到20%以上,发展势头良好,经营在逐步稳定。

5、销量分析
5.1 构建销量表
quantity = pd.concat([y14['Quantity'], y15['Quantity'], y16['Quantity'], y17['Quantity']], axis=1)
5.2 列名 行名 重命名
quantity.columns = ['Quantity-2014', 'Quantity-2015', 'Quantity-2016', 'Quantity-2017']
quantity.index = ['Jau', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
quantity.to_excel(r'.\result\quantity.xlsx')
5.3 绘制折线图
x_data = quantity.index.astype(str).tolist()
fig = plt.figure()
ax0 = fig.add_subplot(111)
plt.title('2014-2017年月销量')
for y in [y14, y15, y16, y17]:
ax0.plot(x_data, y['Quantity'], label=y['year'][0])
leg = ax0.legend(loc="upper left", bbox_to_anchor=[0, 1], ncol=2, shadow=True, title="yearQuantity", fancybox=True)
plt.grid()
plt.savefig(r'.\result\2014_2017年月销量.png')
plt.show()

从上面可以看出,2014-2017年销量变化趋势与销售额类似,下半年销量整体高于上半年,同时2015年之后销量同比上一年均在提高。

5.4 年销量总量
quantity_sum = quantity.sum()
quantity_sum.plot(kind='bar', alpha=0.4)
plt.title("2014-2017年销量总数")
plt.subplots_adjust(bottom=0.3)
plt.grid()
plt.savefig(r'.\result\2014_2017年销量总数.png')
plt.show()
5.5 销量年增长率
rise_15 = quantity_sum[1] / quantity_sum[0] - 1
rise_16 = quantity_sum[2] / quantity_sum[1] - 1
rise_17 = quantity_sum[3] / quantity_sum[2] - 1
rise_rate = [0, rise_15, rise_16, rise_17]
quantity_sum = pd.DataFrame({'quantity_sum': quantity_sum})
quantity_sum['rise_rate'] = rise_rate
quantity_sum.to_excel(r'.\result\quantity_rise_rate.xlsx')

从上面的结果可以看出,每年的销量在逐年增加,说明企业经营状况良好,销量平稳,2016年之后稳定在23%-26%之间,总体销量增长较高。

6、利润分析
6.1 构建利润表
profit = pd.concat([y14['Profit'], y15['Profit'], y16['Profit'], y17['Profit']], axis=1)
6.2 列名 行名 重命名
profit.columns = ['Profit-2014', 'Profit-2015', 'Profit-2016', 'Profit-2017']
profit.index = ['Jau', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
6.3 绘制折线图
x_data = profit.index.astype(str).tolist()
fig = plt.figure()
ax0 = fig.add_subplot(111)
plt.title('2014-2017年利润总额')
for y in [y14, y15, y16, y17]:
ax0.plot(x_data, y['Profit'], label=y['year'][0])
leg = ax0.legend(loc="upper left", bbox_to_anchor=[0, 1], ncol=2, shadow=True, title="yearProfit", fancybox=True)
plt.grid()
plt.savefig(r'.\result\2014_2017年月利润总额.png')
plt.show()
6.4 年利润总额
profit_sum = profit.sum()
profit_sum.plot(kind='bar', alpha=0.5)
plt.title('2014-2017年利润总额')
plt.subplots_adjust(bottom=0.3)
plt.grid()
plt.savefig(r'.\result\2014_2017年利润总额.png')
plt.show()
6.5 年利润率
profit_sum = pd.DataFrame({'profit_sum': profit_sum})
profit_sum["year"] = [2014, 2015, 2016, 2017]

sales_sum = pd.DataFrame({'sales_sum': sales.sum()})
sales_sum["year"] = [2014, 2015, 2016, 2017]

profit_sum = pd.merge(profit_sum, sales_sum)
profit_sum["profit_rate"] = profit_sum["profit_sum"] / profit_sum["sales_sum"]
profit_sum.to_excel(r'.\result\profit_rate.xlsx')

上面的结果可以看出,每年的利润和销售额、销量类似,是在逐年增加的,说明企业经营比较妥善的,利润率总体平稳,稳定在10%-12%之间,总体利润率也还是不错的。

©著作权归作者所有:来自51CTO博客作者lanxiaofang的原创作品,请联系作者获取转载授权,否则将追究法律责任

python自学教程7-字典有哪些常用操作_12178579的博客-多极客编程

Hi,今天我们聊聊字典。正式开始前,先看一个问题。下面的个人信息,如果想使用Python数据类型表示,应该用什么数据类型呢?你会发现,数字、字符串、列表其实表达起来都不是很方便。 字典就比较适合这种场景。python中的字典类型能很方便的表达多维数据。字典类型利用集合元素的不重复特性作为key与对应的值形成键值对。然后因为集合中的元素都是可哈希,非常方便建立哈希表来做索引查询对应的值。Python

python3中的算术运算符_mb6107f4b8c7d14的博客-多极客编程

一·算术运算符在python中,算术运算符与数学中的算术运算极为类似,只是有些运算符号有所差别。算术运算符的算术计算一般是运用于int类型与floa类型,同时+与*还可以运用到各种序列的拼接合并与复制中。优先级:有括号先算括号内的,再乘方>乘除>整除>取余>加减进行运算。运算符名称说明+求和数学里的加法-取差数学里的减法*相乘数学里的乘法/相除数学里的除法%取余得到除法的余

python自学笔记6-列表有哪些常用操作_12178579的博客-多极客编程

列表是Python中最重要的数据类型,它使用的频率非常非常的高,最大程度的发挥Python的灵活性。和字符串一样,列表的操作方法也有很多。如果说一头钻进去,可能会导致学习没有重点。在这篇文章当中,首先九柄会跟大家介绍列表的基础操作,然后我会跟大家去说一些列表这个数据类型常用的实战操作。争取能够对Python列表有一个大概的认识。Python列表定义首先我们来看一下列表的定义。列表通常用来存储多个数

钻石价格分析_懒笑翻的博客-多极客编程

一、数据描述 本文件探讨的数据集是有关钻石各种属性与价格,数据集中有53,943颗钻石,有10个特征(carat, cut, color, clarity, depth, table, price, x, y, z)。数据集: ​​DiamondsPrices2022.csv​​1、数据集中变量特征 总共10个变量,其中3个为Object类型 [cut、 color 和 clarity],1

【python助力疫情管控】太方便啦~从100个不同格式的excel文件里,1秒内找出1个人的详细信息_程序员晚枫的博客-多极客编程

大家好,我是在重庆奋斗的Python程序员晚枫。 最近开源中国的推荐项目,Python自动化办公专用的👉python-office库,更新了一个和疫情管控有关的功能。 今天我们一起来学习一下,1行代码就能解决问题,真的很实用! python-office的项目官网:https://www.python-office.com 0. 功能说明 这次发布的功能,来自核酸检测中,对Excel数据的查

咖啡价格分析_懒笑翻的博客-多极客编程

一、数据概览 咖啡是一种用烘焙过的咖啡豆、咖啡属某些开花植物的浆果种子调制而成的饮料。 从咖啡果实中分离出种子,生产出一种稳定的、未经烘焙的生咖啡。 然后将种子进行烘焙,这一过程将它们转化为一种可消费的产品:焙烤咖啡,将其磨成细颗粒,通常在热水中浸泡,然后过滤,形成一杯咖啡。 咖啡价格数据从2000年1月2022年5月。 在本例中我们使用pandas、pyplot、seaborn进行数据可视

【超详细】apache durid从入门到安装详细教程_博学谷狂野架构师的博客-多极客编程

1. Durid概述Apache Druid是一个集时间序列数据库、数据仓库和全文检索系统特点于一体的分析性数据平台。本文将带你简单了解Druid的特性,使用场景,技术特点和架构。这将有助于你选型数据存储方案,深入了解Druid存储,深入了解时间序列存储等。Apache Druid是一个高性能的实时分析型数据库。1.1 为什么使用1.1.1 云原生数据库一个现代化的云原生,流原生,分析型数据库

python自学教程7-字典有哪些常用操作_12178579的博客-多极客编程

Hi,今天我们聊聊字典。正式开始前,先看一个问题。下面的个人信息,如果想使用Python数据类型表示,应该用什么数据类型呢?你会发现,数字、字符串、列表其实表达起来都不是很方便。 字典就比较适合这种场景。python中的字典类型能很方便的表达多维数据。字典类型利用集合元素的不重复特性作为key与对应的值形成键值对。然后因为集合中的元素都是可哈希,非常方便建立哈希表来做索引查询对应的值。Python

openharmony - arkui(ts)开发之下拉选择菜单_鸿蒙社区的博客-多极客编程

作者:何贝 前言 鸿蒙3.0推出了一种新的开发方式ETS,本文通过采用ETS实现我们项目开发中比较常见的下拉选择菜单组件来初步了解和体验下ETS的开发规范和方法,主要用到的TS知识点有Flex布局、文本展示、样式绑定、图片引入、父子组件变量共享、参数传递、ForEach循环遍历、事件绑定。 实现效果 用到的装饰器 装饰器 装饰内容 说明 @Component struct 结构体在

钻石价格分析_懒笑翻的博客-多极客编程

一、数据描述 本文件探讨的数据集是有关钻石各种属性与价格,数据集中有53,943颗钻石,有10个特征(carat, cut, color, clarity, depth, table, price, x, y, z)。数据集: ​​DiamondsPrices2022.csv​​1、数据集中变量特征 总共10个变量,其中3个为Object类型 [cut、 color 和 clarity],1

算法竞赛入门【码蹄集新手村600题】(mt1101-1150)_灵彧universe的博客-多极客编程

算法竞赛入门【码蹄集新手村600题】(MT1101-1150) @TOC 前言 为什么突然想学算法了? > 用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重要。 在绝大多数的计算机科学分支领域中,要想完成任何实质性的工作,理解算法的基础知识并掌握与算法密切相关的数据结构知识是必不可少的。> 但从实际而言,是因为当下快到了考研和找工作的年纪(ಥ_ಥ),无论走哪一条路

java之stringbuilder和stringbuffer精选_javaarchitecttl的博客-多极客编程

前言: 他强任他强,清风拂山岗.他横任他横,明月照大江我们上一篇聊到了java之String类,这一片我们聊一下StringBuilder和stringbuffer类,针对于以下的概念,都会有实体例子配合着,给大家演示,希望给历险中的你带来一些帮助!!!  一.介绍     StringBuilder类在 Java 5 中被提出,它和StringBuffer 之间的最大不同在于 StringBui