지난번 포스팅에서는 범주형 및 연속형 데이터에 대한 연관규칙 분석에 대하여 알아보았습니다.

 

이번 포스팅에서는 시간(time), 순서(sequence)를 고려한 순차패턴분석(sequence pattern analysis)에 대하여 소개하겠습니다.

 

먼저, 연관규칙(association rule)과 순차패턴규칙의 차이점을 '분석 주안점', '활용 데이터 항목', '흥미도/유용성 평가 척도'의 관점에서 표로 비교해보면 아래와 같습니다.

 

If A then B 형식의 데이터 속에 숨겨져있는 규칙을 찾아낸다는 면에서는 같습니다만, 순차패턴분석의 경우 "What goes AFTER what?" 과 같이 시간/순서에 따른 사건의 규칙을 찾는다는 점, 데이터셋에 Identity information (Customer Identifier, or Event ID), TimeStamp (Sequence information, or Sequence ID) 변수가 있어야 한다는 점, 그리고 Support 척도만 제공할 뿐 연관규칙에서 썼던 Confidence, Lift는 없다는 점이 연관규칙과는 다릅니다.

 

 

 

 

 

순차패턴분석에서 사용하는 데이터셋은 아래처럼 고객ID (or Event ID)별로 TimeStampe (or Sequence ID)의 시간 순서로 거래 데이터가 정리된 형태(ordered by customer ID and TimeStamp)로 되어있습니다.

 

 

 

 

항목집합을 순서로 나타낸 리스트를 sequence라고 하며, 를 j번째 항목집합이라고 할 때 으로 표기합니다.

 

순차패턴분석에서 사용하는 규칙 흥미도 척도인 Support(s) = Sequence s를 포함하는 고객의 비율 입니다.

 

특정 최소 지지도(support) 이상을 가지는 sequence를 빈발 시퀀스(large sequence) 라고 합니다. 순차적 패턴 탐사 문제는 빈발 시퀀스 중에서 최대 시퀀스(maximal sequence)들을 찾는 것이라고 할 수 있습니다.

 

순차 패턴 분석 알고리즘 (Agrawal and Srikant, 1995)은 다음의 단계들로 구성되어 있습니다.

 

 

1) 정렬 단계 : Transaction database를 고객 sequence data로 전환한다.

 

2) 빈발항목집합 단계 : 고객 시퀀스의 항목집합 또는 이의 부분집합 중 최소 지지도(고객비율 사용) 이상인 것들을 빈발항목집합으로 도출한다. 편의상 각 빈발 항목집합에 일련번호를 부여한다.

 

3) 변환 단계 : 고객 시퀀스를 빈발항목집합을 사용한 시퀀스로 변환한다.

 

4) 시퀀스 단계 : 빈발 시퀀스를 도출한다.

 

5) 최대화 단계 : 빈발 시퀀스로부터 최대 시퀀스를 탐색한다.

 

 

(* 출처 : 데이터마이닝 기법과 응용, 전치혁 지음, 한나래 아카데미)

 

 

순차적 패턴 탐사 알고리즘에 대해서는 깊이 들어가지는 않겠으며, R의 arulesSequences package 사용법 중심으로 이번 포스팅을 이어가겠습니다.

 

 

1) "arulesSequences" package installation and loading

 

arulesSequences package는 M. Zaki가 개발한 cSPADE 알고리즘을 사용하여 빈발 순차 패턴을 탐색합니다. 이 알고리즘은 효율적인 격자 탐색 기법과 함께 temporal joins을 이용하며 시간 제약을 제공합니다. (Mining frequent sequential patterns with the cSPADE algorithm. This algorithm utilizes temporal joins along with efficient lattice search techniques and provides for timing constraints.  - help(arulesSequences) -)

 

> ##----------------------------------------
> ## sequence analysis
> ##----------------------------------------
> ## 'arulesSequences' package installation, loading
> install.packages("arulesSequences")
Installing package into ‘C:/Users/Owner/Documents/R/win-library/3.3’
(as ‘lib’ is unspecified)
also installing the dependency ‘arules’

trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.3/arules_1.4-1.zip'
Content type 'application/zip' length 1889108 bytes (1.8 MB)
downloaded 1.8 MB

trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.3/arulesSequences_0.2-15.zip'
Content type 'application/zip' length 4002231 bytes (3.8 MB)
downloaded 3.8 MB

