# 必要なライブラリの読み込み
library(MASS) # isoMDS用
library(vegan) # spantree (MST) 用
## 要求されたパッケージ permute をロード中です
# データの読み込み
data_raw <- read.csv("data_PC_fixed.csv", row.names=1)
# 1. データを転置
data_t <- t(data_raw)
# 2. 標準化
data_scaled <- scale(data_t)
# 3. 距離行列の計算
d <- dist(data_scaled)
# 4. isoMDSによる次元圧縮
set.seed(123)
init_pos <- cmdscale(d, k=2)
mds_res <- isoMDS(d, y = init_pos, k=2)
## initial value 3.026497
## iter 5 value 2.209066
## iter 10 value 2.080127
## final value 2.062140
## converged
# MDSの結果
x <- mds_res$points[,1]
y <- mds_res$points[,2]
labels <- rownames(data_t)
# 5. 最小全域木 (MST) の計算
mst_res <- spantree(d)
# --- 6. 標準グラフ機能による可視化 ---
# フォントの設定(Mac用: HiraKakuProN-W3)
par(family = "HiraKakuProN-W3", mar = c(5, 5, 4, 2) + 0.1)
# データの範囲を計算し、10%ほど余裕を持たせる例
range_x <- range(x)
range_y <- range(y)
buffer_x <- diff(range_x) * 0.1
buffer_y <- diff(range_y) * 0.1
# 空のプロットを作成(枠組みと軸ラベル)
plot(x, y, type = "n",
xlim = c(range_x[1] - buffer_x, range_x[2] + buffer_x),
ylim = c(range_y[1] - buffer_y, range_y[2] + buffer_y),
xlab = "MDS 第1次元", ylab = "MDS 第2次元",
main = "政党・候補者の得票傾向によるisoMDSおよび最小全域木",
sub = "自治体ごとの得票パターンの類似性に基づく配置")
# MSTの線を描画 (segmentsを使用)
# mst_res$kid は2番目の要素からの親ノードを指す
segments(x[-1], y[-1], x[mst_res$kid], y[mst_res$kid], col = "grey80", lwd = 1)
# ポイントの描画
points(x, y, pch = 16, col = rainbow(length(labels)), cex = 1.5)
# ラベルの描画
# pos=3 は点の上(above)に表示。pos=3は、点の右。cexは文字サイズ。
# text(x, y, labels = labels, pos = 3, cex = 0.8)
text(x, y, labels = labels, pos = 4, cex = 0.5)
# グリッド線を追加(オプション:ggplot風にする場合)
grid(col = "grey90", lty = "solid")
