1.地域のクラスタリング
# 必要なライブラリの読み込み
if (!require("FactoMineR")) install.packages("FactoMineR")
## 要求されたパッケージ FactoMineR をロード中です
if (!require("factoextra")) install.packages("factoextra")
## 要求されたパッケージ factoextra をロード中です
## 要求されたパッケージ ggplot2 をロード中です
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
if (!require("ggplot2")) install.packages("ggplot2")
library(FactoMineR)
library(factoextra)
library(ggplot2)
# 1. データの読み込み
df <- read.csv("data_PC.csv", row.names = 1, check.names = FALSE)
rownames(df)
## [1] "門司区" "小倉北区" "小倉南区" "若松区" "八幡東区" "八幡西区"
## [7] "戸畑区" "東区" "博多区" "中央区" "南区" "城南区"
## [13] "早良区" "西区" "大牟田市" "久留米市" "直方市" "飯塚市"
## [19] "田川市" "柳川市" "八女市" "筑後市" "大川市" "行橋市"
## [25] "豊前市" "中間市" "小郡市" "筑紫野市" "春日市" "大野城市"
## [31] "宗像市" "太宰府市" "古賀市" "福津市" "うきは市" "宮若市"
## [37] "嘉麻市" "朝倉市" "みやま市" "糸島市" "那珂川市" "宇美町"
## [43] "篠栗町" "志免町" "須恵町" "新宮町" "久山町" "粕屋町"
## [49] "芦屋町" "水巻町" "岡垣町" "遠賀町" "小竹町" "鞍手町"
## [55] "桂川町" "筑前町" "東峰村" "大刀洗町" "大木町" "広川町"
## [61] "香春町" "添田町" "糸田町" "川崎町" "大任町" "赤村"
## [67] "福智町" "苅田町" "みやこ町" "吉富町" "上毛町" "築上町"
colnames(df)
## [1] "日本共産党" "日本維新の会" "無所属連合" "日本保守党" "立憲民主党"
## [6] "参政党" "国民民主党" "チームみらい" "日本誠真会" "社会民主党"
## [11] "れいわ新選組" "日本改革党" "自由民主党" "再生の道" "公明党"
## [16] "NHK党" "KWM" "SHM" "TMN" "NAS"
## [21] "NKD" "ITO" "FRK" "YMG" "MRK"
## [26] "MTS" "MOR" "OKS" "NOD"
# 2. 対応分析 (CA) の実行
res.ca <- CA(df, graph = FALSE)
summary(res.ca)
##
## Call:
## CA(X = df, graph = FALSE)
##
## The chi square of independence between the two variables is equal to 146535.4 (p-value = 0 ).
##
## Eigenvalues
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6 Dim.7
## Variance 0.017 0.007 0.003 0.002 0.001 0.001 0.001
## % of var. 53.280 21.224 8.393 6.197 3.301 2.441 1.798
## Cumulative % of var. 53.280 74.504 82.897 89.094 92.395 94.836 96.634
## Dim.8 Dim.9 Dim.10 Dim.11 Dim.12 Dim.13 Dim.14
## Variance 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## % of var. 0.765 0.490 0.405 0.392 0.249 0.212 0.177
## Cumulative % of var. 97.400 97.890 98.295 98.688 98.937 99.149 99.326
## Dim.15 Dim.16 Dim.17 Dim.18 Dim.19 Dim.20 Dim.21
## Variance 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## % of var. 0.147 0.108 0.082 0.067 0.054 0.045 0.043
## Cumulative % of var. 99.473 99.581 99.663 99.729 99.783 99.829 99.871
## Dim.22 Dim.23 Dim.24 Dim.25 Dim.26 Dim.27 Dim.28
## Variance 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## % of var. 0.035 0.026 0.019 0.018 0.015 0.012 0.002
## Cumulative % of var. 99.906 99.933 99.952 99.970 99.986 99.998 100.000
##
## Rows (the 10 first)
## Iner*1000 Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3
## 門司区 | 0.800 | -0.156 2.505 0.534 | 0.116 3.482 0.296 | 0.049
## 小倉北区 | 0.402 | 0.025 0.117 0.050 | 0.090 3.806 0.643 | 0.032
## 小倉南区 | 0.407 | -0.032 0.219 0.092 | 0.083 3.778 0.631 | 0.039
## 若松区 | 0.663 | -0.067 0.391 0.101 | 0.126 3.492 0.358 | 0.107
## 八幡東区 | 0.236 | -0.078 0.432 0.312 | 0.081 1.183 0.340 | 0.052
## 八幡西区 | 0.389 | -0.027 0.188 0.083 | 0.077 3.945 0.689 | 0.035
## 戸畑区 | 0.513 | -0.048 0.148 0.049 | 0.127 2.590 0.343 | 0.116
## 東区 | 0.849 | 0.111 4.606 0.925 | 0.018 0.290 0.023 | 0.010
## 博多区 | 2.646 | 0.220 13.046 0.841 | 0.043 1.234 0.032 | -0.052
## 中央区 | 3.166 | 0.251 15.545 0.837 | -0.066 2.677 0.057 | 0.026
## ctr cos2
## 門司区 1.576 0.053 |
## 小倉北区 1.227 0.082 |
## 小倉南区 2.172 0.144 |
## 若松区 6.274 0.254 |
## 八幡東区 1.224 0.139 |
## 八幡西区 2.030 0.140 |
## 戸畑区 5.490 0.287 |
## 東区 0.249 0.008 |
## 博多区 4.697 0.048 |
## 中央区 1.067 0.009 |
##
## Columns (the 10 first)
## Iner*1000 Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3
## 日本共産党 | 1.565 | -0.076 0.654 0.071 | 0.189 10.239 0.444 | 0.148
## 日本維新の会 | 0.528 | 0.125 2.267 0.732 | -0.001 0.000 0.000 | -0.009
## 無所属連合 | 0.070 | 0.106 0.125 0.305 | -0.027 0.020 0.020 | 0.000
## 日本保守党 | 0.940 | 0.166 4.888 0.886 | 0.017 0.131 0.009 | 0.014
## 立憲民主党 | 0.950 | -0.079 2.104 0.378 | -0.061 3.188 0.228 | 0.057
## 参政党 | 0.638 | 0.073 2.361 0.631 | -0.006 0.035 0.004 | -0.020
## 国民民主党 | 1.940 | 0.168 10.445 0.918 | 0.000 0.000 0.000 | -0.002
## チームみらい | 1.662 | 0.338 7.935 0.814 | -0.031 0.166 0.007 | 0.044
## 日本誠真会 | 0.078 | 0.088 0.176 0.384 | -0.018 0.018 0.016 | 0.032
## 社会民主党 | 0.396 | -0.094 0.580 0.250 | 0.033 0.178 0.030 | -0.036
## ctr cos2
## 日本共産党 16.021 0.275 |
## 日本維新の会 0.074 0.004 |
## 無所属連合 0.000 0.000 |
## 日本保守党 0.226 0.006 |
## 立憲民主党 7.098 0.201 |
## 参政党 1.121 0.047 |
## 国民民主党 0.006 0.000 |
## チームみらい 0.866 0.014 |
## 日本誠真会 0.145 0.050 |
## 社会民主党 0.527 0.036 |
# 3. 地域の座標を抽出
region_coords <- as.data.frame(res.ca$row$coord)
colnames(region_coords) <- paste0("Dim", 1:ncol(region_coords))
knitr::kable(round(region_coords,digits = 3))
| 門司区 |
-0.156 |
0.116 |
0.049 |
0.019 |
-0.035 |
| 小倉北区 |
0.025 |
0.090 |
0.032 |
0.026 |
-0.041 |
| 小倉南区 |
-0.032 |
0.083 |
0.039 |
-0.018 |
0.003 |
| 若松区 |
-0.067 |
0.126 |
0.107 |
0.087 |
-0.003 |
| 八幡東区 |
-0.078 |
0.081 |
0.052 |
0.031 |
-0.028 |
| 八幡西区 |
-0.027 |
0.077 |
0.035 |
-0.010 |
0.009 |
| 戸畑区 |
-0.048 |
0.127 |
0.116 |
0.104 |
-0.042 |
| 東区 |
0.111 |
0.018 |
0.010 |
-0.005 |
0.006 |
| 博多区 |
0.220 |
0.043 |
-0.052 |
-0.033 |
-0.032 |
| 中央区 |
0.251 |
-0.066 |
0.026 |
0.043 |
-0.048 |
| 南区 |
0.116 |
-0.010 |
0.007 |
-0.015 |
-0.012 |
| 城南区 |
0.080 |
-0.024 |
0.023 |
0.029 |
0.002 |
| 早良区 |
0.084 |
-0.003 |
0.006 |
0.006 |
-0.013 |
| 西区 |
0.096 |
-0.028 |
0.012 |
0.010 |
0.029 |
| 大牟田市 |
-0.216 |
0.070 |
0.108 |
-0.027 |
0.000 |
| 久留米市 |
-0.054 |
-0.045 |
-0.031 |
-0.033 |
-0.018 |
| 直方市 |
-0.113 |
0.044 |
-0.024 |
0.053 |
0.027 |
| 飯塚市 |
-0.142 |
0.036 |
-0.070 |
0.015 |
-0.026 |
| 田川市 |
-0.176 |
0.163 |
-0.051 |
0.060 |
0.110 |
| 柳川市 |
-0.208 |
-0.167 |
0.015 |
-0.034 |
-0.040 |
| 八女市 |
-0.271 |
-0.212 |
0.142 |
-0.117 |
-0.037 |
| 筑後市 |
-0.139 |
-0.111 |
0.073 |
-0.128 |
0.012 |
| 大川市 |
-0.184 |
-0.135 |
-0.057 |
0.006 |
-0.067 |
| 行橋市 |
-0.010 |
-0.047 |
-0.053 |
0.036 |
0.057 |
| 豊前市 |
-0.183 |
-0.119 |
-0.088 |
0.110 |
0.004 |
| 中間市 |
-0.175 |
0.119 |
0.006 |
-0.003 |
-0.010 |
| 小郡市 |
-0.016 |
-0.147 |
0.009 |
0.042 |
0.033 |
| 筑紫野市 |
0.020 |
-0.077 |
0.019 |
-0.018 |
0.033 |
| 春日市 |
0.039 |
-0.018 |
-0.048 |
-0.025 |
0.002 |
| 大野城市 |
0.063 |
-0.046 |
-0.033 |
-0.033 |
0.017 |
| 宗像市 |
0.025 |
-0.022 |
0.052 |
0.058 |
0.069 |
| 太宰府市 |
0.002 |
-0.047 |
0.004 |
-0.006 |
0.044 |
| 古賀市 |
-0.001 |
0.004 |
-0.027 |
-0.020 |
0.041 |
| 福津市 |
0.060 |
-0.021 |
0.013 |
0.019 |
0.067 |
| うきは市 |
-0.200 |
-0.054 |
-0.062 |
0.000 |
-0.011 |
| 宮若市 |
-0.170 |
0.074 |
-0.066 |
-0.021 |
-0.002 |
| 嘉麻市 |
-0.321 |
0.105 |
-0.090 |
-0.039 |
-0.045 |
| 朝倉市 |
-0.208 |
-0.209 |
-0.095 |
0.101 |
-0.053 |
| みやま市 |
-0.230 |
-0.277 |
0.075 |
-0.009 |
0.006 |
| 糸島市 |
-0.038 |
-0.055 |
-0.030 |
0.023 |
0.007 |
| 那珂川市 |
0.000 |
0.060 |
-0.061 |
-0.015 |
0.017 |
| 宇美町 |
-0.092 |
0.122 |
-0.069 |
-0.116 |
-0.025 |
| 篠栗町 |
0.046 |
0.016 |
-0.036 |
-0.050 |
0.040 |
| 志免町 |
0.064 |
0.059 |
-0.072 |
-0.077 |
0.026 |
| 須恵町 |
-0.010 |
0.096 |
-0.104 |
-0.096 |
0.007 |
| 新宮町 |
0.139 |
-0.040 |
-0.021 |
-0.012 |
0.034 |
| 久山町 |
-0.027 |
0.003 |
-0.077 |
-0.001 |
-0.009 |
| 粕屋町 |
0.113 |
0.050 |
-0.053 |
-0.051 |
0.000 |
| 芦屋町 |
-0.173 |
0.028 |
-0.085 |
0.000 |
-0.064 |
| 水巻町 |
-0.135 |
0.166 |
0.038 |
0.011 |
-0.029 |
| 岡垣町 |
-0.065 |
0.025 |
0.002 |
0.006 |
0.063 |
| 遠賀町 |
-0.133 |
-0.025 |
0.037 |
0.055 |
0.014 |
| 小竹町 |
-0.280 |
0.076 |
-0.026 |
0.064 |
-0.035 |
| 鞍手町 |
-0.201 |
0.084 |
-0.070 |
0.016 |
0.003 |
| 桂川町 |
-0.218 |
0.051 |
-0.006 |
-0.011 |
0.039 |
| 筑前町 |
-0.104 |
-0.083 |
-0.044 |
-0.018 |
-0.001 |
| 東峰村 |
-0.297 |
-0.415 |
-0.171 |
0.263 |
-0.177 |
| 大刀洗町 |
-0.043 |
-0.138 |
-0.034 |
0.048 |
0.028 |
| 大木町 |
-0.121 |
-0.117 |
-0.023 |
-0.050 |
0.011 |
| 広川町 |
-0.199 |
-0.218 |
0.158 |
-0.146 |
0.038 |
| 香春町 |
-0.284 |
0.086 |
-0.107 |
0.049 |
0.016 |
| 添田町 |
-0.358 |
0.054 |
-0.068 |
0.041 |
-0.031 |
| 糸田町 |
-0.296 |
0.215 |
-0.165 |
-0.054 |
0.009 |
| 川崎町 |
-0.391 |
0.275 |
-0.163 |
-0.008 |
-0.043 |
| 大任町 |
-0.325 |
0.182 |
-0.230 |
-0.092 |
-0.072 |
| 赤村 |
-0.276 |
0.019 |
-0.147 |
0.024 |
0.028 |
| 福智町 |
-0.206 |
0.127 |
-0.119 |
0.037 |
0.083 |
| 苅田町 |
0.069 |
0.009 |
-0.056 |
-0.010 |
0.080 |
| みやこ町 |
-0.214 |
-0.097 |
-0.025 |
0.075 |
0.020 |
| 吉富町 |
-0.156 |
-0.015 |
-0.027 |
0.107 |
-0.031 |
| 上毛町 |
-0.163 |
-0.192 |
-0.049 |
0.153 |
0.049 |
| 築上町 |
-0.194 |
-0.252 |
-0.140 |
0.250 |
-0.055 |
# 4. クラスター分析の実行(階層的クラスタリング)
dist_matrix <- dist(region_coords[, 1:2])
hc <- hclust(dist_matrix, method = "ward.D2")
# クラスター数は 5 とします
k_clusters <- 5
clusters <- cutree(hc, k = k_clusters)
# 結果の整理
region_results <- data.frame(
region = rownames(region_coords),
Dim1 = region_coords$Dim1,
Dim2 = region_coords$Dim2,
cluster = as.factor(clusters)
)
# 5. 可視化
p <- ggplot(region_results, aes(x = Dim1, y = Dim2, color = cluster, label = region)) +
geom_hline(yintercept = 0, linetype = "dashed", color = "gray60") +
geom_vline(xintercept = 0, linetype = "dashed", color = "gray60") +
# 点の凡例だけを表示させる
geom_point(size = 2, alpha = 0.7) +
# show.legend = FALSE を追加して凡例から「a」を消去
geom_text(vjust = -1, size = 3, family = "HiraKakuProN-W3",
check_overlap = TRUE, show.legend = FALSE) +
labs(title = "対応分析に基づく地域のクラスタリング",
subtitle = paste0("支持傾向の類似した地域を ", k_clusters, " グループに分類"),
x = paste0("第1次元 (", round(res.ca$eig[1, 2], 1), "%)"),
y = paste0("第2次元 (", round(res.ca$eig[2, 2], 1), "%)"),
color = "クラスター") +
# テーマとフォント設定を適用
theme_minimal(base_family="HiraKakuProN-W3") +
theme(legend.position = "right")
# グラフの表示
print(p)

