系統樹を描く (1)

 今回は、系統樹によるクラスタリングを行います。系統樹とは、同系統のグループ内の親子関係を推定し、その結果を樹木の枝分かれに見立てて表現する手法のことです。樹根(樹木の根の部分)がある系統樹を有根系統樹と呼び、樹根がない系統樹を無根系統樹と呼びます。
 以下の例では、caパッケージのauthorを分析データとして使用します。*1 そして、proxyパッケージでデータを距離行列に変換し、apeパッケージで系統樹を作成します。

# 分析データ
library(ca)
author
# 距離行列(Gower距離)
library(proxy)
d <- as.dist(simil(author, method = "gower"))
# 結合(近隣結合法)
library(ape)
nj <- nj(d)
# 系統樹の描画
par(mfrow = c(2, 2))
# 有根系統樹
plot(nj, type = "c", main = "c")
plot(nj, type = "p", main = "p")
# 無根系統樹
plot(nj, type = "r", main = "r")
plot(nj, type = "u", main = "u")

f:id:langstat:20140509123112p:plain

 このように、apeパッケージで系統樹を作成する場合、"c", "p", "r", "u"という4種類のオプションがあり、最初の2つで有根系統樹、残りの2つで無根系統樹を描くことができます。作成された系統樹を見ると、作家ごとにクラスターを形成しており、テクストにおける文字の使用率が書き手によって異なることが示唆されています。
 なお、系統樹を作成する場合に、dist関数で距離行列を作ったり、hclust関数で結合することもできます。

# 距離行列(ユークリッド距離)
d2 <- dist(author)
# 結合(最長一致法)
hc <- hclust(d2)
# 系統樹を描くためのデータ形式に変換
hc.phy <- as.phylo(hc)
# 系統樹の描画
par(mfrow = c(2, 2))
# 有根系統樹
plot(hc.phy, type = "c", main = "c")
plot(hc.phy, type = "p", main = "p")
# 無根系統樹
plot(hc.phy, type = "r", main = "r")
plot(hc.phy, type = "u", main = "u")

f:id:langstat:20140509125547p:plain

 ただ、今回の分析に限って言えば、ユークリッド距離と最長一致法を用いるよりも、Gower距離と近隣結合法を用いた方が書き手をうまく分類することができたようです。

*1:このデータは、12編の小説における26種類のアルファベットの数を集計したものです。

広告を非表示にする