Python实现超市关键指标数据分析

超市月报表关键指标计算

业务背景:
现在有一个超市2017年和2016年1月和4月的经营数据,需要了解2017年4月的营业情况如何,营业情况的核心指标用销售额、客流量、客单价这三个指标来反映,这三个指标将会直接影响公司的盈利情况。
但是如何去评判这三个指标的发展情况呢?我们可以通过对比来进行比较,那么和谁去对比呢,最先对比的就是相邻的时间段,也就是和上个月比;再然后就是和相邻时间段的同一时间段,也就是去年的同期做对比,这样就可以综合反映本月各指标的发展情况。
计算指标:
1、计算2017年4月销售额、客流量、客单价
2、计算2017年4月的同比销售额、客流量、客单价
3、计算2017年4月的环比销售额、客流量、客单价
说明:
1、销售额 = 售价 乘 销量 = ["Price"] 乘 ["Qty"]
2、客流量 = 订单量(客流量用订单量代替)
3、客单价 = 销售额/客流量
4、同比是指相邻时间段内的相同时间段内的数据之比,2017年的4月的同比是2016年4月的数据
5、环比是指相邻时间段内的数据之比,2017年4月的环比是2017年3月的数据。(这里没有2017年3月的数据,用2017年1月的数据代替)。

导入相关库

%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from dateutil.parser import parse # 将字符串 转换为日期格式
plt.rcParams["font.sans-serif"]="SimHei" # 解决中文乱码
plt.rcParams["axes.unicode_minus"]=False # 解决正负号无法正确显示

导入数据

data_2017=pd.read_csv(open(r"C:\Python数据分析\2017年1月&2017年4月数据.csv"))
data_2017.head()
2017年前五行数据

2017年数据详情
data_2016=pd.read_csv(open(r"C:\Python数据分析\2016年1月&20164月数据.csv"))
data_2016.head()
2016年前五行数据

2016年数据详情

数据预处理

1、去除重复项


去重

2、时间处理
目前明细数据中已有的时间字段是SDate和STime,SDate是非时间格式,需要将该字段解析为时间格式,STime是时间格式,但是该字段是分秒粒度的,我们目前需要月维度的数据,所以需要将这两个字段中其中一个转化为月维度的数据,这里选择将SDate转化为月维度的数据。

data_2016["date"]=[parse(str(time)) for time in data_2016["SDate"]]
data_2017["date"]=[parse(str(time)) for time in data_2017["SDate"]]
data_2016["月份"]=[time.month for time in data_2016["date"]]
data_2017["月份"]=[time.month for time in data_2017["date"]]

可以看出2017年和2016年各有两个月的数据,即201601、201604、201701、201704的数据


月份

报表制作

1、本月累计数据计算

# 筛选出2017年4月数据
April_data=data_2017[data_2017['date']>=parse('2017-04-01')]
April_data.head()
2017.4数据

2017.4销售额
2017.4客流量

2017.4客单价

2、上月同期计算

# 筛选出2017年3月数据(1月代替3月)
March_data=data_2017[(data_2017["date"]>=parse("2017-01-01"))&(data_2017["date"]<=parse("2017-01-31"))]
March_data.head()
2017.3数据

2017.3销售额

2017.03客流量

2017.3客单价

3、去年同期计算

# 筛选出2016年4月数据
last_april=data_2016[data_2016["date"]>=parse("2016-04-01")]
last_april.head()

2016.4数据

2016.4销售额

2016.4客流量

2016.4客单价

编写函数减少代码

def get_month_data(data):
    sale_sum=(data["Price"]*data["Qty"]).sum()
    traffic_sum=data["SheetID"].drop_duplicates().count()
    customer_price=sale_sum/traffic_sum
    return(sale_sum,traffic_sum,customer_price)
image.png

报表汇总

data={"本月累计":[round(sale_sum),round(traffic_sum),round(customer_price)],
      "环比上月":[round(sale_sum3),round(traffic_sum3),round(customer_price3)],
      "去年同期":[round(sale_sum_last),round(taffic_sum_last),round(customer_price_last)]}
