Mlxtend (machine learning extensions) is a Python library of useful tools for the day-to-day data science tasks.
mlxtend是一个拓展库,用来
mlxtend官网地址:Welcome to mlxtend's documentation
这次我使用这个主要是用来搞购物篮分析,也就是关联分析,下面我们就来开始入门了
安装
这个之前写了一个,直接参考吧:anaconda安装mlxtend
安装中没什么问题,只是用命令搞一下就好。
频繁项目集
关于这一块儿,官网上有很详细的介绍,可以参考这里:Frequent Itemsets via Apriori Algorithm
频繁项目集,就是我们要在一堆订单中找到经常在一起被购买的商品组合。这也是我们关心的,哪些商品我可以哪来做组合销售,打包售卖,除了主观的判断,从数据上,我们的用户到底喜欢购买哪些?
官方例子中给到的样例数据如下:
dataset = [['Milk', 'Onion', 'Nutmeg', 'Kidney Beans', 'Eggs', 'Yogurt'],
['Dill', 'Onion', 'Nutmeg', 'Kidney Beans', 'Eggs', 'Yogurt'],
['Milk', 'Apple', 'Kidney Beans', 'Eggs'],
['Milk', 'Unicorn', 'Corn', 'Kidney Beans', 'Yogurt'],
['Corn', 'Onion', 'Onion', 'Kidney Beans', 'Ice cream', 'Eggs']]
这就相当于5笔订单,每笔订单中的商品。
一开始,我在这里产生了一个疑问,就是,比如说,同样的商品A、商品B,这样的订单如果有10笔,我该怎样提现出来呢?
我主观的以为之类忽略了订单的数量,只保留了出现过的商品,为此,我困惑了很久,后来在一篇文章中想明白了,后面也会分享。
后面,我们要调用mlxtend提供的方法,也就是传入参数,传入参数需要符合人家的要求,也就是接口规范,我们需要用到
from mlxtend.preprocessing import TransactionEncoder
te = TransactionEncoder()
te_ary = te.fit(dataset).transform(dataset)
te_ary
这里,主要使用了TransactionEncoder的两个方法,一个fit,一个transform
先fit之后,mlxtend就可以知道有多少个唯一值,有了所有的唯一值,就可以转换成one-hot code了
如果要转为0,1形式,也非常方便
te_ary.astype("int")
上面说到的fit函数,它会初始化一个变量“columns_”
最后一步,把数据转换为DataFrame
import pandas as pd
pd.DataFrame(te_ary, columns=te.columns_)
哦,下面才是最后1步,调用数据,输出频繁项目集
from mlxtend.frequent_patterns import apriori
apriori(df, min_support=0.6)
这里输出的是支持度,支持度越高,说明出现的频率越高
这里的项目集显示不太友好,加个参数就好。
apriori(df, min_support=0.6, use_colnames=True)
上面,还有一个 min_support 参数,这是对支持度进行过滤,最小支持度为0.6
频繁项目集,就是如此,一步数据处理,一步接口调用,完事儿。
上面的数据已经出来了,我们排个序看看,顺便人工验证一下
这个Kidney Beans支持度是1.0,也就是100%,说明所有的订单中都包含了这个商品,看一眼,的确是这样的
我们再看一个组合商品的,组合的可能才是我们更关注的
(Eggs,Kidney Beans),支持度0.8,说明有80%的订单都同时购买了这两款商品,再看一眼数据,一共5笔订单,包含这两款商品的订单有4笔,恩就是80%
这里会出现一个问题,就是刚刚提到的,我们想要看组合商品,单个商品的暂时不看,那就需要增加一个字段
frequent_itemsets = apriori(df, min_support=0.6, use_colnames=True)
frequent_itemsets['length'] = frequent_itemsets['itemsets'].apply(lambda x: len(x))
frequent_itemsets
然后,我们只要过滤下就好
frequent_itemsets[frequent_itemsets['length']>1]