餐厅订单数据分析:订单维度和时间维度
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'
加载数据、数据预处理
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')
data = pd.concat([data1,data2,data3],axis=0)
data.dropna(axis=1,inplace=True)
data.info()
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
round(data['amounts'].mean(),2)
round(np.mean(data['amounts']),2)
44.82
一、订单维度
(1)频数统计:什么菜最受欢迎? (对菜名进行频数统计:value_counts() 计数,取最大的前10名:切片)
dishes_count = data['dishes_name'].value_counts()[:10]
dishes_count
dishes_count.plot(kind='line',color=['r'])
dishes_count.plot(kind='bar',fontsize=16,alpha=0.5)
for x,y in enumerate(dishes_count):
print(x,y)
plt.text(x,y+2,y,ha='center',fontsize=12)
0 323
1 269
2 239
3 216
4 189
5 188
6 187
7 186
8 178
9 173
(2)哪个订单点菜的种类最多(非数量)
data_group = data['order_id'].value_counts()
data_group = data['order_id'].value_counts()[:10]
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):
plt.text(x,y+3,y,ha='center',fontsize=12)
(3)哪个订单ID点菜的数量最多Top10 (分组order_id, counts()求和, 排序, 前10) SQL也可
data['total_amounts'] = data['counts']*data['amounts']
dataGroup = data[['order_id','counts','amounts','total_amounts']]
dataGroup = dataGroup.groupby(by='order_id')
Group_sum = dataGroup.sum( )
sort_counts = Group_sum.sort_values(by='counts',ascending=False)
sort_counts_10 = sort_counts['counts'][:10]
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)
(4)哪个订单ID吃的钱最多、消费最多的ID(排序) Group_sum中已经分组求和了,只需要排序即可
sort_total_amounts = Group_sum.sort_values(by='total_amounts',ascending=False)
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,怎么使用索引
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.sort_values(by='average',ascending=False)
sort_average = Group_sum.sort_values(by='average',ascending=False)
sort_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]):
plt.text(x,y+1,round(y,2),ha='center')
sort_average['average'].plot(kind='bar')
二、时间维度
(1)点菜数和小时关系图:一天当中什么时间段,点菜量比较集中(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',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)
gp_by_day = data.groupby(by='day').count()['hourcount']
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.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
- 绘制柱状图走势和高度