基于numpy、pandas、matplotlib的数据分析项目详解(超详细版)

421 阅读5分钟

一、引言

在之前的文章中,我们介绍了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进行餐厅订单数据的分析。在这个过程中,我们不仅学会了如何加载和清洗数据,还掌握了各种统计分析和数据可视化的方法。这些技能将极大地提升我们在数据分析领域的能力。

希望通过这篇博客,能够激发你对数据分析的兴趣,让我们在数据的海洋中不断探索,发现更多的价值与乐趣!如果你有任何问题或建议,欢迎在评论区留言,我们一起讨论和进步。