[ADP] 연관성 분석 (Association Analysis)
> # 17. 연관성 분석 (Association Analysis)
>
>
> library(arules)
>
> data("Groceries")
> dim(Groceries)
[1] 9835 169
> str(Groceries)
Formal class 'transactions' [package "arules"] with 3 slots
..@ data :Formal class 'ngCMatrix' [package "Matrix"] with 5 slots
.. .. ..@ i : int [1:43367] 13 60 69 78 14 29 98 24 15 29 ...
.. .. ..@ p : int [1:9836] 0 4 7 8 12 16 21 22 27 28 ...
.. .. ..@ Dim : int [1:2] 169 9835
.. .. ..@ Dimnames:List of 2
.. .. .. ..$ : NULL
.. .. .. ..$ : NULL
.. .. ..@ factors : list()
..@ itemInfo :'data.frame': 169 obs. of 3 variables:
.. ..$ labels: chr [1:169] "frankfurter" "sausage" "liver loaf" "ham" ...
.. ..$ level2: Factor w/ 55 levels "baby food","bags",..: 44 44 44 44 44 44 44 42 42 41 ...
.. ..$ level1: Factor w/ 10 levels "canned food",..: 6 6 6 6 6 6 6 6 6 6 ...
..@ itemsetInfo:'data.frame': 0 obs. of 0 variables
>
> itemFrequencyPlot(Groceries, topN=10, type='absolute')
> # itemFrequencyPlot() 함수로 절대 빈도수가 높은 10개의 아이템 확인 시각화
>
> itemFrequencyPlot(Groceries, topN=15)
> # 빈도수가 높은 15개의 품목을 상대적인 빈도로 시각화
>
> # 맥주(beer)에 관한 연관규칙을 모형화하기 위해 apriori() 함수 이용
> # Apriori 알고리즘을 사용하기 위해서는 최소지지도, 최소신뢰도, 아이템 세트가 가질 수 있는 장바구니 크기의 최소값과 최대값을 결정해야 한다.
> rules <- apriori(Groceries, parameter = list(sup=0.001,conf=0.9,maxlen=4))
Apriori
Parameter specification:
confidence minval smax arem aval originalSupport maxtime support minlen maxlen target ext
0.9 0.1 1 none FALSE TRUE 5 0.001 1 4 rules TRUE
Algorithmic control:
filter tree heap memopt load sort verbose
0.1 TRUE TRUE FALSE TRUE 2 TRUE
Absolute minimum support count: 9
set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[169 item(s), 9835 transaction(s)] done [0.00s].
sorting and recoding items ... [157 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 4 done [0.01s].
writing ... [67 rule(s)] done [0.00s].
creating S4 object ... done [0.00s].
경고메시지(들):
In apriori(Groceries, parameter = list(sup = 0.001, conf = 0.9, :
Mining stopped (maxlen reached). Only patterns up to a length of 4 returned!
> rules
set of 67 rules
>
> options(digits = 2)
> rules <- sort(rules, by='lift', decreasing = TRUE)
> inspect(rules[1:5]) # 규칙을 찾는 함수는 inspect() 함수이다.
lhs rhs support confidence coverage lift count
[1] {liquor,red/blush wine} => {bottled beer} 0.0019 0.90 0.0021 11.2 19
[2] {root vegetables,butter,cream cheese } => {yogurt} 0.0010 0.91 0.0011 6.5 10
[3] {citrus fruit,root vegetables,soft cheese} => {other vegetables} 0.0010 1.00 0.0010 5.2 10
[4] {pip fruit,whipped/sour cream,brown bread} => {other vegetables} 0.0011 1.00 0.0011 5.2 11
[5] {butter,whipped/sour cream,soda} => {other vegetables} 0.0013 0.93 0.0014 4.8 13
> # 가장 큰 향상도를 보이는 규칙은 병맥주(Bottled beer)를 살 때 증류수나 와인을 함께 구매하는 것이다.
>
> # 신뢰도 기준으로 내림차순으로 정렬하고 신뢰도가 높은 5개의 규칙을 보여준다.
> rules <- sort(rules, by='confidence', decreasing = TRUE)
> inspect(rules[1:5])
lhs rhs support confidence coverage lift count
[1] {citrus fruit,root vegetables,soft cheese} => {other vegetables} 0.0010 1 0.0010 5.2 10
[2] {pip fruit,whipped/sour cream,brown bread} => {other vegetables} 0.0011 1 0.0011 5.2 11
[3] {rice,sugar} => {whole milk} 0.0012 1 0.0012 3.9 12
[4] {canned fish,hygiene articles} => {whole milk} 0.0011 1 0.0011 3.9 11
[5] {root vegetables,butter,rice} => {whole milk} 0.0010 1 0.0010 3.9 10
> # 이 표에서 신뢰도는 모두 100%이다.
>
> # arules 패키지의 crossTable() 함수를 이용해 교차표를 만들고 처음 3행과 3열을 확인한다.
> tab <- crossTable(Groceries)
> tab[1:3,1:3]
frankfurter sausage liver loaf
frankfurter 580 99 7
sausage 99 924 10
liver loaf 7 10 50
> # 소비자들이 Sausage를 구매한 924번 중 10번 liver loaf를 구매했다.
>
> # 병맥주(Bottled beer)에 대한 규칙을 추출한다. apriori() 함수를 사용하고 appearance라는 구문을 이용하여 우변의 값을 병맥주를 구매할 확률로 지정하고, 좌변의 값을 우변의 값을 증가시키는 품목들로 지정한다. 단 최소지지도와 최소신뢰도를 높게 조정을 하게 되면 연관규칙의 수가 당연히 감소함을 알 수 있다.
> beer.rules <- apriori(data = Groceries, parameter = list(support=0.0015,confidence=0.3), appearance = list(default="lhs",rhs="bottled beer"))
Apriori
Parameter specification:
confidence minval smax arem aval originalSupport maxtime support minlen maxlen target ext
0.3 0.1 1 none FALSE TRUE 5 0.0015 1 10 rules TRUE
Algorithmic control:
filter tree heap memopt load sort verbose
0.1 TRUE TRUE FALSE TRUE 2 TRUE
Absolute minimum support count: 14
set item appearances ...[1 item(s)] done [0.00s].
set transactions ...[169 item(s), 9835 transaction(s)] done [0.00s].
sorting and recoding items ... [153 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 4 5 6 done [0.01s].
writing ... [4 rule(s)] done [0.00s].
creating S4 object ... done [0.00s].
> beer.rules
set of 4 rules
>
> beer.rules <- sort(beer.rules, decreasing = TRUE, by='lift')
> inspect(beer.rules)
lhs rhs support confidence coverage lift count
[1] {liquor,red/blush wine} => {bottled beer} 0.0019 0.90 0.0021 11.2 19
[2] {liquor} => {bottled beer} 0.0047 0.42 0.0111 5.2 46
[3] {soda,red/blush wine} => {bottled beer} 0.0016 0.36 0.0046 4.4 16
[4] {other vegetables,red/blush wine} => {bottled beer} 0.0015 0.31 0.0050 3.8 15
> # 병맥주의 구매는 증류수나 레드와인과 관련이 있음을 알 수 있다.
>
> tab['bottled beer','red/blush wine']
[1] 48
> tab['red/blush wine','red/blush wine']
[1] 189
> # 48/189=0.25
> tab['bottled beer','white wine']
[1] 22
> tab['white wine','white wine']
[1] 187
> # 22/187=0.12
> # 레드와인을 구매할 경우 25%의 확률로 병맥주를 함께 구매하지만, 화이트와인의 경우에는 확률이 12%로 줄어들었다.
>
출처 : 2020 데이터 분석 전문가 ADP 필기 한 권으로 끝내기