2. 政党のクラスタリング
# 必要なライブラリの読み込み
if (!require("FactoMineR")) install.packages("FactoMineR")
if (!require("factoextra")) install.packages("factoextra")
if (!require("ggplot2")) install.packages("ggplot2")
if (!require("ggrepel")) install.packages("ggrepel") # ラベル調整用
## 要求されたパッケージ ggrepel をロード中です
library(FactoMineR)
library(factoextra)
library(ggplot2)
library(ggrepel)
# --- (データ読み込み・計算部分は変更なし) ---
df <- read.csv("data_PC.csv", row.names = 1, check.names = FALSE)
df <- df[,1:16] # 政党のデータだけを取り出す
colnames(df)
## [1] "日本共産党" "日本維新の会" "無所属連合" "日本保守党" "立憲民主党"
## [6] "参政党" "国民民主党" "チームみらい" "日本誠真会" "社会民主党"
## [11] "れいわ新選組" "日本改革党" "自由民主党" "再生の道" "公明党"
## [16] "NHK党"
res.ca <- CA(df, graph = FALSE)
party_coords <- as.data.frame(res.ca$col$coord)
colnames(party_coords) <- c("Dim1", "Dim2", "Dim3", "Dim4", "Dim5")
dist_matrix <- dist(party_coords[, 1:2])
hc <- hclust(dist_matrix, method = "ward.D2")
k_clusters <- 4
clusters <- cutree(hc, k = k_clusters)
party_results <- data.frame(
party = rownames(party_coords),
Dim1 = party_coords$Dim1,
Dim2 = party_coords$Dim2,
cluster = as.factor(clusters)
)
# 5. 可視化(修正版)
p <- ggplot(party_results, aes(x = Dim1, y = Dim2, color = cluster, label = party)) +
geom_hline(yintercept = 0, linetype = "dashed", color = "gray") +
geom_vline(xintercept = 0, linetype = "dashed", color = "gray") +
geom_point(size = 3) +
# geom_textの代わりにgeom_text_repelを使用
geom_text_repel(
family = "HiraKakuProN-W3",
force = 2, # 反発の強さ
box.padding = 0.5, # テキスト周りの余白
point.padding = 0.3, # 点との距離
show.legend = FALSE
) +
labs(title = "対応分析に基づく政党のクラスタリング",
subtitle = paste0("階層的クラスタリング (k=", k_clusters, ")"),
x = paste0("第1次元 (", round(res.ca$eig[1, 2], 1), "%)"),
y = paste0("第2次元 (", round(res.ca$eig[2, 2], 1), "%)"),
color = "クラスター") +
# 軸の範囲を少し広げる(マージンの確保)
expand_limits(x = c(min(party_results$Dim1)*1.2, max(party_results$Dim1)*1.2),
y = c(min(party_results$Dim2)*1.2, max(party_results$Dim2)*1.2)) +
theme_minimal(base_family="HiraKakuProN-W3") +
theme(legend.position = "right")
# グラフの表示
print(p)

# (任意)デンドログラムの表示
plot(hc, hang = -1, main = "政党のクラスタリング(デンドログラム)", family = "HiraKakuProN-W3")
