一、引言
在之前的文章中,我们介绍了NumPy、Pandas和Matplotlib这三款强大的数据分析工具。今天,我们将通过一个实际项目来帮助大家更好地掌握这些工具。项目名称为《餐厅订单数据分析》。在这个项目中,我们将分析餐厅的订单数据,以获取有关菜品销售、订单趋势和顾客偏好的有价值信息。
二、代码实现
1. 导入所需依赖并设置字体
首先,我们需要导入所需的库,并设置绘图时使用的字体为“黑体”。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 设置字体
%matplotlib inline # 在Jupyter Notebook中显示图形
2. 加载项目数据
接下来,我们将数据从Excel文件中加载到三个DataFrame中,并将它们合并为一个完整的数据集。
# 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. 合并数据
data = pd.concat([data1, data2, data3], axis=0) # 按行拼接数据
data.dropna(axis=1, inplace=True) # 删除含有缺失值的列
data.info() # 显示数据基本信息
输出结果:
<class ‘pandas.core.frame.DataFrame’>
Index: 10037 entries, 0 to 3610
Data columns (total 11 columns):
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: datetime64ns, int64(8), object(2)
memory usage: 941.0+ KB
运行后,我们可以看到数据的基本信息,包括总共10037条记录和11个字段,确保数据完整性。
3. 统计卖出菜品的平均价格
接下来,我们计算所有菜品的平均价格。我们提供了两种方法:使用Pandas和NumPy。
average_price_pandas = round(data["amounts"].mean(), 2) # 方法一:使用Pandas
average_price_numpy = round(np.mean(data["amounts"]), 2) # 方法二:使用NumPy
print(f"平均菜品价格(Pandas): {average_price_pandas}, 平均菜品价格(NumPy): {average_price_numpy}")
输出结果为:
平均菜品价格(Pandas): 44.82, 平均菜品价格(NumPy): 44.82
4. 最受欢迎的菜品
我们可以通过频数统计来找出最受欢迎的菜品,并进行可视化展示。
dishes_count = data['dishes_name'].value_counts()[:10] # 统计前10个菜品
# 数据可视化
dishes_count.plot(kind='bar', fontsize=16)
dishes_count.plot(kind='line', color=['r'])
plt.xticks(rotation=90)
for x, y in enumerate(dishes_count):
plt.text(x, y + 2, y, ha='center') # 绘制文本
plt.title('最受欢迎的菜品')
plt.show()
5. 点菜种类最多的订单
我们接下来分析哪些订单的点菜种类最多,并进行可视化。
data_group = data['order_id'].value_counts()[:10] # 统计前10个订单
data_group.plot(kind='bar', fontsize=16)
plt.xticks(rotation=90)
plt.title('订单点菜种类Top10')
for x, y in enumerate(data_group):
plt.text(x, y + 0.5, y, ha='center') # 绘制文本
plt.xlabel('订单ID')
plt.ylabel('点菜种类')
plt.legend()
plt.show()
6. 订单菜品的平均点菜数量
接下来,我们计算每个订单的菜品总金额,并找出平均点菜数量最多的订单。
data['total_amounts'] = data['counts'] * data['amounts'] # 计算每个订单的总金额
data_group = data[['order_id', 'counts', 'amounts', 'total_amounts']].groupby(by='order_id').sum()
sort_counts = data_group.sort_values(by='counts', ascending=False) # 按点菜数量排序
sort_counts['counts'][:10].plot(kind='bar', fontsize=16)
plt.ylabel('点菜数量')
plt.xlabel('订单ID')
plt.title('点菜数量最多的订单')
plt.show()
7. 付款金额最多的订单
我们接着找出付款金额最多的订单。
sort_total_amounts = data_group.sort_values(by='total_amounts', ascending=False) # 按总金额排序
sort_total_amounts['total_amounts'][:10].plot(kind='bar', fontsize=16)
plt.ylabel('消费金额')
plt.xlabel('订单ID')
plt.title('付款金额最多的订单')
plt.show()
8. 平均消费最贵的订单
我们继续分析平均消费最贵的订单。
data_group['average'] = data_group['total_amounts'] / data_group['counts'] # 计算平均消费
sort_average = data_group.sort_values(by='average', ascending=False)
sort_average['average'][:10].plot(kind='bar', fontsize=16)
plt.title('订单消费单价Top10')
plt.ylabel('平均消费单价')
plt.xlabel('订单ID')
plt.show()
9. 一天中点菜量的集中时间段
我们分析一下在一天中,点菜量集中在什么时间段。
data['hour'] = pd.to_datetime(data['place_order_time']).dt.hour # 提取小时
gp_by_hour = data['hour'].value_counts().sort_index() # 按小时统计
gp_by_hour.plot(kind='bar', fontsize=16)
plt.title('一天中点菜量分布')
plt.xlabel('小时')
plt.ylabel('点菜数量')
plt.show()
10. 哪一天订单数最多
我们接着找出哪一天的订单数最多。
data['day'] = pd.to_datetime(data['place_order_time']).dt.day # 提取日期
gp_by_day = data['day'].value_counts().sort_index() # 按日期统计
gp_by_day.plot(kind='bar', fontsize=16)
plt.title('每日订单数')
plt.xlabel('日期')
plt.ylabel('订单数量')
plt.show()
11. 星期几的订餐数最多
最后,我们分析一下星期几的订餐人数和订餐数。
data['weekday'] = pd.to_datetime(data['place_order_time']).dt.isoweekday() # 提取星期几
gp_by_weekday = data['weekday'].value_counts().sort_index() # 按星期几统计
gp_by_weekday.plot(kind='bar', fontsize=16)
plt.title('每周订餐数')
plt.xlabel('星期几')
plt.ylabel('订餐数量')
plt.show()
三、结语
通过本项目的实战,我们深入了解了如何利用NumPy、Pandas和Matplotlib进行餐厅订单数据的分析。在这个过程中,我们不仅学会了如何加载和清洗数据,还掌握了各种统计分析和数据可视化的方法。这些技能将极大地提升我们在数据分析领域的能力。
希望通过这篇博客,能够激发你对数据分析的兴趣,让我们在数据的海洋中不断探索,发现更多的价值与乐趣!如果你有任何问题或建议,欢迎在评论区留言,我们一起讨论和进步。
标签:plt,10037,numpy,matplotlib,order,订单,counts,data,pandas From: https://blog.csdn.net/2301_82067992/article/details/143800742