지난번 포스팅에서는 거래 데이터 (transaction data)를 가지고 R을 사용하여 연관규칙 분석을 하였습니다.

 

이번 포스팅에서는 범주형 데이터와 연속형 데이터를 가지고 연관규칙을 생성(association rule mining on categorical data and continuous data)하는 방법을 소개하겠습니다. 

 

보통 연관규칙 분석을 배운다고 하면 거래 데이터(transaction data)만 가능한걸로 알고 끝내기 쉬운데요, 범주형 또는 연속형 데이터에 대해서도 연관규칙을 생성할 수 있다는 것을 알고 나면 연관규칙을 적용할 수 있는 범위가 늘어납니다.

 

가령 범주형 데이터를 가지고 연관규칙을 찾는 다면 아래와 같은 예가 있을 수 있습니다. 연속형 데이터를 범주형 데이터로 변환 (이산형화, discretization)하면 위의 예와 같은 연관규칙을 도출할 수 있습니다. 아래 예에서는 '연령'을 '연령대'로 구간을 나누었습니다.

 

 

 

[범주형 데이터 연관규칙 예]

 

{선형대수 수강 = Pass, 통계/확률 수강 = Pass}  →  {Machine Learning 수강 = Pass}

 

{성별 = 여성, 거주지역 = 분당, 연령대 = 30세~39세, 아동용품 구매경험 여부 = Yes}  →  {모바일쇼핑재구매 = Yes} 

 

 

범주형 데이터 또는 연속형 데이터를 가지고 연관규칙 분석을 하는 기본 원리는 "이항 데이터(binary data)로 변환하여 연관규칙 분석 방법을 수행"하는 것입니다.

 

아래의 가상의 데이터셋을 가지고 예를 들어보겠습니다.

성별(Gender), 아동상품구매여부(Child_Prd_YN), 모바일앱이용여부(Mobile_App_Use), 재구매여부(Re_Order) 등의 변수는 범주형 데이터(categorical data)이며, 연령(Age)은 연속형 데이터(continuous data)에 속합니다.  이를 '1', '0' 의 두개의 값만 가지는 변수로 변환하는 이항변수화(Binarization)을 하면 아래와 같습니다.

 

 

[ 범주형/연속형 데이터의 이항변수화 (Binarization) ]

 

 

 

이항변수화를 할 때 구간을 몇 개로 나눌 것인지가 중요한데요, 너무 잘게 쪼개서 구간을 많이 만들게 되면 연관규칙이 잘 안나올 수 있습니다. 왜냐하면 구간을 잘게 쪼개면 각 구간별 freqnency 가 작아져서 지지도(support) 값이 낮아지고, inqrequent item set은 pruning 되기 때문입니다.  따라서 적당한(?) 구간으로 (너무 잘게 쪼개지 않게) 나누는 것이 필요합니다.  위의 예에서는 연령(age)의 경우 20대, 30대, 40대의 3개 구간으로만 나누어보았습니다.

 

 

R을 가지고 위의 가상의 간략한 예제 데이터를 가지고 연관규칙을 생성해보겠습니다.

 

R의 as(dataset, "transactions") 함수를 이용하면 연관규칙분석을 위한 이항변수화(binirization) 작업을 별도로 안해줘도 되므로 편리합니다. 단, 연속형 변수를 범주형 변수로 만드는 이산형화(discretization)하는 작업은 아래 예처럼 코딩을 해줘야 합니다.

 

 

(1) 범주형 dataset 확보, 연속형 변수의 이산형화(discretization)

 

> ##--------------------------------------------------------------
> ## categorical data -> binarization -> association rule analysis
> ##--------------------------------------------------------------
> 
> # vector -> cbind -> data.frame
> cust_id <- c(1, 2, 3, 4, 5, 6)
> gender <- c("FEMALE", "MALE", "FEMALE", "FEMALE", "MALE", "FEMALE")
> age <- c(23, 28, 42, 34, 45, 36)
> child_prd_yn <- c("NO", "NO", "NO", "YES", "NO", "YES")
> mobile_app_use <- c("YES", "YES", "NO", "YES", "NO", "YES")
> re_order <- c("YES", "NO", "NO", "YES", "NO", "YES")
> 
> cust_mart <- cbind(cust_id, gender, age, child_prd_yn, mobile_app_use, re_order)
> cust_mart <- as.data.frame(cust_mart)
> sapply(cust_mart, class)
       cust_id         gender            age   child_prd_yn mobile_app_use       re_order 
      "factor"       "factor"       "factor"       "factor"       "factor"       "factor" 
