컴공돌이의 취미 블로그

[R]. 연관 분석(Association Rules) 본문

Study/R

[R]. 연관 분석(Association Rules)

컴공돌이​​ 2017. 7. 14. 14:02

[R]. 연관 분석(Association Rules)

오늘은 지난 번에 만들어 보았던 워드 클라우드(Word Cloud)에서 사용했던 MC the MAX 노래 가사를 이용한 연관 분석을 만들어 보고자 한다.

이글 또한 나름 이리저리 검색해보고 최선을 다해서 만든 코드이기 때문에 다른 사람들한테도 도움이 되었으면 하는 생각에서 작성해 보게 되었다.


제일 먼저 연관 분석에서 사용할 데이터는 이전 워드 클라우드 만들때 사용했던 MC the MAX 의 1집 가사들이지만 약간의 수정이 필요하다. 

왜냐하면 연관 분석은 보통 하나의 글마다 나오는 단어를 분석한 후 어떠한 단어들이 연계되어서 자주 나오는가를 분석하는 것이기 때문에 이전 데이터로 만들어 보게 된다면 한 줄마다 단어의 연관을 분석하여 결과로 아무것도 나오지 않을 가능성이 있기 때문이다.


우선 아래와 같은 데이터 형태에서


하나의 곡을 한 줄로 만든 아래와 같은 데이터 형태로 바꾼다.


이렇게 만들면 각 줄마다 데이터를 분석하여 단어들의 연관 분석이 쉽게 될 것이다.

이렇게 바꾼 데이터를 파일명을 'lyric1.txt'로 만들었고 이것을 R Studio의 프로젝트 폴더 안에 생성하였다.


이제 연관 분석에서 사용할 문서는 완성이 되었으므로 본격적으로 코드에 대하서 설명해보자.


<코드 설명>


(1). KoNLP Package의 설치 및 사용 

install.packages("KoNLP")

library(KoNLP)

useSejongDic()

R에서는 한글 자연어 처리를 위한 패키지가 존재한다. 

한글을 영어로 번역해 보면 Korean Natural Language Precess 인데 이것을 줄여서 나온것이 KoNLP 이다.

문서 안에 들어있는 단어들의 품사를 정확하게 알기위해서 반드시 설치하고 사용해야 하는 패키지이다.

또한 단어들을 검사할때 세종 사전을 사용하기 위해서 useSejongDic() 명령어로 사전을 저장해 둔다. 


(2). arules Package의 설치 및 사용

install.packages("arules")

library(arules)

R에서 연관 분석을 하기 위해 제공되는 패키지가 있는데 그것이 바로 arules Package이다.

이 Package에 들어있는 데이터 형변환의 as() 함수, 단어들의 연관성을 분석해주는 apriori() 함수같은 것들을 사용하기 위해서 패키지를 설치한 후 호출한다.


(3). igraph Package의 설치 및 사용

install.packages("igraph")

library(igraph)

R에서 그래프를 그리기 위해 제공되는 패키지가 있는데 그것이 바로 igraph Package 이다.

연관 분석에서의 최종적인 목표는 단어들 간의 연관성을 그래프로 보여주는 것이기 때문에 그래프를 그리기 위해서 이 패키지를 설치한 후 호출한다.


(4). 자연어 처리할 문서를 한줄씩 읽어들이기

doc <- readLines('lyric1.txt')

readLines() 함수는 문서를 한줄씩 읽어들인 후 저장하는 함수이다.


readLines('lyric1.txt') 명령어를 사용하면 아래와 같은 결과를 얻을 수 있다.



(5).  문서안에서 각 문장안의 단어들의 형태 분석한 뒤 중복된 단어 및 빈 문장 제거하기

library(stringr)

wlist <- list()

for(i in 1: length(doc)){

    words <- SimplePos09(doc[i])

    extracted <- str_match(words, '([가-힣]+)/[NPM]')

    keyword <- extracted[,2]

    nouns <- keyword[!is.na(keyword)]

    nouns <- unique(nouns)

    nouns <- Filter(function(x){nchar(x)>1},nouns)

    nouns <- list(nouns)

    wlist <- c(wlist, nouns)

}

wlist <- unique(wlist)

SimplePos09() 함수는 문서에 존재하는 단어들을 카이스트에서 제작한 태그를 붙여서 어떠한 품사인지 확인할 수 있게 해주는 함수이다.


첫번째로 SimplePos09() 함수를 사용해서 워드 클라우드 글에서 처럼 우선적으로 9개의 형태소로 각 문장에서의 단어를 분석한다.


두번째로 str_match 함수를 사용하여 N(체언), P(용언), M(수식언) 을 형태소만을 따로 저장을 한다.

이때 str_match는 stringr 패키지에 들어있는 함수 이므로 stringr 패키지를 호출한 후 함수를 사용한다.


세번째로 extracted[,2] 와 keyword[!is.na(keyword)]를 사용하여 태그가 달린 분필요한 데이터와 비어있는 데이터를 없앤다.

위의 첫번째부터 세번째 단계까지의 자세한 설명은 워드 클라우드 글 안을 보면 나와있다.


네번째로 unique 함수와 Filter를 사용하여 중복된 단어는 없애고 1글자인 단어 또한 제외를 시킨다.


마지막으로 list 함수를 사용하여 단어들을 list화 시킨후 wlist에 list를 넣는다.

