超市月報(bào)表關(guān)鍵指標(biāo)計(jì)算
業(yè)務(wù)背景:
現(xiàn)在有一個(gè)超市2017年和2016年1月和4月的經(jīng)營數(shù)據(jù),需要了解2017年4月的營業(yè)情況如何,營業(yè)情況的核心指標(biāo)用銷售額、客流量、客單價(jià)這三個(gè)指標(biāo)來反映,這三個(gè)指標(biāo)將會(huì)直接影響公司的盈利情況。
但是如何去評(píng)判這三個(gè)指標(biāo)的發(fā)展情況呢?我們可以通過對(duì)比來進(jìn)行比較,那么和誰去對(duì)比呢,最先對(duì)比的就是相鄰的時(shí)間段,也就是和上個(gè)月比;再然后就是和相鄰時(shí)間段的同一時(shí)間段,也就是去年的同期做對(duì)比,這樣就可以綜合反映本月各指標(biāo)的發(fā)展情況。
計(jì)算指標(biāo):
1、計(jì)算2017年4月銷售額、客流量、客單價(jià)
2、計(jì)算2017年4月的同比銷售額、客流量、客單價(jià)
3、計(jì)算2017年4月的環(huán)比銷售額、客流量、客單價(jià)
說明:
1、銷售額 = 售價(jià) 乘 銷量 = ["Price"] 乘 ["Qty"]
2、客流量 = 訂單量(客流量用訂單量代替)
3、客單價(jià) = 銷售額/客流量
4、同比是指相鄰時(shí)間段內(nèi)的相同時(shí)間段內(nèi)的數(shù)據(jù)之比,2017年的4月的同比是2016年4月的數(shù)據(jù)
5、環(huán)比是指相鄰時(shí)間段內(nèi)的數(shù)據(jù)之比,2017年4月的環(huán)比是2017年3月的數(shù)據(jù)。(這里沒有2017年3月的數(shù)據(jù),用2017年1月的數(shù)據(jù)代替)。
導(dǎo)入相關(guān)庫
%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from dateutil.parser import parse # 將字符串 轉(zhuǎn)換為日期格式
plt.rcParams["font.sans-serif"]="SimHei" # 解決中文亂碼
plt.rcParams["axes.unicode_minus"]=False # 解決正負(fù)號(hào)無法正確顯示
導(dǎo)入數(shù)據(jù)
data_2017=pd.read_csv(open(r"C:\Python數(shù)據(jù)分析\2017年1月&2017年4月數(shù)據(jù).csv"))
data_2017.head()


data_2016=pd.read_csv(open(r"C:\Python數(shù)據(jù)分析\2016年1月&20164月數(shù)據(jù).csv"))
data_2016.head()


數(shù)據(jù)預(yù)處理
1、去除重復(fù)項(xiàng)

2、時(shí)間處理
目前明細(xì)數(shù)據(jù)中已有的時(shí)間字段是SDate和STime,SDate是非時(shí)間格式,需要將該字段解析為時(shí)間格式,STime是時(shí)間格式,但是該字段是分秒粒度的,我們目前需要月維度的數(shù)據(jù),所以需要將這兩個(gè)字段中其中一個(gè)轉(zhuǎn)化為月維度的數(shù)據(jù),這里選擇將SDate轉(zhuǎn)化為月維度的數(shù)據(jù)。
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年各有兩個(gè)月的數(shù)據(jù),即201601、201604、201701、201704的數(shù)據(jù)

報(bào)表制作
1、本月累計(jì)數(shù)據(jù)計(jì)算
# 篩選出2017年4月數(shù)據(jù)
April_data=data_2017[data_2017['date']>=parse('2017-04-01')]
April_data.head()




2、上月同期計(jì)算
# 篩選出2017年3月數(shù)據(jù)(1月代替3月)
March_data=data_2017[(data_2017["date"]>=parse("2017-01-01"))&(data_2017["date"]<=parse("2017-01-31"))]
March_data.head()




3、去年同期計(jì)算
# 篩選出2016年4月數(shù)據(jù)
last_april=data_2016[data_2016["date"]>=parse("2016-04-01")]
last_april.head()




編寫函數(shù)減少代碼
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)

報(bào)表匯總
data={"本月累計(jì)":[round(sale_sum),round(traffic_sum),round(customer_price)],
"環(huán)比上月":[round(sale_sum3),round(traffic_sum3),round(customer_price3)],
"去年同期":[round(sale_sum_last),round(taffic_sum_last),round(customer_price_last)]}
columns=["本月累計(jì)","環(huán)比上月","去年同期"]
index=["銷售額","客流量","客單價(jià)"]
month_report=pd.DataFrame(data,index=index,columns=columns)
month_report["環(huán)比"]=(month_report["本月累計(jì)"]/month_report["環(huán)比上月"]-1)
month_report["同比"]=(month_report["本月累計(jì)"]/month_report["去年同期"]-1)
month_report[["本月累計(jì)","環(huán)比上月","環(huán)比","去年同期","同比"]]

