仕事の結果を学会専門誌に投稿するモチベーションが最近になって根本的に変わってきた。何年も修正・追加作業を求められるのも水準維持には必要なコストだが、出た結果、行った試行は出来るだけ早く共有したいものだ。そんな風に思っているところで、以前から利用しているRSTUDIOの結果をRpubsで公開すればいいと思いついた。

この作業は、昨年の「ビジネス統計分析」最後のアンケート回答の中の自由記述欄をテキストマイニングにかけた結果である。最初のトライアルに丁度いいのでpublishすることにした。

library(dplyr)
library(RMeCab)
library(wordcloud)
library(RColorBrewer)

テキスト・マイニング

一つ前の段階ではモジュールごとに記載されたコメントを統合して、それをファイルに書きだした。次の段階は、コメント全体の特徴をテキストマイニングの手法を利用して視覚化する作業である。

元のファイルを利用すれば、モジュール別に、また履修者別にコメントを分類することもできるので、様々な分析が可能である。このような分野に関心を持っている人は、『Rによるテキストマイニング入門』(石田基広)、『Rで学ぶ日本語テキストマイニング』(石田基広、小林雄一郎)を参考にしてほしい。テキストマイニングでも対応分析やクラスター分析が活用されることを知って興味を感じる人がいるかもしれない。本資料は、テキストの内容を視覚化するための「ホンの一例」として見てほしい。

以下では、統合された三つのコメント“goodness”, “badness”, “misc”をそれぞれパッケージ“RMeCab”を利用してテキストマイニングにかけることにする。

まず三つのコメントそれぞれについて、登場する形態素分析(≒単語に分解したうえで品詞などの属性を付与する作業)をしておく。

rsl.good <- RMeCabFreq("good.txt",dic="c:/work/shamani.dic")
## file = ./good.txt 
## length = 385
rsl.bad <- RMeCabFreq("bad.txt",dic="c:/work/shamani.dic")
## file = ./bad.txt 
## length = 441
rsl.misc <- RMeCabFreq("misc.txt",dic="c:/work/shamani.dic")
## file = ./misc.txt 
## length = 441
head(rsl.good)
##   Term  Info1  Info2 Freq
## 1   ・   記号   一般    3
## 2   (   記号 括弧開    2
## 3   )   記号 括弧閉    2
## 4   。   記号   句点  112
## 5   、   記号   読点   29
## 6 ない 形容詞   自立    3
head(rsl.bad)
##   Term Info1 Info2 Freq
## 1   ・  記号  一般    3
## 2   ?  記号  一般    3
## 3   々  記号  一般    1
## 4   ―  記号  一般    1
## 5   ○  記号  一般    2
## 6   △  記号  一般    2
head(rsl.misc)
##   Term Info1 Info2 Freq
## 1   ・  記号  一般    3
## 2   ?  記号  一般    3
## 3   々  記号  一般    1
## 4   ―  記号  一般    1
## 5   ○  記号  一般    2
## 6   △  記号  一般    2

(1) Goodness(良いところ)の分析

形態素分析で作成した表を登場頻度の順で並べ直す。その後、名詞あるいは動詞である単語をとりだしてrsl.good.wordsという名で保存する。また、一般名詞のみを取り出してrsl.good.meisiという名前をつけておく。

head(rsl.good)
##   Term  Info1  Info2 Freq
## 1   ・   記号   一般    3
## 2   (   記号 括弧開    2
## 3   )   記号 括弧閉    2
## 4   。   記号   句点  112
## 5   、   記号   読点   29
## 6 ない 形容詞   自立    3
jun.good <- order(rsl.good$Freq,decreasing=T)
rsl.good <- rsl.good[jun.good,]
rsl.good.words <- rsl.good %>% filter(Info1 == "名詞" | Info1 == "動詞")
rsl.good.meisi <- rsl.good %>% filter(Info1=="名詞" & Info2 == "一般")
head(rsl.good.meisi)
##         Term Info1 Info2 Freq
## 1     データ  名詞  一般   25
## 2     主成分  名詞  一般   20
## 3 クラスター  名詞  一般   19
## 4          R  名詞  一般   12
## 5       線形  名詞  一般   11
## 6     モデル  名詞  一般   10

