利用Python进行市场购物篮分析——入门篇

更多深度文章,请关注:https://yq.aliyun.com/cloud



我们从日常生活中获取数据,大量的商业活动以及社交活动为我们提供了丰富的数据。如何从这些看似无用的数据中提取价值,这对于我们程序猿来说应该是我们的职责所在。今天就让我们用Python来进行市场购物篮的分析。

文中需要用到MLxtend,MLxtend是一个基于Python的开源项目,主要为日常处理数据科学相关的任务提供了一些工具和扩展。项目的Github地址:http://github.com/rasbt/mlxtend。

python分析师可以使用许多数据分析工具,但知道在那些情况下使用那些数据分析工具可能很困难。一种有用的(但却被忽视)的技术称为关联分析,它尝试在大型数据集中查找相关商品之间的关联。一个具体的应用通常称为市场篮子分析。最经典引用的市场篮子分析的例子是所谓的“啤酒和尿布”案例。基本的故事是​​,大型零售商能够挖掘他们的交易数据,并找到一个意想不到的购买啤酒和婴儿尿布的购买模式。

不幸的是,这个故事很可能是一个数据城市传奇。然而,它是挖掘事务数据可以获得的商业价值的示例。

如果你对Python数据科学有一些基本的了解,可能你的第一个倾向就是考虑scikit学习一个现成的算法。然而,scikit-learn不支持这种算法。幸运的是,Sebastian
Raschka 提供了非常有用的具有Apriori算法MLxtend库的,以方便我们进一步分析我们所掌握的数据。

接下来我将演示一个使用此库来分析相对较大的在线零售数据集的示例,并尝试查找有趣的购买组合。在本文结尾处,我希望你能掌握将其应用于你自己的数据集的基本方法。

为什么是关联分析?

在当今的世界,有许多复杂的数据分析方法(聚类,回归,神经网络,随机森林,SVM等)。这些方法中的很多种所面临的挑战在于它们可能难以调整,并需要相当多的数据准备和特征工程才能获得好的结果。换句话说,它们都非常强大,但需要掌握很多知识才能正确实现。

关联分析对数学知识的掌握要求非常低,而且结果易于向非技术人员解释。此外,它是一种无监督的学习工具,可以查找隐藏的模式,因此对数据准备和特征工程的需求有限。对于某些数据探索案例来说,这是一个很好的开始,并且可以发现使用其他方法深入了解数据的方式。

另外一个额外的好处,MLxtend库中的python实现对于非常熟悉scikit-learn 和pandas应该是非常简单的。由于所有这些原因,我认为这是一个有用的工具来帮助你解决数据分析实际问题。

关联分析101

理解关联分析中常用使用的几个术语很重要。在介绍数据挖掘是为那些有兴趣了解这些定义和算法实现的人,让他们对关联分析的数学方法有一个基本的概念。

关联规则通常如下:{Diapers} - > {Beer},这意味着在同一交易中购买尿布的客户之间和购买啤酒之间存在很强的关系。

在上面的例子中,{Diaper}是前提,{Beer}是后果。前提和后果可以包含很多内容,换句话说,就是类似{Diaper,Gum} - > {Beer,Chips}也是一个有效的关联规则。

信心是对关联规则可靠性的度量。上述例子中有0.5的信心意味着在购买了Diaper和Gum的情况下,有50%的可能去购买Beer和Chips。对于产品推荐,50%的置信度可能是完全可以接受的,但在医疗情况下,此级别可能不够高。

如果两个规则是独立的,Lift是观察到的支持与预期的支持的比率(lift解释详见维基百科)。基本的经验法则是Lift接近1表示规则完全独立。Lift>
1通常更“有趣”,可以表示这是有用的规则模式。

最后一个注意事项,与数据有关。此分析要求将交易的所有数据包含在1行中,并且编码方式应为one-hot编码(了解one-Hot编码)。了解MLxtend 的文档对了解如何运用是非常有用:

本文的具体数据来自UCI机器学习存储库,数据代表了2010-2011年英国零售商的交易数据。这主要代表的是批发商的销售数据,所以它与消费者购买模式略有不同,但仍然是一个有用的案例研究。

代码讲解

可以使用pip安装MLxtend,只有安装了MLxtend下面的代码才能真正运行。一旦安装完毕,下面的代码将会开始工作。我已经将源代码上传至Github,以方便你的下载。

获取我们的Pandas和MLxtend代码导入并读取数据:

import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
df=pd.read_excel('http://archive.ics.uci.edu/ml/machine-learning-databases/00352/Online%20Retail.xlsx')
df.head()

我们需要做一点数据处理。首先,一些数据描述中具有需要删除的空格。我们还会删除没有发票编号的行,并删除信用交易(发票编号包含C)。

df['Description'] = df['Description'].str.strip()
df.dropna(axis=0, subset=['InvoiceNo'], inplace=True)
df['InvoiceNo'] = df['InvoiceNo'].astype('str')
df = df[~df['InvoiceNo'].str.contains('C')]