根據(jù)報(bào)表匯總各項(xiàng)指標(biāo),發(fā)現(xiàn)銷售額、客流量、客單價(jià)環(huán)比和同比均為下降狀態(tài),尤其銷售額環(huán)比下降近35%,客單價(jià)環(huán)比下降28%,可能是由于我們選取的數(shù)據(jù)為1月份數(shù)據(jù),為過年前夕數(shù)據(jù),人們大量采購,有一定失真;但是同比去年4月銷售額下降21%,客流量同比去年4月下降16%,說明2017.4月整體經(jīng)營狀況并不理想,應(yīng)采取措施改善經(jīng)營狀況,比如促銷、或激活沉睡會(huì)員等活動(dòng)。
鑒于4月整體經(jīng)營狀況環(huán)比和同比都為下降狀態(tài),我們需對(duì)4月的各項(xiàng)指標(biāo)進(jìn)行具體分析,找出那些原因造成了這些指標(biāo)變差
我們先從時(shí)間維度進(jìn)行分析,具體計(jì)算指標(biāo)如下:
1.計(jì)算2017年4月每日的銷售額、客流量、客單價(jià),并用圖表形式展現(xiàn)
2.計(jì)算 2017 年 4 月中周一至周日的銷售額、客流量、客單價(jià),并用圖表形式
展現(xiàn)
3.隨機(jī)選取 2017 年 4 月中的一天,計(jì)算一天中不同小時(shí)的銷售額、客流量、
客單價(jià),并用圖表形式展現(xiàn)
分日趨勢(shì)圖
# 篩選出2017年4月數(shù)據(jù)
April_data=data_2017[data_2017['月份']==4]
April_data.head()

# 增加一列銷售額
April_data['銷售額']=April_data['Qty']*April_data['Price']
April_data.head()

sale_sum=April_data.copy().groupby('SDate')['銷售額'].sum()
sale_sum.plot(title='四月銷售額分日趨勢(shì)圖')

通過上圖可以看出在4月9日及4月23日左右為銷售的高點(diǎn),4月19日為銷售的最低點(diǎn);應(yīng)該具體查看什么原因造成了銷售的高點(diǎn)及低點(diǎn),例如:如果為線下門店,是否因?yàn)樘鞖庠?,如為線上門店,是否為網(wǎng)站故障等;同理針對(duì)最高點(diǎn)也需分析原因,是否有促銷活動(dòng)等。
traffic_sum=April_data[['SDate','SheetID']].drop_duplicates().copy().groupby('SDate')['SheetID'].count()
traffic_sum.plot(title='四月客流量分日趨勢(shì)圖')

由圖可以看出,客流量分日趨勢(shì)圖與銷售額分日趨勢(shì)圖基本重合,可以看出是由于客流量低的原因造成了銷售額降低,具體分析造成客流量減少的原因。
customer_price=sale_sum/traffic_sum
customer_price.plot(title='四月客單價(jià)分日趨勢(shì)圖')

由上圖可以看出4月12日客單價(jià)最低,需要結(jié)合業(yè)務(wù)的具體情況分析為什么這天客單價(jià)低,是不是這天有新品上市或者打折促銷活動(dòng)。
分周數(shù)據(jù)
# 增加一列,表示周幾
April_data["week_num"]=[time.weekday()+1 for time in April_data["date"]]
April_data.head()

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 = "分周客單價(jià)")

由上可以看出不論分日還是分周客流量和銷售額趨勢(shì)基本一致,周五的客單價(jià)最低,需要結(jié)合具體業(yè)務(wù)分析情況。
分小時(shí)數(shù)據(jù)
# 隨機(jī)選擇一天進(jìn)行分析
April_day = April_data[April_data["SDate"] == 20170430]
April_day['小時(shí)']=[int(str(time)[11:13]) for time in April_day['STime']]
April_day.head()

day_sale=April_day.groupby('小時(shí)')["銷售額"].sum()
day_sale.plot(title='分小時(shí)銷售額')

traffic_day=April_day[['小時(shí)','SheetID']].groupby('小時(shí)')['SheetID'].count()
traffic_day.plot(title='分小時(shí)客流量')

可以看出一天的銷售高峰時(shí)9點(diǎn)左右,第二個(gè)高峰時(shí)16:00,可以在這兩個(gè)時(shí)間段進(jìn)行一些促銷活動(dòng)。
day_price = day_sale/traffic_day
day_price.plot(title = "分小時(shí)客單價(jià)")