package ‘arules’ successfully unpacked and MD5 sums checked
package ‘arulesSequences’ successfully unpacked and MD5 sums checked

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

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

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

    abbreviate, write

 

 

 

 

2) transaction dataset 준비

 

순차분석 예제 데이터로는 package "arules"에 내장되어 있는 "zaki" transactions (3 variables : sequenceID, eventID, SIZE) dataset을 사용하겠습니다.

 

 

> ## zaki transaction Dataset
> data(zaki)
> str(zaki)
Formal class 'transactions' [package "arules"] with 3 slots
  ..@ data       :Formal class 'ngCMatrix' [package "Matrix"] with 5 slots
  .. .. ..@ i       : int [1:27] 2 3 0 1 2 0 1 5 0 2 ...
  .. .. ..@ p       : int [1:11] 0 2 5 8 12 15 16 19 22 24 ...
  .. .. ..@ Dim     : int [1:2] 8 10
  .. .. ..@ Dimnames:List of 2
  .. .. .. ..$ : NULL
  .. .. .. ..$ : NULL
  .. .. ..@ factors : list()
  ..@ itemInfo   :'data.frame':	8 obs. of  1 variable:
  .. ..$ labels: chr [1:8] "A" "B" "C" "D" ...
  ..@ itemsetInfo:'data.frame':	10 obs. of  3 variables:
  .. ..$ sequenceID: int [1:10] 1 1 1 1 2 2 3 4 4 4
  .. ..$ eventID   : int [1:10] 10 15 20 25 15 20 10 10 20 25
  .. ..$ SIZE      : int [1:10] 2 3 3 4 3 1 3 3 2 3

 

> help(zaki)
zaki {arulesSequences} R Documentation

Zaki Data Set

Description

A small example database for sequence mining provided as an object of class transactions and as a text file.

Usage

data(zaki)

Details

The data set contains the sequential database described in the paper by M. J. Zaki for illustration of the concepts of sequence mining. sequenceID and eventID denote the sequence and event (time) identifiers of the transactions.

Source

M. J. Zaki. (2001). SPADE: An Efficient Algorithm for Mining Frequent Sequences. Machine Learning Journal, 42, 31–60.

 

 

> as(zaki, "data.frame")
       items sequenceID eventID SIZE
1      {C,D}          1      10    2
2    {A,B,C}          1      15    3
3    {A,B,F}          1      20    3
4  {A,C,D,F}          1      25    4
5    {A,B,F}          2      15    3
6        {E}          2      20    1
7    {A,B,F}          3      10    3
8    {D,G,H}          4      10    3
9      {B,F}          4      20    2
10   {A,G,H}          4      25    3

 

 

 

3) 순차패턴분석

 

cspade(dataset, parameter, control) 함수를 사용하여 순차 패턴 탐사를 진행하여보겠습니다.

 

parameter

 - support : a numeric value specifying the minimum support of a sequence (default 0.1, range [0,1]).

 - maxsize : an integer value specifying the maximum number of items of an element of a sequence (default 10, range > 0)

 - maxlen : an integer value specifying the maximum number of elements of a sequence (default 10, range > 0)

 - maxwin : an integer value specifying the maximum time difference between any two elements of a sequence (default none, range >= 0)

 

> ## sequential pattern analysis : cspade()
> seq_rule_1 <- cspade(zaki, 
+                      parameter = list(support = 0.3, maxsize = 5, maxlen = 4), 
+                      control= list(verbose = TRUE))

parameter specification:
support : 0.3
maxsize :   5
maxlen  :   4

algorithmic control:
bfstype  : FALSE
verbose  :  TRUE
summary  : FALSE
tidLists : FALSE

preprocessing ... 1 partition(s), 0 MB [0.03s]
mining transactions ... 0 MB [0.03s]
reading sequences ... [0.04s]

total elapsed time: 0.1s

 

 

 

 

4) 순차 패턴 규칙 조회

 

summary(rule), as(rule, "data.frame") 함수를 이용해서 순차 패턴 규칙을 조회해보겠습니다.

 

> ## sequence pattern rule summary
> summary(seq_rule_1)
set of 18 sequences with

most frequent items:
      A       B       F       D (Other) 
     11      10      10       8      28 

most frequent elements:
    {A}     {D}     {B}     {F}   {B,F} (Other) 
      8       8       4       4       4       3 

