關卡 1

這門課程會跟同學介紹在R中常用的AssociationRule算法。

關卡 2

首先請同學安裝arules這個套件。

check_then_install("arules", "1.3.0")

關卡 3

載入arules套件。

library(arules)

關卡 4

接著,我們查一查arules有沒有vignette。

vignette(package = "arules")

關卡 5

有一篇名叫arules的vignette。麻煩同學先打開它。

vignette("arules", package = "arules")

關卡 6

這篇文章仔細的介紹arules套件所提供的演算法、參數,以及提供了範例。如果想要深入了解apriori演算法的同學,可以花點時間細讀這份文件。

關卡 7

讓我們先看看arules提供的apriori函數。請同學先打開apriori函數的說明頁面。

?apriori

關卡 8

請問下列哪一個「不是」apriori函數的參數?請參考說明文件作答。

confidence

關卡 9

apriori的data參數必須要是transactions型態。所以我們要先探索何謂transactions型態的物件

關卡 10

請同學輸入:?"transactions-class"來打開transactions的說明文件。這裡因為文字中包含-這個符號,所以要用雙引號。

?"transactions-class"

關卡 11

請問transactions物件預設「不能」從哪些物件轉換而來?請參考Details章節作答。

numeric vector

關卡 12

AssociationRules要挖掘的,就是透過探索哪些物品(Item)會共同出現在哪些交易(Transaction)中,而衍生出來的技術。在R裡面,我們要透過list、matrix或data.frame來告訴R這些物品和交易的資訊。

關卡 13

舉例來說,如果我們有三種物品: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"))

關卡 14

有了record_list之後,我們可以利用as來把record_list轉換成transactions物件。請同學輸入:record<-as(record_list,"transactions")

record <- as(record_list, "transactions")

關卡 15

我們來看看record的結果。請同學輸入:record

record

關卡 16

我們看到了2筆交易,因為length(record_list)為2。而且我們看到了3個物品,它們是:c("a","b","c")

關卡 17

R也提供了summary來更仔細的檢視record。請同學輸入:summary(record)

summary(record)

關卡 18

我們看到了更多更深入的資訊,例如出現最多次的物品、交易中包含的物品類別的分佈

關卡 19

接著,讓我們看一個真實的範例:AdultUCI資料。請同學輸入:data(AdultUCI)

data(AdultUCI)

關卡 20

也請同學輸入:?AdultUCI來看一看arules套件針對這個範例資料的說明。有興趣的同學可以深入閱讀。

?AdultUCI

關卡 21

由於AdultUCI有numeric型態的欄位,而AssociationRule基本上只能使用在類別型變數,所以我們需要先把AdultUCI作整理,把numeric變成factor,然後用剛剛學到的as函數轉換成transactions物件。說明文件的Example區塊有示範怎麼正確的做資料的整理與轉換。請同學輸入:example(AdultUCI)來讓R自動幫我們整理資料。

example(AdultUCI)

關卡 22

這裡,我們把描述人的特色,當成「物品」,而把每個人當成「交易」。透過AssociationRule的技術,我們可以回答如:如果一個人的婚姻狀態、工作和教育等屬性為何時,資料顯示會比較容易有高收入。AssociationRule的結果不代表因果關係

關卡 23

arules套件已經把Adult資料轉換成transactions物件了。請同學用class(Adult)來確認。

class(Adult)

關卡 24

請同學輸入summary(Adult),準備回答下一個問題。

summary(Adult)

關卡 25

請問哪一個物品是最頻繁出現的物品?

capital-loss=None

關卡 26

如果我們計算每筆交易所包含物品的數量,哪一個數字是頻率最高的?

13

關卡 27

請同學輸入inspect(head(Adult,10))來看前10筆資料。

inspect(head(Adult, 10))

關卡 28

接著我們再回到apriori函數的說明頁面。

?apriori

關卡 29

我們請同學先輸入:rules<-apriori(Adult,parameter=list(support=0.5,confidence=0.9))

rules <- apriori(Adult, parameter = list(support = 0.5, confidence = 0.9))

關卡 30

上一題的parameter=list(support=0.5,confidence=0.9)就是控制aprori演算法的參數。不同的參數會導致不同的答案。

關卡 31

接著我們來看看學到的結果。請同學輸入:summary(rules)

summary(rules)

關卡 32

請問我們一個學到多少個規則?

52

關卡 33

接著請同學輸入inspect(rules[1])來看看第一個規則。

inspect(rules[1])

關卡 34

由於這個規則只有牽涉一個物品,所以它描述的是說capital-gain=None是一個很常看到的物品。這裡代表的是說,有91%的人的capital-gane都是None。

關卡 35

請同學輸入:inspect(rules[4])來看看第四個規則。

inspect(rules[4])

關卡 36

這條規則就有歸納出lhs(因)和rhs(果)的關係。也就是說,擁有一個Full-time的工作的人,資產上通常不會有損失。support0.56代表的是,同時有lhs+rhs特性的人,占總資料的56%。confidence0.96則代表所有具備lhs特性的人,有96%的人具備有rhs。lift則代表套用這個規則對rhs做預測是否效果良好。以這個規則來說,有lhs的人相對沒有lhs的人,具備rhs的機率只高了1.005,算是沒什麼效果的規則。

關卡 37

我們可以運用subset指令來挑出我們特別感興趣的規則。請同學先輸入?"subset,rules-method"來打開subset用在rules物件上的說明訊息。

?"subset,rules-method"

關卡 38

我覺得這裡套件開發者在前半段的說明並不算明確。但是透過閱讀Examples中的範例程式碼,我們仍然可以了解到不少subset的功能。在學習開放原始碼的程式時,常常會發生程式碼或範例比說明文件還清楚的狀況。

關卡 39

我們先試試看:rules.none<-subset(rules,subset=rhs%in%"capital-gain=None")

rules.none <- subset(rules, subset = rhs %in% "capital-gain=None")

關卡 40

rules.none應該包含所有rhs為capital-gain=None的規則。

關卡 41

接著,我們來看篩選出來的rules.none包含的第一個規則。請同學使用inspect[]

inspect(rules.none[1])

關卡 42

我們可以再看看篩選出來後,rules.none所包含的第二個規則。

inspect(rules.none[2])

關卡 43

這結果看來很聳動:擁有Full-time工作的人,有93%的機會資產是沒有增加的。但是如果同學仔細看的話,會發現lift非常的低,而且上一個規則才告訴我們capital-gain=None的人非常非常多(92%),所以這個規則可能沒什麼意義。

關卡 44

我們可能只對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)

關卡 45

結果資料中學不出任何這樣的規則,哈哈。

關卡 46

我們對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)