餐厅订单数据分析(源码自用)
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 设置中文
'''
分析可得信息
1.订单表的长度,shape,columns
2.统计菜品的平均价格(amounts)
3.什么菜最受欢迎
4.哪个订单ID点的菜最多
......
'''
# 1 加载数据
data1 = pd.read_excel("meal_order_detail.xls",sheet_name="meal_order_detail1")
data2 = pd.read_excel("meal_order_detail.xls",sheet_name="meal_order_detail2")
data3 = pd.read_excel("meal_order_detail.xls",sheet_name="meal_order_detail3")
# 2 数据预处理(合并数据,NA处理),分析数据
data = pd.concat([data1,data2,data3],axis=0) # 上下拼接
data.dropna(axis=1,inplace=True) # 按列删除na列,并且修改源数据
# 统计8月卖出菜品的平均价格
average1 = round(data['amounts'].mean(),2) # 方法一:pandas自带函数
average2 = round(np.mean(data['amounts']),2) # 方法二:numpy函数处理
# 频数统计,什么菜最受欢迎 (对菜名进行频数统计,取最大前10名)
dishes_count = data['dishes_name'].value_counts()[:10]
'''
# 3 数据可视化matplotlib
dishes_count.plot(kind='line',color='r') #顶部显示折线
dishes_count.plot(kind='bar',fontsize=16)
for x,y in enumerate(dishes_count): #顶部显示数字
plt.text(x,y+2,y,ha='center',fontsize=12)
plt.show()
# 订单点菜的种类最多
data_group = data['order_id'].value_counts()[:10]
data_group.plot(kind='bar',fontsize=16,color=['r','m','b','y','g'])
plt.title('订单点菜的种类Top10')
plt.xlabel('订单ID',fontsize=16)
plt.ylabel('点菜种类',fontsize=16)
plt.show()
# 8月份餐厅订单点菜种类前10名,平均点菜25个菜品
# 订单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.xlabel('订单ID')
plt.ylabel('点菜数量')
plt.title('订单ID点菜数量Top10')
# plt.show()
# 8月份订单点菜数量前10名
# 哪个订单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名')
# plt.show()
# 哪个订单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名')
# plt.show()
# 一天当中什么时间段,点菜量比较集中(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('点菜数与小时的关系图')
# plt.show()
# 8月份哪一天订餐数量最多
data['daycount'] = 1
data['day'] = data['time'].map(lambda x:x.day) # 解析出天
gp_by_day = data.groupby(by='day').count()['daycount']
# rank = gp_by_day.sort_values(ascending=False)[:5]
# rank.plot(kind='bar')
gp_by_day.plot(kind='bar')
plt.xlabel('8月份日期')
plt.ylabel('点菜数量')
plt.title('点菜数量与日期的关系图')
plt.show()
# 拓展:排序,取点菜量最大的前5天(Done)
# 查看星期几人数最多,订餐数最多,映射数据到星期
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('点菜数量与星期的关系图')
plt.show()
'''
'''
不同维度进行数据分析:
针对订单order_id:
什么菜最受欢迎
点菜的种类
点菜的数量
消费金额最大
平均消费
针对时间日期进行分析:
点菜量比较集中的时间
哪一天订餐数量最大
星期几就餐人数最多
技术点:
拼接数据:pd.concat([列1,...])
分组统计(求和)
排序,切片Top10
绘制柱状图走势和高度
'''