关联分析:R与SAS的比较

标签: 统计之都 | 发表时间:2013-02-17 20:10 | 作者:高 燕
出处:http://cos.name

啤酒和尿布的故事是关联分析方法最经典的案例,而用于关联分析的Apriori算法更是十大数据挖掘算法之一( http://www.cs.uvm.edu/~icdm/algorithms/index.shtml,这个排名虽然是几年前的调查结果,但是其重要性仍可见一斑)。本文以《 R and Data Mining》书中使用的泰坦尼克号人员的生存数据为例,介绍如何使用R和SAS的Apriori算法进行关联分析,比较两者的建模结果并对结果中存在的差异进行解释分析。

一、关联分析

网上有很多资料介绍关联分析算法,本文就不再赘述。我自己看的是《Introduction to Data Mining》(有对应的中文版,人民邮电出版社的《 数据挖掘导论》),愿意看英文的同学可以访问: http://www-users.cs.umn.edu/~kumar/dmbook/ch6. pdf。网上其他的资料我也大致翻过,对比之后感觉这本书是一本相当不错的教材,算法方面介绍地比较全面且有一定深度。我本人不建议大家去看那些非专业人士总结的关联分析算法介绍,虽然浅显易懂,但是内容片面,容易误导初学者,错把树木当成了森林。

对于关联分析在行业应用中的经验分享、初学者的误区和最佳实践方面的资料很少,唯一能找到的一本好书是清华大学出版社的《 啤酒与尿布》,主要介绍购物篮分析在零售行业的应用。我始终认为分析师除了算法和软件,还需要了解行业背景,不然挖出的只是模式,而不是切实可行并且能带来商业价值的模式,甚至还有可能是错误的模式。 

二、软件

我只用过R和SAS,其他的软件没碰过,所以只能对这两个软件进行比较。

算法 R/ARULES SAS/EM
Apriori Yes Yes
ECLAT Yes No
FP-Growth No No

据网友说Excel也能做关联分析,但是因为其对数据进行了抽样,所以每次运行的结果都不一样。SPSS的Modeler不知道怎么样,有用过的同学请分享一下经验,最好使用泰坦尼克号的数据进行分析,这样可以比较一下各软件的结果是否相同。

三、R的代码和结果

R的代码主要来自《 R and Data Mining》,我只加了下载数据的代码和对代码的中文说明。

1)下载泰坦尼克数据

setInternet2(TRUE)
con <- url(“ http://www.rdatamining.com/data/titanic.raw.rdata“)
load(con)
close(con) # url() always opens the connection
str(titanic.raw)

2)关联分析

library(arules)
# find association rules with default settings
rules <- apriori(titanic.raw)
inspect(rules)

3)只保留结果中包含生存变量的关联规则

# rules with rhs containing “Survived” only
rules <- apriori(titanic.raw, parameter = list(minlen=2, supp=0.005, conf=0.8), appearance = list(rhs=c(“Survived=No”, “Survived=Yes”), default=”lhs”),control = list(verbose=F))
rules.sorted <- sort(rules, by=”lift”)
inspect(rules.sorted)

R 总共生成了12条跟人员生存相关的规则:
lhs       rhs      support      confidence      lift
1 {Class=2nd, Age=Child}                         => {Survived=Yes}
0.010904134 1.0000000 3.095640
2 {Class=2nd, Sex=Female, Age=Child}  => {Survived=Yes}
0.005906406 1.0000000 3.095640
3 {Class=1st, Sex=Female}                      => {Survived=Yes}
0.064061790 0.9724138 3.010243
4 {Class=1st, Sex=Female, Age=Adult}    => {Survived=Yes}
0.063607451 0.9722222 3.009650
5 {Class=2nd, Sex=Male, Age=Adult}        => {Survived=No}
0.069968196 0.9166667 1.354083
6 {Class=2nd, Sex=Female}                      => {Survived=Yes}
0.042253521 0.8773585 2.715986
7 {Class=Crew, Sex=Female}                   => {Survived=Yes}
0.009086779 0.8695652 2.691861
8 {Class=Crew, Sex=Female, Age=Adult} => {Survived=Yes}
0.009086779 0.8695652 2.691861
9 {Class=2nd, Sex=Male}                           => {Survived=No}
0.069968196 0.8603352 1.270871
10 {Class=2nd, Sex=Female, Age=Adult}  => {Survived=Yes}
0.036347115 0.8602151 2.662916
11 {Class=3rd, Sex=Male, Age=Adult}       => {Survived=No}
0.175829169 0.8376623 1.237379
12 {Class=3rd, Sex=Male}                          => {Survived=No}
0.191731031 0.8274510 1.222295

