背景:当评估餐厅经营状况时,数据分析至关重要。如果一家餐厅业绩不佳,首要步骤是收集最新的经营数据,并进行深入分析。通过数据分析,可以准确识别出现的问题,并有针对性地进行商业调整和优化。接下来我们会分析一家餐厅的数据,以期发现并解决当前的经营挑战。
1.认识数据并预处理
如下图所示(该数据为2016年8月某餐厅的一个营业数据,在该份数据中包含三份excel内置表格,其中包括detail_id,order_id,dishes_id等一系列餐厅数据,同时观察表格当中也存在一些空值,所以我们需要对其进行处理)。
对数据进行预处理(代码如下):
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.family']='SimHei' #设置中文字体
%matplotlib inline
#1.加载数据
data1=pd.read_excel('meal_order_detail.xlsx',sheet_name='meal_order_detail1')
data2=pd.read_excel('meal_order_detail.xlsx',sheet_name='meal_order_detail2')
data3=pd.read_excel('meal_order_detail.xlsx',sheet_name='meal_order_detail3')
#2.数据预处理(合并数据,NA等处理),分析数据
data=pd.concat([data1,data2,data3],axis=0) #按照行连接数据
#data.head(5)
#data.info() 查询类型
data.dropna(axis=1,inplace=True) #按列查找,将空列删除,inplace是对原数据进行处理
知识点:
- pd_read_excel :读取 Excel 文件
- pd.concat :数据合并,由于我们在该excel当中内置三份表格,所以我们需要对其进行合并操作
- data.dropna: 表中含有大量的空的数据,需对其进行处理。
2.最受欢迎的菜并可视化分析
代码如下:
#频数统计,什么菜最受欢迎(对菜名进行频数统计,取最大的前10名)
dishes_count=data['dishes_name'].value_counts()[:10]
#dishes_count
#3.数据可视化matplotlib
dishes_count.plot(kind='line',color='red')
dishes_count.plot(kind='bar',fontsize=16)
for x,y in enumerate(dishes_count):
plt.text(x,y+2,y,ha='center',fontsize=12) #第一个x代表绘制的位置,y代表高度,第三个y代表绘制文本
结果如下:
根据结果,我们可以知道该餐厅当中最受欢迎的菜是白饭/大碗,在该月份的订单量中,白饭/大碗竟高达323份左右,也符合人们日常生活的满足需求。
知识点:
enumerate(dishes_count)
返回一个迭代对象,每次迭代会返回一个元组(x, y)
,其中x
是索引,y
是值。plt.text(x, y + 2, str(y), ha='center', fontsize=12)
在位置(x, y + 2)
添加文本y
。这里y + 2
是为了将文本稍微向上移动,以避免与条形图重叠。ha='center'
表示水平居中对齐。
3.订单点菜种类最多并可视化分析(这里我么选择订单点菜种类的top10)
#订单点菜种类最多
data_group=data['order_id'].value_counts()[:10]
data_group.plot(kind='bar',fontsize=16)
data_group.plot(kind='line',color='red')
plt.title('订单点菜种类的Top10')
plt.xlabel('订单ID',fontsize=16)
plt.ylabel('点菜种类',fontsize=16)
for x,y in enumerate(data_group):
plt.text(x,y,y,ha='center',fontsize=12)
结果如下:
根据结果,可知8月份餐厅订单点菜种类的前10名,订单id398的点菜种类最多为36种,总体来看平均点菜25个菜品
4.订单id点菜数量top10
#订单id点菜数量top10(分组order_id,counts求和,排序,前10)
data['total_amounts']=data['counts']*data['amounts'] #统计单道菜消费总额
dataGroup=data[['order_id','counts','amounts','total_amounts']].groupby(by='order_id')
Group_sum=dataGroup.sum() #分组求和
sort_counts=Group_sum.sort_values(by='counts',ascending=False)
sort_counts['counts'][:10].plot(kind='bar',fontsize=16)
plt.title('订单id')
plt.xlabel('点菜数量')
plt.ylabel('订单ID点菜数量top10')
结果如下:
知识点:
- sort_counts['counts'][:10]:对其进行切片操作,取前10个数据
5.那个订单id消费的金额最多
sort_total_amounts=Group_sum.sort_values(by='total_amounts',ascending=False)
sort_total_amounts['total_amounts'][:10].plot(kind='bar')
plt.xlabel('订单ID')
plt.ylabel('消费金额')
plt.title('消费金额前10')
结果如下:
6.那个订单id平均消费最贵
#那个订单id平均消费最贵
Group_sum['average']=Group_sum['total_amounts']/Group_sum['counts']
sort_average=Group_sum.sort_values(by='average',ascending=False)
sort_average['average'][:10].plot(kind='bar')
plt.xlabel('订单id')
plt.ylabel('消费单价')
plt.title('订单消费单价前10')
结果如下:
7.在一天中什么时间段,点菜量比较集中(hour)
#一天中什么时间段,点菜量比较集中(hour)
data['hourcount']=1 #新列,用做计数器
data['time']=pd.to_datetime(data['place_order_time']) #将时间转换成日期类型存储
data['hour']=data['time'].map(lambda x:x.hour)
gp_by_hour=data.groupby(by='hour').count()['hourcount']
gp_by_hour.plot(kind='bar')
plt.xlabel('小时')
plt.ylabel('下单数量')
plt.title('下单量与小时的关系图')
结果如下:
8.那一天的订餐数量最多
#那一天的订餐数量最多
data['daycount']=1 #新列,用做计数器
data['day']=data['time'].map(lambda x:x.day)
gp_by_day=data.groupby(by='day').count()['daycount']
gp_by_day.plot(kind='bar')
plt.xlabel('8月份日期')
plt.ylabel('点菜数量')
plt.title('点菜量与号的关系图')
结果如下:
9.星期几的人数最多,订餐数最多
#星期几的人数最多,订餐数最多,映射数据列到星期
data['weekcount']=1 #新列,用做计数器
data['weekday']=data['time'].map(lambda x:x.weekday())
gp_by_weekday=data.groupby(by='weekday').count()['weekcount']
gp_by_weekday.plot(kind='bar')
plt.xlabel('星期')
plt.ylabel('点菜数量')
plt.title('点菜量与星期的关系图')
结果如下:(这里的0代表星期一,后续依次递增)