【大数据实训日记】Day12 超市电商数据分析(读取、清洗数据及数据分析)

一、数据源概况:

本案例将对某大型超市的零售数据进行数据分析,通过了
解运营状况,做出合理的决策。详细字段是:
Row ID: 行编号;
Order ID: 订单 ID
Order Date: 订单日期;
Ship Date: 发货日期;
Ship Mode: 发货模式;
Customer ID: 客户 ID
Customer Name: 客户姓名;
Segment: 客户类别;
City: 客户所在城市;
State: 客户城市所在州;
Country: 客户所在国家;
Postal Code: 邮编;
Market: 商店所属区域;
Region: 商店所属州;
Product ID: 产品 ID
Category: 产品类别;
Sub-Category: 产品子类别;
Product Name: 产品名称;
Sales: 销售额;
Quantity: 销售量;
Discount: 折扣;
Profit: 利润;
Shipping Cost: 发货成本;
Order Priority: 订单优先级;

二、读取、清洗数据:

1. 使用 pandas read_csv 读取数据后,查看各列数据的空值情
况,发现 Postal Code 字段(邮编字段)有空值,而且这一
列不重要,所以首先删除掉 Postal Code 列;
2. 使用 DataFrame 对象的 describe() 方法,没有发现异常数
据,所以,不必处理; 3. Order Date 订单日期字段的数据修改为 datetime 类型;
4. 为了后续分析方便,从订单日期中分别提取年、月、季度数
据,并添加三个列用来存取年、月、季度信息,分别
为: ’Order-year’,’Order-month’,’quarter’
# 加载数据分析需要使用的库
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("E:\下载包\项目一:Python超市电商数据分析\market.csv",encoding='ISO-8859-1')
df.head()
#数据大小
df.shape
#数据分布情况
df.describe()
#重命名列名
df.rename(columns = lambda x: x.replace(' ', '_').replace('-', '_'), inplace=True)
#查看缺失值
df.isnull().sum(axis=0)
#删除邮编信息列
df.drop(["Postal_Code"],axis=1, inplace=True)
#异常值处理
df.describe()    #无异常,不需要处理
#重复值处理
df.duplicated().sum()   #无重复值,不需要处理
#异常值处理
#将Order Date订单日期字段的数据修改为datetime类型
df["Order_Date"] = pd.to_datetime(df["Order_Date"])
#新增加年份列和月份列
df['year'] = df['Order_Date'].dt.year
df['month'] = df['Order_Date'].dt.month
df

三、数据分析:

1.利润分析

先根据年和月进行分组,再分别提取各年份( 2011-2014 年)的数据,分析各年份对应月的利润情况。
##利润分析
# 整体销售情况子数据集,包含下单日期、销售额、销量、利润、年份、月份信息
sales_data = df[['Order_Date','Sales','Quantity','Profit','year','month']]
#按照年份、月份对销售子数据集进行分组求和
sales_year = sales_data.groupby(['year','month']).sum()
year_2011 = sales_year.loc[(2011,slice(None)),:].reset_index()
year_2012 = sales_year.loc[(2012,slice(None)),:].reset_index()
year_2013 = sales_year.loc[(2013,slice(None)),:].reset_index()
year_2014 = sales_year.loc[(2014,slice(None)),:].reset_index()
#销售额分析
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=['Jau','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']

# 颜色越深,销售额越高
sales.style.background_gradient()

#构建利润表
profit=pd.concat([year_2011['Profit'],year_2012['Profit'],
                 year_2013['Profit'],year_2014['Profit']],axis=1)
profit.columns=['Profit-2011','Profit-2012','Profit-2013','Profit-2014']
profit.index=['Jau','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']

profit.style.background_gradient()

2.客单价分析