columns=["本月累计","环比上月","去年同期"]
index=["销售额","客流量","客单价"]
month_report=pd.DataFrame(data,index=index,columns=columns)
month_report["环比"]=(month_report["本月累计"]/month_report["环比上月"]-1)
month_report["同比"]=(month_report["本月累计"]/month_report["去年同期"]-1)
month_report[["本月累计","环比上月","环比","去年同期","同比"]]

报表汇总

根据报表汇总各项指标,发现销售额、客流量、客单价环比和同比均为下降状态,尤其销售额环比下降近35%,客单价环比下降28%,可能是由于我们选取的数据为1月份数据,为过年前夕数据,人们大量采购,有一定失真;但是同比去年4月销售额下降21%,客流量同比去年4月下降16%,说明2017.4月整体经营状况并不理想,应采取措施改善经营状况,比如促销、或激活沉睡会员等活动。
鉴于4月整体经营状况环比和同比都为下降状态,我们需对4月的各项指标进行具体分析,找出那些原因造成了这些指标变差
我们先从时间维度进行分析,具体计算指标如下:
1.计算2017年4月每日的销售额、客流量、客单价,并用图表形式展现
2.计算 2017 年 4 月中周一至周日的销售额、客流量、客单价,并用图表形式
展现
3.随机选取 2017 年 4 月中的一天,计算一天中不同小时的销售额、客流量、
客单价,并用图表形式展现

分日趋势图

# 筛选出2017年4月数据
April_data=data_2017[data_2017['月份']==4]
April_data.head()
2017.4数据前五行
# 增加一列销售额
April_data['销售额']=April_data['Qty']*April_data['Price']
April_data.head()
2017.4销售额
sale_sum=April_data.copy().groupby('SDate')['销售额'].sum()
sale_sum.plot(title='四月销售额分日趋势图')
分日趋势图

通过上图可以看出在4月9日及4月23日左右为销售的高点,4月19日为销售的最低点;应该具体查看什么原因造成了销售的高点及低点,例如:如果为线下门店,是否因为天气原因,如为线上门店,是否为网站故障等;同理针对最高点也需分析原因,是否有促销活动等。

traffic_sum=April_data[['SDate','SheetID']].drop_duplicates().copy().groupby('SDate')['SheetID'].count()
traffic_sum.plot(title='四月客流量分日趋势图')
客流量分日趋势图

由图可以看出,客流量分日趋势图与销售额分日趋势图基本重合,可以看出是由于客流量低的原因造成了销售额降低,具体分析造成客流量减少的原因。

customer_price=sale_sum/traffic_sum
customer_price.plot(title='四月客单价分日趋势图')
客单价分日趋势图

由上图可以看出4月12日客单价最低,需要结合业务的具体情况分析为什么这天客单价低,是不是这天有新品上市或者打折促销活动。

分周数据

# 增加一列,表示周几
April_data["week_num"]=[time.weekday()+1 for time in April_data["date"]]
April_data.head()
week_num
week_num=April_data.copy().groupby('week_num')['销售额'].sum()
week_num.plot(kind='bar',title='分周销售额')
分周销售额

由上图可以看出周六、周日的销售额较高

week_traffic=April_data[['SheetID','week_num']].groupby('week_num')['SheetID'].count()
week_traffic.plot(kind='bar',title = "分周客流量")
分周客流量
week_price=week_num/week_traffic
week_price.plot(title = "分周客单价")
分周客单价

由上可以看出不论分日还是分周客流量和销售额趋势基本一致,周五的客单价最低,需要结合具体业务分析情况。

分小时数据

# 随机选择一天进行分析
April_day = April_data[April_data["SDate"] == 20170430]
April_day['小时']=[int(str(time)[11:13]) for time in April_day['STime']]
April_day.head()   
增加小时列
day_sale=April_day.groupby('小时')["销售额"].sum()
day_sale.plot(title='分小时销售额')
分小时销售额
traffic_day=April_day[['小时','SheetID']].groupby('小时')['SheetID'].count()
traffic_day.plot(title='分小时客流量')
分小时客流量

可以看出一天的销售高峰时9点左右,第二个高峰时16:00,可以在这两个时间段进行一些促销活动。

day_price = day_sale/traffic_day
day_price.plot(title = "分小时客单价")
分小时客单价

推荐阅读更多精彩内容