0

超市零售分析_懒笑翻的技术博客_51CTO博客

 2 years ago
source link: https://blog.51cto.com/lanxf/5623788
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

超市零售分析

精选 原创

lanxiaofang 2022-08-26 13:56:19 博主文章分类:Python ©著作权

文章标签 数据 重命名 折线图 文章分类 Python 编程语言 指尖人生 阅读数218

一、数据描述

数据集中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、年销量增强情况

三、数据预处理

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())

四、数据可视化

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%之间,总体利润率也还是不错的。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK