Rのワードクラウドで審美的なアウトプット　wordcloud2ライブラリの紹介

# 目的

Rの[wordcloud2パッケージ](https://cran.r-project.org/web/packages/wordcloud2/wordcloud2.pdf)でワードクラウドを作成すると、日本語の文章でも大変美しいワードクラウドが描画できます。このパッケージを検証します。


# 美しいwordcluod2パッケージを使う

## 1. データ準備

サンプルデータとして、とある掲示板のとあるトピックの内容を1つにまとめたデータを使用しました。
RMeCabのdocMatrix2関数で、ファイルの文書を読み形態素解析し、名詞だけを抽出して、ターム・文書行列を作成します。
 ファイル1つだけなので行列は1列になります
 

```r
library(RMeCab)

file <-"topic_id_99999999" 

#docMatrix2関数で、文書fileのターム・文書行列を作成する。ここでは名詞だけに限定した。
#docMatrix2関数で、第1引数にファイルが渡された場合、ワードの頻度が1列目に入ったマトリクスが返される。
# フォルダが指定された場合、フォルダ内の各ファイル毎に列をとり、頻度が入ったマトリクスが返される。
tmpdf <-docMatrix2(file,pos=c("名詞"))

#データフレームに変換する
tmpdf<-as.data.frame(tmp_df)

#行名をtermという列に格納する。
tmpdf$term <- row.names(tmpdf)

colnames(tmpdf) <- c("Freq","term")

#列を、term,Freqの順に入れ替え
df <-tmpdf %>% dplyr::select(term,Freq)

#除外ワードファイルは、1列だけ
exclude_df <- read.table("stopword.tsv",header=T)
#リストにする。
exclude_word <- exclude_df$exclude_word

#除外するワードを除外する
df <- df %>% dplyr::filter(!(term %in% exclude_word)) 

```

dfは、ワード毎の頻度が格納されたデータフレーム

|term|Freq|
|:----------|:----------|
|ワード1|249|
|ワード2|64|
|ワード3|93|
	

## 2.関数wordcloud2にワード、頻度の2列だけのデータフレームを渡す


```r
library(wordclud2)
library(dplyr)

# wc_dfというデータフレームに、頻度の降順にソートする。
# データフレームのレコード数(ワード数）を上位100個までに絞る。
# wordcloud2関数に引き渡すデータの列の順番は、ワード、頻度、に合わせる。

wc_df <-　df %>% dplyr::arrange(desc(Freq)) %>% head(100)

# size＝1がデフォルト、minSizeは謎
wordcloud2(wc_df,size=1,minSize=0)

```


## 3. wordcloud2のアウトプット

こんな感じでできます。

![全トピックのワードクラウド_名詞_st.png](https://qiita-image-store.s3.amazonaws.com/0/114127/81bc11a3-98ea-d0f6-603b-c8fefa966897.png)





## 4. wordcloud2の注意点　
ワード毎の頻度で、以下のように頻度に上位数個のワードとそれ以外とで著しい差がある場合、上位のワードはデフォルトのオプション指定だとワードクラウドに描画されません。

以下の例で検証します。
ワード毎の頻度分布

|term|Freq|
|:----------|:----------|
|ベビーカー|249|
|バス|93|
|抱っこ|64|
|子供|62|
|マナー|50|
|ママ|43|
|迷惑|41|
|(省略)|(省略)|

### 4.1. size=1の場合
「ベビーカー」がワードクラウドから漏れてしまっています。

```r
wordcloud2(wc_df,size=1,minSize=0)
```
![Wc_size1_minsize_0.png](https://qiita-image-store.s3.amazonaws.com/0/114127/e6439ce5-77b4-80b5-a583-ff87a674f76f.png)

### 4.2. size=0.7の場合

頻度が1位の「ベビーカー」が表示されます。これでは、2位以下のワードとのフォントサイズの差が激しいです。

```r
wordcloud2(wc_df,size=0.7,minSize=0)
```

![Wc_size_07_minsize_0.png](https://qiita-image-store.s3.amazonaws.com/0/114127/e3a2e5f5-989a-f2dc-b6ac-c213191bdcaf.png)


### 4.3. size=2の場合
フォントが大きくなります。上位の「ベビーカー」は描画に含まれません。

  ```r
   wordcloud2(wc_df,size=2,minSize=0)
  ```


![Wc_size2_minsize_0.png](https://qiita-image-store.s3.amazonaws.com/0/114127/7ac4b499-7431-3c14-9a52-3a460f8d21cd.png)

### 4.4. size=3にした場合
最低の頻度のワードのフォントサイズが大きくなっています。「ベビーカー」は表示されません。

![Wc_size3_minsize=0.png](https://qiita-image-store.s3.amazonaws.com/0/114127/24119edb-f723-e19b-0a09-284fe0cd8722.png)



### 4.5 オプションminSize
 minSize=25とすると、下位のワードはワードクラウドから消滅します。しかし、ワード頻度が25以上のワードが描画されたわけではなく、上位25位のワードを描画したわけでもないようです。
minsizeは、パッケージヘルプによると
A character string of the subtitle
となっていますが、サブタイトルの文字列？　ちょっと解せません。

>githubに、wordcloud2.jsでは、「キャンバスに描画するフォントサイズの最小値」なので、上記「subtitle」の説明は間違ってるのでは？という問題があがっていました(https://github.com/Lchiffon/wordcloud2/issues/26)

とにかく、minSizeに任意の数値を指定すると「頻度が下位のワードはワードクラウドで可視化されなく」なります。minSizeの値が大きいほど、頻度が上位のワードだけが可視化の対象になりました。


```r
wordcloud2(wc_df,size=2,minSize=25)
```

![Wc_size_2_minsize_25.png](https://qiita-image-store.s3.amazonaws.com/0/114127/4a4f6eda-48b2-8e47-043a-b5bad4ae5952.png)

### 4.6 オプションgridSize

gridsizeを大きくすると、ワード間の間隔が大きくなります。

```r
wordcloud2(wc_df,size=2.0,gridSize=8)
```

![wc_gridsize_8.png](https://qiita-image-store.s3.amazonaws.com/0/114127/c94aafec-9871-1fd2-ff57-b89ec1dff3f1.png)

# まとめ

Rでワードクラウドを作成するには、wordcloud2が素敵ですよ、という話でした。


# 参考にしたサイト
 - [r-bloggersのライブラリ紹介記事(2016/12/9)](https://www.r-bloggers.com/the-wordcloud2-library/)
　 


# 実行環境

```r
> sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Sierra 10.12.6
```