一、数据描述

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