> 
> 
> # cust_id : factor -> character
> # age : factor -> numeric
> cust_mart <- transform(cust_mart, 
+                        cust_id = as.character(cust_id),
+                        age = as.numeric(age))
> 
> sapply(cust_mart, class)
       cust_id         gender            age   child_prd_yn mobile_app_use       re_order 
   "character"       "factor"      "numeric"       "factor"       "factor"       "factor" 
> 
> 
> # age : custinuous data -> discretization
> cust_mart <- within(cust_mart, {
+   age_cd = character(0)
+   age_cd[ age <= 29 ] = "age_20"
+   age_cd[ age > 29 & age <= 39 ] = "age_30"
+   age_cd[ age > 39 ] = "age_40"
+   age_cd = factor(age_cd, level = c("age_20", "age_30", "age_40"))
+ })
> 
> 
> # dataset for assocition rule : (1) deleting 'cust_id', 'age'
> cust_mart_ar <- subset(cust_mart, select = -c(cust_id, age))
> str(cust_mart_ar)
'data.frame':	6 obs. of  5 variables:
 $ gender        : Factor w/ 2 levels "FEMALE","MALE": 1 2 1 1 2 1
 $ child_prd_yn  : Factor w/ 2 levels "NO","YES": 1 1 1 2 1 2
 $ mobile_app_use: Factor w/ 2 levels "NO","YES": 2 2 1 2 1 2
 $ re_order      : Factor w/ 2 levels "NO","YES": 2 1 1 2 1 2
 $ age_cd        : Factor w/ 3 levels "age_20","age_30",..: 1 1 1 1 1 1
> 

 

 

 

(2) 거래데이터 형식으로 데이터 변환하기 : as(dataset, "transactions")

 