element (sequence) size distribution:
sizes
1 2 3 
8 7 3 

sequence length distribution:
lengths
1 2 3 4 
4 8 5 1 

summary of quality measures:
    support      
 Min.   :0.5000  
 1st Qu.:0.5000  
 Median :0.5000  
 Mean   :0.6528  
 3rd Qu.:0.7500  
 Max.   :1.0000  

includes transaction ID lists: FALSE 

mining info:
 data ntransactions nsequences support
 zaki            10          4     0.3

 

> as(seq_rule_1, "data.frame")
          sequence support
1            <{A}>    1.00
2            <{B}>    1.00
3            <{D}>    0.50
4            <{F}>    1.00
5          <{A,F}>    0.75
6          <{B,F}>    1.00
7        <{D},{F}>    0.50
8      <{D},{B,F}>    0.50
9        <{A,B,F}>    0.75
10         <{A,B}>    0.75
11       <{D},{B}>    0.50
12       <{B},{A}>    0.50
13       <{D},{A}>    0.50
14       <{F},{A}>    0.50
15   <{D},{F},{A}>    0.50
16     <{B,F},{A}>    0.50
17 <{D},{B,F},{A}>    0.50
18   <{D},{B},{A}>    0.50

 



5) 순차 규칙 선별 (Subsetting sequence rule)

 

순차 규칙 내 원소의 개수(element size)가 2개 이상인 규칙만 선별해보겠습니다. 



> # making the sequence rule as a DataFrame

> seq_rule_1_df <- as(seq_rule_1, "data.frame")

> # calculate the size of the elements per each rule

> seq_rule_1_size <- size(seq_rule_1)

> # combine the element size with the sequence rule DataFrame

> seq_rule_1_df <- cbind(seq_rule_1_df, seq_rule_1_size)

> # subsetting the rules which have moer the 2 elements in the rule

> seq_rule_1_df_size_2 <- subset(seq_rule_1_df, 

+                                subset = seq_rule_1_size >= 2)

> # checking the result

> seq_rule_1_df_size_2


          sequence support seq_rule_1_size

7        <{D},{F}>     0.5               2

8      <{D},{B,F}>     0.5               2

11       <{D},{B}>     0.5               2

12       <{B},{A}>     0.5               2

13       <{D},{A}>     0.5               2

14       <{F},{A}>     0.5               2

15   <{D},{F},{A}>     0.5               3

16     <{B,F},{A}>     0.5               2

17 <{D},{B,F},{A}>     0.5               3

18   <{D},{B},{A}>     0.5               3

 




다음번 포스팅에서는 항목의 분류/계층 체계 (taxonomy), 가상 항목(virtual item)에 대해서 알아보겠습니다.

 

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

 

[ cSPADE Algorithm Reference ]

