立命館大学言語学研究会 (Day2)

 以下は、立命館大学言語学研究会のR講習会に関するメモです*1

記述統計

 まずは、平均値、中央値、分散、標準偏差などの記述統計を求めてみましょう。

x <- c(1, 2, 3, 4, 5)
# 平均値
mean(x)
# 中央値
median(x)

# グループAの5人の年収の調査(単位は万円)
a <- c(100, 200, 300, 400, 500)
mean(a)
median(a)
# グループBの5人の年収の調査(単位は万円)
b <- c(100, 200, 300, 400, 5000)
mean(b)
median(b)

x <- c(1, 2, 3, 4, 5)
# 最大値
max(x)
# 最小値
min(x)
# 分散
var(x)
# 標準偏差
sd(x)
# 要約統計量
summary(x)

# 行列の作成(復習を含む)
mat <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 3, ncol = 3, byrow = TRUE)
mat
# 行列の総和
sum(mat)
# 行列の平均値
mean(mat)
# 行列の1行目の総和
sum(mat[1, ])
# 行列の2〜3列目の平均値
mean(mat[, 2 : 3])
# 行ごとの総和
rowSums(mat)
# 列ごとの総和
colSums(mat)
# 行ごとの平均値
rowMeans(mat)
# 列ごとの平均値
colMeans(mat)

# 行ごとの総和(rowSums(mat)と同じ)
apply(mat, 1, sum)
# 列ごとの平均値(colMeans(mat)と同じ)
apply(mat, 2, mean)
# 行ごとの最大値
apply(mat, 1, max)
# 列ごとの要約統計量
apply(mat, 2, summary)

検定・効果量

 次に、検定をしてみましょう。

# クロス集計表の準備
tab <- matrix(c(96, 54, 52, 48), nrow = 2, ncol = 2, byrow = TRUE)
rownames(tab) <- c("Male", "Female")
colnames(tab) <- c("Jotai", "Keitai")
# クロス集計表の確認
tab
# クロス集計表の可視化
mosaicplot(tab)

# カイ自乗検定
chisq.test(tab, correct = FALSE)
# カイ自乗検定(イェーツの補正あり)
chisq.test(tab, correct = TRUE)

 2つ以上の頻度の差を検定する場合は、以下のようにします。多重比較の結果として得られるp値を解釈する際は、ボンフェローニの補正などをします。

# 2×3のクロス集計表の準備
tab.2 <- matrix(c(805, 414, 226, 99, 38, 12), nrow = 2, ncol = 3, byrow = TRUE)
rownames(tab.2) <- c("Correct", "Error")
colnames(tab.2) <- c("Level 1", "Level 2", "Level 3")
# クロス集計表の確認
tab.2

# 多重比較
# 1列目と2列目を検定
chisq.test(tab.2[, c(1, 2)], correct = FALSE)
# 1列目と3列目を検定
chisq.test(ab.2[, c(1, 3)], correct = FALSE)
# 2列目と3列目を検定
chisq.test(tab.2[, c(2, 3)], correct = FALSE)

 検定は非常に便利なものですが、検定結果がサンプルサイズに影響されることに注意する必要があります。そのため、p値だけでなく、オッズ比などの効果量も確認するとよいでしょう。

# 表中の数値を全て10倍
tab.3 <- tab * 10
# 10倍したデータの確認
tab.3
# カイ自乗検定
chisq.test(tab.3, correct = FALSE)

# オッズ比の計算
(tab[1, 1] / tab[2, 1]) / (tab[1, 2] / tab[2, 2])
# 10倍したデータでオッズ比を計算
(tab.3[1, 1] / tab.3[2, 1]) / (tab.3[1, 2] / tab.3[2, 2])

# 追加パッケージのインストール(初回のみ)
install.packages("vcd", dependencies = TRUE)
# 追加パッケージの読み込み(Rを起動するごとに毎回)
library(vcd)
# オッズ比の計算
oddsratio(tab, log = FALSE)
# オッズ比の信頼区間(下限値,上限値)の計算
confint(oddsratio(tab, log = FALSE))
  • 練習問題
    • 以下のデータを使って、モザイクプロットを描きなさい
    • 同じデータに対して、カイ自乗検定(イェーツの補正なし)を実行しなさい
    • 同じデータに対して、オッズ比と、オッズ比の信頼区間を計算しなさい
