본문 바로가기

Previous (20-22)/Development

R Programming - (1) Word Cloud

Word Cloud 라. 해석하면 단어 구름이죠.

아마 아래 사진을 보시면 확 와닿을 것입니다.




이런것 인터넷 돌아다니다 많이 보셨을 것입니다.


이번 글에서는 R을 통해서 어떻게 구현하는지를 한번 보도록 할게요.





Word Cloud



R에서 제공하는 외부 패키지 중 하나입니다.


R 공식사이트에서 제공하는 패키지 중 하나로, 


https://cran.r-project.org/web/packages/wordcloud/index.html


이곳에서 다운받을 수 있고요.



하지만 저는 R Studio에서 쉽게 다운로드를 받고 설치를 했습니다.



여기 화면 보이는데로 들어가셔서,




입력하면 자동으로 나와서 설치하면 됩니다.


하지만 wordcloud 패키지만 설치하지 마시고,


tm : A framework for text mining applications within R.

RColorBrewer : provides color schemes for maps (and other graphics) designed by Cynthia Brewer


패키지도 같이 설치해주시고요.


필요에 따라서는 또다른 패키지도 같이 설치해주시는것을 권장합니다.



wordcloud에서 제공되는 대표적인 함수는 아래와 같이 있으며,



commonality.cloud 

comparison.cloud 

textplot 

wordcloud 

wordlayout 



이것들을 다 다루지는 않고. wordcloud 함수를 사용한 예제만 간단히 보여드리겠습니다.


1
2
3
4
5
6
7
8
9
10
require(tm)
require(wordcloud)
data(crude)
crude <- tm_map(crude,removePunctuation)
crude <- tm_map(crude,function(x)removeWords(x,stopwords()))
tdm <- TermDocumentMatrix(crude)
<- as.matrix(tdm)
<- sort(rowSums(m),decreasing = TRUE)
<- data.frame(word = names(v),freq=v)
wordcloud(d$word,d$freq)
cs


이 예제가 사실은 wordcloud 와 관련된 예제중에서 굉장히 많이 있는 예제입니다.

다른 곳에도 지금 예제는 똑같이 있을겁니다.


예제를 간단히 설명하면 다음과 같습니다.


1~2. tm 패키지와 wordcloud 패키지를 불러옵니다 (만약 제대로 안되면 Rcpp 패키지도 같은방법으로 불러오세요)

3. crude라는 값(value)을 불러온다. (crude라는 것은 tm 패키지의 예제용 내장 데이터 값입니다.)

4. crude 값의 인용부호를 제거한다. (이걸 제거해야 데이터셋 구성하기가 좋은가봅니다)

5. crude 값의 전치사, 접두사 등등 인용구를 삭제한다 (한글 지원 안됩니다)

6~9. crude에 대한 2차원 배열을 생성하고, 이것에 대한 데이터 d를 생성한다.

10. wordcloud 함수로 결과를 뿌려준다.




이게 기본 예제입니다.


확인 결과, 모든 값이 다 나오는 것은 아니고 일부 값은 표시(Plotted)되어 나타나지 못한다고도 합니다.

그래서 세부 파라미터 등을 통해서 표현하면 더 좋을 것입니다. (세부 파라미터는 뒤에 나와있음)


그렇다면 말이죠. 8번째 줄과 같이 wordcloud로 word와 freq를 가지고 뿌려주는데. 

word와 freq는 어떤 데이터 구조일까요??



바로 이런 데이터 구조입니다.


조금은 감이 잡히실 것입니다.


wordcloud 함수로 뿌려주는 것은

첫번째 Parameter에 뿌려주는 내용을 나타내고,

두번째 Parameter에 해당 내용에 대한 크기를 나타내는겁니다.


즉 위 열 이름을 추정했을때 특정 단어에 대한 사용빈도를 뿌려주고, 빈도가 클수록 글씨도 커지겠죠??





자. 이제 응용해 봅시다.




저는 코스피 시가총액 상위 50종목의 시가총액 규모를 가지고 해보기로 했습니다.


그래서 그걸가지고 엑셀파일을 만들었죠.



name total
삼성전자 2,250,869
한국전력 292,094
현대차 290,765
SK하이닉스 290,109
삼성물산 279,793
삼성전자우 257,444
........