数据清理完成后,我们需要将每个产品进行one-hot编码。为了保持数据集小,我选择只是看法国的销售记录。然而,在下面的其他代码中,我将这些结果与德国的销售进行比较。进一步的国家比较将会是有趣的调查。

basket = (df[df['Country'] =="France"]
          .groupby(['InvoiceNo', 'Description'])['Quantity']
          .sum().unstack().reset_index().fillna(0)
          .set_index('InvoiceNo'))

以下是前几列的样子(注意,我在列中添加了一些数字来说明这个概念,这个例子中的实际数据全是0).

数据中有很多零,但是我们还需要确保将任何正则转换为1,而将0设置为0。此步骤将完成数据的one-hot编码,并删除邮资列:

def encode_units(x):
    if x <= 0:
        return 0
    if x >= 1:
        return 1
basket_sets = basket.applymap(encode_units)
basket_sets.drop('POSTAGE', inplace=True, axis=1)

既然数据的结构是正确,我们可以生成支持至少7%的频繁项目集(选择这个数字,可以帮助我得到更多有用的例子。)

frequent_itemsets = apriori(basket_sets, min_support=0.07, use_colnames=True)

最后一步是产生相应的信心和提升的规则:

rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)
rules.head()

这就是这个项目的一切!

现在,最棘手的部分是弄清楚我们得到的这些结论告诉我们什么了。可能绝大多数程序猿不太关注。例如,我们可以发现很多关联规则具有很高的提升价值,这意味着它的发生频率可能会高于交易和产品组合数量的预期值。这部分分析是行业知识将派上用场的地方。由于我没有,所以我只是想找几个说明性的例子。

我们可以使用标准的pandas code来过滤数据帧。在这种情况下,寻找一个lift(6)和高信度(.8):

rules[ (rules['lift'] >= 6) &
       (rules['confidence'] >= 0.8) ]

在查看规则时,可以发现似乎绿色和红色闹钟是一起购买的,红纸杯,餐巾纸和纸板是以总体概率提高的方式一起购买的。

您可能想要看看有多大的机会可以使用一种产品的受欢迎程度来推动另一种产品的销售。例如,我们可以看到,我们销售340个绿色闹钟,但只有316个红色闹钟,所以也许我们可以通过科学的方法来推动更多的红色闹钟销售。

basket['ALARM CLOCK BAKELIKE GREEN'].sum()
340.0
basket['ALARM CLOCK BAKELIKE RED'].sum()
316.0

我们来看看德国有什么流行的组合呢?

basket2 = (df[df['Country'] =="Germany"]
          .groupby(['InvoiceNo', 'Description'])['Quantity']
          .sum().unstack().reset_index().fillna(0)
          .set_index('InvoiceNo'))
basket_sets2 = basket2.applymap(encode_units)
basket_sets2.drop('POSTAGE', inplace=True, axis=1)
frequent_itemsets2=apriori(basket_sets2,min_support=0.05, use_colnames=True)
rules2= association_rules(frequent_itemsets2, metric="lift", min_threshold=1)
rules2[ (rules2['lift'] >= 4) &
        (rules2['confidence'] >= 0.5)]

似乎除了大卫·哈塞尔夫以外,德国人喜欢锡太太雄和林地动物的Plaster。

在非常认真的情况下,熟悉数据的分析师可能会有十几个不同的问题,即这种类型的分析可以发挥商业价值。我没有将此分析复制到额外的国家或客户组合,但是由于上述基本的pandas代码,整个过程将相对简单。

结论

关联分析有一个非常好的方面是它很容易运行,相对容易解释。如果您没有使用MLxtend和关联分析,则使用基本Excel分析找到这些模式将是非常困难。使用python和MLxtend,分析过程相对简单,如果你了解Python,你可以访问python生态系统中的所有其他可视化技术和数据分析工具。

最后,我建议您查看MLxtend库的其余部分。如果您在使用scikit-learn做工作,可以了解并熟悉MLxtend,以及如何增加数据科学工具包中的一些现有工具。

本文由北邮@爱可可-爱生活老师推荐,@阿里云组织翻译。

文章原标题《Introduction to Market Basket Analysis in Python》,

作者:Chris Moffitt 译者:袁虎 审阅:董昭男

文章为简译,更为详细的内容,请查看原文

时间: 2024-09-22 07:29:44

利用Python进行市场购物篮分析——入门篇的相关文章

市场购物篮分析(规则归纳/C5.0)+apriori

之前介绍了C5.0的内容,今天将描述超市购物篮内容(所购买的全部商品的集合)的虚构数据,以及购买的相关个人数据(通过忠诚卡方案获得).目的是寻找购买相似产品并且可按人口统计学方式(年龄,收入)刻画其特征的客户群. 要做这项工作,要进行两个阶段的工作: 关联规则建模和一个解释所购买商品之间联系的WEB显示: C5.0规则归纳(描绘已标识产品组的购买者的特征) Note:此应用不直接使用预测模型,因此,不对最终模型进行准确性度量,在数据挖掘过程中也不存在与之相关的训练/检验两个步骤的区分. 本例使用

《R语言数据挖掘》——2.2 购物篮分析