이때 wlist는 데이터 분석을 할때 사용될 데이터 구조이다.


위의 모든 명령어가 잘 실행되었다면 아래와 같은 결과를 얻을 수 있을 것이다.


(6). 단어 리스트 데이터를 transaction 데이터로 변환

wordtran <- as(wlist, "transactions")

as 함수를 통해서 wlist 데이터를 transactions 데이터로 변환시켜준다.

transaction 데이터는 기본 데이터를 통합하면서 생겨난 분석에 용이한 정보들 포함하고 있는 데이터의 형태이다.


아래와 같이 wordtran안에는 유용한 정보들이 많이 들어있다.


(7). 단어들을 가지고 테이블 생성

wordtable <- crossTable(wordtran)

crossTable() 함수는 wordtran에 있는 모든 단어의 정보를 행과 열에 똑같이 넣어서 테이블을 생성한다.


crossTable() 명령어가 잘 실행됬다면 아래와 같은 결과를 얻을 수 있을것이다.


(8). wordtran안의 단어에 대해서 연관도를 분석

tranrules <- apriori(wordtran, parameter=list(supp=0.25, conf=0.75))

이부분이 연관 분석에서 가장 중요한 부분이 아닐까 싶다.

apriori()함수는 단어들의 연관성을 확인한 후 해당하는 것들을 따로 저장해 주는 함수이다.


apriori 내부에서 연관도를 분석할 때 사용하는 측도는 2가지 supp 와 conf 이다.

supp 와 conf 는 각각 support(지지도), confidence(신뢰도)의 줄임말이다.


Support(지지도)는 전체 글중에서 어떠한 X와 Y를 둘다 가지고 있는 글의 확률을 말한다.

이것은 

 

로도 표현 가능하다.

이 Support는 크면 클 수록 중요성이 높다는 것을 의미한다.


Confidence(신뢰도)는 X가 포함되어있는 글 중에서 X와 Y를 둘다 가지고 있는 글의 확률을 말한다.

이것은 

로도 표현 가능하다.

이 Confidence는 크면 클수록 X와 Y간의 연관성이 높다는 것을 의미한다.


위의 코드에서 supp=0.25, conf=0.75라고 설정을 해 놨는데

이것을 전체 글중에서 X와 Y가 들어있는 글이 1/4 정도 된다는 뜻과 X가 포함되어져 있는 글들 중에서 Y까지 포함하고 있을 확률이 3/4 이라는 뜻이다.


이 조건을 만족하는 것들은 위의 명령어를 실행하여보니 아래와 같이 30가지라는 결과를 얻을 수 있었다.


(9). tranrules의 단어들을 itemMatrix 형태로 저장

rules <- labels(tranrules, ruleSep=" ")

rules <- sapply(rules, strsplit, " ",  USE.NAMES=F)

labels() 함수는 데이터를 itemMatrix의 형태로 바꾸어 주는 함수이다.

윗 단계에서 구한 tranrules 안의 30개의 규칙들을 itemMatrix로 만들어서 저장을 해준 다음 문자형 벡터를 기준으로 나누어주는 함수가 아래의 sapply 내부에 있는 strsplit이다.


위의 명령어가 잘 실행되었다면 아래와 같은 결과를 얻을 수 있을 것이다.


(10). rules를 matrix의 형태로 다시 재 정렬

rulemat <- do.call("rbind", rules)

do.call()함수는 위에서 얻은 rules 의 단어들을 matrix의 형태로 재정렬하는 함수이다.


명령어를 실행하면 아래와 같은 결과를 얻을 수 있을 것이다.

전 단계에서 얻은 rules가 아래와 같이 깔끔한 matrix의 형태로 다시 정렬된다.


(11). 그래프로 그릴 edge와 vertex 형태로 변환

ruleg <- graph.edgelist(rulemat, directed=F)

위에서 구한 rulemat를 이제 그래프로 그리기 전에 그래프에서 사용할 edge와 vertex의 형태로 먼저 변환을 시켜주어야 한다.

graph.edgelist() 함수를 사용하면 rulemat 안에 들어있는 데이터들을 각 행에서 1열의 데이터와 2열의 데이터를 edge로 묶은 데이터의 형태로 바꾸어준다.


명령어가 잘 실행되었다면 아래와 같은 결과를 얻을 수 있을 것이다.


(12). 단어 연관 분석 그래프 그리기

plot.igraph(ruleg, vertex.label=V(ruleg)$name, vertex.label.cex=1.0, vertex.label.color='black', vertex.size=20, vertex.color='gray', vertex.frame.color='blue')

igraph() 함수는 우리의 최종적인 결과물인 단어 연관 그래프를 만들어주는 함수이다.

바로 전 단계에서 생성한 ruleg를 함수에 넣어주고 그래프에서 각 노드에 표시될 이름에도 V(ruleg)$name 을 넣어주면 그래프가 생성될 것이다.

이 밖에도 노드의 색, 크기, 이름의 크기, 색 등 따로 원하는 값을 설정해 주면 가독성 좋은 연관 그래프가 생성될 것이다.


위의 명령어를 사용하면 아래와 같은 결과를 얻게 될 것이다.



< 전체 코드>




반응형

'Study > R' 카테고리의 다른 글

[R]. 워드 클라우드 (Word Cloud)  (7) 2017.07.13