A新聞 B新聞
内閣支持 225 292
内閣不支持 275 208

相関・回帰

 続いて、相関回帰をしてみます。

# 追加パッケージのインストール(初回のみ)
install.packages("corpora", dependencies = TRUE)
# 追加パッケージの読み込み(Rを起動するごとに毎回)
library(corpora)
# データセットの準備
data(BNCbiber)
# データの冒頭の5行のみを表示
head(BNCbiber, 5)
# 相関係数の計算
cor(BNCbiber[, 2], BNCbiber[, 4], method = "pearson")

# 散布図の描画
plot(BNCbiber[, 2], BNCbiber[, 4], xlab = "past tense", ylab = "present tense")

# 無相関検定
cor.test(BNCbiber[, 2], BNCbiber[, 4])

# スピアマンの順位相関係数の計算
cor(BNCbiber[, 2], BNCbiber[, 4], method = "spearman")

# ピアソンの積率相関係数
cor(BNCbiber[, 2 : 4], method = "pearson")
# スピアマンの順位相関係数の計算
cor(BNCbiber[, 2 : 4], method = "spearman")

# 追加パッケージのインストール(初回のみ)
install.packages("psych", dependencies = TRUE)
# 追加パッケージの読み込み(Rを起動するごとに毎回)
library(psych)
# 相関係数が表示された散布図行列の作成
pairs.panels(BNCbiber[, 2 : 4])

# 単回帰分析
lm.result <- lm(BNCbiber[, 2] ~ BNCbiber[, 4])
# 結果の確認
lm.result

# 回帰式の可視化
plot(BNCbiber[, 4], BNCbiber[, 2], xlab = "present tense", ylab = "past tense", pch = 16, col = "grey")
abline(lm.result)

# 重回帰分析
lm.result.2 <- lm(BNCbiber[, 2] ~ BNCbiber[, 3] + BNCbiber[, 4])
# 結果の確認
lm.result.2
  • 練習問題
    • carsデータセットを使って、散布図を描きなさい
    • 同じデータを使って、自動車の速度とブレーキを踏んでから止まるまでの距離の積率相関係数と順位相関係数を求めなさい
    • 同じデータを使って、説明変数を速度、目的変数を距離とする回帰分析を行い、その結果を可視化しなさい

多変量解析

 多変量解析と呼ばれる手法はたくさんありますが、ここでは対応分析クラスター分析を扱います。

# 追加パッケージのインストール(初回のみ)
install.packages("ca", dependencies = TRUE)
# 追加パッケージの読み込み(Rを起動するごとに毎回)
library(ca)
# データセットの準備
data(author)
# データの冒頭の5行のみを表示
head(author, 5)

# 対応分析
ca.result <- ca(author)
# 結果の可視化
plot(ca.result)

# 行データ(テキスト)のみを表示
plot(ca.result, what = c("all", "none"))
# 列データ(変数)のみを表示
plot(ca.result, what = c("none", "all"))

# 対応分析から得られた詳しい結果の確認
ca.result
# 行データの表示(第1~2次元のみ)
ca.result$rowcoord[, 1 : 2]
# 行データの第1次元の得点を並び換え
sort(ca.result$rowcoord[, 1], decreasing = TRUE)
# 行データの第2次元の得点を並び換え
sort(ca.result$rowcoord[, 2], decreasing = TRUE)
# 列データの表示(第1~2次元のみ)
ca.result$colcoord[, 1 : 2]
# 列データの第1次元の得点を並び換え
sort(ca.result$colcoord[, 1], decreasing = TRUE)
# 列データの第2次元の得点を並び換え
sort(ca.result$colcoord[, 2], decreasing = TRUE)

# 相対頻度の計算
author.2 <- author / apply(author, 1, sum)
# ユークリッド距離の計算
dist.result <- dist(author.2, method = "euclidean")
# 階層型クラスター分析(ウォード法)
hclust.result <- hclust(dist.result, method = "ward.D2")
# 結果の可視化
plot(hclust.result)

# データセットの転置
author.3 <- t(author.2)
# ユークリッド距離の計算
dist.result.2 <- dist(author.3, method = "euclidean")
# 階層型クラスター分析(ウォード法)
hclust.result.2 <- hclust(dist.result.2, method = "ward.D2")
# 結果の可視化
plot(hclust.result.2)

