這門課程會跟同學介紹在R中常用的AssociationRule算法。
首先請同學安裝arules這個套件。
check_then_install("arules", "1.3.0")
載入arules套件。
library(arules)
接著,我們查一查arules有沒有vignette。
vignette(package = "arules")
有一篇名叫arules的vignette。麻煩同學先打開它。
vignette("arules", package = "arules")
這篇文章仔細的介紹arules套件所提供的演算法、參數,以及提供了範例。如果想要深入了解apriori演算法的同學,可以花點時間細讀這份文件。
讓我們先看看arules提供的apriori函數。請同學先打開apriori函數的說明頁面。
?apriori
請問下列哪一個「不是」apriori函數的參數?請參考說明文件作答。
confidence
apriori的data參數必須要是transactions型態。所以我們要先探索何謂transactions型態的物件
請同學輸入:?"transactions-class"來打開transactions的說明文件。這裡因為文字中包含-這個符號,所以要用雙引號。
?"transactions-class"
請問transactions物件預設「不能」從哪些物件轉換而來?請參考Details章節作答。
numeric vector
AssociationRules要挖掘的,就是透過探索哪些物品(Item)會共同出現在哪些交易(Transaction)中,而衍生出來的技術。在R裡面,我們要透過list、matrix或data.frame來告訴R這些物品和交易的資訊。
舉例來說,如果我們有三種物品:c("a","b","c")。而第一筆交易有c("a","b","c"),第二筆交易有c("a","b"),那我們就可以建立以下的list:record_list<-list(c("a","b","c"),c("a","b"))請同學試試看。
record_list <- list(c("a", "b", "c"), c("a", "b"))
有了record_list之後,我們可以利用as來把record_list轉換成transactions物件。請同學輸入:record<-as(record_list,"transactions")
record <- as(record_list, "transactions")
我們來看看record的結果。請同學輸入:record
record
我們看到了2筆交易,因為length(record_list)為2。而且我們看到了3個物品,它們是:c("a","b","c")。
R也提供了summary來更仔細的檢視record。請同學輸入:summary(record)
summary(record)
我們看到了更多更深入的資訊,例如出現最多次的物品、交易中包含的物品類別的分佈
接著,讓我們看一個真實的範例:AdultUCI資料。請同學輸入:data(AdultUCI)
data(AdultUCI)
也請同學輸入:?AdultUCI來看一看arules套件針對這個範例資料的說明。有興趣的同學可以深入閱讀。
?AdultUCI
由於AdultUCI有numeric型態的欄位,而AssociationRule基本上只能使用在類別型變數,所以我們需要先把AdultUCI作整理,把numeric變成factor,然後用剛剛學到的as函數轉換成transactions物件。說明文件的Example區塊有示範怎麼正確的做資料的整理與轉換。請同學輸入:example(AdultUCI)來讓R自動幫我們整理資料。
example(AdultUCI)
這裡,我們把描述人的特色,當成「物品」,而把每個人當成「交易」。透過AssociationRule的技術,我們可以回答如:如果一個人的婚姻狀態、工作和教育等屬性為何時,資料顯示會比較容易有高收入。AssociationRule的結果不代表因果關係
arules套件已經把Adult資料轉換成transactions物件了。請同學用class(Adult)來確認。
class(Adult)
請同學輸入summary(Adult),準備回答下一個問題。
summary(Adult)
請問哪一個物品是最頻繁出現的物品?
capital-loss=None
如果我們計算每筆交易所包含物品的數量,哪一個數字是頻率最高的?
13
請同學輸入inspect(head(Adult,10))來看前10筆資料。
inspect(head(Adult, 10))
接著我們再回到apriori函數的說明頁面。
?apriori
我們請同學先輸入:rules<-apriori(Adult,parameter=list(support=0.5,confidence=0.9))
rules <- apriori(Adult, parameter = list(support = 0.5, confidence = 0.9))
上一題的parameter=list(support=0.5,confidence=0.9)就是控制aprori演算法的參數。不同的參數會導致不同的答案。
接著我們來看看學到的結果。請同學輸入:summary(rules)
summary(rules)
請問我們一個學到多少個規則?
52
接著請同學輸入inspect(rules[1])來看看第一個規則。
inspect(rules[1])
由於這個規則只有牽涉一個物品,所以它描述的是說capital-gain=None是一個很常看到的物品。這裡代表的是說,有91%的人的capital-gane都是None。
請同學輸入:inspect(rules[4])來看看第四個規則。
inspect(rules[4])
這條規則就有歸納出lhs(因)和rhs(果)的關係。也就是說,擁有一個Full-time的工作的人,資產上通常不會有損失。support0.56代表的是,同時有lhs+rhs特性的人,占總資料的56%。confidence0.96則代表所有具備lhs特性的人,有96%的人具備有rhs。lift則代表套用這個規則對rhs做預測是否效果良好。以這個規則來說,有lhs的人相對沒有lhs的人,具備rhs的機率只高了1.005,算是沒什麼效果的規則。
我們可以運用subset指令來挑出我們特別感興趣的規則。請同學先輸入?"subset,rules-method"來打開subset用在rules物件上的說明訊息。
?"subset,rules-method"
我覺得這裡套件開發者在前半段的說明並不算明確。但是透過閱讀Examples中的範例程式碼,我們仍然可以了解到不少subset的功能。在學習開放原始碼的程式時,常常會發生程式碼或範例比說明文件還清楚的狀況。
我們先試試看:rules.none<-subset(rules,subset=rhs%in%"capital-gain=None")
rules.none <- subset(rules, subset = rhs %in% "capital-gain=None")
rules.none應該包含所有rhs為capital-gain=None的規則。
接著,我們來看篩選出來的rules.none包含的第一個規則。請同學使用inspect和[]。
inspect(rules.none[1])
我們可以再看看篩選出來後,rules.none所包含的第二個規則。
inspect(rules.none[2])
這結果看來很聳動:擁有Full-time工作的人,有93%的機會資產是沒有增加的。但是如果同學仔細看的話,會發現lift非常的低,而且上一個規則才告訴我們capital-gain=None的人非常非常多(92%),所以這個規則可能沒什麼意義。
我們可能只對lift很高的規則有興趣。請同學輸入:rules.none2<-subset(rules,subset=rhs%in%"capital-gain=None"&lift>1.1)篩選所有rhs為capital-gain=None且lift超過1.1的規則。
rules.none2 <- subset(rules, subset = rhs %in% "capital-gain=None" & lift > 1.1)
結果資料中學不出任何這樣的規則,哈哈。
我們對AssociationRule的介紹就到這。最後請同學完成一個小練習後輸入submit()
library(arules)
data(Adult)
#' 請同學使用參數 support = 0.3, confidence = 0.9 在Adult上學一個新的規則結果
rules2 <- {
NULL # 請在這邊寫上你的程式碼
}
rules2 <- apriori(Adult, parameter = list(support = 0.3, confidence = 0.9))
stopifnot(length(rules2) == 326)
#' 請同學挑選出lhs 包含 hours-per-week=Full-time 的規則
rules2.fulltime <- {
NULL # 請在這邊寫上你的程式碼
}
rules2.fulltime <- subset(rules2, subset = lhs %in% "hours-per-week=Full-time")
stopifnot(length(rules2.fulltime) == 42)