M. J. Zaki. (2001). SPADE: An Efficient Algorithm for Mining Frequent Sequences. Machine
Learning Journal, 42, 31–60.

 

 

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. 2016.08.20 22:32  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • R Friend R_Friend 2016.08.22 11:41 신고  댓글주소  수정/삭제

      안녕하세요 Marketer 님,

      원천 transaction 데이터가 sequence ID, event ID, size, Item 의 컬럼 순서대로 준비가 되어있고, tab 으로 구분자가 되어있다고 할 경우, 불러오기 할 때 아래처럼 info = c("sequenceID", "eventID", "size") 라고 해서 Label을 명기해보시기 바랍니다.

      arulesSequences Package의 manual 을 찾아보면 아래처럼 unique한 "sequenceID"와 "eventID" Label을 반드시 명기하라고 되어 있습니다.

      "Unique event time identifiers must be provided in columns labels and eventID. Note that the latter
      is used for computation of gaps, etc."
      (* 출처 : arulesSequences Package의 manual)

      ##------------- 참고하세요.
      install.packages("arulesSequences")
      library(arulesSequences)
      tr_smaple <- read_baskets("tr_sample.txt",
      sep = "[ \t]+",
      info = c("sequenceID", "eventID", "size"))

  2. jihye 2016.10.19 14:55  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 ! 포스팅 잘 봤습니다.
    저 궁금한게 있는데요~ sequence를 학습해서 그다음 sequence를 예측하는 학습은 불가한가요?

    • R Friend R_Friend 2016.10.19 15:10 신고  댓글주소  수정/삭제

      jihye님, sequence pattern analysis는 순서 상의 패턴을 탐색하는 기법이구요(a를 구매하면 순차적으로 b를 구매하는 경향이 있다....그게 언제가 될지는 모르지만 암튼 순서상으로 a 다음에 b... 이런식이요. 만약 반복재구매, 반복재발생 사건이라면 재구매주기를 따로 분석하면 특정 시점까지 고려한 예측에 활용할수도 있겠네요),

      만약 시계열 데이터를 가지고 "특정 시점"에 값을 예측하는데는 시계열분석(예: ARIMA, 이동평균, 지수평활, 시계열분해... 등)이나 딥러닝의 RNN 이 많이 사용됩니다.

  3. niceguy1575 2017.01.20 11:39  댓글주소  수정/삭제  댓글쓰기

    궁금한게 있네요~
    what goes after? 라는 질문에
    본 알고리즘이 대답을 해줄 수 있는지에 대해서 궁금합니다.

    그러니까 여태까지 이런 순서로 상품을 샀고, 발견된 규칙들에 의해 이런 순서의 상품을 살 것이다. 라는 예측이 가능한 알고리즘인가요?

    • R Friend R_Friend 2017.01.20 11:47 신고  댓글주소  수정/삭제

      네, 그렇습니다. 상품추천에 이용가능합니다.

      구매주기(간격) 정보까지 접목하면 시점도 예측가능하겠지요.

    • niceguy1575 2017.01.20 13:01  댓글주소  수정/삭제

      말씀 감사드립니다.

      하지만, 게시글에서는 상품추천이나 시점 예측에 관한 부분이 빠진것같습니다.
      위의 코드에서 어떻게 발전시키면 상품추천 / 시점 예측이 가능한지 알 수 있을까요??

    • R Friend R_Friend 2017.01.20 13:15 신고  댓글주소  수정/삭제

      타캐팅은 별도로 진행해야 합니다.

      대상고객 타케팅은 sequence rule의 왼쪽 부분 item은 구매, 오른쪽 부분 item은 미구매한 고객 선별하면 됩니다.

      sequence rule의 왼쪽, 오른쪽 두 상품 간 구매 간격도 두 상춤을 모두 샀던 고객들의 거래데이터에서 구매간격의 분포분석을 해서 평균이나 중앙값 쓰면 됩니다.

    • 2017.01.20 15:52  댓글주소  수정/삭제

      비밀댓글입니다

    • R Friend R_Friend 2017.01.20 15:56 신고  댓글주소  수정/삭제

      예를 들면, sequence rule이 if A then B 가 나왔습니다.

      1번 고객은 A구매, B구매
      2번 고객은 A구매, B미구매,
      3번 고객은 A미구매, B미구매

      라고 했을때
      B고객을 타케팅하면 된다는 뜻입니다.

  4. ULove48 2017.01.23 12:09  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 ! 글 잘 봤습니다~
    질문이 하나 있는데요
    as(seq_rule_1, "data.frame") 를 통해 나온 결과를 어떻게 해석하죠?

    sequence열이 의미하는게 무엇인지 모르겠어요 구매의 순서를 의미하는건가..

    만약
    <{A},{B,F}> 1.00
    <{A,B,F}> 0.75
    <{A,F}> 0.5
    이면 A다음에 BF를 살 support가 제일 높다? 라고 얘기할 수 있는건가요?

    • R Friend R_Friend 2017.01.23 13:18 신고  댓글주소  수정/삭제

      가령 {A, B} 0.75 sequence rule 이라면

      if A then B 의 순서로 구매하는 거래의 구성비율(support)이 75%라는 뜻입니다.

      suppport 가 높을 수록 발생가능성이 높은 rule이라고 판단할 수 있습니다.

  5. chunb82 2017.03.15 16:44  댓글주소  수정/삭제  댓글쓰기

    안녕하세요,
    데이터 형태에서 에러가 자꾸 나서 문의드립니다.
    샘플에 나와있는 items가 어떻게 만들어진 건지 모르겠어요.
    어찌어찌 비슷한 포맷으로 데이터를 만들어봤는데 transactions데이터가 아니어서 함수가 안먹히네요. (dplyr 패키지를 활용하였고, 데이터 구조를 보면 Classes ‘tbl_df’, ‘tbl’ and 'data.frame' 입니다.)
    제가 만든 데이터로는 transactions데이터로 변환도 안된다고 에러가 뜨는데 처음 데이터 생성부터 어떻게 해야 분석을 할 수 있을까요? 답변 주시면 감사하겠습니다!!!ㅜㅜ

    • R Friend R_Friend 2017.03.15 17:14 신고  댓글주소  수정/삭제

      아래 링크포스팅 하단 참고하세요. 은 association rule 분석용 transaction 포맷으로 데이터셋 만드는 방법들 몇개 소개해놓았습니다.

      http://rfriend.tistory.com/193

      sequence analysis 용 포맷으로 만드는건 좀 찾아봐야해요.

    • chunb82 2017.03.21 18:01  댓글주소  수정/삭제

      정말 감사합니다. 마지막에 변환하는 방법이 나오네요.
      그런데 제가 가진 데이터로 돌려보니 (t.data<-as(split(data, data$prod_nm, data$sale_date, data$cust_no),"transactions"))

      "Error in asMethod(object) : can coerce list with atomic components only
      추가정보: 경고메시지(들):
      In if (drop) f <- factor(f) :
      length > 1 이라는 조건이 있고, 첫번째 요소만이 사용될 것입니다"

      라는 에러 메시지가 뜨는데 어떻게 해결해야 할까요?
      변수는 모두 팩터였습니다.

  6. khw 2017.04.25 18:04  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.
    분석결과를 보고 해석이 잘 안되서요.
    마지막
    as(seq_rule_1, "data.frame")
    sequence support
    1 <{A}> 1.00
    ...
    5 <{A,F}> 0.75
    ...
    7 <{D},{F}> 0.50
    ...
    라고 나오는데 , {} 안에 있는것이 한 트랜잭션에 있는 상품인가요?
    예를 들어
    1번 A는 support가 1이면 매번 구매되는 상품이다.
    5번 A,F는 같이 구매 되는 경우가 75% 이다.
    7번 D를 구매하고 F를 구매한 경우는 전체 50% 다. 라고 해석이 가능한가요?

    마지막으로, 7번과 같이 어떤 상품을 구매하고 다른상품을 후에 구매하는 경우만
    뽑으려면 어떻게 해야할까요?

    • R Friend R_Friend 2017.04.26 23:56 신고  댓글주소  수정/삭제

      안녕하세요 khw 님,

      sequence rule 결과 해석은 댓글로 남겨주신 대로 하시면 됩니다.

      7번과 같이 rule size 가 2개 이상인 rule만 선별을 하고 싶으시면 아래 R script를 참고하세요. size 함수를 사용해서 한방에 subset하는 더 간편한 방법이 있을 것 같은데요, 자꾸 에러가 나네요. 그래서 빙 돌아가더라도 일단 그냥 DataFrame으로 바꾸어 놓고 나서, size 함수로 size 개수 구한 후에, cbind로 DataFrame에 붙이고, subset 함수 써서 선별하는 방법으로 작성해봤습니다.

      # making DataFrame
      seq_rule_1_df <- as(seq_rule_1, "data.frame")

      # counting sequence rule size
      seq_rule_1_size <- size(seq_rule_1)

      # combining seq_rule size with DataFrame
      seq_rule_1_df <- cbind(seq_rule_1_df, seq_rule_1_size)

      # subsetting rules which are equal or greater than size 2
      seq_rule_1_df_size_2 <- subset(seq_rule_1_df, subset = seq_rule_1_size >= 2)

      # check the result
      seq_rule_1_df_size_2

      sequence support seq_rule_1_size
      7 <{D},{F}> 0.5 2
      8 <{D},{B,F}> 0.5 2
      11 <{D},{B}> 0.5 2
      12 <{B},{A}> 0.5 2
      13 <{D},{A}> 0.5 2
      14 <{F},{A}> 0.5 2
      15 <{D},{F},{A}> 0.5 3
      16 <{B,F},{A}> 0.5 2
      17 <{D},{B,F},{A}> 0.5 3
      18 <{D},{B},{A}> 0.5 3

    • khw 2017.04.27 11:29  댓글주소  수정/삭제

      답변 감사합니다.
      알고리즘을 적용해 나온 분석결과와 적용하기 위한 결과가 조금 다를 수 있네요.
      개인적으로 답변을 보고 R을 좀더 유연하게 쓸 계기가 되었습니다.

  7. 노경모 2018.03.14 19:11 신고  댓글주소  수정/삭제  댓글쓰기

    zaki 데이텃을 찾을 수 없다고 하는데, 왜그런걸까요?

    --------------------------------------

    > library(arulesSequences)
    Error: package ‘arules’ 1.5.0 is loaded, but >= 1.5.1 is required by ‘arulesSequences’
    In addition: Warning message:
    패키지 ‘arulesSequences’는 R 버전 3.3.3에서 작성되었습니다
    > data(zaki)
    Warning message:
    In data(zaki) : 데이터셋 ‘zaki’을 찾을 수 없습니다
    > help(zaki)
    No documentation for ‘zaki’ in specified packages and libraries:
    you could try ‘??zaki’
    > require(arulesSequences)
    필요한 패키지를 로딩중입니다: arulesSequences
    Failed with error: ‘package ‘arules’ 1.5.0 is loaded, but >= 1.5.1 is required by ‘arulesSequences’’
    In addition: Warning message:
    패키지 ‘arulesSequences’는 R 버전 3.3.3에서 작성되었습니다
    > data(zaki)
    Warning message:
    In data(zaki) : 데이터셋 ‘zaki’을 찾을 수 없습니다
    > help(zaki)
    No documentation for ‘zaki’ in specified packages and libraries:
    you could try ‘??zaki’

    • R Friend R_Friend 2018.03.14 21:42 신고  댓글주소  수정/삭제

      안녕하세요 노경모님.

      아래의 에러 메시지에 보면 R 버전이 낮아서 arules가 1.5.0이 설치가 되고, (1.5.1 버전보다 낮다보니) arulesSequences 가 설치가 안되었기 때문에 zaki 데이터셋을 찾을 수 없는 것 같습니다.
      ------------------------------------------
      Error: package ‘arules’ 1.5.0 is loaded, but >= 1.5.1 is required by ‘arulesSequences’
      In addition: Warning message:
      패키지 ‘arulesSequences’는 R 버전 3.3.3에서 작성되었습니다
      ------------------------------------------

      다음의 https://cran.r-project.org/ 사이트에 가셔서 R 최신버전(오늘 현재 version 3.4.3)을 다운받아서 R을 재설치 하신 후에 위의 arules, arulesSequences 패키지 설치해보시면 해결 될 듯 합니다.

    • 노경모 2018.03.15 14:08 신고  댓글주소  수정/삭제

      잘 되네요, 감사합니다 ^^

