超市月报表关键指标计算
业务背景:
现在有一个超市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 = "分小时客单价")
分小时客单价