实战项目:餐厅订单数据分析:订单维度和时间维度

餐厅订单数据分析:订单维度和时间维度

1. 针对不同维度进行数据分析:

针对订单order_id:
  • 什么菜最受欢迎
  • 点菜的种类
  • 点菜的数量
  • 消费金额最大
  • 平均消费
针对时间日期进行分析:
  • 点菜量比较集中的时间
  • 哪一天订餐数量最大
  • 星期几就餐人数最多

2. 技术点

  • 导入数据:pd.read_excel()
  • 拼接数据:pd.concat([列1,…],axis=0)
  • 删除空值:data.dropna(axis=1,inplace=True)
  • 分组进行统计(分组求和):.groupby(by=‘str’)
  • 排序,切片Top10
  • 绘制柱状图走势和高度
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']='SimHei'  #设置中文显示

加载数据、数据预处理

# 1.加载数据
data1 = pd.read_excel('./Data/cooking_data1/meal_order_detail.xlsx',sheet_name='meal_order_detail1')
data2 = pd.read_excel('./Data/cooking_data1/meal_order_detail.xlsx',sheet_name='meal_order_detail2')
data3 = pd.read_excel('./Data/cooking_data1/meal_order_detail.xlsx',sheet_name='meal_order_detail3')
# 2.数据预处理(合并数据,NA处理),分析数据
data = pd.concat([data1,data2,data3],axis=0)  #按照行进行拼接数据;列连接axis=1
#data.head(5)
#data.info()
#这里我们需要的数据是:order_id counts  amounts  place_order_time 
#一些空值列需要删除
data.dropna(axis=1,inplace=True)    #按照列删除na列,并且修改源数据
data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 10037 entries, 0 to 3610
Data columns (total 11 columns):
 #   Column            Non-Null Count  Dtype         
---  ------            --------------  -----         
 0   detail_id         10037 non-null  int64         
 1   order_id          10037 non-null  int64         
 2   dishes_id         10037 non-null  int64         
 3   dishes_name       10037 non-null  object        
 4   itemis_add        10037 non-null  int64         
 5   counts            10037 non-null  int64         
 6   amounts           10037 non-null  int64         
 7   place_order_time  10037 non-null  datetime64[ns]
 8   add_inprice       10037 non-null  int64         
 9   picture_file      10037 non-null  object        
 10  emp_id            10037 non-null  int64         
dtypes: datetime64[ns](1), int64(8), object(2)
memory usage: 941.0+ KB
# 统计8月份卖出菜品的平均价格
round(data['amounts'].mean(),2)     #方法一:pandas自带的mean()函数
round(np.mean(data['amounts']),2)   #方法二:numpy函数处理(更快)
44.82

一、订单维度

(1)频数统计:什么菜最受欢迎? (对菜名进行频数统计:value_counts() 计数,取最大的前10名:切片)
dishes_count = data['dishes_name'].value_counts()[:10]
dishes_count
# 3.数据的可视化matplotlib——将菜名作为横轴,销量作为纵轴
dishes_count.plot(kind='line',color=['r'])
dishes_count.plot(kind='bar',fontsize=16,alpha=0.5)               #设置字体大小为16
for x,y in enumerate(dishes_count):
    print(x,y)
    plt.text(x,y+2,y,ha='center',fontsize=12)   #plt.text(位置,高度+偏移量,内容,横轴位置)
0 323
1 269
2 239
3 216
4 189
5 188
6 187
7 186
8 178
9 173

在这里插入图片描述

(2)哪个订单点菜的种类最多(非数量)
# data.groupby(by='order_id').value_counts()            #前面的知识
data_group = data['order_id'].value_counts()
data_group = data['order_id'].value_counts()[:10]        #取前10:订单id 种类数
data_group.plot(kind='bar',fontsize=16,color=['r','m','b','y','g'],alpha=0.5)
plt.title('订单点菜的种类Top10')
plt.xlabel('订单ID',fontsize=16)
plt.ylabel('点菜种类',fontsize=16)
for x,y in enumerate(data_group):
    #print(x,y)
    plt.text(x,y+3,y,ha='center',fontsize=12)
# 8月份餐厅订单点菜种类前10名,平均点菜25个菜品

在这里插入图片描述

(3)哪个订单ID点菜的数量最多Top10 (分组order_id, counts()求和, 排序, 前10) SQL也可
data['total_amounts'] = data['counts']*data['amounts'] #统计单道菜品的消费总额,给表中增加一列total_amounts
dataGroup = data[['order_id','counts','amounts','total_amounts']]    #取出其中四列作为新的表dataGroup
dataGroup = dataGroup.groupby(by='order_id')    #取出含有这四列的表并按order_id分组
Group_sum = dataGroup.sum( )   #分组后的数据表求和 counts、amounts、total_amounts列
sort_counts = Group_sum.sort_values(by='counts',ascending=False)   #按照求和后的counts排序,降序
#sort_counts  #查看数据
#sort_counts['counts']  #查看counts这一列数据(分组#排序后的)
sort_counts_10 = sort_counts['counts'][:10]   #取Top10
sort_counts_10.plot(kind='bar',fontsize=16,color=['g'],alpha=0.6)
plt.title('订单ID点菜数量Top10',fontsize=12)
plt.xlabel('订单ID',fontsize=12)
plt.ylabel('点菜数量',fontsize=12)
for x,y in enumerate(sort_counts_10):
    plt.text(x,y+1,y)
