前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pandas每天一题-探索分析:找出最受欢迎的二次点餐菜式

pandas每天一题-探索分析:找出最受欢迎的二次点餐菜式

作者头像
咋咋
发布2021-09-01 12:21:04
3360
发布2021-09-01 12:21:04
举报
文章被收录于专栏:数据大宇宙

前面我们一直在讲解 pandas 数据处理的各种知识点,现在开始就应用上这些知识点来探索一下点餐数据。

本系列计划每天更新一期,希望各位小伙伴先自行思考,再查看答案。如果对你有帮助,记得转发推荐给你的好友!

上期文章:pandas每天一题-探索分析:找出哪些菜式做成套餐能大卖

后台回复"数据",可以下载本题数据集

如下数据:

代码语言:javascript
复制
import pandas as pd
import numpy as np
from itertools import combinations

df = pd.read_csv('chipotle.tsv',
                 sep='\t',
                 converters={'item_price': lambda x: float(x[1:-1])})

df

数据描述:

  • 此数据是订单明细表。一个订单会包含很多明细项,表中每个样本(每一行)表示一个明细项
  • order_id 列存在重复
  • item_name 是品类名称,例如"罐装饮料"
  • quantity 是明细项数量
  • item_price 是该明细项的总价钱
  • choice_description 是每一项更详尽的描述,例如:"雪碧"

例如, 某个单子中,客人点餐

  • 牛排玉米饼
  • 烧烤玉米饼
  • 1罐可乐
  • 1罐雪碧

于是产生了4行记录:

前面章节讲解过的知识点,本文不再讲解!

需求:

有一次你巡店,无意间看到某客人喝完了一瓶可乐,意犹未尽,再下单点了一瓶。

由此你突发奇想,有哪些品类最常被二次点餐

说不定能搞一个"二次点餐优惠包",能进一步提升销量

下面是答案了


理解数据

在同一个订单中,重复出现的品类,被视为二次点餐。

就算不看数据,凭感觉应该能想到饮料应该是最常见的二次点餐商品:

代码语言:javascript
复制
def each(xdf):
    return (xdf['choice_description']=='[Coke]').sum()>1

df.groupby('order_id').filter(each)
  • 行4:groupby + filter 可以筛选出符合条件的组。这里的条件我们使用自定义函数编写
  • 行2:找出具体食物是可乐,并且记录数多于1条

你可能觉得是不是这桌是2个人,并且都点了可乐?

如果是这样子,那么应该只有一笔可乐记录,quantity(数量)为2

代码语言:javascript
复制
def each(xdf):
    return (xdf.eval("choice_description=='[Coke]' and quantity>1")).any()

df.groupby('order_id').filter(each)
  • 上图 270 订单,就很可能是3个人来吃饭。其中2个人点了可乐,1个人点了瓶装水

下一节我们将探索就餐人数的问题,这里不展开


品类统计

由于 choice_description 字段有缺失,并且需要很多数据清洗操作才能合理使用。

由此本节我们只对 item_name 做分析。

结合 item_name 与 choice_description 字段做分析更合理

按需求,我们需要每个订单为一组,统计里面的品类频数:

代码语言:javascript
复制
df.groupby('order_id')['item_name'].value_counts()
  • 这里语义很直观,groupby('order_id')['item_name'].value_counts() 能对每个组的 item_name 字段做数量统计
  • 注意此时得到的是一个列数据(Series)

此时我们需要把数量大于1的筛选出来:

代码语言:javascript
复制
ret = df.groupby('order_id')['item_name'].value_counts()
ret[ret>1].to_frame('counts')

也可以这么做:

代码语言:javascript
复制
(
    df.groupby('order_id')['item_name'].value_counts()
    .to_frame('counts')
    .query('counts>1')
)
  • 注意此时结果表只有一列(counts),item_name 是行索引

此时数据的一行表达的是,某品类在某订单中出现二次点餐。

我们只需要进一步对 item_name 再一次统计频数,即可知道哪些品类二次点餐最多:

代码语言:javascript
复制
(
    df.groupby('order_id')['item_name'].value_counts()
    .to_frame('counts')
    .query('counts>1')
    .index.get_level_values('item_name')
    .value_counts()
)
  • 行5:上一步的结果的 item_name 是行索引的一层,由此通过 .index 访问行索引,通过 get_level_values 获取指定层的值
  • 行6:统计数量

你可能觉得我太历害了,竟然知道这种方法名字。

实际上我是记不住这么多方法名字,我只记忆关键词,比如这里是多层索引的层级——level。使用我的小工具:

利用上一节的知识,做一个简单的条形图:

代码语言:javascript
复制
(
    df.groupby('order_id')['item_name'].value_counts()
    .to_frame('counts')
    .query('counts>1')
    .index.get_level_values('item_name')
    .value_counts()
    .head(5).sort_values()
    .plot.barh()
)

这个结果其实很不合理,原因在于我们是用品类进行统计,很多不同的菜式都属于同一个品类。

如果我们使用具体菜式名字进行统计,会得到以下图表:

  • 此时可乐就出现在榜单上。
  • 可以看到未经清洗的数据也有很多不合理的地方。比如第一第二名是差不多的东西,看起来他们是一个套餐(沙拉+米饭+其他菜式)
  • 注意此时的数量就比较合理

这份数据还有更多有趣的探索,下一节继续,记得点赞三连!!!!


推荐阅读:

  1. Python+PowerBI探索分析,看图表,说数据。解析泰坦尼克号中谁能被获救——分析篇
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据大宇宙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 理解数据
  • 品类统计
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档