立命館大学言語学研究会 (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付]決定版 英語シャドーイング【改訂新版】

Pythonに関するメモ

 数年ぶりにPythonを勉強し直そうと思い*1、自分用のメモを作りました(随時更新)。

*1:2009〜2011年ぐらいにPython 2とNLTKを使っていたのですが、もう殆ど忘れてしまいました。。。