因子分析(や主成分分析)の結果をバイプロットすることがあります。因子分析の場合は、Rのbiplot()
関数を使うと簡単に作成できますが、因子負荷量の文字列が読みにくいのが難点です。
例として、バイプロットを作ってみましょう。まず因子負荷量・因子得点っぽいダミーの値を準備しました。データ値は標準正規分布の乱数をそのまま使います。変数ラベルはなんでも良いのですが、Mac OS Xには/usr/share/dict
下に英単語が入っているテキストファイルがあるので、そこからランダムに抜き出します。DTPやウェブサイトのデザインではプレースホルダ文章として「lorem ipsum」を使いますが、それっぽいことができます。
N <- 10
# ダミーの因子負荷量(と変数のラベル)を作成 ...変数の数はN
X <- matrix(rnorm(2 * N), ncol=2)
names.all <- read.table("/usr/share/dict/propernames")
names <- names.all[sample(nrow(names.all), size=N), ]
# ダミーの因子得点を作成 ...データ数は適当に3Nにしました
Y <- matrix(rnorm(2 * 3*N), ncol=2)
このデータに対して、普通にbiplot()
を使用すると下記のようになります。赤矢印が因子負荷量、黒数字が因子得点を表しています。
row.names(X) <- names
biplot(Y, X, xlab="Factor 1", ylab="Factor 2")
grid()
矢印の先に変数のラベルがあるのですが、個人的には矢印の先に 矢印と同じ方向 にラベルが傾いているものが好みです。このほうがラベルと矢印の対応が分かりやすいので、理解しやすいのです。
これを実現するためには、因子負荷量に応じて文字の始点と傾きを操作してやる必要があります。具体的には、できるだけ文字が上下反転しないように、文字位置が横軸方向で正負のどちらであるかの判定をして、文字の回転方向をかえています。そのためにatan()
で分岐して、text()
内のsrt
引数で回転角度を指定しています。
plot(X[,1], X[,2], type="n", asp=1, xlim=c(-3, +3), ylim=c(-3, +3), xlab="Factor 1", ylab="Factor 2")
grid()
arrows(0, 0, X[,1], X[,2], length=0.1, angle=15, col="red")
for (n in 1:length(names)) {
if (X[n,1] >= 0) {
angle <- atan2(X[n,2], X[n,1]) / pi * 180
text(X[n,1], X[n,2], labels=names[n], adj=-0.1, col="red", srt=angle)
} else {
angle <- atan2(X[n,2], X[n,1]) / pi * 180 + 180
text(X[n,1], X[n,2], labels=names[n], adj=+1.1, col="red", srt=angle)
}
}
points(Y[,1], Y[,2], pch=1)
黒数字を黒丸にしたのでさらに印象がすっきりしました。