4)去除冗余的规则

# find redundant rules
subset.matrix <- is.subset(rules.sorted, rules.sorted)
subset.matrix[lower.tri(subset.matrix, diag=T)] <- NA
redundant <- colSums(subset.matrix, na.rm=T) >= 1
which(redundant)

# remove redundant rules
rules.pruned <- rules.sorted[!redundant]
inspect(rules.pruned)

去除冗余的规则后剩下8条规则:
lhs       rhs      support      confidence      lift
1 {Class=2nd, Age=Child}                   => {Survived=Yes}
0.010904134  1.0000000 3.095640
2 {Class=1st, Sex=Female}                => {Survived=Yes}
0.064061790  0.9724138 3.010243
3 {Class=2nd, Sex=Female}               => {Survived=Yes}
0.042253521  0.8773585 2.715986
4 {Class=Crew, Sex=Female}            => {Survived=Yes}
0.009086779  0.8695652 2.691861
5 {Class=2nd, Sex=Male, Age=Adult} => {Survived=No}
0.069968196  0.9166667 1.354083
6 {Class=2nd, Sex=Male}                   => {Survived=No}
0.069968196  0.8603352 1.270871
7 {Class=3rd, Sex=Male, Age=Adult}  => {Survived=No}
0.175829169  0.8376623 1.237379
8 {Class=3rd, Sex=Male}                    => {Survived=No}
0.191731031  0.8274510 1.222295

5)结果的解释

对于结果的解释,一定要慎重,千万不要盲目下结论。从下面的四条规则看,好像确实像电影中描述的那样:妇女和儿童优先。

1 {Class=2nd, Age=Child}              => {Survived=Yes} 0.010904134  1.0000000 3.095640
2 {Class=1st, Sex=Female}           => {Survived=Yes} 0.064061790  0.9724138 3.010243
3 {Class=2nd, Sex=Female}          => {Survived=Yes} 0.042253521  0.8773585 2.715986
4 {Class=Crew, Sex=Female}       => {Survived=Yes} 0.009086779  0.8695652 2.691861

如果我们减小最小支持率和置信度的阈值,则能看到更多的真相。

rules <- apriori(titanic.raw, parameter = list(minlen=3, supp=0.002, conf=0.2), appearance = list(rhs=c(“Survived=Yes”), lhs=c(“Class=1st”, “Class=2nd”, “Class=3rd”, “Age=Child”, “Age=Adult”), default=”none”), control = list(verbose=F))
rules.sorted <- sort(rules, by=”confidence”)
inspect(rules.sorted)

lhs                        rhs           support     confidence lift
1 {Class=2nd, Age=Child} => {Survived=Yes} 0.010904134 1.0000000 3.0956399
2 {Class=1st, Age=Child} => {Survived=Yes} 0.002726034 1.0000000 3.0956399
3 {Class=1st, Age=Adult} => {Survived=Yes} 0.089504771 0.6175549 1.9117275
4 {Class=2nd, Age=Adult} => {Survived=Yes} 0.042707860 0.3601533 1.1149048
5 {Class=3rd, Age=Child} => {Survived=Yes} 0.012267151 0.3417722 1.0580035
6 {Class=3rd, Age=Adult} => {Survived=Yes} 0.068605179 0.2408293 0.7455209

从规则3和规则5以及之前的规则2和3可以看出泰坦尼克号获得优先权的主要是头等舱、二等舱的妇孺。

据统计,头等舱男乘客的生还率比三等舱中儿童的生还率还稍高一点。美国新泽西州州立大学教授、著名社会学家戴维·波普诺研究后毫不客气地修改了曾使英国人颇感“安慰”的“社会规范”(妇女和儿童优先):“在泰坦尼克号上实践的社会规范这样表述可能更准确一些:‘头等舱和二等舱的妇女和儿童优先’。”

这些是关于泰坦尼克号生存数据分析的资料:
泰坦尼克号逃生真相:“妇女儿童优先”只是个传说
历史没有那么温暖

6)可视化

# visualize rules
library(arulesViz)
plot(rules)
plot(rules, method=”graph”, control=list(type=”items”))
plot(rules, method=”paracoord”, control=list(reorder=TRUE))

对于不熟悉R的SAS用户,可以阅读以下资料学习R以及ARULES包:
http://cran.r-project.org/web/packages/arules/vignettes/arules.pdf
https://science.nature.nps.gov/im/datamgmt/statistics/R/documents/R_for_SAS_SPSS_users.pdf