名詞・動詞の上位100位までを対象にワードクラウドを描画してみる。

wordcloud(rsl.good.words[1:100,]$Term,rsl.good.words[1:100,]$Freq)

次いで、頻出名詞を視覚化する。文章の長さが比較的短いので登場する名詞全体が少なく、ワードクラウドよりは円グラフの方が特徴をよく伝えているように思われる。

pie(head(rsl.good.meisi,10)$Freq,labels=head(rsl.good.meisi,10)$Term,clockwise=T)

pal1 <- brewer.pal(7,"Pastel1")
pal2 <- brewer.pal(7,"Accent")
wordcloud(rsl.good.meisi$Term,rsl.good.meisi$Freq,c(3,0.3),2,100,TRUE,,0.15)

#wordcloud(rsl.good.meisi$Term,rsl.good.meisi$Freq,c(3,0.3),2,100,TRUE,,0.15,pal1)
wordcloud(rsl.good.meisi$Term,rsl.good.meisi$Freq,c(3,0.3),2,100,TRUE,,0.15,pal2)

上で特徴付けをしたコメントは授業で「わかったこと」、「使えること」などプラス面である。

描かれた図を見ると、マアマア(?)、授業全体の骨格が見えるかな・・・と、そんな印象なのだが、どうだろうか?

(2) Badness(悪いところ)の分析

良い所(Goodness)と同様にすればよい。が、今回のデータにおいては文章text.badの長さが短く(長さ自体は十分だが登場する単語のばらつきに比べると短い)、語句の頻度分布が特徴ある形として浮かび上がっていないように思われる。そのため、上と同じ作業をしてもあまり面白い(役に立ちそうな?)結果は得られなかった。

head(rsl.bad)
##   Term Info1 Info2 Freq
## 1   ・  記号  一般    3
## 2   ?  記号  一般    3
## 3   々  記号  一般    1
## 4   ―  記号  一般    1
## 5   ○  記号  一般    2
## 6   △  記号  一般    2
jun.bad <- order(rsl.bad$Freq,decreasing=T)
rsl.bad <- rsl.bad[jun.bad,]
rsl.bad.words <- rsl.bad %>% filter(Info1 == "名詞" | Info1 == "動詞")
rsl.bad.meisi <- rsl.bad %>% filter(Info1=="名詞" & Info2 == "一般")
head(rsl.bad.meisi)
##         Term Info1 Info2 Freq
## 1   コマンド  名詞  一般   19
## 2     データ  名詞  一般   13
## 3 クラスター  名詞  一般   12
## 4          R  名詞  一般    9
## 5     主成分  名詞  一般    6
## 6       方法  名詞  一般    5

頻度順に並べ直すところまでは同じである。次に、名詞・動詞だけを取り出してワードクラウドを描いてみる。Goodnessでは細かな設定をしたが、今度はデフォールトで描く。色はつけず白黒である。

wordcloud(rsl.bad.words[1:100,]$Term,rsl.bad.words[1:100,]$Freq)

一般名詞だけを取り出して、円グラフ、ワードクラウドを描く。

pie(head(rsl.bad.meisi,10)$Freq,labels=head(rsl.bad.meisi,10)$Term,clockwise=T)

#wordcloud(rsl.bad.meisi$Term,rsl.good.bad$Freq,c(3,0.3),2,100,TRUE,,0.15,pal1)
wordcloud(rsl.bad.meisi$Term,rsl.bad.meisi$Freq,c(3,0.3),2,100,TRUE,,0.15,pal2)

授業の改善のためには「分からなかったこと」、「使えないこと」の記述の分析が大事である。どうやら単純な集計分析では有用なメッセージを導き出せないようである ― 「コマンド」というキーワードが「分からなかったこと」として多く登場している点は図にも表れている。とはいえ、この点は分析以前に認識されていたことでもある・・・。

ま、25人分のコメント分析であるから目で読めばいいわけである。が、何百人の分量になれば、効率的な分析手法を確立しておくことが大事であろう。更なるテキストマイニングは来年度までの課題とさせていただき、次年度の授業に活かしていきたいと思う。

(3) Misc(その他記載事項)の分析

作業としては同じになるので、ここでは省略する。