Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。
前言
对于python分析师来说有许多数据分析工具,但是知道在特定情况下使用哪个数据分析工具是非常考验人的。一种有用的(但有点被忽视)的技术称为关联分析,它尝试在大型数据集中找到事物的通用运行模式。其中一个具体的应用就是市场篮子分析,其典型案例就是“啤酒和尿布”,基本思路就是大型零售商能够挖掘人们的交易数据,并找到一个意想不到的购买啤酒和婴儿尿布的人的购买模式。
不幸的是,这个案例很可能是数据领域的传奇,然而,它是数据挖掘得到实用的经典说明。虽然这些数据通常用于查看销售交易,不过一些基本的分析也可以应用于其他情况,例如点击流跟踪,备件订购和在线推荐引擎 等。
如果你对Python数据科学世界有一些基本的了解,或许你的第一个想法就是使用scikit-learn完成一个现成的算法。然而,scikit-learn不支持这种算法。不过由Sebastian Raschka开发的MLxtend库可以用于提取复杂数据来实现进一步的数据分析。
本文接下来将演示一个使用此库分析在线零售数据集的示例,并尝试查找有趣的购买组合。读完本文您应该熟悉将其应用于自己的数据集的基本方法。
为什么要进行关联分析?
在当今世界,有许多复杂的数据分析方法(聚类,回归,神经网络,随机森林,SVM等)。这些方法的难点在于它们需要相当多的数据准备和功能特性来获得好的结果。换句话说,它们可以非常强大,但是需要很多知识才能完成。
数据关联分析的数学概念非常容易理解,易于向非技术人员解释。此外,它是一种无监督的学习工具,可以查找出隐藏的模式,因此对数据准备和功能特性的要求很低。对于某些数据探索案例来说,这是一个很好的开始,并且可以使用其他方法深入挖掘数据。
此外,MLxtend中的python代码对于经常接触scikit-learn和pandas的人来说非常容易理解。综上所述,我认为这是一个非常有用的工具用以熟悉并帮助您解决数据分析问题。
一个简单的说法 - 在技术上,市场篮子分析只是一个关联分析的应用,本文将会互换使用关联分析和市场篮子分析这两个术语。
关联分析101
这有几个术语对于理解关联分析很重要。这里的内容对那些想理解背后数学原理及算法细节的人来说是一个很好的参考。
关联规则通常如下:{尿布} - > {啤酒},这代表在同一笔交易中购买尿布的客户和购买啤酒之间存在很强的关系。
在上面的例子中,{尿布}是前提,{啤酒}是结果。前提和后果可以有多个项目。换句话说,{尿布,胶囊} - > {啤酒,芯片}是一个有效的规则。
支持度用以确定规则可以用于给定数据集的频繁程度。在许多情况下,您可能希望寻求高的支持度以确保它是一个有用的关系。但是,在“隐藏”关系中,则可能会出现低支持度的情况。
置信度是对规则可靠性的度量。上述例子中的0.5的置信度意味着在购买了尿布和胶囊的情况下,有50%的可能性购买啤酒和芯片。对于产品推荐来说,50%的置信度可能是完全可以接受的,但在医疗情况下,这还是有点低的。
提升度是两个独立规则下支持度的比率。基本的经验法则是提升度接近1表示规则完全独立。提升度大于 1可以指示出有用的规则模式。
最后一个注意事项与数据有关。此分析要求将交易的所有数据包含在1行中,并且项目应为一位有效编码,具体的可以看MLxtend文档示例:
本文的具体数据来自UCI机器学习存储库,代表了2010-2011年英国零售商的交易数据。这主要代表对批发商的销售,所以它与消费者购买模式略有不同,但这仍然是一个有用的案例研究。
代码
MLxtend可以使用pip安装,在尝试执行以下代码之前需要完成MLxtend的安装。一旦安装完毕,下面的代码显示了如何让它运行。我已经记录下详细的过程。
首先导入pandas和MLxtend并读取数据:
开始之前先做一些处理。删掉一些描述用的空格和没有发票编号的行,并删除信用交易(发票编号包含C)。
完成之后,我们需要将每个产品进行一位有效编码,将每个项目合并为一个事务。为了使数据集小一些,我只看法国的销售。然而,在下面的其他代码中,我将这些结果与德国的销售进行比较。进一步的与其它国家之间比较将是一件有趣的调查。
以下是前几列的样子(注意,我在列中添加了一些数字来说明这个概念 - 这个例子中的实际数据全是0):
数据中有很多零,但是我们需要确保将任何正值转换为1,而将小于0的值设置为0。此步骤将完成数据的一位有效编码,并删除邮资列(因为收费不是我们希望探讨的):
现在数据结构正确,我们可以生成支持至少7%的频繁项目集(使用这个数字以便我可以得到足够的实例):
最后一步是生成相应的支持度,置信度和提升度规则。
以上就是所有,用apriori表示频繁项目,association_rules构建规则。
现在,棘手的部分是弄清楚这告诉我们什么。例如,我们可以看到有很多规则具有很高的提升度,这意味着它的发生频率要高于交易和产品组合数量的预期值。我们也可以看到几个置信度也很高的地方。这部分分析是专业知识将派上用场的地方,不过我不具备这方面的知识,只是想找几个说明性的例子而已。
我们可以使用标准的pandas代码来过滤数据。在这种情况下,寻找一个大提升度(6)和高置信度(.8):
在查看规则时,似乎绿色和红色闹钟是一起购买的,红纸杯,餐巾纸和纸板是以总体概率提高的方式一起购买的。
这时,你可能想知道,我们有多少机会可以通过推荐关联商品来促进商品的销售。例如,我们可以看到,销售340个绿色闹钟,但只有316个红色闹钟,所以也许我们可以通过推荐带动更多的红色闹钟的销售?
有趣的是国家的变化会影响购买组合,我们来看看德国有什么流行的组合呢?
似乎除了David Hasselhoff以外,德国人喜欢Plaster和Woodland Animails。
在正规的项目中,熟悉数据的分析师可能会有十几个不同的问题。我没有将此分析复制到其它的国家或客户组合,但是有了上述的基本pandas代码,其他分析过程也很容易完成。
总结
关联分析非常好的一方面是它很容易运行,相对容易解释。如果您无法实现MLxtend和关联分析,则使用基本Excel分析找到这些模式将非常困难。使用python和MLxtend,分析过程相对简单,在Python中,您可以访问python生态系统中的所有其他可视化技术和数据分析工具。
最后,我建议您查看MLxtend库的其余部分。如果您在做关于sci-kit的工作,可以了解如何熟悉MLxtend,以及如何增加数据科学工具包中的一些现有工具。
英文原文:http://pbpython.com/market-basket-analysis.html
译者:Mr Chen