明确需求和目的
对一家全球超市四年(2011-2014)的销售数据进行 “人、货、场”分析,并给出提升销量的针对性建议。
场:整体运营情况分析,包括销售额、销量、利润、客单价、市场布局等具体情况分析。
货:商品结构、优势/爆款商品、劣势/待优化商品等情况分析。
人:客户数量、新老客户、RFM模型、复购率、回购率等用户行为分析。
数据收集
数据来源为kaggle平台,这是一份全球大型超市四年的零售数据集,数据详尽。
数据集为 “superstore_dataset2011-2015.csv”,共有51290条数据,共24个特征。
数据预处理
1、数据整合
1.1 加载相关库和数据集
使用的库主要有:pandas、numpy、matplotlib、seaborn
使用的数据集: superstore_dataset2011-2015.csv
# 加载数据分析需要使用的库
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']
warnings.filterwarnings('ignore')
# 加载零售数据集,使用'ISO-8859-1'编码方式
df = pd.read_csv('superstore_dataset2011-2015.csv',encoding='ISO-8859-1')
df.head()
1.2 数据概览
首先看一下数据集大小(行列信息):
df.shape
---------------
(51290, 24)
看一下数据概况:
# df.info()
df.describe()
2、数据清洗
2.1 列名重命名
从上面发现列名不符合Python的命名规范,对列名进行一下重命名,采用下划线命名法:
df.rename(columns = lambda x: x.replace(' ', '_').replace('-', '_'), inplace=True)
看一下重命名后的列名:
df.columns
-----------------
Index(['Row_ID', 'Order_ID', 'Order_Date', 'Ship_Date', 'Ship_Mode',
'Customer_ID', 'Customer_Name', 'Segment', 'City', 'State', 'Country',
'Postal_Code', 'Market', 'Region', 'Product_ID', 'Category',
'Sub_Category', 'Product_Name', 'Sales', 'Quantity', 'Discount',
'Profit', 'Shipping_Cost', 'Order_Priority'],
dtype='object')
2.2 数据类型处理
查看一下各个列的数据类型:
df.dtypes
-----------------
Row_ID int64
Order_ID object
Order_Date object
Ship_Date object
Ship_Mode object
Customer_ID object
Customer_Name object
Segment object
City object
State object
Country object
Postal_Code float64
Market object
Region object
Product_ID object
Category object
Sub_Category object
Product_Name object
Sales float64
Quantity int64
Discount float64
Profit float64
Shipping_Cost float64
Order_Priority object
dtype: object
从上面看到,大部分为object类型,销量、销售额、利润等为数值型,不需要进行数据类型处理。下单日期应为datetime类型,需要进行处理。
df["Order_Date"] = pd.to_datetime(df["Order_Date"])
df["Order_Date"].sample(5)
----------------------------------
9319 2013-04-10
30390 2012-03-19
31025 2013-08-19
32210 2014-03-20
43430 2012-11-26
Name: Order_Date, dtype: datetime64[ns]
为了便于分析每年和每月的销售情况,增加年份列和月份列:
df['year'] = df["Order_Date"].dt.year
df['month'] = df['Order_Date'].values.astype('datetime64[M]')
2.3 缺失值处理
查看缺失值情况:
df.isnull().sum(axis=0)
----------------------------
Row_ID 0
Order_ID 0
Order_Date 0
Ship_Date 0
Ship_Mode 0
Customer_ID 0
Customer_Name 0
Segment 0
City 0
State 0
Country 0
Postal_Code 41296
Market 0
Region 0
Product_ID 0
Category 0
Sub_Category 0
Product_Name 0
Sales 0
Quantity 0
Discount 0
Profit 0
Shipping_Cost 0
Order_Priority 0
year 0
month 0
dtype: int64
发现有一列缺失值比较多,此列表示邮编信息,对我们的分析没有太多作用,可直接删除:
df.drop(["Postal_Code"],axis=1, inplace=True)
2.4 异常值处理
简单查看一下是否有异常值:
df.describe()
没发现明显的异常值,不需要进行处理。
2.5 重复值处理
看一下是否有重复值:
df.duplicated().sum()
---------------------
0
也没有重复值,不需要进行处理。
数据分析
1、整体销售情况分析
首先构造整体销售情况的数据集:
# 整体销售情况子数据集,包含下单日期、销售额、销量、利润、年份、月份信息
sales_data = df[['Order_Date','Sales','Quantity','Profit','year','month']]
sales_data.sample(5)
------------------------------
Order_Date Sales Quantity Profit year month
45436 2014-11-27 38.040 2