客单价指商场(超市)每一个顾客平均购买商品的金额,客单价反映顾客的购买水平;
客单价=销售额÷成交顾客数
通过计算并展示每年的客单价数据,可以反映每年的顾客购买水平
# 创建一个字典来存储每年的客单价
year_unit_price = {}
for i in range(2011, 2015):
    data = df[df['year'] == i]
    price = data[['Order_Date', 'Customer_ID', 'Sales']]
    #删除重复数据
    price_dr = price.drop_duplicates(subset=['Order_Date', 'Customer_ID'])
    #得到pprice_dr的总行数
    total_num = price_dr.shape[0]   
    unit_price = price['Sales'].sum() / total_num
    year_unit_price[i] = unit_price
    print('{}年总消费次数='.format(i), total_num)
    print('{}年客单价='.format(i), unit_price, '\n')
#展示每年的客单价数据
# 使用matplotlib绘制柱状图展示每年的客单价
plt.figure(figsize=(10, 6))
plt.bar(year_unit_price.keys(), year_unit_price.values(), color='skyblue')
plt.xlabel('Year')
plt.ylabel('客单价')
plt.title('每年客单价分布')
plt.xticks(range(2011, 2015))
plt.show()

3.每年销售额与销售额的增长率分析

通过年份分组,计算每年的销售额总和
销售额增长率 = ( 本年销售额 - 上年销售额 ) / 上年销售额 * 100% = 本年销售额 / 上年销售额 - 1
#计算每年的销售总额及增长率并绘图显示:
sales_sum=sales.sum()
# 计算每年增长率
rise_12=sales_sum[1]/sales_sum[0]-1
rise_13=sales_sum[2]/sales_sum[1]-1
rise_14=sales_sum[3]/sales_sum[2]-1
rise_rate=[0,rise_12,rise_13,rise_14]

fig, ax1 = plt.subplots()
ax1.bar(sales.columns[:], sales_sum.values[:], color='b', alpha=0.6, label='Sales')
ax1.set_xlabel('Year')  
ax1.set_ylabel('Sales', color='b')  
ax1.tick_params(axis='y', labelcolor='b')  
ax2 = ax1.twinx() 
ax2.tick_params(axis='y', labelcolor='r')  
ax2.plot(sales.columns[:], rise_rate[:], marker='o', linestyle='-', color='g') 
ax2.set_ylabel('Growth Rate (%)', color='r')
plt.show

可以看出:该超市在2011-2014年销售额在稳步上升,说明企 业市场占有能力在不断提 高; 2012-2014年的增长率在增长后 趋于平稳,说明企业经营在逐步稳定。

4.分析各个地区分店的销售额

查看不同区域分店的总销售额占比:

#四年来各个地区销售额占总销售额的百分比
Market_Sales = df.groupby(['Market']).agg({'Sales':'sum'})
Market_Sales["percent"] = Market_Sales["Sales"] / df["Sales"].sum()
Market_Sales.style.background_gradient()

#绘制饼状图
labels =['APAC', 'Africa', 'Canada', 'EMEA', 'EU', 'LATAM', 'US']
sizes=[0.28362615, 0.0619951 , 0.0052939 , 0.06376596, 0.23239776,
       0.17121652, 0.18170461]
colors = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet']  
explode = (0,0,0,0,0,0,0) 
plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', startangle=90)
plt.axis('equal')
plt.show

从该饼图可以看出:APACBJ两个地区的销售额比例很高, 总计占51.6%,Canada的销售总额占比最小,只有0.5%,可以增加对该地区的营销。

分别对各个区域每年销售额分析

#分别对各个区域每年销售额分析
Market_Year_Sales = df.groupby(['Market', 'year']).agg({'Sales':'sum'}).reset_index().rename(columns={'Sales':'Sales_amounts'})
Market_Year_Sales.head()
sns.barplot(x='Market', y='Sales_amounts', hue='year', data = Market_Year_Sales)
plt.title('各个区域每年销售额')
plt.show
由上面的条形图可看出,各个地区2011-2014年的销售总 额均是增长趋势, 其中APAC地区和EU地区的增长速度较快,市场前景较好,下一年可以适当 加大运营成本。

分别对各个区域的不同类型产品销售额分析