四、SAS代码和结果

1)下载泰坦尼克数据

proc iml;
submit /R;
setInternet2(TRUE)
con <- url( http://www.rdatamining.com/data/titanic.raw.rdata)
load(con)
close(con) # url() always opens the connection
endsubmit;

call ImportDataSetFromR(“Work.titanic”, “titanic.raw”);
run; quit;

2)将数据转换成SAS/EM要求的格式

data items2;
set titanic;
length tid 8;
length item $ 8;
tid = _n_;
item = class;
output;
item = sex;
output;
item = age;
output;
item = survived;
output;
keep tid item;
run;

3)关联分析

proc dmdb data=items2 dmdbcat=dbcat;
class tid item;
run; quit;

proc assoc data=items2 dmdbcat=dbcat pctsup= 0.5 out=frequentItems;
id tid;
target item;
run;

proc rulegen in=frequentItems dmdbcat=dbcat out=rules minconf= 80;
run ;

proc sort data=rules;
by descending conf;
run ;

4) 只保留结果中包含生存变量的关联规则

data surviverules;
set rules(where=(set_size> 1 and (_rhand=‘Yes’ or _rhand=‘No’)));
run;

proc print data=surviverules;
var conf support lift rule ;
run ;

SAS 结果:

Obs CONF SUPPORT LIFT RULE
1 100.00 1.09 3.10 2nd & Child ==> Yes
2 100.00 0.59 3.10 2nd & Child & Female ==> Yes
3 100.00 0.50 3.10 2nd & Child & Male ==> Yes
4 97.24 6.41 3.01 1st & Female ==> Yes
5 97.22 6.36 3.01 1st & Adult & Female ==> Yes
6 91.67 7.00 1.35 2nd & Adult & Male ==> No
7 87.74 4.23 2.72 2nd & Female ==> Yes
8 86.96 0.91 2.69 Crew & Female ==> Yes
9 86.96 0.91 2.69 Adult & Crew & Female ==> Yes
10 86.03 7.00 1.27 2nd & Male ==> No
11 86.02 3.63 2.66 2nd & Adult & Female ==> Yes
12 83.77 17.58 1.24 3rd & Adult & Male ==> No
13 82.75 19.17 1.22 3rd & Male ==> No

有关SAS/EM关联分析的公开资料很少,产品的在线帮助文档大概从4.3以后的版本就设置了访问权限,只有SAS/EM的用户才能阅读,新版本的功能和界面跟4.3版本有很大差别。这里只能给大家一些4.3的帮助文档,主要是上面代码中用到的几个过程步: http://support.sas.com/documentation/onlinedoc/miner/em43/dmdb.pdf
http://support.sas.com/documentation/onlinedoc/miner/em43/assoc.pdf
http://support.sas.com/documentation/onlinedoc/miner/em43/sequence.pdf
http://support.sas.com/documentation/onlinedoc/miner/em43/rulegen.pdf

mbscore(购物篮数据的预测,是EM 6.1/SAS 9.2 时新引入的过程步,支持层次关联<Hierarchical Association>)

五、结果比较

从上面的结果看,R生成了12条规则,而SAS生成了13条规则,对比每条规则后,发现SAS的第3条规则在R中没有。

3 100.00 0.50 3.10 2nd & Child & Male ==> Yes

我猜测原因是两个软件对最小支持度的处理不太一样,SAS可能是对最小支持度百分比乘以总记录条数后取整了。此处,泰坦尼克数据总共有2201条记录,最小支持度百分比为 0.5%,两者相乘积为11.005,而 2nd & Child & Male ==> Yes 这条规则总共出现过11次,如果严格按照实数大小比较,不应该出现在最后的结果中,但是如果按照整数部分比较,则结果正确。打算将SAS模型切换到R或者将R模型切换到SAS的同学要注意这个差异,结果有时不完全一样!

data min_support;
set frequentItems;
if count=int(2201*0.005);
run ;

proc print data=min_support;
run; quit

Obs SET_SIZE COUNT ITEM1 ITEM2 ITEM3 ITEM4 ITEM5 ITEM6
1 3 11 2nd Child Male
2 4 11 2nd Child Male Yes

相比SAS,R关联分析中比较吸引人的功能就是从规则集中去除冗余的规则,这一功能SAS里面好像没有(我没找到)。SAS用户如果想要使用R的这个功能,我找到的唯一办法就是将SAS的关联规则导出成PMML文件,然后再将PMML文件导入R生成对应的Rule对象,但是这个方法因为我的环境有点问题,所以我自己没试。

