一、明确需求和目的
- 对一家全球超市的四年(2011-2014)销售数据进行“人、货、场”分析,并给出提升销量的针对性建议。
- 场:整体运营情况分析,包括销售额、销量、利润、客单价、市场布局等具体情况分析。
- 货:商品结构、优势/爆款商品、劣势/待优化商品等情况分析。
- 人:客户数量、新老客户、RFM模型、复购率、回购率等用户行为分析。
二、数据介绍
- 数据来源于Kaggle平台,这是一份全球大型超市五年的零售数据集,数据详尽。
- 数据集为superstore_dataset2011-2015.csv,共有51290条数据,每条数据共24个特征。
三、数据预处理
3.1 加载相关库和数据集
# 加载数据分析需要的库 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warnings plt.rcParams['font.sans-serif'] = ['SimHei'] # 替换sans-serif字体 plt.rcParams['axes.unicode_minus'] = False # 解决坐标轴负数的负号显示问题 warnings.filterwarnings('ignore') # 抑制第三方警告 # 使用"unicode-escape"编码方式加载数据集 df = pd.read_csv('./superstore_dataset2011-2015.csv', encoding='unicode-escape') df.head()
首先看一下数据集的大小:
df.shape > (51290, 24)
再看一下数据的分布概况:
df.describe()
3.2 列名重命名
从上面展示的数据可以发现其列名不符合Python的命名规范,因此采用下划线命名法对列名进行重命名:
df.rename(columns=lambda x: x.replace(' ', '_').replace('-', '_'), inplace=True) df.columns
3.3 数据类型处理
首先查看各列的数据类型:
df.dtypes
可以看到大部分列的数据类型是object,其中销量(Quantity)、销售额(Sales)、利润(Profit)等为数值型,不需要进行数据类型转换。另外,订单日期(Order_Date)的类型应为datetime,因此需要对其进行转换。
df['Order_Date'] = pd.to_datetime(df['Order_Date']) df['Order_Date'].sample(5)
为了便于分析每年和每月的销售情况,增加“Year”列和“Month”列:
df['Year'] = df['Order_Date'].dt.year df['Month'] = df['Order_Date'].values.astype('datetime64[M]') df[['Year', 'Month']].sample(5)
3.4 缺失值处理
先查看一下数据的缺失情况:
df.isnull().sum(axis=0)
发现“Postal_Code”列的缺失值非常多,该列表示的是邮编信息,显然对我们的分析没有太大作用,因此可直接删除该列。
df.drop(['Postal_Code'], axis=1, inplace=True)
3.5 异常值处理
df.describe()
从上面展示的结果可以确定没有明显的异常值,因此不需要进行处理。
3.6 重复值处理
先查看一下是否有重复值:
df.duplicated().sum() > 0
说明没有重复值,因此不需要进行处理。
四、数据分析
4.1 整体销售情况分析
首先构造整体销售情况的子数据集:
# 包含:订单日期、年份、月份、销售额、销量、利润 sales_data = df[['Order_Date', 'Year', 'Month', 'Sales', 'Quantity', 'Profit']] sales_data.sample(5)
然后按照年份、月份对销售子数据集进行分组求和:
sales_year = sales_data.groupby(['Year', 'Month']).sum() sales_year
接着对以上进行分组求和后的数据进行拆分,将每一年的数据作为独立的表:
year_2011 = sales_year.loc[2011:2011,:].reset_index() year_2012 = sales_year.loc[2012:2012,:].reset_index() year_2013 = sales_year.loc[2013:2013,:].reset_index() year_2014 = sales_year.loc[2014:2014,:].reset_index() year_2014
4.1.1 销售额分析
# 构建销售额表 sales = pd.concat([year_2011['Sales'],year_2012['Sales'], year_2013['Sales'],year_2014['Sales']], axis=1) # 对行名和列名进行重命名 sales.columns = ['Sales_2011', 'Sales_2012', 'Sales_2013', 'Sales_2014'] sales.index = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'] # 添加颜色:颜色越深表示销售额越高 sales.style.background_gradient()
- 从上图可以看出基本上每一年下半年的销售额都比上半年要高,而且随着年份的增大ÿ