> # dataset for assocition rule : (2) transaction data format
> install.packages("arules")
Installing package into ‘C:/Users/Owner/Documents/R/win-library/3.2’
(as ‘lib’ is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.2/arules_1.4-1.zip'
Content type 'application/zip' length 1885277 bytes (1.8 MB)
downloaded 1.8 MB

package ‘arules’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\Owner\AppData\Local\Temp\Rtmp0ybsUO\downloaded_packages
> library(arules)
필요한 패키지를 로딩중입니다: Matrix

다음의 패키지를 부착합니다: ‘arules’

The following objects are masked from ‘package:base’:

    abbreviate, write

Warning message:
패키지 ‘arules’는 R 버전 3.2.5에서 작성되었습니다 
> 
> cust_mart_ar_tr <- as(cust_mart_ar, "transactions")
> str(cust_mart_ar_tr)
Formal class 'transactions' [package "arules"] with 3 slots
  ..@ data       :Formal class 'ngCMatrix' [package "Matrix"] with 5 slots
  .. .. ..@ i       : int [1:30] 0 2 5 7 8 1 2 5 6 8 ...
  .. .. ..@ p       : int [1:7] 0 5 10 15 20 25 30
  .. .. ..@ Dim     : int [1:2] 11 6
  .. .. ..@ Dimnames:List of 2
  .. .. .. ..$ : NULL
  .. .. .. ..$ : NULL
  .. .. ..@ factors : list()
  ..@ itemInfo   :'data.frame':	11 obs. of  3 variables:
  .. ..$ labels   : chr [1:11] "gender=FEMALE" "gender=MALE" "child_prd_yn=NO" "child_prd_yn=YES" ...
  .. ..$ variables: Factor w/ 5 levels "age_cd","child_prd_yn",..: 3 3 2 2 4 4 5 5 1 1 ...
  .. ..$ levels   : Factor w/ 7 levels "age_20","age_30",..: 4 5 6 7 6 7 6 7 1 2 ...
  ..@ itemsetInfo:'data.frame':	6 obs. of  1 variable:
  .. ..$ transactionID: chr [1:6] "1" "2" "3" "4" ...
> 

 

 

 

 

(3) 연관규칙 생성 (association rule generation) : arules package, apriori algorithm

 

 

> # association rule generation
> cust_mart_ar_tr_rule <- apriori(cust_mart_ar_tr, 
+                              parameter = list(support = 0.3, confidence = 0.5))
Apriori

Parameter specification:
 confidence minval smax arem  aval originalSupport support minlen maxlen target   ext
        0.5    0.1    1 none FALSE            TRUE     0.3      1     10  rules FALSE

Algorithmic control:
 filter tree heap memopt load sort verbose
    0.1 TRUE TRUE  FALSE TRUE    2    TRUE

Absolute minimum support count: 1 

Warning in apriori(cust_mart_ar_tr, parameter = list(support = 0.3, confidence = 0.5)) :
  You chose a very low absolute support count of 1. You might run out of memory! Increase minimum support.

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[9 item(s), 6 transaction(s)] done [0.00s].
sorting and recoding items ... [9 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 4 5 done [0.00s].
writing ... [135 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].

 

 

(4) 연관규칙 탐색 (inspection of association rule) : inspect(association rule)

 

 

> # association rule inspection > inspect(head(cust_mart_ar_tr_rule, 20)) # head 20 rules lhs rhs support confidence lift 1 {} => {re_order=YES} 0.5000000 0.5000000 1.0 2 {} => {re_order=NO} 0.5000000 0.5000000 1.0 3 {} => {child_prd_yn=NO} 0.6666667 0.6666667 1.0 4 {} => {mobile_app_use=YES} 0.6666667 0.6666667 1.0 5 {} => {gender=FEMALE} 0.6666667 0.6666667 1.0 6 {} => {age_cd=age_20} 1.0000000 1.0000000 1.0 7 {gender=MALE} => {re_order=NO} 0.3333333 1.0000000 2.0 8 {re_order=NO} => {gender=MALE} 0.3333333 0.6666667 2.0 9 {gender=MALE} => {child_prd_yn=NO} 0.3333333 1.0000000 1.5 10 {child_prd_yn=NO} => {gender=MALE} 0.3333333 0.5000000 1.5 11 {gender=MALE} => {age_cd=age_20} 0.3333333 1.0000000 1.0 12 {mobile_app_use=NO} => {re_order=NO} 0.3333333 1.0000000 2.0 13 {re_order=NO} => {mobile_app_use=NO} 0.3333333 0.6666667 2.0 14 {mobile_app_use=NO} => {child_prd_yn=NO} 0.3333333 1.0000000 1.5 15 {child_prd_yn=NO} => {mobile_app_use=NO} 0.3333333 0.5000000 1.5 16 {mobile_app_use=NO} => {age_cd=age_20} 0.3333333 1.0000000 1.0 17 {child_prd_yn=YES} => {re_order=YES} 0.3333333 1.0000000 2.0 18 {re_order=YES} => {child_prd_yn=YES} 0.3333333 0.6666667 2.0 19 {child_prd_yn=YES} => {mobile_app_use=YES} 0.3333333 1.0000000 1.5 20 {mobile_app_use=YES} => {child_prd_yn=YES} 0.3333333 0.5000000 1.5

 

 

 

(5) 특정 관심있는 연관규칙만 선별해서 보기 : subset()

 

  예) 연관규칙의 right-hand side 에 "재구매여부=예"를 포함하고 "lift >=2" 인 rule만 선별(subset)

 

> # subset : right-hand sied in "re_order = YES" & lift >= 2 > cust_mart_ar_tr_rule_reorder <- subset(cust_mart_ar_tr_rule, + subset = rhs %in% "re_order=YES" & lift >= 2) > > inspect(cust_mart_ar_tr_rule_reorder) lhs rhs support confidence lift 1 {child_prd_yn=YES} => {re_order=YES} 0.3333333 1 2 2 {child_prd_yn=YES, mobile_app_use=YES} => {re_order=YES} 0.3333333 1 2 3 {gender=FEMALE, child_prd_yn=YES} => {re_order=YES} 0.3333333 1 2 4 {child_prd_yn=YES, age_cd=age_20} => {re_order=YES} 0.3333333 1 2 5 {gender=FEMALE, mobile_app_use=YES} => {re_order=YES} 0.5000000 1 2 6 {gender=FEMALE, child_prd_yn=YES, mobile_app_use=YES} => {re_order=YES} 0.3333333 1 2 7 {child_prd_yn=YES, mobile_app_use=YES, age_cd=age_20} => {re_order=YES} 0.3333333 1 2 8 {gender=FEMALE, child_prd_yn=YES, age_cd=age_20} => {re_order=YES} 0.3333333 1 2 9 {gender=FEMALE, mobile_app_use=YES, age_cd=age_20} => {re_order=YES} 0.5000000 1 2 10 {gender=FEMALE, child_prd_yn=YES, mobile_app_use=YES, age_cd=age_20} => {re_order=YES} 0.3333333 1 2

 

 

 

제일 마지막 결과까지 보고 나면 '어, 저거 rule-base 규칙인데...어디서 많이 본건데...' 싶지 않으신가요?  Decision Tree랑 뭔가 모르게 비슷하다는 생각이 좀 들지요?  혹시 명확한 target을 가진 (설명력이 좋은) 분류 규칙 찾는 목적이라면 Decision Tree 를 쓰는게 더 효과적일 수 있습니다.  (가령, 재구매고객의 특성이 뭐지? 처럼요)

 

그런데 뭔지는 지금은 모르겠지만 '기존에는 잘 몰랐으면서 & insight가 담겨있고 & 설명가능하고 & 실행가능한' 연관규칙을 한번 찾아봐 줘, 그러면 내가 그 rule들을 평가해보고 쓸만한거 추려서 이용해볼게...하는 상황이면 연관규칙 분석을 사용하시면 됩니다. 

 

Decision Tree는 하햐식 방식(Top to bottom)으로 분류규칙을 만들어나가는데 반해 (즉, child node는 parent node에 종속적), 연관규칙, 순차패턴은 규칙이 서로 독립적이라는게 다릅니다.

 

이상으로 범주형, 연속형 데이터의 연관규칙 분석에 대해서 알아보았습니다.

 

다음번 포스팅에서는 순차분석(sequence analysis)에 대해서 알아보겠습니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡'를 꾸욱~ 눌러주세요.

 

728x90
반응형
Posted by Rfriend
,

지난 포스팅에서 기계학습의 정의, 학습 및 과적합(overfitting)에 대한 큰 그림, 개략적이고 이론적인 내용을 다루었습니다.

 

이번 포스팅부터는 기계학습 분석 기법의 각론으로 들어가보겠습니다.

 

먼저, Y값(종속변수, 목표변수)이 없는 상태에서 데이터 속에 숨겨져 있는 패턴, 규칙을 찾아내는 비지도학습(unsupervised learning)의 하나인 '연관규칙분석(Association Rule Analysis)', 혹은 유통업계에서 사용하는 용어로 '장바구니분석(Market Basket Analysis)'에 대해서 알아보겠습니다.

 

보통 기계학습, 데이터마이닝 교육을 받는다고 하면 단골메뉴로 나오는 분석 기법이기도 하며, "맥주와 기저귀" 사례(이거 가짜 사례임... -_-')와 함께 많이 회자되곤 합니다.  그러다 보니 '회귀분석' 만큼이나 분석 강의 좀 들어봤다 하는 사람이면 열에 아홉은 연관규칙분석을 들어는 봤고, 그러다보니 만만하게(?) 보는 것도 좀 있는 것 같고요, rule이 엄청 많이 나오는데 그중에서 쓸모있는 것은 별로 찾지 못해서 재미를 잘 못보고 평가절하받는 기법인것도 같습니다.  

 

 

B2C 업종에 종사하는 분이라면 약방의 감초처럼 빼놓을 수 없는게 상품추천(recommendation) 일텐데요, 추천을 위해 많이 사용하는 분석 기법이 연관규칙분석, 순차분석입니다.

 

 

 

상품 추천에 사용하는 분석기법들을 아주 간략히 소개하자면,

  • 연관규칙분석, 장바구니분석 (Association Rule Analysis, Market Basket Analysis) : 고객의 대규모 거래데이터로부터 함께 구매가 발생하는 규칙(: A à 동시에 B)을 도출하여, 고객이 특정 상품 구매 시 이와 연관성 높은 상품을 추천
  • 순차분석 (Sequence Analysis)고객의 시간의 흐름에 따른 구매 패턴(A à 일정 시간 후 B)을 도출하여, 고객이 특정 상품 구매 시 일정 시간 후 적시에 상품 추천
  • Collaborative Filtering모든 고객의 상품 구매 이력을 수치화하고, 추천 대상이 되는 고객A와 다른 고객B에 대해 상관계수를 비교해서, 서로 높은 상관이 인정되는 경우 고객B가 구입 완료한 상품 중에 고객A가 미구입한 상품을 고객A에게 추천
  • Contents-based recommendation고객이 과거에 구매했던 상품들의 속성과 유사한 다른 상품 아이템 중 미구매 상품을 추천 (Collaborative Filtering유사 고객을 찾는 것과 비교됨)
  • Who-Which modeling특정 상품()을 추천하는 모형을 개발 (: 신형 G5 핸드폰 추천 스코어모형)하여 구매 가능성 높은(: 스코어 High) 고객() 대상 상품 추천

등이 있습니다. 

 

 

상품 추천은 이미 몇 십년 전부터 실전에 적용이 되어 왔고, 그 선진 업체들의 경우 효과를 톡톡히 보고 있습니다.

추천은 그 자체로 환전성이 있기 때문에 가치가 있다. 넷플릭스의 경우 대여되는 영화의 2/3가 추천을 통해 발생했으며, 구글 뉴스(Google News)의 경우 38% 이상이 추천을 통해서 조회가 발생하는 것으로 알려져 있다. 또한 아마존의 경우에도 추천을 통해 판매가 전체 매출액의 35%를 넘는다. ...

 

* 출처 : 넷플릭스의 빅데이터, 인문학적 상상력과의 접점, 조영신, KISDI 동향 Focus 

 

물론 연관규칙이나 순차분석만 가지고 상품추천하는 것은 아닙니다만, 연관규칙분석, 순차분석은 상품추천에 활용할 수 있는 가장 기본적인 분석기법임에는 틀림없습니다.  아래에 넥플릭스에서 상품추천에 이용하는 알고리즘 소개글을 보면 사용할 수 있는 데이터를 모조리 모아서, 분석기법을 여러개 조합해서 상품추천을 하고 있는것으로 보입니다.

 

넥플릭스는 이용자들이 동영상에 매긴 별점과 위치정보, 기기정보, 플레이버튼 클릭 수, 평일과 주말에 따른 선호 프로그램, 소셜 미디어 내에서 언급된 횟수 등을 분석해 알고리즘을 개발했다. 

* 출처 : 넷플릭스의 빅데이터, 인문학적 상상력과의 접점, 조영신, KISDI 동향 Focus 

 

 

암튼, 서두가 길었습니다.  연관규칙 본론으로 들어가겠습니다.

 

규칙(rule)이란 "if condition then result"  (if A --> B) 의 형식으로 표현을 합니다.

 

연관규칙(association rule)은 특정 사건이 발생하였을 때 함께 (빈번하게) 발생하는 또 다른 사건의 규칙을 말합니다. 

 

연관규칙에서 사용하는 기본 용어에 대해서 짚고 넘어가자면,

  • 항목 집합 (Item set) : 전체 Item (I) 중에서 가능한 부분 집합,
  • 항목 집합의 집합 (The set of item sets) : Item의 부분집합들로 구성된 집합,

 

연관규칙을 다시 좀 어려운 위의 용어를 사용해서 써보자면, 연관규칙이란 특정 항목 집합이 발생하였을 때 또 다른 항목 집합이 발생하는 규칙을 말합니다.

 

 

가령,

 

{맥주} --> {기저귀} 

  : 맥주를 사는 고객은 기저귀도 같이 산다

 

{남성, 금요일, 맥주} --> {기저귀}

  : 금요일에 맥주를 사는 남성 고객은
    기저귀도 같이 산다

 

같은 규칙이 연관규칙의 예가 되겠습니다.

 

 

 

 

연관규칙분석, 장바구니분석, 순차분석... 용어가 좀 헷갈릴 수 도 있는데요, 개념 이해를 위해 비교를 해보자면요,

 

연관규칙(association rule)은 "What goes WITH what?" 즉, 동시 구매품목에 관심을 가지는데 비해서, 순차분석(sequeuce analysis)은 "What goes AFTER what?" 처럼 시간의 순서에 따른 규칙에 관심을 가집니다.  연관분석할 때는 주문번호, 고객ID, 구매상품코드만 있으면 되는데요, 순차분석을 하려면 "Time-stamp" 변수가 추가로 꼭 필요합니다.

 

장바구니분석(Market basket analysis)는 연관규칙을 유통업에서 부르는 용어입니다. 도식화하자면 장바구니분석은 연관규칙의 부분집합(?)이라고도 할 수 있겠네요.

 

 

 

유통업에서 장바구니분석(연관분석)을 통해 상품 추천뿐만이 아니라 상품 진열이라든지 상품 패키징, 번들링, (홈쇼핑의 경우) 방송순서나 카달로그 배치 등 다방면에 적용을 할 수 있습니다.

 

연관규칙은 유통업말고도 여러 업종에서 사용되는데요, 의료계에서는 암 데이터 분석에서 단백질 서열과 자주 발견되는 DNA 패턴을 찾는다던지, 증상과 질병 간 연관관계 등을 찾는데 연관규칙을 사용합니다.

 

순차분석은 의료비 허위 청구 순서 패턴을 찾는다던지, 휴대폰서비스 이용 부당행위 사전 조합 식별, 불량 유발 공정/장비 패턴 탐지, 웹사이트나 모바일앱의 메뉴별 클릭 스트림 분석 등을 하는데 사용할 수 있습니다.

 

다음번 포스팅에서는 연관규칙의 평가 척도 (지지도, 신뢰도, 향상도)에 대해서 알아보도록 하겠습니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡'를 꼬옥 눌러주세요. ^^

 

728x90
반응형
Posted by Rfriend
,