# 階層型クラスターつきのヒートマップ
heatmap(author.2)

テキストマイニング

 最後に、RMeCabを使って、簡単なテキストマイニングデモをします。RMeCabのインストール方法は、他のパッケージと異なるため、公式サイトをよく読んでください(テキストデータの扱い方は、WindowsMacで異なる部分もあります)。

# 追加パッケージの読み込み(Rを起動するごとに毎回)
library(RMeCab)
# 短い文章の形態素解析
RMeCabC("すもももももももものうち")
# 形態素解析結果の保存
RMeCabC.result <- RMeCabC("すもももももももものうち")
# データ形式の確認
class(RMeCabC.result)
# データ形式の変換
RMeCabC.result.2 <- unlist(RMeCabC.result)
RMeCabC.result.2
# データのクラスの確認
class(RMeCabC.result.2)

# 解析結果の一部のみを表示
RMeCabC.result.2[1]
RMeCabC.result.2[2]
RMeCabC.result.2[1 : 3]

# 品詞情報のみを表示
names(RMeCabC.result.2)

# 単語の原形を復元
RMeCabC.result.3 <- RMeCabC("私は焼肉を食べていない。", 1)
RMeCabC.result.4 <- unlist(RMeCabC.result.3)
RMeCabC.result.4

# 追加パッケージのインストール(初回のみ)
install.packages("wordcloud", dependencies = TRUE)
# 追加パッケージの読み込み(Rを起動するごとに毎回)
library(wordcloud)

# RMeCabText関数で形態素解析(解析対象のファイルを選択)
RMeCabText.result <- RMeCabText(file.choose())
# RMeCabText関数の結果の確認
head(RMeCabText.result, 5)
# 単語ベクトルの作成
RMeCabText.result.2 <- unlist(sapply(RMeCabText.result, "[[", 1))
# 単語ベクトルの確認
head(RMeCabText.result.2, 5)
# ワードクラウドを描画
wordcloud(RMeCabText.result.2, min.freq = 2, random.order = FALSE)

# 追加パッケージのインストール(初回のみ)
install.packages("igraph", dependencies = TRUE)
# 追加パッケージの読み込み(Rを起動するごとに毎回)
library(igraph)
# NgramDFによる共起語の集計(解析対象のファイルを選択)
NgramDF.result <- NgramDF(file.choose(), type = 1, N = 2, pos = "名詞")
# 共起頻度2以上のペアのみを抽出
NgramDF.result.2 <- subset(NgramDF.result, Freq > 1)
# ネットワークの描画
g <- graph.data.frame(NgramDF.result.2, directed = FALSE)
plot(g, vertex.label = V(g)$name, vertex.color = "grey")
# 共起頻度3以上のペアのみを抽出
NgramDF.result.3 <- subset(NgramDF.result, Freq > 2)
# ネットワークの描画
g.2 <- graph.data.frame(NgramDF.result.3, directed = FALSE)
plot(g.2, vertex.label = V(g.2)$name, vertex.color = "grey")

参考図書

Rによるやさしいテキストマイニング

Rによるやさしいテキストマイニング

*1:本講習会は、学内のクローズドなイベントです

*2:CSVファイルを読み込む際、 ISO <- read.csv(file(file.choose(), encoding = "cp932"), header = TRUE, row.names = 1) のように文字コードで cp932 を指定すること

立命館大学言語学研究会 (Day1)

 以下は、立命館大学言語学研究会のR講習会に関するメモです*1

簡単な計算

 Rのコンソール画面の入力に慣れるために、簡単な計算をしてみましょう。

# 四則演算
1 + 1
3 - 2
2 * 2
8 / 2
(1 + 2) * 3
# 累乗
3 ^ 2 
  • 練習問題
    • こちらのページにある四則演算を「Rを使って」解いてみましょう。

関数

 関数と呼ばれる機能を使って、平方根や絶対値を求めてみましょう。

# 平方根を計算するための関数
sqrt(9)
# 絶対値を計算するための関数
abs(-5)

変数への代入

 次に、変数と呼ばれる箱(のようなもの)の中にデータを格納してみましょう。変数の中にデータを入れることを代入と言います。

# 変数に値を代入
x <- 1
# 代入結果を確認
x
# 上書き
x <- 2
x

