DAY27. R ์ฐ๊ด๋ถ์
01. ์ฐ๊ด๋ถ์๊ฐ์
์ด๋ค ์ฌ๊ฑด์ด ์ผ๋ง๋ ์์ฃผ ๋์์ ๋ฐ์ํ๋๊ฐ๋ฅผ ํํํ๋ ๊ท์น ๋๋ ์กฐ๊ฑด
์ดํฐ๋ฒ ์ด์ค์์ ์ฌ๊ฑด์ ์ฐ๊ด๊ท์น์ ์ฐพ๋ ๋ฌด๋ฐฉํฅ์ฑ ๋ฐ์ดํฐ ๋ง์ด๋ ๊ธฐ๋ฒ
๋ง์ผํ ์์ ๊ณ ๊ฐ์ ์ฅ๋ฐ๊ตฌ๋์ ๋ค์ด์๋ ํ๋ชฉ ๊ฐ์ ๊ด๊ณ ํ๊ตฌ
y๋ณ์๊ฐ ์๋ ๋น์ง๋ ํ์ต์ ์ํ ํจํด ๋ถ์
์ฌ๊ฑด๊ณผ ์ฌ๊ฑด ๊ฐ ์ฐ๊ด์ฑ(๊ด๊ณ)๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ(์:๊ธฐ์ ๊ท์ ๋งฅ์ฃผ) ์) ์ฅ๋ฐ๊ตฌ๋ ๋ถ์ : ์ฅ๋ฐ๊ตฌ๋ ์ ๋ณด๋ฅผ ํธ๋์ญ์ ์ด๋ผ๊ณ ํ๋ฉฐ, ํธ๋์ญ์ ๋ด์ ์ฐ๊ด์ฑ์ ์ดํด๋ณด๋ ๋ถ์๊ธฐ๋ฒ
๋ถ์์ ์ฐจ : ๊ฑฐ๋๋ด์ญ -> ํ๋ชฉ ๊ด์ฐฐ -> ๊ท์น(Rule) ๋ฐ๊ฒฌ
๊ด๋ จ๋ถ์ผ
: ๋ํ ๋งํธ, ๋ฐฑํ์ , ์ผํ๋ชฐ ํ๋งค์ -> ๊ณ ๊ฐ ๋์ ์ํ์ถ์ฒ
1. ๊ณ ๊ฐ๋ค์ ์ด๋ค ์ํ๋ค์ ๋์์ ๊ตฌ๋งคํ๋๊ฐ?
2. ๋ผ๋ฉด์ ๊ตฌ๋งคํ ๊ณ ๊ฐ์ ์ฃผ๋ก ๋ค๋ฅธ ์ด๋ค ์ํ์ ๊ตฌ๋งคํ๋๊ฐ
ํ์ฉ๋ฐฉ์
: ์์ ๊ฐ์ ์ง๋ฌธ์ ๋ํ ๋ถ์์ ํ ๋๋ก ๊ณ ๊ฐ๋ค์๊ฒ
1) ์ํ์ ๋ณด ๋ฐ์ก
2) ํ ๋ ๋ง์ผํ ๋ฅผ ํตํด์ ํจํค์ง ์ํ ํ๋งค ๊ธฐํ
3) ๋งํธ์ ์ํ์ง์ด
์ฐ๊ด๊ท์น ํ๊ฐ์ฒ๋
1. ์ง์ง๋(support) : ์ํA์ ์ํB๋ฅผ ํจ๊ป ๊ตฌ๋งคํ ํ๋ฅ A->B ์ง์ง๋ ์
-> A์ B๋ฅผ ํฌํจํ ๊ฑฐ๋์ / ์ ์ฒด ๊ฑฐ๋์
2. ์ ๋ขฐ๋(confidence) : ์ํA๋ฅผ ๊ตฌ๋งคํ ๋ ์ํB๋ฅผ ๊ฐ์ด ๊ตฌ๋งคํ ์กฐ๊ฑด๋ถ ํ
A->B ์ ๋ขฐ๋ ์ : ์์๋ฅผ ๊ณ ๋ คํ๋ค๋ ์๋ฏธ -> ์กฐ๊ฑด๋ถ ํ๋ฅ
-> A์ B๋ฅผ ํฌํจํ ๊ฑฐ๋์ / A๋ฅผ ํฌํจํ ๊ฑฐ๋์
3. ํฅ์๋(Lift) : ์ง์ง๋์ ์ ๋ขฐ๋๋ฅผ ๋์์ ๊ณ ๋ คํ ์ํA์ ์ํB ๊ฐ์ ์ฐ๊ด์ฑ ํฅ์๋
-> ์ ๋ขฐ๋ / B๊ฐ ํฌํจ๋ ๊ฑฐ๋์จ
ํฅ์๋ > 1 : ๋ ํ๋ชฉ์ด ์์ ์ฐ๊ด์ฑ์ ๊ฐ์ง(๋นต๊ณผ ๋ฒํฐ)
ํฅ์๋ = 1 : ๋ ๋ฆฝ์ ๊ฐ๊น์ด ์ฌ๊ฑด(๊ณผ์์ ํ์ถ)
ํฅ์๋ < 1 : ๋ ํ๋ชฉ์ด ์์ ์ฐ๊ด์ฑ์ ๊ฐ์ง(์ค์ฌ์ฝ์ ๋ณ๋น์ฝ)
์ ๋ขฐ๋(confidence) : A๊ฐ ํฌํจ๋ ๊ฑฐ๋ ์ค์์ B๋ฅผ ํฌํจํ ๊ฑฐ๋์ ๋น์จ(์กฐ๊ฑด๋ถ ํ๋ฅ )
A->B ์ ๋ขฐ๋ ์
-> A์ B๋ฅผ ํฌํจํ ๊ฑฐ๋์ / A๋ฅผ ํฌํจํ ๊ฑฐ๋์
ํฅ์๋(Lift) : ํ์ ํญ๋ชฉ๋ค์ด ๋
๋ฆฝ์์ ์ผ๋ง๋ ๋ฒ์ด๋๋์ง์ ์ ๋๋ฅผ ์ธก์ ํ ๊ฐ
ํฅ์๋ ์
-> ์ ๋ขฐ๋ / B๊ฐ ํฌํจ๋ ๊ฑฐ๋์จ
[์ค์ต]
<์ง์ง๋์ ์ ๋ขฐ๋ ์์>
t1 : ๋ผ๋ฉด,๋งฅ์ฃผ,์ฐ์
t2 : ๋ผ๋ฉด,๊ณ ๊ธฐ,์ฐ์
t3 : ๋ผ๋ฉด,๊ณผ์ผ,๊ณ ๊ธฐ
t4 : ๊ณ ๊ธฐ,๋งฅ์ฃผ,์ฐ์
t5 : ๋ผ๋ฉด,๊ณ ๊ธฐ,์ฐ์
t6 : ๊ณผ์ผ,์ฐ์
A -> B ์ง์ง๋ ์ ๋ขฐ๋ ํฅ์๋
๋งฅ์ฃผ -> ๊ณ ๊ธฐ 1/6=0.166 1/2=0.5 0.5/0.66(4/6)=0.75
๋ผ๋ฉด,์ฐ์ -> ๋งฅ์ฃผ 1/6=0.166 1/3=0.33 0.33/2/6(0.33)=1
์ฐ๊ด์ฑ ๊ท์น ๋ถ์์ ์ํ ํจํค์ง
install.packages("arules") # association Rule
read.transactions(), apriori(), Adult ๋ฐ์ดํฐ์ ์ ๊ณต
library(arules) #read.transactions()ํจ์ ์ ๊ณต
1) transaction ๊ฐ์ฒด ์์ฑ(ํ์ผ ์ด์ฉ)
setwd("C:/ITWILL/2_Rwork/data")
# read.transactions() : ํ์๋ฌธ -> ํธ๋์ญ์
๊ฐ์ฒด ๋ณํ
tran <- read.transactions("tran.txt", format="basket", sep=",")
tran
#6 transactions (rows) and
#5 items (columns)
2. transaction ๋ฐ์ดํฐ ๋ณด๊ธฐ
inspect(tran)
3. rule ๋ฐ๊ฒฌ(์์ฑ) - ์ง์ง๋,์ ๋ขฐ๋ = 0.1
apriori(ํธ๋์ญ์
data, parameter=list(supp, conf))
์ฐ๊ด์ฑ ๊ท์น ํ๊ฐ ์ฒ๋ - ์ง์ง๋์ ์ ๋ขฐ๋
rule1 <- apriori(tran, parameter = list(supp=0.3, conf=0.1)) # 16 rule
rule2 <- apriori(tran, parameter = list(supp=0.1, conf=0.1)) # 35 rule
inspect(rule1) # ๊ท์น ๋ณด๊ธฐ
inspect(rule2) # ๊ท์น ๋ณด๊ธฐ
์ง์ง๋, ์ ๋ขฐ๋, maxlen ์ธ์
help("apriori") # support 0.1, confidence 0.8, and maxlen 10
rule <- apriori(tran) # 6 rule(s)
rule<- apriori(tran, parameter = list(supp=0.1, conf=0.8, maxlen=10))
inspect(rule)
2. ํธ๋์ญ์
๊ฐ์ฒด ์์ฑ
ํ์) read.transactions(file, format=c("basket", "single"), sep = NULL, cols=NULL, rm.duplicates=FALSE,encoding="unknown")
file : file name
format : data set์ ํ์ ์ง์ (basket ๋๋ single)
-> single : ๋ฐ์ดํฐ ๊ตฌ์ฑ(2๊ฐ ์นผ๋ผ) -> transaction ID์ ์ํด์ ์ํ(item)์ด ๋์๋ ๊ฒฝ์ฐ
-> basket : ๋ฐ์ดํฐ ์
์ด ์ฌ๋ฌ๊ฐ์ ์ํ์ผ๋ก ๊ตฌ์ฑ -> transaction ID ์์ด ์ฌ๋ฌ ์ํ(item) ๊ตฌ์ฑ
sep : ์ํ ๊ตฌ๋ถ์
cols : single์ธ ๊ฒฝ์ฐ ์ฝ์ ์ปฌ๋ผ ์ ์ง์ , basket์ ์๋ต(transaction ID๊ฐ ์๋ ๊ฒฝ์ฐ)
rm.duplicates : ์ค๋ณต ํธ๋์ญ์
ํญ๋ชฉ ์ ๊ฑฐ
encoding : ์ธ์ฝ๋ฉ ์ง์
(1) single ํธ๋์ญ์
๊ฐ์ฒด ์์ฑ
read demo data - sep ์๋ต : ๊ณต๋ฐฑ์ผ๋ก ์ฒ๋ฆฌ, single์ธ ๊ฒฝ์ฐ cols ์ง์
format = "single" : 1๊ฐ์ transaction id์ ์ํด์ item์ด ์ฐ๊ฒฐ๋ ๊ฒฝ์ฐ
setwd("C:/ITWILL/2_Rwork/data")
stran <- read.transactions("demo_single",format="single",cols=c(1,2))
inspect(stran)
[์ค์ต2] ์ค๋ณต ํธ๋์ญ์
๊ฐ์ฒด ์์ฑ
stran2<- read.transactions("single_format.csv", format="single", sep=",",
cols=c(1,2), rm.duplicates=T)
stran2
summary(stran2) # 248๊ฐ ํธ๋์ญ์
์ ๋ํ ๊ธฐ์ ํต๊ณ ์ ๊ณต
ํธ๋์ญ์
๋ณด๊ธฐ
inspect(stran2) # 248 ํธ๋์ญ์
ํ์ธ
๊ท์น ๋ฐ๊ฒฌ
astran2 <- apriori(stran2) # supp=0.1, conf=0.8์ ๋์ผํจ
#astran2 <- apriori(stran2, parameter = list(supp=0.1, conf=0.8))
astran2 # set of 102 rules
attributes(astran2)
inspect(astran2)
ํฅ์๋๊ฐ ๋์ ์์๋ก ์ ๋ ฌ
inspect(sort(astran2, by="lift"))
(2) basket ํธ๋์ญ์
๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
btran <- read.transactions("demo_basket",format="basket",sep=",")
inspect(btran) # ํธ๋์ญ์
๋ฐ์ดํฐ ๋ณด๊ธฐ
3. ์ฐ๊ด๊ท์น ์๊ฐํ(Adult ๋ฐ์ดํฐ ์
์ด์ฉ)
[Adult ๋ฐ์ดํฐ ์ ]
32,000๊ฐ์ ๊ด์ฐฐ์น์ 15๊ฐ์ ๋ณ์๋ก ๊ตฌ์ฑ๋์ด ์์
์ข ์๋ณ์์ ์ํด์ ๋ ๊ฐ ๊ฐ์ธ ์์ ์ด 5๋ง๋ฌ๋ฌ ์ด์ ์ธ์ง๋ฅผ
์์ธกํ๋ ๋ฐ์ดํฐ ์ ์ผ๋ก transactions ๋ฐ์ดํฐ๋ก ์ฝ์ด์จ
๊ฒฝ์ฐ 48,842ํ๊ณผ 115 ํญ๋ชฉ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
data(Adult) #arules์์ ์ ๊ณต๋๋ ๋ด์ฅ ๋ฐ์ดํฐ ๋ก๋ฉ
str(Adult) #Formal class 'transactions' , 48842(ํ)
Adult
attributes(Adult) #ํธ๋์ญ์
์ ๋ณ์์ ๋ฒ์ฃผ ๋ณด๊ธฐ
์์ฝ ํต๊ณ๋
summary(Adult)
์ ๋ขฐ๋ 80%, ์ง์ง๋ 10%์ด ์ ์ฉ๋ ์ฐ๊ด๊ท์น 6137 ๋ฐ๊ฒฌ
ar1 <- apriori(Adult, parameter = list(supp=0.1, conf=0.8))
ar2 <- apriori(Adult, parameter = list(supp=0.2)) # ์ง๋๋ ๋์
ar3 <- apriori(Adult, parameter = list(supp=0.2, conf=0.95)) # ์ ๋ขฐ๋ ๋์
ar4 <- apriori(Adult, parameter = list(supp=0.3, conf=0.95)) # ์ ๋ขฐ๋ ๋์
ar5 <- apriori(Adult, parameter = list(supp=0.35, conf=0.95)) # ์ ๋ขฐ๋ ๋์
ar6 <- apriori(Adult, parameter = list(supp=0.4, conf=0.95)) # ์ ๋ขฐ๋ ๋์
๊ฒฐ๊ณผ๋ณด๊ธฐ
inspect(head(ar6)) #์์ 6๊ฐ ๊ท์น ์ ๊ณต -> inspect() ์ ์ฉ
confidence(์ ๋ขฐ๋) ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ ์์ 6๊ฐ ์ถ๋ ฅ
inspect(head(sort(ar6, decreasing=T, by="confidence")))
lift(ํฅ์๋) ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ ์์ 6๊ฐ ์ถ๋ ฅ
inspect(head(sort(ar6, by="lift")))
์ฐ๊ด์ฑ ๊ท์น์ ๋ํ ๋ฐ์ดํฐ ์๊ฐํ๋ฅผ ์ํ ํจํค์ง
install.packages("arulesViz")
library(arulesViz) # rules๊ฐ ๋์ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๋ ํจํค์ง
plot(ar4) #x:์ง์ง๋(support), y:์ ๋ขฐ๋(conf) , ํฅ์๋(lift)์ ๋ํ ์ฐํฌ๋
plot(ar5, method="graph") #์ฐ๊ด๊ท์น ๋คํธ์ํฌ ๊ทธ๋ํ
* ๊ฐ ์ฐ๊ด๊ท์น ๋ณ๋ก ์ฐ๊ด์ฑ ์๋ ํญ๋ชฉ(item) ๋ผ๋ฆฌ ๋ฌถ์ฌ์ ๋คํธ์ํฌ ํํ๋ก ์๊ฐํ
4. ์๋ฃํ์ ํ์ผ ์์
library(arules)
#transactions ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
data("Groceries") #์๋ฃํ์ ๋ฐ์ดํฐ ๋ก๋ฉ
str(Groceries) # Formal class 'transactions' [package "arules"] with 4 slots
Groceries #9835 transactions (rows) and 169 items (columns)
ํ์) object@slots
Groceries@data
rules <- apriori(Groceries, parameter=list(supp=0.001, conf=0.8))
rules #410
inspect(rules)
๊ท์น์ ๊ตฌ์ฑํ๋ ์ผ์ชฝ(LHS) -> ์ค๋ฅธ์ชฝ(RHS)์ item ๋น๋์ ๋ณด๊ธฐ
plot(rules, method="grouped")
์ต๋ ๊ธธ์ด 3์ด๋ด๋ก ๊ท์น ์์ฑ
rules <- apriori(Groceries, parameter=list(supp=0.001, conf=0.80, maxlen=3))
inspect(rules) # 29๊ฐ ๊ท์น
confidence(์ ๋ขฐ๋) ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์์ผ๋ก ๊ท์น ์ ๋ ฌ
rules <- sort(rules, decreasing=T, by="confidence")
inspect(rules)
library(arulesViz) # rules๊ฐ ๋์ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๋ ํจํค์ง
plot(rules, method="graph", control=list(type="items"))
์ค์ฌ์ด ๊ธฐ์ค subset๋ง๋ค๊ธฐ
1. rhs = 'whole milk'
wmilk = subset(rules, rhs %in% 'whole milk')
wmilk #18
plot(wmilk, method="graph")
์ง์ง๋ ๋์ ์ํ : ๋์์ ๊ตฌ๋งค ๊ฐ๋ฅ์ฑ ๋์ ์ํ ex.ํ๋ธ, ๋กค๋นต, ์น์ฆ+ํ๋ฒ๊ฑฐ
ํฅ์๋ ๋์ ์ํ : ๊ด๋ จ์ฑ ๋์ ์ํ ex.์+์คํ
2. rhs = 'other vegetables'
ovege = subset(rules, rhs %in% 'other vegetables')
ovege #10
plot(ovege, method='graph')
์ง์ง๋+ํฅ์๋ ์ํ : ๊ณ ๊ธฐ๋ฅ, ์ผํ๋ฐฑ, ์+์๊ฑฐํธ
#3.lhs+์ฌ๋ฌ๊ฐ item์กฐํฉ (yogurt + rice)
yog_rice = subset(rules, lhs %in% c('yogurt','rice'))
yog_rice #6
inspect(yog_rice)
4.ํฌํจ๋ฌธ์ (๋ถ๋ถ ๋ฌธ์์ด)
milk = subset(rules, rhs %pin% 'milk')
milk #18