R语言数据挖掘实践——关联分析预测用户购买行为习惯
我们使用R语言挖掘Groceries数据中各商品的购买行为中所隐含的关联性。让我们再学习运用apriori()和eclat()函数的同时,看看能否从数据中发现一些有趣的结论。
探索数据
首先,我们尝试对apriori()函数以最少的限制,来观察它可以反馈给我们哪些信息,再以此决定下一步操作。这里将支持度的最小阈值(minsup)设置为0.001,置信度最小阈值(mincon)设为0.5,其他参数不进行设定取默认值,并将所得关联规则名记为rules0。
> library(arules)
> data("Groceries")
>#生成关联规则rules0
> rules0
Apriori
Parameter specification:
confidence minval smax arem aval originalSupport maxtime support minlen maxlen target ext
0.5 0.1 1 none FALSE TRUE 5 0.001 1 10 rules FALSE
Algorithmic control:
filter tree heap memopt load sort verbose
0.1 TRUE TRUE FALSE TRUE 2 TRUE
Absolute minimum support count: 9
set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[169 item(s), 9835 transaction(s)] done [0.00s].
sorting and recoding items ... [157 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 4 5 6 done [0.02s].
writing ... [5668 rule(s)] done [0.00s].
creating S4 object ... done [0.00s].
以上输出结果中包括指明支持度、置信度最小值的参数详解(parameter specification)部分,记录算法执行过程中相关参数的算法控制(algorithmic control)部分,以及apriori算法的基本信息和执行细节,如:apriori函数的版本、各步骤的程序运行时间等。
>#显示rules0中生成的关联规则条数
> rules0
set of 5668 rules
>#显示rules0中前10条规则
> inspect(rules0[1:10])
lhs rhs support confidence lift
[1] {honey}=> {whole milk} 0.001118454 0.7333333 2.870009
[2] {tidbits}=> {rolls/buns} 0.001220132 0.5217391 2.836542
[3] {cocoa drinks}=> {whole milk} 0.001321810 0.5909091 2.312611
[4] {pudding powder}=> {whole milk} 0.001321810 0.5652174 2.212062
[5] {cooking chocolate}=> {whole milk} 0.001321810 0.5200000 2.035097
[6] {cereals}=> {whole milk} 0.003660397 0.6428571 2.515917
[7] {jam}=> {whole milk} 0.002948653 0.5471698 2.141431
[8] {specialty cheese}=> {other vegetables} 0.004270463 0.5000000 2.584078
[9] {rice}=> {other vegetables} 0.003965430 0.5200000 2.687441
[10] {rice}=> {whole milk} 0.004677173 0.6133333 2.400371
我们可以看到rules0*包含5668条关联规则,可以想象,若将如此大量的关联规则全部输出是没有意义的。并且,仔细观察每条规则,我们发现关联规则的先后顺序与可以表明其关联性强度的三个参数值(support、confidence、lift)的取值大小并没有明显关系。
面对杂乱无章的大量信息,我们无法快速获取如关联性最强的规则等重要信息。因此,可以考虑选择生成其中关联性较强的若干条规则。
对生成规则进行强度控制
最常用的方法即是通过提高支持度或置信度的值来实现这一目的,这往往是一个不断调整的过程。而最终关联规则的规模大小,或者说强度高低,是根据使用者的需要决定的。但需要知道,如果阈值设定较高,容易丢失有用信息,若设定较低,则生成的规则数量将会很大。
一般说来,我们可以选择先不对参数进行设置,直接使用apriori()函数的默认值(支持度为0.1,置信度为0.8)来生成规则,再进一步调整。或者如之前所示,先将阈值设定得很低,再逐步提高阈值,直至达到设想的规则规模或强度。
下面我们来尝试筛选出其中前5条左右的强关联规则,在上面的过程中,我们知道当支持度与置信度分别为0.001和0.5时,可以得到5668条规则,我们以此作为如下一系列参数调整过程的基础。
1.通过支持度、置信度共同控制
首先,我们可以考虑将支持度与置信度两个指标共同提高来实现学历,如下当仅将支持度提高0.004至0.005时,规则数降为120条,进而调整置信度参数至0.64后,仅余下4条规则。另外,在两参数共同调整过程中,如果更注重关联项集在总体中所占的比例,则可以适当地多提高支持度的值;若是更注重规则本身的可靠性,则可多提高一些置信度。
>#将支持度调整为0.005,记为rules1
>rules1
>rules1
set of 120 rules
>#将置信度调整为0.60,记为rules2
>rules2
>rules2
set of 22 rules
>#将置信度调整为0.64,记为rules3
>rules3
>rules3
set of 4 rules
> inspect(rules3)
lhs rhs support confidence lift
[1] {butter,whipped/sour cream}=> {whole milk} 0.006710727 0.6600000 2.583008
[2] {pip fruit,whipped/sour cream}=> {whole milk} 0.005998983 0.6483516 2.537421
[3] {pip fruit,root vegetables,other vegetables}=> {whole milk} 0.005490595 0.6750000 2.641713
[4] {tropical fruit,root vegetables,yogurt}=> {whole milk} 0.005693950 0.7000000 2.739554
2.主要通过支持度控制
另外,也可以采取对其中一个指标给予固定阈值,再按照其他指标来选择前5强的关联规则。比如当我们想要按照支持度来选择,则可以运行如下程序:
>#给定置信度阈值为0.5,按支持度排序,记为rules.sorted_sup
> rules.sorted_sup
>#输出前5条强关联规则
> inspect(rules.sorted_sup[1:5])
lhs rhs support confidence lift
[1] {other vegetables,yogurt}=> {whole milk} 0.02226741 0.5128806 2.007235
[2] {tropical fruit,yogurt}=> {whole milk} 0.01514997 0.5173611 2.024770
[3] {other vegetables,whipped/sour cream}=> {whole milk} 0.01464159 0.5070423 1.984385
[4] {root vegetables,yogurt}=> {whole milk} 0.01453991 0.5629921 2.203354
[5] {pip fruit,other vegetables}=> {whole milk} 0.01352313 0.5175097 2.025351
如上输出结果,5条强关联规则按照支持度从高到低的顺序排列出来。这种控制规则强度的方式可以找出支持度最高的若干条规则。当我们对某一指标要求苛刻时,可以优先考虑该方式,且易于控制输出规则的条数。
3.主要通过置信度控制
我们按照置信度来选出前5条强关联规则,由输出结果得到了5条置信度高达100%的关联规则,比如第一条规则:购买了米和糖的消费者,都购买了全脂牛奶。这就是一条相当有用的关联规则,正如这些食品在超市中往往摆放得很近。
>#给定支持度阈值为0.001,按置信度排序,记为rules.sorted_con
> rules.sorted_con
> #输出前5条强关联规则
> inspect(rules.sorted_con[1:5])
lhs rhs support confidence lift
[1] {rice,sugar}=> {whole milk} 0.001220132 1 3.913649
[2] {canned fish,hygiene articles}=> {whole milk} 0.001118454 1 3.913649
[3] {root vegetables,butter,rice}=> {whole milk} 0.001016777 1 3.913649
[4] {root vegetables,whipped/sour cream,flour}=> {whole milk} 0.001728521 1 3.913649
[5] {butter,soft cheese,domestic eggs}=> {whole milk} 0.001016777 1 3.913649
4.主要通过提升度控制
我们按lift值进行升序排序并输出前5条。
> #给定支持度阈值为0.001,置信度阈值为0.5,按提升度排序,记为rules.sorted_lift
> rules.sorted_lift
> #输出前5条强关联规则
> inspect(rules.sorted_lift[1:5])
lhs rhs support confidence lift
[1] {Instant food products,soda}=> {hamburger meat} 0.001220132 0.6315789 18.99565
[2] {soda,popcorn}=> {salty snack} 0.001220132 0.6315789 16.69779
[3] {flour,baking powder}=> {sugar} 0.001016777 0.5555556 16.40807
[4] {ham,processed cheese}=> {white bread} 0.001931876 0.6333333 15.04549
[5] {whole milk,Instant food products}=> {hamburger meat} 0.001525165 0.5000000 15.03823
提升度可以说是筛选关联规则最可靠的指标。由以上输出结果,我们能够清晰地看到强度最高的关联规则为{即食食品, 苏打水}→{汉堡肉},其后为{苏打水,爆米花}→{垃圾食品}。这是一个符合直观猜想的有趣结果,我们甚至可以想象出,形成如此强关联性的购物行为的消费者是一批辛苦工作一周后去超市大采购,打算周末在家好好放松,吃薯片、泡方便面、喝饮料、看电影的上班族。