#分别对各个区域的不同类型产品销售额分析
Category_Sales = df.groupby(['Market','Category']).agg({'Sales':'sum'}).reset_index().rename(columns={'Sales':'Sales_amounts'})
sns.barplot(x='Market', y='Sales_amounts', hue='Category', data = Category_Sales)
plt.title('不同类型产品在不同地区销售额对比')

由上图可看出,除了Canada地区以外,各大地区销售额都比较 高的是电子产品,可 以适当加大对各地区(除Canada地区) 该种类的投入,以便扩大优势。

5.销量分析与销售淡旺季分析

销量分析

通过表格展示, 2011-2014 年各月份的详细销量数据
##销量分析
quantity = pd.concat([year_2011['Quantity'],year_2012['Quantity'],
                      year_2013['Quantity'],year_2014['Quantity']],axis=1)
# 对行名和列名进行重命名
quantity.columns=['Quantity-2011','Quantity-2012','Quantity-2013','Quantity-2014']
quantity.index=['Jau','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
# 颜色越深,销量越高
quantity.style.background_gradient()

淡旺季分析(通过销售额分析)

通过年月销售额的变化趋势分析淡旺季
#销量分析与销售淡旺季分析
sales.plot.area(stacked=False)

由上面的折线图可以看出,该超市2011-2014年每一年的销售 额同比上一年都是上升趋势,而且该超市的旺季是下半年;在 上半年的销售额中发现6月份的销售额较高,可以在6月份开始加大一运营成本;尤其需要注意,下半年的7月份和10月份销售额会有明显下降,可以针对这两个月份举行一些营销活动,以期提高销售额。

6.分析新老客户数

新老客户的定义:将只要消费过的客户定义为老客户,否则就 是新客户
根据 Customer ID 列数据进行重复行的删除, 保证数据集中所有的客户ID 都是唯一的,根据此数据再通过年、月进行分组,通过透视表分析新老客户数
data = df.drop_duplicates(subset=['Customer_ID'])

#根据此数据再通过年、月进行分组,并使用size()函数对每个分组进行计数
new_consumer = data.groupby(by=['year','month']).size()
new_consumer2 = new_consumer.reset_index(level=[0,1])
#通过透视表分析新老客户数
sales_year_month = pd.pivot_table(new_consumer2,index='month',columns='year',values=0)
print(sales_year_month)

由于上述透视表的人数和远远小于总的记录数,说明超市对保持老客户较为有效 ,也间接说明了超市的运营状况较为稳定;还可以发现,2011-2014年每年的新增客户数呈逐年减少的趋势,新客户获取率比较低,因此,可以进行主动推广营销,从而增加新客户数;

7.用户数据分析

客户类型占比分析

绘制饼图查看不同客户的类型占比,其中, 'Segment' 字段代表客户类别
#客户类型占比分析
df["Segment"].value_counts().plot(kind='pie', autopct='%.2f%%', shadow=True, figsize=(14, 6))

可知:Consumer类型的消费者的客户占比最多,达51.7%, Home Office占比最小,可加强对该类型的客户进行营销宣传。

各年不同类型消费者数量分析

#各年不同类型消费者数量分析
Segment_Year = df.groupby(["Segment", 'year']).agg({'Customer_ID':'count'}).reset_index()
sns.barplot(x='Segment', y='Customer_ID', hue='year', data = Segment_Year)
plt.title('各年不同类型消费者数量')
plt.show

由上面可分析出,每种类型的客户数量在逐年增长,说明客户的结构类型趋于良好

 不同类型的客户每年的销售额分析

#不同类型的客户每年的销售额分析
Segment_sales = df.groupby(["Segment", 'year']).agg({'Sales':'sum'}).reset_index()
sns.barplot(x='Segment', y='Sales', hue='year', data = Segment_sales)
plt.title('不同类型的客户每年的销售额')
plt.show

由上面可知,各类型的消费者的销售额在逐步上升,其中以普通消费者的销售额最多, 可能是因为普通消费者最多的缘故
  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值