# 変数にベクトルを代入(:は〜という意味)
y <- 1 : 5
y
z <- c(1, 3, 7, 8, 10) # cは関数の名前
z
# ベクトルの長さ(要素数)の確認
length(x)
length(y)
length(z)
# ベクトルの3番目の要素だけを取り出す
y[3]
# ベクトルの2番目から4番目の要素だけを取り出す
y[2 : 4]

# 変数同士の計算
y + z
z - y
y * z

# 合計を計算するための関数
sum(y)
sum(z)

# 合計同士の計算
sum(y) + sum(z)
sum(y) - sum(z)
sum(y) * sum(z)
sum(y) / sum(z)

# ベクトルの結合
yz <- c(y, z)
yz
  • 練習問題
    • 5という数値をxという変数に代入し、その中身を表示しなさい
    • xに代入した数値に1を足しなさい
    • xに代入した数値を2で割りなさい
    • 7という数値をyという変数に代入し、xとyを掛け合わせなさい
    • 1, 3, 5, 7, 9という5つの数値をxという変数に代入し、その中身を表示しなさい
    • xに代入した5つの数値それぞれに対して、1を足した数値を効率的に求めなさい
    • 2, 4, 6, 8, 10という5つの数値をyという変数に代入し、xとyを掛け合わせなさい
    • xとyを結合し、1つのベクトルにしなさい

行列

 ここまでは、ベクトルという1次元のデータを使用してきましたが、行列という2次元のデータを作成することも可能です。

# 行列を作成
matrix(c(1, 2, 3, 4), nrow = 2) # 引数nrowで行列の行数を指定
matrix(c(1, 2, 3, 4), nrow = 2, byrow = TRUE) # 引数byrowでTRUEを指定すると、数字の配置が換わる(要注意)
# 変数に行列を代入
m1 <- matrix(c(12, 17, 22, 16), nrow = 2)
# 代入結果を確認
m1 
# 行列の行数や列数を確認
nrow(m1)
ncol(m1)
dim(m1)

 作成した行列に行ラベルと列ラベルを付けることもできます。

# 行ラベルの作成
rownames(m1) <- c("A", "B")
# 列ラベルの作成
colnames(m1) <- c("X", "Y")
# ラベルをつけた結果の確認
m1

# 行列を使った計算
m2 <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 2, byrow = TRUE)
m2
m3 <- matrix(c(7, 8, 9, 10, 11, 12), nrow = 2, byrow = TRUE)
m3
# 行列同士の計算
m2 + m3
m2 * m3

# 元の行列
m2
# 2行目・3列目の要素を取り出し
m2[2, 3]
# 2行目の要素全てを取り出し
m2[2, ]
# 3列目の要素全てを取り出し
m2[, 3]
# 2行目の要素以外の全てを取り出し
m2[-2, ]
# 3列目の要素以外の全てを取り出し
m2[, -3]

# 行列の総和
sum(m3)
# 行列の1行目の総和
sum(m3[1, ])
# 行列の2〜3列目の平均値
mean(m3[, 2 : 3])
# 行ごとの総和
rowSums(m3)
# 列ごとの総和
colSums(m3)

# 行列の転置
t(m2)
# 元の行列
m2
  • 練習問題
    • 以下の行列(商品Aと商品Bに関するクチコミのデータ)を作成し、上記の行列のPositiveとNegativeの列のみを表示しなさい
    • 商品Aに関するクチコミ数の総計と、商品Bに関するクチコミ数の総計を計算しなさい
A B
Positive 122 86
Negative 97 135
Neutral 244 230

CSVファイルからの読み込み

 Rでファイルを読み込む方法はいくつかありますが、ここでは、マウス操作で行う方法を使います。データの形式は、CSVファイルとします。読み込むデータは、Excelなどで用意します。

# 列ラベルも行ラベルもない場合
dat1 <- read.csv(file.choose(), header = FALSE)
# 列ラベルがある場合
dat2 <- read.csv(file.choose(), header = TRUE)
dat2
# 列ラベルと行ラベルがある場合
dat3 <- read.csv(file.choose(), header = TRUE, row.names = 1)
dat3
  • 練習問題
    • 以下のAKB48チームメンバーリスト(2015年7月現在)のデータ*2CSVファイルの形式で用意し、Rで適切に読み込みなさい

