揭秘双十一套路——python购物篮分析模型实操!

阿里云2000元红包!本站用户参与享受九折优惠!

最近临近双十一,各大电商的优惠活动看的我心也痒痒了,虽然知道这种促销的节日也是商家的营销策略,但还是打开了某宝逛了逛。不少东西价格还是比平时便宜的,我也陆陆续续加购了一些酒水,香烟、零食、保健品等等,过了一会在首页就看到这个:

淘宝给我推荐凑单产品,有牙膏,牙刷,纸巾之类的,仔细一想,纸巾这类的消耗品反正都是要买,顺便也加购了。

反思我刚才的购物流程,其实这样的商品推荐就是通过消费者购买行为数据,进行购物篮分析之后的得出的。历史上经典的“啤酒和尿布”的故事也是购物篮分析的应用案例之一,购物篮分析的应用不仅仅局限在网络营销,它出现在我们生活的方方面面,平时在app看书的时候,下面也会经常显示,读过次数的人还读过哪些哪些书,这些都是购物篮分析的应用,今天我就给大家讲讲一下购物篮分析模型是如何操作及应用的。(文末有实操案例)

什么是购物篮分析?

购物篮分析的本质其实就是商品间的关联分析,因为最初这种关联分析主要是在超市应用广泛,所以后来被人们称为“购物篮分析”。购物篮分析的目的在于在一个数据集中找出项之间的关联关系。比如,购买鞋的顾客,有10%的可能也会买袜子,60%的买面包的顾客,也会买牛奶。

购物篮分析一般在电商和超市行业应用的比较多,在金融服务业,保险业也有应用,下面我列了几种应用场景给大家参考:

电商:

个性化推荐:像我开头的经历一样,给用户推一些相关商品

组合优惠券:给购买过的用户发相关联商品的优惠券

捆绑销售:将相关联的商品组合起来销售

超市:

商品配置分析:哪些商品可以一起购买,关联商品如何陈列/促销

客户需求分析:分析顾客的购买习惯/顾客购买商品的时间/地点等

销售趋势分析:利用数据仓库对品种和库存的趋势进行分析,选定需要补充的商品,研究顾客购买趋势,分析季节性购买模式,确定降价商品

帮助供应商改进老产品及开发新品:通过购物篮分析,根据客户的需求,开发新的产品/改进老产品及产品包装

金融业/保险业:用购物篮分析设计出一些不寻常的投资或者投保组合。

购物篮分析常用名词及指标

购物篮分析里有三个非常重要的指标:支持度、可信度和提升度

举个例子。假设有10000个订单,其中购买了A产品的订单数是1000单,购买了B产品的订单数是2000单,同时购买了A产品和B产品的订单数是800单。

支持度

简单的字面理解就是支持的程度。在所有的事务中同时出现A和B的概率,即P(AB)。支持度表示了A和B同时出现的频率,如果A和B一起出现的频率非常小,那么就说明了A和B之间的联系并不大;如果一起出现的频率非常频繁,那么A和B总是相关联的知识也许已经成为常识而存在了。所以支持度公示如下:

像上面例子的支持度就是:800/10000*100%=8%。

置信度

置信度也称为可靠度,置信度表示了这条规则有多大程度上值得可信。表示关联规则A–>B中,发生A的前提下也出现了B,其实就是一种条件概率,表达式为:

置信度揭示了B出现时,A是否一定会出现,如果出现则其大概有多大的可能出现。如果置信度为100%, 则说明了B出现时,A一定出现。那么,对这种情况而言,假设A和B是市场上的两种商品,就没有理由不进行捆绑销售了。如果置信度太低,那么就会产生这样的疑问,A和B关系并不大,也许与B关联的并不是A。

提升度

提升度,表示出现A的条件下同时出现B的可能性与没有任何条件下出现B的可能性之比,可用数学表达式表示为:

这个指标是置信度的补充,用来判断A与B之间是不是独立,不独立的话关联性有多强。一般提升度等于1时,表示A与B之间是独立的,即A的出现对B的出现没有派上仍然作用;提升度大于1,且值越大说明A对B的影响越大,关联性也就越强。

用python做一次购物篮分析

一般了解python的人第一个想法就是用scikit-learn完成一个现成的算法。但是scikit-learn不支持这种算法。不过由Sebastian Raschka开发的MLxtend库可以用来提取复杂数据来实现进一步的数据分析,所以本文案例中需要使用到MLxtend。MLxtend是一个基于Python的开源项目,主要为日常处理数据科学相关的任务提供了一些工具和扩展。项目的Github地址:http://github.com/rasbt/mlxtend。

MLxtend可以使用pip安装,在尝试执行以下代码之前需要完成MLxtend的安装

首先导入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’)]

完成之后,我们需要将每个产品进行一位有效编码,将每个项目合并为一个事务。为了使数据集小一些,我只看法国的销售。然而,在下面的其他代码中,我将这些结果与德国的销售进行比较。进一步的与其它国家之间比较将是一件有趣的调查。

basket = (df[df[‘Country’] ==”France”]

          .groupby([‘InvoiceNo’, ‘Description’])[‘Quantity’]

          .sum().unstack().reset_index().fillna(0)

          .set_index(‘InvoiceNo’))

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

数据中有很多零,但是我们需要确保将任何正值转换为1,而将小于0的值设置为0。此步骤将完成数据的一位有效编码,并删除邮资列(因为收费不是我们希望探讨的):

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()

以上就是所有,用apriori表示频繁项目,association_rules构建规则。

现在,棘手的部分是弄清楚这告诉我们什么。例如,我们可以看到有很多规则具有很高的提升度,这意味着它的发生频率要高于交易和产品组合数量的预期值。我们也可以看到几个置信度也很高的地方。这部分分析是专业知识将派上用场的地方,不过我不具备这方面的知识,只是想找几个说明性的例子而已。

我们可以使用标准的pandas代码来过滤数据。在这种情况下,寻找一个大提升度(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)]

似乎除了David Hasselhoff以外,德国人喜欢Plaster和Woodland Animails。

在正规的项目中,熟悉数据的分析师可能会有十几个不同的问题。我没有将此分析复制到其它的国家或客户组合,但是有了上述的基本pandas代码,其他分析过程也很容易完成。

总结

在数据分析领域里有很多复杂的数据分析方法比如:聚类,回归,神经网络,随机森林,SVM等等,这些方法的难点在于它们要相当多的数据准备和功能特性来获得好的结果。换句话说,它们功能很强大,但是学习成本很高。而数据关联分析的数学概念非常容易理解,容易向非技术人员解释。另外,它是一种无监督的学习工具,可以查找出隐藏的模式,所以对数据准备和功能特性的要求很低。对于一些数据探索案例来说,这是一个很好的开始,并且可以使用其他方法深入挖掘数据。

https://www.jianshu.com/p/ee680f7e02fd

Python量化投资网携手4326手游为资深游戏玩家推荐:《《神位纷争》先行试玩与测评

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论