# 八月份订单点菜数量前十名,平均30道菜

在这里插入图片描述

(4)哪个订单ID吃的钱最多、消费最多的ID(排序) Group_sum中已经分组求和了,只需要排序即可
sort_total_amounts = Group_sum.sort_values(by='total_amounts',ascending=False)   #降序
# sort_total_amounts
sort_total_amounts_10 = sort_total_amounts['total_amounts'][:10]
sort_total_amounts_10.plot(kind='bar',fontsize=16,color=['r','g','b'],alpha=0.3)
plt.xlabel('订单ID',fontsize=12)
plt.ylabel('消费金额',fontsize=12)
plt.title('消费金额Top10',fontsize=15)
Text(0.5, 1.0, '消费金额Top10')

在这里插入图片描述

取中间数据,不是Top10,怎么使用索引
# 消费总额排序后,取中间第100到110之间: 
sort_total_amounts_mi=sort_total_amounts['total_amounts'][100:110]
sort_total_amounts_mi
order_id
764     830
846     829
1079    829
1120    827
1125    826
777     824
716     824
833     823
783     823
728     823
Name: total_amounts, dtype: int64
(5)哪个订单ID平均消费最贵 = 消费总额/菜总数量
Group_sum['average'] = Group_sum['total_amounts']/Group_sum['counts']
# Group_sum 现在一共5列,增加了average列  在按照average进行排序,降序
Group_sum.sort_values(by='average',ascending=False)   
sort_average = Group_sum.sort_values(by='average',ascending=False) 
sort_average['average']    #排序后取出average列
sort_average['average'][:10]
sort_average['average'][:10].plot(kind='bar',fontsize=16,color=['r'],alpha=0.3)
plt.title('订单ID每个菜品的平均消费',fontsize=16)
plt.xlabel('订单ID')
plt.ylabel('菜品平均单价')
for x,y in enumerate(sort_average['average'][:10]):
    #print(x,y)
    plt.text(x,y+1,round(y,2),ha='center')
sort_average['average'].plot(kind='bar')
<AxesSubplot:title={'center':'订单ID每个菜品的平均消费'}, xlabel='order_id', ylabel='菜品平均单价'>

在这里插入图片描述

二、时间维度

(1)点菜数和小时关系图:一天当中什么时间段,点菜量比较集中(hour)
data['hourcount'] = 1   #新列,用作计数器
data['time'] = pd.to_datetime(data['place_order_time']) #将时间转换为日期类型存储
data['hour'] = data['time'].map(lambda x: x.hour)
# data   #到这里一共增加了3列数据,计数列hourcount、日期类型time列、时间hour列
gp_by_hour = data.groupby(by='hour').count()['hourcount']
# gp_by_hour
gp_by_hour.plot(kind='bar',fontsize=16,alpha=0.3)
plt.title('下单数与小时的关系图')
plt.xlabel('小时',fontsize=15)
plt.ylabel('点菜数量',fontsize=15)
Text(0, 0.5, '点菜数量')

在这里插入图片描述

(2)哪一天订餐数量最多
data['daycount'] = 1 #新列,计数列
data['day'] = data['time'].map(lambda x:x.day)   #新列,天的表示
# data
gp_by_day = data.groupby(by='day').count()['hourcount']
#gp_by_day
gp_by_day.plot(kind='bar',fontsize=15,color=['r'],alpha=0.3)
plt.xlabel('8月份日期',fontsize=14)
plt.ylabel('点菜数量',fontsize=14)
plt.title('每天的订餐数量',fontsize=14)
Text(0.5, 1.0, '每天的订餐数量')

在这里插入图片描述

(3)星期几人数最多? 订餐数最多? 映射数据到星期
data['weekcount'] = 1
data['weekday'] = data['time'].map(lambda x:x.weekday())
gp_by_weekday = data.groupby(by='weekday').count()['weekcount']
# gp_by_weekday
gp_by_weekday.plot(kind='bar',alpha=0.3)
plt.xlabel('星期')
plt.ylabel('订餐数')
plt.title('点菜数量与星期关系图')
Text(0.5, 1.0, '点菜数量与星期关系图')

在这里插入图片描述

针对不同维度进行数据分析:

针对订单order_id:
  • 什么菜最受欢迎
  • 点菜的种类
  • 点菜的数量
  • 消费金额最大
  • 平均消费
针对时间日期进行分析:
  • 点菜量比较集中的时间
  • 哪一天订餐数量最大
  • 星期几就餐人数最多

技术点

  • 导入数据:pd.read_excel()
  • 拼接数据:pd.concat([列1,…],axis=0)
  • 删除空值:data.dropna(axis=1,inplace=True)
  • 分组进行统计(分组求和):.groupby(by=‘str’)
  • 排序,切片Top10
  • 绘制柱状图走势和高度
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值