氏名,年齢,身長
小嶋陽菜,27,164
高橋みなみ,24,148.5
大家志津香,23,164
宮崎美穂,22,159
横山由依,22,158
中村麻里子,21,161
島崎遥香,21,157
小笠原茉由,21,151
前田亜美,20,165
中西智代梨,20,160
小嶋菜月,20,154
佐々木優佳里,19,158
入山杏奈,19,157
田北香世子,18,155
宮脇咲良,17,160
岩田華怜,17,159
白問美瑠,17,155
平田梨奈,17,149
谷口めぐ,16,159
山田菜々美,16,154
大和田南那,15,154
樋渡結依,15,151
西山怜那,14,151

視覚化

 Rのcorporaという追加パッケージに入っているBNCbiberというデータセットを使って、ヒストグラムを描いてみましょう*3

# 追加パッケージのインストール(初回のみ)
install.packages("corpora", dependencies = TRUE)
# 追加パッケージの読み込み(Rを起動するごとに毎回)
library(corpora)
# データセットの準備
data(BNCbiber)
# データセットのヘルプを確認
help(BNCbiber)
# データの冒頭の5行のみを表示
head(BNCbiber, 5)

# ヒストグラムの描画(列名で指定)
hist(BNCbiber[, 2])
# ヒストグラムの描画(変数名$列名の形式で指定)
hist(BNCbiber$f_01_past_tense)
# ヒストグラムのタイトルと軸ラベルを変更
hist(BNCbiber[, 2], main = "past tense", xlab = "frequency", ylab = "number of texts")
# ヒストグラムの色を変更
hist(BNCbiber[, 2], main = "past tense", xlab = "frequency", ylab = "number of texts", col = "grey")
# Rで使える色の確認
colors()

 同じデータセットを使って、箱ひげ図を描いてみましょう。

# 箱ひげ図の描画
boxplot(BNCbiber[, 2], range = 0)
# 箱ひげ図の作成に用いられている要約統計量の確認
boxplot.stats(BNCbiber[, 2])
# 箱ひげ図のタイトルと色を変更
boxplot(BNCbiber[, 2], range = 0, main = "past tense", col = "grey")
# 箱ひげ図の外れ値を表示
boxplot(BNCbiber[, 2], main = "past tense", col = "grey")

# アヤメのデータセットの確認
iris
help(iris)
# グループ別の箱ひげ図の描画
boxplot(iris[, 1] ~ iris[, 5], col = "grey")
# グループ別の箱ひげ図の描画(別の書き方)
boxplot(iris$Sepal.Length ~ iris$Species, col = "grey")
# ノッチのある箱ひげ図の描画
boxplot(iris$Sepal.Length ~ iris$Species, col = "grey", notch = TRUE) # ノッチがオーバーラップしていなければ統計的な有意差あり

# 追加パッケージのインストール(初回のみ)
install.packages("beeswarm", dependencies = TRUE)
# 追加パッケージの読み込み(Rを起動するごとに毎回)
library(beeswarm)
# 箱ひげ図の上に個々のデータの分布を重ねて描画
boxplot(iris$Sepal.Length ~ iris$Species, col = "grey")
beeswarm(iris$Sepal.Length ~ iris$Species, col = "black", pch = 16, add = TRUE) # pchでポイントの形を指定
  • 練習問題
    • irisデータの1列目のデータでヒストグラムを作成しなさい(図の色は赤、タイトルはSepal.Length)
    • irisデータの2列目のデータで箱ひげ図を作成しなさい(図の色は青、タイトルはSepal.Width)
    • irisデータの3列目のデータを使って、アヤメの品種別に箱ひげ図を作成しなさい(図の色は緑、タイトルはPetal.Length、個々のデータを重ね書き)
    • irisデータの4列目のデータを使って、アヤメの品種別に箱ひげ図を作成しなさい(図の色は緑、タイトルはPetal.Width、ノッチを入れる)

 Rのtextometryという追加パッケージに入っているrobespierreというデータセットを使って、モザイクプロットを描いてみましょう。

