关联规则:R与SAS的比较
啤酒和尿布的故事是關聯分析方法最經典的案例,而用于關聯分析的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可以看出泰坦尼克號獲得優先權的主要是頭等艙、二等艙的婦孺。
據統計,頭等艙男乘客的生還率比三等艙中兒童的生還率還稍高一點。美國新澤西州州立大學教授、著名社會學家戴維·波普諾研究后毫不客氣地修改了曾使英國人頗感“安慰”的“社會規范”(婦女和兒童優先):“在泰坦尼克號上實踐的社會規范這樣表述可能更準確一些:‘頭等艙和二等艙的婦女和兒童優先’?!?/p>
這些是關于泰坦尼克號生存數據分析的資料:
泰坦尼克號逃生真相:“婦女兒童優先”只是個傳說
歷史沒有那么溫暖
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 結果:
| 100.00 | 1.09 | 3.10 | 2nd & Child ==> Yes |
| 100.00 | 0.59 | 3.10 | 2nd & Child & Female ==> Yes |
| 100.00 | 0.50 | 3.10 | 2nd & Child & Male ==> Yes |
| 97.24 | 6.41 | 3.01 | 1st & Female ==> Yes |
| 97.22 | 6.36 | 3.01 | 1st & Adult & Female ==> Yes |
| 91.67 | 7.00 | 1.35 | 2nd & Adult & Male ==> No |
| 87.74 | 4.23 | 2.72 | 2nd & Female ==> Yes |
| 86.96 | 0.91 | 2.69 | Crew & Female ==> Yes |
| 86.96 | 0.91 | 2.69 | Adult & Crew & Female ==> Yes |
| 86.03 | 7.00 | 1.27 | 2nd & Male ==> No |
| 86.02 | 3.63 | 2.66 | 2nd & Adult & Female ==> Yes |
| 83.77 | 17.58 | 1.24 | 3rd & Adult & Male ==> No |
| 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中沒有。
| 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;?
| 3 | 11 | 2nd | Child | Male | ? | ? | ? |
| 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
轉載于:https://www.cnblogs.com/huzs/p/3741981.html
總結
以上是生活随笔為你收集整理的关联规则:R与SAS的比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机专硕考数一英一,专硕难度升级!改考
- 下一篇: android mcc mnc,Syst