提升自己,掌握数据分析的能力,最快的方式就是实践!
这里是一个经典的数据分析项目——餐厅订单数据分析,有需要项目配套数据集的可以关注私信我免费获取(●'◡'●)
PS:本文中全部代码都在Jupyter Notebook中编写完成,可以使用Jupyter Notebook或者Jupyter Lab直接运行。
第一步我们要理清数据分析需要做些什么,首先呢是加载数据,然后是数据的预处理 分析数据,最后呢是数据的可视化。
第二步我们要梳理一下获取到的有用信息,列举几个,比如:
1.订单表的长度,shape,columns
......
数据集图例:
然后就是紧张刺激的代码编写环节啦!
数据分析代码展示
一、数据预处理及最受欢迎的菜可视化分析
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt #导入所需软件包
# 1.加载数据(分别获取excel表格三个工作表的数据)
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.数据预处理(合并数据,NA等处理),分析数据
data = pd.concat([data1,data2,data3],axis=0) #按照行进行拼接数据
# data.head(5)
#data.info() #查看数据类型,发现大量空值数据
data.dropna(axis=1,inplace=True) #按列删除na列,并修改原数据
data.info()
# 统计卖出菜品的平均价格
round(data['amounts'].mean(),2) #方法一:pandas自带函数
round(np.mean(data['amounts']),2) #方法二:numpy函数处理
# 频数统计,什么菜最受欢迎 (对菜名进行频数统计,取最大的前十名)
dishes_count = data['dishes_name'].value_counts()[:10]
dishes_count
# 3.数据可视化matplotlib
dishes_count.plot(kind='line',color=['red']) #绘制折线图
dishes_count.plot(kind='bar',fontsize=16) #绘制柱状图
for x,y in enumerate(dishes_count):
print(x,y)
plt.text(x,y+2,y,ha='center',fontsize=12) #在每个柱状图上加对应数字
二、订单消费维度可视化分析
# 订单点菜的种类最多
data_group = data['order_id'].value_counts()[:10]
data_group.plot(kind='bar',fontsize=16)
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+1,y,ha='center',fontsize=12)
# 计算平均值
average_y = np.mean(data_group.values)
print("y的平均值:", average_y)
# 8月份餐厅订单点菜种类前10名,平均点菜27个菜品
#订单ID点菜数量Top10(分组order_id,counts求和,排序,前十)
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')
#8月份订单点菜数量前十名
#消费金额最大的订单有哪些(排序)
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')
#哪个订单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')
#哪个订单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')
average_y = np.mean(sort_average['average'].values) #全部订单的平均消费
print("y的平均值:", average_y)
三、日期与时间维度进行点菜量分析
#一天当中什么时间段点菜量比较集中
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('下单数与小时的关系图')
for x,y in enumerate(gp_by_hour):
plt.text(x,y+1,y,ha='center',fontsize=12)
#哪一天订餐数量最多
data['daycount'] = 1 #新列,用作计数器
data['day'] = data['time'].map(lambda x:x.day) #解析出天
gp_by_day = data.groupby(by='day').count()['daycount'] #按天分组并计数
top_five_days = gp_by_day.sort_values(ascending=False).head(5) #按点菜数量排序并取前五天
top_five_days.plot(kind='bar',color='blue')
plt.xlabel('8月份日期')
plt.ylabel('点菜数量')
plt.title('前五天点菜数量与日期的关系图')
#查看星期几人数最多,订餐数最多,映射数据到星期
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.xticks(range(7),['1','2','3','4','5','6','7']) # 设置 x 轴的刻度位置和标签
plt.xlabel('8月份星期')
plt.ylabel('点菜数量')
plt.title('点菜数量与星期关系图')
OK,我们的代码部分到这里就展示完毕了,那么最后我们简单做个总结,本次餐厅订单数据分析都通过哪些维度去分析思考呢,主要是分为两个维度:
针对订单order_id:
什么菜最受欢迎
点菜的种类
点菜的数量
消费金额最大
平均消费
针对时间日期进行分析:
点菜量比较集中的时间
哪一天订餐量最大
星期几就餐人数最多
最后的最后呢,有想练习的朋友可以找我要数据集亲手实践一下!