# 追加パッケージのインストール(初回のみ)
install.packages("textometry", dependencies = TRUE)
# 追加パッケージの読み込み(Rを起動するごとに毎回)
library(textometry)
# データセットの準備
data(robespierre)
# データセットの確認
robespierre
help(robespierre)
# データ最終行の削除
robespierre.2 <- robespierre[-6, ]
# 修正したデータセットの確認
robespierre.2
# モザイクプロットを描画
mosaicplot(robespierre.2)
# ラベルの向きを変更
mosaicplot(robespierre.2, las = 2)

 ここまでは1つの変数のみを視覚化してきましたが、次は、2つ(以上)の変数を散布図で視覚化してみます。

# 散布図を描画
plot(BNCbiber$f_01_past_tense, BNCbiber$f_03_present_tense)
# 散布図の引数を指定
plot(BNCbiber$f_01_past_tense, BNCbiber$f_03_present_tense, main = "tense", xlab = "past", ylab = "present")
# 点の大きさとタイプと色を指定
plot(BNCbiber$f_01_past_tense, BNCbiber$f_03_present_tense, main = "tense", xlab = "past", ylab = "present", cex = 1.2, pch = 16, col = "grey")

# 追加パッケージのインストール(初回のみ)
install.packages("car", dependencies = TRUE)
# 追加パッケージの読み込み(Rを起動するごとに毎回)
library(car)
# 散布図と箱ひげ図を同時に描画
scatterplot(BNCbiber$f_01_past_tense, BNCbiber$f_03_present_tense, xlab = "past", ylab = "present", smoother = FALSE, reg.line = FALSE)

# 散布図行列を描画
pairs(BNCbiber[, 2 : 4])
# おまけ: もう少し綺麗な散布図行列を描画
install.packages(c("psych", "GGally"), dependencies = TRUE)
library(psych)
pairs.panels(iris, bg = as.numeric(iris$Species), pch = 21)
library(GGally)
ggpairs(iris, colour = "Species", shape = "Species")
  • 練習問題
    • Rのcarsデータを表示しなさい(コンソールにcarsと入力し、エンターキー)
    • carsデータで散布図を作成しなさい(X軸のラベルをspeed、Y軸のラベルをdist、タイトルをcars)
    • 上記の散布図の点の形を▲にし、点の色をピンク、点の大きさを1.5倍にしなさい
    • irisデータの1〜4列目のデータで散布図行列を作成しなさい

参考図書

Rによるやさしいテキストマイニング

Rによるやさしいテキストマイニング

*1:本講習会は、学内のクローズドなイベントです

*2:兼子毅 (2015). 『ゼロから始めるR―四則演算から多変量解析まで』日科技連出版社, p.99

*3:Rの追加パッケージのインストールの仕方、呼び出し方については、こちらなどに詳しく書いてあります。

ワードクラウドは本当にわかりやすい可視化の方法なのか?

 近年、テキストマイニングの結果をワードクラウドと呼ばれる方法で可視化するのが流行しています。

文章中で出現頻度が高い単語を複数選び出し、その頻度に応じた大きさで図示する手法。ウェブページやブログなどに頻出する単語を自動的に並べることなどを指す。文字の大きさだけでなく、色、字体、向きに変化をつけることで、文章の内容をひと目で印象づけることができる。
デジタル大辞泉の解説

 しかし、ワードクラウドという可視化の方法は、それを見る人にとって、本当にわかりやすいものなのでしょうか? まずは、RのlanguageRパッケージのalice(『不思議の国のアリス』)を使って、ワードクラウドを描いてみます。ワードクラウドの作成には、wordcloudパッケージを用います。また、ここではワードクラウドという可視化の方法そのものに焦点を当てるべく、綺麗な色などはつけずにモノクロで作成します。

# 分析データ
library(languageR)
data(alice)
# ワードクラウドの作成(頻度10以上の単語を描画)
library(wordcloud)
wordcloud(alice, min.freq = 10)

 上記スクリプトを実行すると、以下のようなワードクラウドが表示されます。

f:id:langstat:20180111214755p:plain

 この図を見ると、"said"や"alice"といった単語が多く使われていることがわかります。では、それ以外に多く使われている単語は何でしょうか? よく目をこらしてみると、"little"、"queen"、"and"、"time"のような単語が他の単語よりも大きく描かれているような気がします。この「ような気がします」というのが曲者で、人間の目は、文字の大小関係を一度にたくさん把握するのが必ずしも得意ではありません。その結果、分析者の目に「たまたま」とまった単語に注意が向けられ、恣意的な解釈を招く危険性もあります。
 ここで思い出してほしいのは、上記のワードクラウドは、単に単語の頻度の高低(=文字の大小)をランダムに配置しているだけだということです。つまり、このグラフを眺めてわかるのは、よく使われる単語の頻度に関する情報だけです。しかし、先ほど述べたように、ワードクラウド上では、頻度の高低を正確に把握するのが難しく、個々の単語の使用頻度もわかりません。
 単語の頻度に関する順位について知りたければ、単純に頻度上位の単語を棒グラフで可視化する方がよほど効果的です。