有兴趣的同学,可以看看下面的资料:
1) 如何将PMML文件导入R生成Rule对象
2) 如何在SAS EMM 中使用PMML?

附:PMML技术的未来

对于模型的部署和使用,尤其是跨软件、平台的使用场景下或者对于大数据的分析,PMML是一个可行的解决方案,有一些厂商已经在自己的产品中通过PMML这种方式来实现对大数据的分析预测。

Zementis:
Deploying Predictive Analytics with PMML, R evolution R, and ADAPA
PMML: Accelerating the Time to Value for Predictive Analytics in the Big Data Era

IBM: Database Mining Guide

相关 [关联 分析 sas] 推荐:

关联分析:R与SAS的比较

- - 统计之都
啤酒和尿布的故事是关联分析方法最经典的案例,而用于关联分析的Apriori算法更是十大数据挖掘算法之一( http://www.cs.uvm.edu/~icdm/algorithms/index.shtml,这个排名虽然是几年前的调查结果,但是其重要性仍可见一斑). 本文以《 R and Data Mining》书中使用的泰坦尼克号人员的生存数据为例,介绍如何使用R和SAS的Apriori算法进行关联分析,比较两者的建模结果并对结果中存在的差异进行解释分析.

SAS、Stata与SPSS的比较(转)

- - 数据范儿
很多人曾问及SAS,Stata 和SPSS之间的不同,它们之中哪个是最好的. 可以想到,每个软件都有自己独特的风格,有自己的优缺点. 本文对此做了概述,但并不是一个综合的比较. 人们时常会对自己所使用的统计软件有特别的偏好,希望大多数人都能认同这是对这些软件真实而公允的一个对比分析. SAS由于其功能强大而且可以编程,很受高级用户的欢迎.

2012年SAS公司博客排名

- - 统计之都
想要了解和学习 SAS 产品的同学,一定要看看这个博客排名,因为这里有你需要的绝大部分资料,从数据处理、图形显示、分析、培训到最新的技术和产品信息. Rick Wicklin, 博士, SAS 公司计算统计学方面资深研发人员,PROC IML 和 SAS/IML Studio 的首席开发工程师. 精通计算统计学、统计图形、现代统计分析方法,是 Statistical Programming with SAS/IML Software 这本书的作者.

SAS vs SSD对比测试MySQL tpch性能

- - MySQL 中文网 -
早先已经做过一次OLTP性能对比测试: SAS vs SSD各种模式下MySQL TPCC OLTP对比测试结果,这次做OLAP对比测试. SSD设备相应的性能提升比例:.

应聘准备:非统计和计算机背景的学生如何找到SAS程序员的工作?

- - 统计之都
在LinkedIn上看到一个帖子问“金融和会计背景且有SAS知识的学生是否很难找到SAS程序员的工作. ”,第一位回复的是SAS公司资的深培训师 Cynthia Zender,回复内容非常专业具体,值得一看. Cynthia Zender 说每当她的学生提出类似问题时, 她的答复是:上招聘网站 Monster.com 或者 Icrunchdata.com 看看即将投身的领域在所在地区都需要什么样的SAS技能和经验.

Hive中小表与大表关联(join)的性能分析

- - 数据库 - ITeye博客
经常看到一些Hive优化的建议中说当小表与大表做关联时,把小表写在前面,这样可以使Hive的关联速度更快,提到的原因都是说因为小表可以先放到内存中,然后大表的每条记录再去内存中检测,最终完成关联查询. 这样的原因看似合理,但是仔细推敲,又站不住脚跟. 如果所谓的小表在内存中放不下怎么办. 我用2个只有几条记录的表做关联查询,这应该算是小表了,在查看reduce的执行日志时依然是有写磁盘的操作的.

数据挖掘典型应用:如何做好关联分析

- - 互联网分析沙龙
在电商数据运营中,对于客户而言,有两个很重要的指标对于扩大销售规模是很重要的:第一,提高顾客重复购买次数;第二,提高客户订单中的Basket size(即购物篮件数). 而第二个指标提高Basket size,就是让客户从以前只购买一件产品的转换到现在购买多件产品,从而提高整个购物篮的销售金额,最大限度地实现销售增长.

竞品分析

- 章明 - 互联网的那点事
关于竞品分析,之前天行(@天行Aeros)有篇文章《设计公式:简单有效的竞品分析》已经进行了介绍,本文在该文章的基础之上再进行一些分享,希望对大家有用. 竞品分析(Competitive Analysis)一词最早源于经济学领域. 市场营销和战略管理方面的竞品分析是指对现有的或潜在的竞争产品的优势和劣势进行评价.