本节书摘来自华章出版社<R语言数据挖掘>一书中的第2章,第2.2节,作者[哈萨克斯坦]贝特·麦克哈贝尔(Bater Makhabel),李洪成 许金炜 段力辉 译,更多章节内容可以访问"华章计算机"公众号查看. 2.2 购物篮分析 购物篮分析(Market basket analysis)是用来挖掘消费者已购买的或保存在购物车中物品组合规律的方法.这个概念适用于不同的应用,特别是商店运营.源数据集是一个巨大的数据记录,购物篮分析的目的发现源数据集中不同项之间的关联关系. 2

符号执行:利用Angr进行简单CTF逆向分析

一.符号执行概括 简单的来说,符号执行就是在运行程序时,用符号来替代真实值.符号执行相较于真实值执行的优点在于,当使用真实值执行程序时,我们能够遍历的程序路径只有一条,而使用符号进行执行时,由于符号是可变的,我们就可以利用这一特性,尽可能的将程序的每一条路径遍历,这样的话,必定存在至少一条能够输出正确结果的分支,每一条分支的结果都可以表示为一个离散关系式,使用约束求解引擎即可分析出正确结果,这就是符号执行的简单阐述. Angr是一个利用python开发的二进制程序分析框架,我们可以利用这个工具尝

小白学数据分析之关联分析理论篇

关联分析的学习 在说关联分析之前,先说说自己这段时间的一些感受吧,这段时间相对轻松一些,有一些时间自己自己来学习一些新东西和知识,然而却发现捧着一本数据挖掘理论的书籍在一点一点的研读实在是很漫长,而且看过了没有什么感觉.数据这一行理论很多,算法很多,模型很多,自己现在一直是结合业务来做的数据分析与挖掘,相比电商而言,游戏业做的数据大多很糙,但是仅仅结合业务和运营,更加注重我们客户的质量和维护,当然这不是说电商没做,实际上电商一直在做,然而最近一次经历发现,我们过多的时候去讨论了算法,模型,新理论

小白学数据分析之关联分析算法篇Apriori

早些时候写过关于购物篮分析的文章,其中提到了C5.0和Apriori算法,没有仔细说说这算法的含义,昨天写了一下关联分析的理论部分,今天说说关联分析算法之一的Apriori算法,很多时候大家都说,数据分析师更多的是会用就可以了,不必纠结于那些长篇累牍的理论,其实我觉得还是有点必要的,你未必要去设计算法,但是如果你掌握和熟知一个算法,这对于你如何驾驭和使用这个算法是很有帮助的,此外每个算法都有使用的局限性,比如空间和时间复杂度,使用条件约束.最典型的就是我们难道一份原始数据,然后经过数据处理要进行

利用Python实现简单的相似图片搜索的教程

  利用Python实现简单的相似图片搜索的教程         这篇文章主要介绍了利用Python实现简单的相似图片搜索的教程,文中的示例主要在一个图片指纹数据库中实现,需要的朋友可以参考下 大概五年前吧,我那时还在为一家约会网站做开发工作.他们是早期创业公司,但他们也开始拥有了一些稳定用户量.不像其他约会网站,这家公司向来以洁身自好为主要市场形象.它不是一个供你鬼混的网站--是让你能找到忠实伴侣的地方. 由于投入了数以百万计的风险资本(在US大萧条之前),他们关于真爱并找寻灵魂伴侣的在线广告

仅用PHP4 Session实现的迷你购物篮(二)

session 片段3.创建新的篮子并向其中增加一条项目 <?php // 将项目计数设为1 $ses_basket_items=1; // 填充4个数组的第0个位置,使用从href链接传过来的值 // 链接是在'给你的页面增加链接'部分所讲的 $ses_basket_name[0]=$basket; $ses_basket_amount[0]=1; $ses_basket_price[0]=$price; $ses_basket_id[0]=$id; // 在session中注册新的篮子 se

仅用PHP4 Session实现的迷你购物篮(一)

session 介绍 如果你还没有用PHP 实现你自已的购物篮,在读完这篇文章之后你应该可以创建一个了.甚至你可能已 经有了一个购物篮,我在这里所提供的一些技巧可能会帮助你改善你的系统. 我将给你一些提示,关于如何去做也许才能减少对购物篮表的无限的查询,或减少无限的文本文件填充 你的文件系统,因为应用程序只会做但不会删除它们. 如果你对这类的题目是个新手,不要害怕.它实际上相当简单和有效,你只需要一个支持php4的主机, 象notepad或vi之类的html编辑器,你宝贵的几分种,和这个小例子.

利用Python Paramiko开发linux堡垒机

1.Paramiko模块下的demo.py程序     前面利用Python中的Paramiko模块可以进行SSH的连接,以及用来传送文件(SFTP),但是无论是哪一种方式,连接都是短暂的,并非是长连的,即一次执行一个命令或上传与下载一个文件,显然效率是不如直接使用Linux shell下的ssh连接命令来进行连接.其实在将Paramiko的源码解压出来后,里面有一个demo的文件夹,里面有一个demo.py的程序,利用它,我们就可以进行长连接,即像ssh一样连接远程主机: 1 2 3 4 5