R言語でワードクラウドを作る『呪術廻戦』編2。今回はggplot2棒グラフも作成

今回、**wordcloud**を使って作成した下のワードクラウドと、**ggplot2**を使ったバーグラフ（棒グラフ）の可視化を試みました。

<img width="７00" alt="ワードクラウド2呪術廻戦0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/874379c1-2d6e-2cc6-51d0-d0dc5f265504.png">

##前回同様にツイートを取得します

ワード**「呪術廻戦」**を含むツイートを取得しました。
2021年3月27日以降、最大10,000としました。
[前回同様の手順](https://qiita.com/text_owleyes_0214/items/49d162aeebceada9f63f)で取り込みました。

```r
#TwitterAPI認証情報設定
consumerKey <- "************"
consumerSecret <- "*****************"
accessToken <- "*****************"
accessSecret <- "*********************"

##TwitterAPIにログイン
library("twitteR")
options(httr_oauth_cache = TRUE)
setup_twitter_oauth(consumerKey, consumerSecret, accessToken, accessSecret)

#「呪術廻戦」を含む日本語ツイートを10000件取得。2021年3月27日から
tweets2 <- searchTwitter('呪術廻戦', n = 10000, since = "2021-03-27" , lang="ja" , locale="ja")#日本語とロケールを指定（日本なら"ja")# 目的に応じて"popular","recent","mixed"を指定 #◼️

#データフレームに変換
tweetsdf2 <- twListToDF(tweets2) 
#型を確認
class(tweets2)
[1] "data.frame"

#取得できたか確認
library(dplyr)
tweetsdf2  %>% head()

#リツイートされたもの（TRUE）、そうでないもの（FALSE）の数を確認
table(tweetsdf2$isRetweet)
FALSE  TRUE 
 2539  7461 

#今回リツイートのみ使ってみる
tweetsdf3 <- tweetsdf2 %>% filter(isRetweet %in% c("TRUE")) 
head(tweetsdf3) #確認
nrow(tweetsdf3) #確認

#データフレームのテキスト列だけ抽出
texts <- tweetsdf3$text

#後々使うのでテキスト処理のためのライブラリを呼び出す
library(stringr)
library(magrittr)

#複数の（リスト型）テキストを結合。テキストとテキストの間にはブランクを入れる
texts3 <- paste(texts, collapse = "")

#一時ファイルを作り、xfileという名前で保存
xfile <- tempfile()
write(texts3, xfile)

##形態素解析のライブラリー
library(RMeCab)

#形態素解析。頻度を集計
frq_Tw2 <- RMeCabFreq(xfile)
#上位50を確認
frq_Tw2 %>% arrange(Freq) %>% tail(50)

      Term  Info1                    Info2 Freq
9256     0   名詞                       数  344
9257  譲渡   名詞                 サ変接続  369
9258  ない 助動詞                        *  382
9259    ？   記号                     一般  383
9260  五条   名詞                 固有名詞  407
9261 https   名詞                     一般  409
9262  伏黒   名詞                 固有名詞  414
9263    と   助詞                   格助詞  416
9264    か   助詞 副助詞／並立助詞／終助詞  427
9265     (   名詞                 サ変接続  444
9266    を   助詞                   格助詞  453
9267  です 助動詞                        *  467
9268  見る   動詞                     自立  480
9269  てる   動詞                   非自立  480
9270  虎杖   名詞                     一般  483
9271     2   名詞                       数  515
9272     )   名詞                 サ変接続  534
9273  映画   名詞                     一般  538
```

前回「形容詞」と、「名詞」の中の「固有名詞」をピックアップしましたが、今回よく見ると、

```r
9270  虎杖   名詞                     一般  483
```

と「虎杖」という（外せない）キーワードが入っているので、今回は「名詞」をピックアップすることにしました。

```r
frq3_Tw2 <- frq_Tw2 %>% filter(Info1 %in% c("名詞")) 
frq3_Tw2 %>% arrange(Freq) %>% tail(50) #確認

7390 アニメ  名詞     一般  281
7391     ん  名詞   非自立  282
7392 バッジ  名詞     一般  287
7393      @  名詞 サ変接続  294
7394   送料  名詞     一般  309
7395     崎  名詞     一般  326
7396     釘  名詞     一般  336
7397      #  名詞 サ変接続  343
7398     缶  名詞     一般  344
7399      0  名詞       数  344
7400   譲渡  名詞 サ変接続  369
7401   五条  名詞 固有名詞  407
7402  https  名詞     一般  409
7403   伏黒  名詞 固有名詞  414
7404      (  名詞 サ変接続  444
7405   虎杖  名詞     一般  483
7406      2  名詞       数  515
7407      )  名詞 サ変接続  534
7408   映画  名詞     一般  538
7409      1  名詞       数  566
7410     譲  名詞 固有名詞  602
7411     求  名詞 固有名詞  603
7412  https  名詞 固有名詞  645
7413   交換  名詞 サ変接続  679
7414    ://  名詞 サ変接続 1054
7415     co  名詞     一般 1054
7416      t  名詞     一般 1060
7417      .  名詞 サ変接続 1216
7418      /  名詞 サ変接続 1351
7419     戦  名詞     接尾 2745
7420     廻  名詞 固有名詞 2766
7421   呪術  名詞     一般 2782
```
##ノイズになりそうなワードを外します

見やすいように整形するために、「記号」「アルファベット」を削除します。

```r
library("stringr") 

#termが英語を削除。noun列が作られ「<NA>」が表示。mutateは列を追加したり修正する
frq4_Tw2 <- frq3_Tw2 %>% mutate(noun=str_match((Term), '[^a-zA-Z]+')) #◼️
frq4_Tw2 %>% arrange(Freq) %>% tail(50)

7410     譲  名詞 固有名詞  602     譲
7411     求  名詞 固有名詞  603     求
7412  https  名詞 固有名詞  645   <NA>
7413   交換  名詞 サ変接続  679   交換
7414    ://  名詞 サ変接続 1054    ://
7415     co  名詞     一般 1054   <NA>
7416      t  名詞     一般 1060   <NA>
7417      .  名詞 サ変接続 1216      .
7418      /  名詞 サ変接続 1351      /
7419     戦  名詞     接尾 2745     戦
7420     廻  名詞 固有名詞 2766     廻
7421   呪術  名詞     一般 2782   呪術

#削除。na.omitでNA含む行を削除。
frq5_Tw2 <- na.omit(frq4_Tw2) #◼️
frq5_Tw2 %>% arrange(Freq) %>% tail(50)

4993     譲  名詞 固有名詞  602     譲
4994     求  名詞 固有名詞  603     求
4995   交換  名詞 サ変接続  679   交換
4996    ://  名詞 サ変接続 1054    ://
4997      .  名詞 サ変接続 1216      .
4998      /  名詞 サ変接続 1351      /
4999     戦  名詞     接尾 2745     戦
5000     廻  名詞 固有名詞 2766     廻
5001   呪術  名詞     一般 2782   呪術

#termが記号を識別。noun列が作られ「<NA>」が表示。「\\W」は記号
frq6_Tw2 <- frq5_Tw2 %>% mutate(noun=str_match((Term), '[^\\W]+'))
frq6_Tw2 %>% arrange(Freq) %>% tail(50)

4993     譲  名詞 固有名詞  602     譲
4994     求  名詞 固有名詞  603     求
4995   交換  名詞 サ変接続  679   交換
4996    ://  名詞 サ変接続 1054   <NA>
4997      .  名詞 サ変接続 1216   <NA>
4998      /  名詞 サ変接続 1351   <NA>
4999     戦  名詞     接尾 2745     戦
5000     廻  名詞 固有名詞 2766     廻
5001   呪術  名詞     一般 2782   呪術

#削除。na.omitでNA含む行を削除。
frq7_Tw2 <- na.omit(frq6_Tw2) 
frq7_Tw2 %>% arrange(Freq) %>% tail(50)

4487     譲  名詞     固有名詞  602     譲
4488     求  名詞     固有名詞  603     求
4489   交換  名詞     サ変接続  679   交換
4490     戦  名詞         接尾 2745     戦
4491     廻  名詞     固有名詞 2766     廻
4492   呪術  名詞         一般 2782   呪術
```

さらに見やすくするために1文字のワードを外すことにしました。
ただ、2文字の単単語とみなされませんでしたが、以下の1文字のワードは抜き出し、後で結合することにしました。

```r
4463     巻  名詞         一般  206     巻
4464     狗  名詞         一般  219     狗
4476     崎  名詞         一般  326     崎
4477     釘  名詞         一般  336     釘
```

```r
#「狗」「巻」「釘」「崎」を後で結合できるように取り出しておく
frq7_Tw2_2 <- frq7_Tw2 %>% filter(Term %in% c("狗","巻","釘","崎")) 
frq7_Tw2_2
  Term Info1    Info2 Freq noun
1   崎  名詞     一般  326   崎
2   巻  名詞     一般  206   巻
3   狗  名詞     一般  219   狗
4   釘  名詞     一般  336   釘
5   巻  名詞 固有名詞    9   巻
6   巻  名詞     接尾  193   巻

#Termが1文字の行を削除。まず、1文字ワードの行番号を抽出
index <- grep('..', frq7_Tw2[,1])
frq7_Tw2[index,] %>% arrange(Freq) %>% tail(50) #確認

3636         五条  名詞     固有名詞  407         五条
3637         伏黒  名詞     固有名詞  414         伏黒
3638         虎杖  名詞         一般  483         虎杖
3639         映画  名詞         一般  538         映画
3640         交換  名詞     サ変接続  679         交換
3641         呪術  名詞         一般 2782         呪術

frq8_Tw2 <- frq7_Tw2[index,] 
frq8_Tw2 %>% arrange(Freq) %>% tail(50)

3636         五条  名詞     固有名詞  407         五条
3637         伏黒  名詞     固有名詞  414         伏黒
3638         虎杖  名詞         一般  483         虎杖
3639         映画  名詞         一般  538         映画
3640         交換  名詞     サ変接続  679         交換
3641         呪術  名詞         一般 2782         呪術

先ほど抜き出した「狗」「巻」「釘」「崎」の行（データフレーム ）を結合

frq9_Tw2 <- rbind(frq8_Tw2, frq7_Tw2_2)
frq9_Tw2 %>% arrange(Freq) %>% tail(50)

3639           崎  名詞         一般  326           崎
3640           釘  名詞         一般  336           釘
3641         譲渡  名詞     サ変接続  369         譲渡
3642         五条  名詞     固有名詞  407         五条
3643         伏黒  名詞     固有名詞  414         伏黒
3644         虎杖  名詞         一般  483         虎杖
3645         映画  名詞         一般  538         映画
3646         交換  名詞     サ変接続  679         交換
3647         呪術  名詞         一般 2782         呪術
```

「呪術」はツイートに含まれていて当然なのと、数字（Freq：出現回数）が他と比べてかなり大きいので外すことにします。

```r
frq10_Tw2 <- frq9_Tw2 %>% filter(Term != "呪術")
frq10_Tw2 %>% arrange(Freq) %>% tail(50)

3641         譲渡  名詞     サ変接続  369         譲渡
3642         五条  名詞     固有名詞  407         五条
3643         伏黒  名詞     固有名詞  414         伏黒
3644         虎杖  名詞         一般  483         虎杖
3645         映画  名詞         一般  538         映画
3646         交換  名詞     サ変接続  679         交換
```
wordcloud2での可視化に入ります

```r
#wordcloud2で描画準備
frq11_Tw2 <- frq10_Tw2 #下記の作業でミスをした場合元のデータフレームに戻せるようにする

#Freqが100以上にする
frq12_Tw2 <-　frq11_Tw2$Freq >= 100
tail(frq12_Tw2) #確認

[1]  TRUE  TRUE  TRUE  TRUE FALSE  TRUE

frq13_Tw2 <- frq11_Tw2[frq12_Tw2,]
frq13_Tw2 %>% arrange(Freq) %>% tail(50)

1  手渡し  名詞     サ変接続  103 手渡し
2    東堂  名詞     固有名詞  108   東堂
・・・
30   五条  名詞     固有名詞  407   五条
31   伏黒  名詞     固有名詞  414   伏黒
32   虎杖  名詞         一般  483   虎杖
33   映画  名詞         一般  538   映画
34   交換  名詞     サ変接続  679   交換

#wordcloud2で描画。frq13_Tw2の１列目（Term）と４列目（Freq）を使う
library(wordcloud2)
frq13_Tw2[,c(1,4)] %>% wordcloud2(size=2,minSize=1) #sise=2では全体が大きすぎるので下記利用
frq13_Tw2[,c(1,4)] %>% wordcloud2(size=1.3,minSize=1,gridSize=10)  #gridSizeは文字間隔
```
ワードクラウドの可視化ができました。

<img width="７00" alt="ワードクラウド2呪術廻戦1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/7e6a67f8-8047-1984-a8e0-c69b52ed0086.png">

##残しておきたい1文字ワードをピックアップ

なお、整形途中から気になった「交換」「譲渡」というワードですが、Twitterで検索すると、あるアイドルのつぶやきに「交換日記」「呪術廻戦」が含まれ、多くのリツイートがされたためのようです。
さらに、呪術廻戦グッズの「交換」「譲渡」目的のツイートが数多く見られました。
ということで、放送されたアニメとは関係なさそうなので、外すことにします。
「バッジ」というワードはそのグッズの1つのようですが、「交換」「譲渡」ほど目立たないのでそのままにしました。

```r
frq14_Tw2 <- frq13_Tw2 %>% filter(Term != "交換") %>% filter(Term != "譲渡")
frq14_Tw2 %>% arrange(Freq) %>% tail(50)

27     崎  名詞         一般  326     崎
28     釘  名詞         一般  336     釘
29   五条  名詞     固有名詞  407   五条
30   伏黒  名詞     固有名詞  414   伏黒
31   虎杖  名詞         一般  483   虎杖
32   映画  名詞         一般  538   映画
```
再度wordcloud2で可視化します

```r
frq14_Tw2[,c(1,4)] %>% wordcloud2(size=1.3,minSize=1,gridSize=10)  #gridSizeは文字間隔
```
ワードクラウドの可視化ができました。

<img width="７00" alt="ワードクラウド2呪術廻戦2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/874379c1-2d6e-2cc6-51d0-d0dc5f265504.png">

##ggplot2で棒グラフ

次に、ワードの出現回数順にの棒グラフを作ります。
そのための準備をします。

```r
#扱いやすいようにTerm（ワード）とFreq（出現回数）の2列のデータフレームに
frq15_Tw2 <- data.frame(frq14_Tw2$Term, frq14_Tw2$Freq)
frq15_Tw2 #確認

   frq14_Tw2.Term frq14_Tw2.Freq
1          お願い            137
2            優先            160
3            希望            119
・・・
23           東堂            108
24           真希            199
25           好き            112
26           気軽            169
27           さん            132
28             崎            326
29             巻            206
30             狗            219
31             釘            336
32             巻            193
```
Freq（frq14_Tw2.Freq）の降順に並び替えます。

```r
frq16_Tw2 <- frq15_Tw2[order(frq15_Tw2$frq14_Tw2.Freq, decreasing=T), ] #◼️
frq16_Tw2 #確認
```
列名も元のデータフレームから変わっているので、わかりやすい名称に変更します。

```r
#列名を変更
colnames(frq16_Tw2) <- c("Word","Freq")
head(frq16_Tw2)

   Word Freq
12 映画  538
16 虎杖  483
22 伏黒  414
21 五条  407
31   釘  336
28   崎  326
```
ggplot2で棒グラフを描きます。

```r
#reorderは並び順指定
#stat="identity"はデータラベルつけるときに必要
#fill=ｰFreqにすると値が大きいほど色が濃くなる
#coord_flip()を追加すると、x軸とy軸が入れ替わる
#geom_textとlabelで棒グラフにラベル（Freq）を追加
library(ggplot2)
par(family = "HiraKakuProN-W3") 
ggplot(frq16_Tw2, aes(x=reorder(Word, Freq), y=Freq))+
   geom_bar(aes(y=Freq,fill=-Freq),stat="identity") +
   xlab("")+
   theme_gray (base_family = "HiraKakuPro-W3") +
　　geom_text(aes(x=reorder(Word,Freq),y=Freq,label = Freq), hjust=1.3,colour = " white") +
   coord_flip()
```
<img width="７00" alt="ワードクラウド2呪術廻戦3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/ba9c91de-359c-ed94-b50f-ca8bde844379.png">

狗巻くんの「巻」が「名詞・一般」と「名詞・接尾」と2回出てくるからか、他より長いグラフになりました。
どちらかの「巻」を外せばよいのですが、外さないでうまく処理する方法がわからなかったので、「ラベル+Word」という表記に変えることにしました。
行ラベルの番号が順番通り並んでいないので、ラベルを貼り直します

```r
#1から行数（nrow）までの連番を行番号に差し替えます。
rownames(frq16_Tw2) <- 1:nrow(frq16_Tw2)
head(frq16_Tw2)

  Word Freq
1 映画  538
2 虎杖  483
3 伏黒  414
4 五条  407
5   釘  336
6   崎  326
```
「連番ラベル+Word」の列を追加します。

```r
#結局使わなかったが、cbindで連番とWordを結合しようとすると、Factor型のレベルの数字が並ぶ
#このためを文字型にする必要がある
cbind(rownames(frq16_Tw2), as.character(frq16_Tw2$Word))

#「連番ラベル+Word」列の「Word2」を追加
frq17_Tw2 <- frq16_Tw2 #元に戻しやすいようにするための処理
frq17_Tw2$Word2 <- paste(rownames(frq16_Tw2), frq16_Tw2$Word)
head(frq17_Tw2)

  Word Freq  Word2
1 映画  538 1 映画
2 虎杖  483 2 虎杖
3 伏黒  414 3 伏黒
4 五条  407 4 五条
5   釘  336   5 釘
6   崎  326   6 崎

#念のため型を確認
str(frq17_Tw2)

'data.frame':	32 obs. of  3 variables:
 $ Word : Factor w/ 31 levels "アカ","アニメ",..: 9 16 28 17 26 20 24 5 2 25 ...
 $ Freq : int  538 483 414 407 336 326 309 287 281 271 ...
 $ Word2: chr  "1 映画" "2 虎杖" "3 伏黒" "4 五条" ...
```
再度棒グラフを描画します

```r
par(family = "HiraKakuProN-W3") 
ggplot(frq17_Tw2, aes(x=reorder(Word2, Freq), y=Freq))+
   geom_bar(aes(y=Freq,fill=-Freq),stat="identity") +
   xlab("")+
   theme_gray (base_family = "HiraKakuPro-W3") +
　　geom_text(aes(x=reorder(Word2,Freq),y=Freq,label = Freq), hjust=1.3,colour = " white") 
   coord_flip()

#（確認）Word2はchrでもfactorでもどちらでも描画可能
par(family = "HiraKakuProN-W3") 
ggplot(frq17_Tw2, aes(x=reorder(as.factor(Word2), Freq), y=Freq))+
   geom_bar(aes(y=Freq,fill=-Freq),stat="identity") +
   xlab("")+
   theme_gray (base_family = "HiraKakuPro-W3") +
　　geom_text(aes(x=reorder(as.factor(Word2),Freq),y=Freq,label = Freq), hjust=1.3,colour = " white") +
   coord_flip()
```
<img width="７00" alt="ワードクラウド2呪術廻戦4" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/3a4b8076-475e-c5cc-f601-2f86c4328802.png">

**了**