前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pandas每天一题-探索分析:找出哪些菜式做成套餐能大卖

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

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

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

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

上期文章:pandas每天一题-题目19:"炸列"操作的多种方式

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

如下数据:

代码语言: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
复制
df.item_name.value_counts().head(8).to_frame('count')

不妨做个柱状图更清晰:

代码语言:javascript
复制
df.item_name.value_counts().head(8).plot.bar()
  • DataFrame.plot.bar() ,行索引作为x轴,列值作为y轴,得到柱状图

横向条形图更适合:

代码语言:javascript
复制
df.item_name.value_counts().head(8).plot.barh()
  • 调用 DataFrame.plot.barh() ,即可改为条形图

点评:

前2名都是鸡肉相关,薯条排第3。挺符合美国人口味

我不确定数据是否来自美国的餐馆


组合品类

单个品类的分析太普通,以至于随便用个 Excel 都能得到分析结果。

而且我们需要分析的是哪些品类经常被人们一起点餐。例如薯条配汽水等。

思路是,先要得到每个订单的品类的所有组合。例如拿开篇举例的订单:

需要得到4个品类去重后(Canned Soft Drink有重复)的3个品类的所有两两组合:

代码语言:javascript
复制
from itertools import combinations
items = [
    'Steak Soft Tacos', 'Barbacoa Soft Tacos', 'Canned Soft Drink',
    'Canned Soft Drink'
]
list(combinations(set(items), 2))

输出:

代码语言:javascript
复制
[('Barbacoa Soft Tacos', 'Canned Soft Drink'),
 ('Barbacoa Soft Tacos', 'Steak Soft Tacos'),
 ('Canned Soft Drink', 'Steak Soft Tacos')]
  • 行6:用 set 去重,然后用 combinations 做组合,参数设置为2,选取2个的所有组合

现在我们对每一组的 order_id 做这个组合:

代码语言:javascript
复制
(
    df.groupby('order_id')['item_name']
        .apply(
            lambda x: list(combinations(set(x), 2))
        )
)

现在一个订单一行,每一行的值是一个列表对象,列表里面放着订单里面所有品类的两两组合。

我们希望每个组合占一行,因为这样子方便后续统计数量。很简单,使用之前讲解过的"炸列"操作:

代码语言:javascript
复制
(
    df.groupby('order_id')['item_name']
        .apply(
            lambda x: list(combinations(set(x), 2))
        )
        .explode()
)

有些订单只有一个品类,不存在两两组合,因此结果为 nan

现在仍然使用之前的套路即可得到结果:

代码语言:javascript
复制
(
    df.groupby('order_id')['item_name']
        .apply(
            lambda x: list(combinations(set(x), 2))
        )
        .explode()
        .value_counts().head(8)
        .plot.barh()
)

点评:

  • 鸡排饭或鸡排玉米饼 ,配薯条+果酱 是最受欢迎
  • 其次是饮料+鸡排饭

只有两两组合可能不够,稍微修改参数即可得到3个品类组合的结果:

代码语言:javascript
复制
(
    df.groupby('order_id')['item_name']
        .apply(
            lambda x: list(combinations(set(x), 3))
        )
        .explode()
        .value_counts().head(8)
        .plot.barh()
)
  • 行3:combinations 的第二个参数设置为3

得到的结果就更加合理了,这里不贴结果图了

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


推荐阅读:

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 单个品类的分析
  • 组合品类
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档