# 全ての文字を小文字に変換
alice.lower <- tolower(alice)
# ワードリストの作成
freq.list <- table(alice.lower)
sorted.freq.list <- sort(freq.list, decreasing = TRUE)
# 頻度上位30位までを棒グラフで可視化
barplot(sorted.freq.list[1 : 30], las = 2, ylab = "Freq.")

 上記スクリプトを実行すると、以下のような棒グラフが表示されます。

f:id:langstat:20180111215608p:plain

 この棒グラフを見ると、単語の使用頻度に関する順位が一目瞭然です*1。このように、単語の頻度の高低を議論するのであれば、見た目がキャッチーなだけのワードクラウドではなく、シンプルな棒グラフなどで可視化するのがよいと考えます*2
 ワードクラウドの描画、英語や日本語のテキストからのワードリスト作成については、手前味噌ですが、以下の拙著などにも詳しく説明してあります。

Rによるやさしいテキストマイニング

Rによるやさしいテキストマイニング

*1:棒グラフの描画に使うワードリストを作成する際にストップワードを指定したい場合は、tmパッケージのremoveWords関数などを利用します。

*2:なお、個々の単語の具体的な使用頻度は、sorted.freq.listという変数の中を見ればわかります

2017年12月に購入した本

  以下、順不同です。

Fluency in Native and Nonnative English Speech (Studies in Corpus Linguistics)

Fluency in Native and Nonnative English Speech (Studies in Corpus Linguistics)

Corpora and Language Learners (Studies in Corpus Linguistics)

Corpora and Language Learners (Studies in Corpus Linguistics)

Strategies in Academic Discourse (Studies in Corpus Linguistics)

Strategies in Academic Discourse (Studies in Corpus Linguistics)

How To Use Corpora In Language Teaching (Studies in Corpus Linguistics)

How To Use Corpora In Language Teaching (Studies in Corpus Linguistics)

Linking Up Contrastive and Learner Corpus Research (Language and Computers)

Linking Up Contrastive and Learner Corpus Research (Language and Computers)

Clausal Complements in Native and Learner Spoken English: A Corpus-Based Study With Lindsei and Vicolse (Linguistic Insights)

Clausal Complements in Native and Learner Spoken English: A Corpus-Based Study With Lindsei and Vicolse (Linguistic Insights)

公式 TOEIC Listening & Reading 問題集 3

公式 TOEIC Listening & Reading 問題集 3

1日1分! TOEIC  L&Rテスト千本ノック! (祥伝社黄金文庫)

1日1分! TOEIC L&Rテスト千本ノック! (祥伝社黄金文庫)

2017年11月に購入した本

 以下、順不同です。

Linguistic Variation in Research Articles: When discipline tells only part of the story (Studies in Corpus Linguistics)

Linguistic Variation in Research Articles: When discipline tells only part of the story (Studies in Corpus Linguistics)

Learner Corpora in Language Testing and Assessment (Studies in Corpus Linguistics)

Learner Corpora in Language Testing and Assessment (Studies in Corpus Linguistics)

Multi-Dimensional Analysis, 25 Years On: A Tribute to Douglas Biber (Studies in Corpus Linguistics)

Multi-Dimensional Analysis, 25 Years On: A Tribute to Douglas Biber (Studies in Corpus Linguistics)

Corpus-Based Research in Applied Linguistics: Studies in Honor of Doug Biber (Studies in Corpus Linguistics)

Corpus-Based Research in Applied Linguistics: Studies in Honor of Doug Biber (Studies in Corpus Linguistics)

語学学習支援のための言語処理 (自然言語処理シリーズ 11)

語学学習支援のための言語処理 (自然言語処理シリーズ 11)

[CD付]決定版 英語シャドーイング【改訂新版】

[CD付]決定版 英語シャドーイング【改訂新版】