R Studio에서는 엑셀 데이터 불러오는게 가능합니다. xlsx 파일도 당연히 가능하고요.


※ 엑셀파일 만들때 명심할게 있습니다.

1. 숫자는 반드시 숫자형이여야 하고 (텍스트형 숫자 절대안됨)

2. 숫자가 음수가 들어가면 안됩니다. 왜냐하면 wordcloud의 matrix 두번째값이 숫자크기라 양수만 인식됨

3. 그리고 엑셀파일 만들때 외부 이미지나 하이퍼링크 등등 전부다 제거해주시기 바랍니다.






여기서 한번 생각해 봅시다.


위에 있는 예제는 crude라는 value값을 가지고, dataset 형태로 변환시킨다음에 이를 wordcloud 함수에서 호출만 한겁니다.

그렇다면, 엑셀 데이터를 불러온다면 위에서 했던 저 번거로운 과정 필요없이 바로 결과를 보여주면 되겠네요??


네. 맞아요.


1
2
3
4
require(wordcloud)
library(readxl)
test2 <- read_excel("~/test2.xlsx")
wordcloud(test2$name,test2$total)
cs

그냥 이렇게 하면 끝나요.



참 쉽죠? 

쉽게쉽게 가자고요. 엑셀 데이터 만들어서 원하는대로 뿌려주면 되는데 뭘 번거롭게 합니까.




이번에는 좀 간단하게 디자인하는 예제입니다.

맨 위의 사진처럼 뿌리려면 모양 좀 다양하게 해야겠죠?


1
2
3
4
5
6
require(wordcloud)
require(RColorBrewer)
library(readxl)
test2 <- read_excel("~/test2.xlsx")
pal2 <- brewer.pal(8,"Dark2")
wordcloud(test2$name,test2$total,min.freq=2,max.words=Inf,random.order=FALSE,rot.per=.15,colors=pal2)
cs



RColorBrewer라는 패키지가 들어갔고요.

이거는 여러가지 색깔을 뿌려주는 패키지입니다.

이 부분은 주요 내용은 아니므로 간단하게만 소개할게요.


5번 줄에 보시면, RColorBrewer의 brewer.pal()이라는 함수를 통해서 색깔규격을 지정하는 내용입니다.


wordcloud 함수가 좀 복잡해졌네요. 파라미터 볼게요.

wordcloud 공식 문서에는 아래와 같이 나와있습니다.



term.matrix A term frequency matrix whose rows represent words and whose columns represent documents.

(1열, 2열입니다. 1열은 값이고 2열은 크기입니다)


여기서부터가 3열 이후의 내용입니다.


scale A vector of length 2 indicating the range of the size of the words. 

(크기를 지정합니다. 위 예제에는 해당 부분이 빠졌는데, 이는 특정 데이터의 값이 너무 클 경우 에러가 발생하기 때문입니다)


min.freq words with frequency below min.freq will not be plotted

(만약 나오는 총 단어가 지정개수 이하면 나타나지 않도록 함, 큰 의미는 없군요)


max.words Maximum number of words to be plotted. least frequent terms dropped 

(단어의 최대 길이)


random.order plot words in random order. If false, they will be plotted in decreasing frequency 

(단어 순서를 임의대로 지정한다는데 사실 큰 차이는 없음)


rot.per proportion words with 90 degree rotation 

(90도 회전하는 단어 비율 결정)


colors color words from least to most frequent 

(색깔 결정인데, 위 예제에서는 RColorBrewer 패키지 함수에 지정된 pal2로 지정해서 여러가지 색이 나오는겁니다)


그 외에도 여러 옵션이 사실 있습니다.






위와 같이 코드를 재구성했을때 결과가 맨 첫번째 사진과 같은 결과입니다.

(참 삼성전자 글자가 무지하게 크죠? 그만큼 코스피 시가총액 상위50종목 중 삼성전자 비중이 크다는 뜻입니다)



R에서 사용하는 Word Cloud 패키지 예제를 이상 마치겠습니다.



이 패키지를 통한 빅데이터 활용도는 사실 매우 많이 있고 인터넷 상에도 많이 나돕니다만,

유용하게 사용할 수 있는 방법에 대해서는 조금 더 구상해 보겠습니다.



R Programming 관련하여 제가 일부 잘못 알고있는 부분이 있으면, 전문가님의 피드백 언제든 환영합니다.