지난 포스팅에서 기계학습의 정의, 학습 및 과적합(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 패턴을 찾는다던지, 증상과 질병 간 연관관계 등을 찾는데 연관규칙을 사용합니다.

 

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

 

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

 

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

 

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. 리암 2016.09.01 19:16  댓글주소  수정/삭제  댓글쓰기

    질문 하나만 드리겠습니다.
    연관성 분석을 위해 데이터셋을 추출했는데,중복값이 있어서요.
    '001 file2'가 같은 세션에서 발생했는데, 제거하는 게 맞을까요?

    > head(df)
    SessionId filename
    001 file1
    001 file2
    001 file2
    002 file3

    • R Friend R_Friend 2016.09.01 19:33 신고  댓글주소  수정/삭제

      리암님,
      만약 'Session ID' 가 'Customer ID'(identifier),
      'file name' 가이 'Purchase Product ID'(구매상품 장바구니, item set) 의 개념이라면 삭제하지않고 그대로 두고 분석합니다.

      동일 고객ID에 동일상품 품목이 빈번하게(frequently) 발생해야(질문하신 중복 상황) 연관규칙이 잘 나옵니다.

  2. 리암 2016.09.02 14:39  댓글주소  수정/삭제  댓글쓰기

    그렇군요! 답변 감사합니다

  3. 지나 2017.10.25 13:16  댓글주소  수정/삭제  댓글쓰기

    우연히 와서 보고 있습니다.
    정말 좋은 자료에요.
    감사드려요!

  4. 지나가는나그네 2019.06.03 09:05  댓글주소  수정/삭제  댓글쓰기

    연관규칙이랑 순차패턴의 차이를 명확하게 설명하는 글이 없었는데
    여기서 해결이 되네요ㅎㅎ 감사합니다