
1. データの背景と分析手法

対象: 2024年衆院選 福岡11区の政党および候補者の得票データ。
手法: FactoMineR::CA() で次元圧縮を行い、その全次元座標の距離に基づいて vegan::spantree() でMST(最小全域木)を作成。さらに igraph::degree() で各ノードの次数を算出してドットの大きさに反映させています。
点の大きさは『ハブ強度(次数)』を表しています。大きな点は、そのクラスター内で多くの項目と強い類似性を持って結びついている『中心的な存在』を意味します。一方、小さな点はそのグループの末端に位置する、より個別性の強い存在です。
クラスターと「ハブ」の役割
グラフ上の「点の大きさ」が示すハブ強度(次数)に注目すると、各グループにおける中心的存在が明確になります。
Cluster 1(赤色)
*RS(れいわ新選組)が最も大きなノードとなっており、このグループ内での「共通項」を最も多く持つハブであることがわかります。SDP(社民)やJCP(共産)と強く結びついています。
Cluster 2(青色)
*CDP(立憲民主党)やJB(日本維新の会)が比較的大きな次数を持っており、このクラスター内での中心的な立ち位置にいます。
*LDP(自民党)は他のクラスター(特に緑のTakeda氏側)への架け橋となる位置にありますが、ハブ強度としてはCDPなどの方がこの集団内では中心的です。この接続(エッジ)は、保守層の中での緩やかな連携や、有権者の支持が重なる部分を示唆しているのかもしれません
Cluster 3(緑色)
*Takeda(武田良太氏)がハブとなっており、NKP(公明党)と結びついています。LDP(自民)とも線が繋がっており、自公の協力関係や保守層の広がりを示唆しています。
1.1 Rスクリプト(グラフ1番目)
```{r}
library(readr)
library(ggplot2)
library(FactoMineR)
library(patchwork)
library(vegan)
# --- データの準備 ---
data <- read_csv("data11ku_PC.csv")
voting_data <- as.data.frame(data[,-1])
rownames(voting_data) <- data[[1]]
voting_numeric <- voting_data[, 2:ncol(voting_data)]
# --- 1. 対応分析 (CA) とクラスタリング ---
ca_res <- CA(voting_numeric, graph = FALSE)
# 全次元の座標(距離計算用)
ca_full_coord <- ca_res$col$coord
# 階層的クラスター分析 (Ward法、3グループ)
ca_hc <- hclust(dist(ca_full_coord), method = "ward.D2")
ca_cluster <- factor(cutree(ca_hc, k = 3))
ca_df <- data.frame(
Dim1 = ca_full_coord[,1],
Dim2 = ca_full_coord[,2],
Name = rownames(ca_full_coord),
Cluster = ca_cluster
)
# --- 3. MSTデータ作成関数 (全次元距離行列に対応) ---
get_mst_segments <- function(df, dist_obj) {
mst <- spantree(dist_obj)
n <- nrow(df)
data.frame(
x = df$Dim1[2:n],
y = df$Dim2[2:n],
xend = df$Dim1[mst$kid],
yend = df$Dim2[mst$kid]
)
}
```
```{r}
library(igraph) # ネットワーク分析用
# --- 1. MSTをグラフオブジェクトに変換 ---
# 前回のコードで作成した mst (spantreeの結果) を使用します
# ここでは CA の結果 (ca_full_coord) を使った例です
d_ca <- dist(ca_full_coord)
mst_ca <- spantree(d_ca)
# igraphオブジェクトに変換
# mst_ca$kid (親) と 2:n (子) の関係からエッジリストを作成
n <- nrow(ca_df)
edges <- cbind(mst_ca$kid, 2:n)
g_mst <- graph_from_edgelist(edges, directed = FALSE)
V(g_mst)$name <- ca_df$Name
# --- 2. 各ノードの「次数 (Degree)」を計算 ---
# 次数 = その点から伸びている線の数
node_degrees <- degree(g_mst)
# データを ca_df に統合
ca_df$Degree <- node_degrees
# --- 3. ハブ(次数が多い順)を表示 ---
cat("■ クラスター内でのハブ項目(次数上位)\n")
print(sort(node_degrees, decreasing = TRUE))
# --- 4. 次数の大きさを点のサイズに反映させて可視化 ---
p_hub <- ggplot(ca_df, aes(x = Dim1, y = Dim2)) +
# MSTの線
geom_segment(data = get_mst_segments(ca_df, d_ca),
aes(x = x, y = y, xend = xend, yend = yend),
color = "gray80", linetype = "solid") +
# 次数に応じて点のサイズを変更
geom_point(aes(color = Cluster, size = Degree), alpha = 0.7) +
# ラベル
geom_text(aes(label = Name, color = Cluster),
vjust = -1.5, fontface = "bold",
family = "HiraKakuProN-W3", show.legend = FALSE) +
scale_size_continuous(range = c(3, 8)) + # サイズの範囲指定
theme_minimal(base_family="HiraKakuProN-W3") +
expand_limits(x = range(ca_df$Dim1)*1.5, y = range(ca_df$Dim2)*1.5) +
coord_cartesian(clip = "off") +
scale_color_brewer(palette = "Set1") +
labs(title = "CA: Hub Identification (Node Size = Degree)",
x = "Dimension 1", y = "Dimension 2", size = "Degree (ハブ強度)")
p_hub
```
1.2 Rスクリプト(グラフ2番目)
```{r}
library(dplyr)
library(igraph)
# --- 1. クラスター別ハブ強度の計算関数 ---
# 各クラスターごとに独立したMSTを作成し、次数を計算します
calc_cluster_hubs <- function(df, full_coords) {
results_list <- list()
# 各クラスター番号(1, 2, 3...)ごとにループ
for (cl in levels(df$Cluster)) {
# 当該クラスターのデータのみ抽出
sub_indices <- which(df$Cluster == cl)
sub_df <- df[sub_indices, ]
# 2点以上ないとMSTが作れないためチェック
if (nrow(sub_df) > 1) {
sub_coords <- full_coords[sub_indices, ]
d_sub <- dist(sub_coords)
mst_sub <- spantree(d_sub)
# ネットワークオブジェクト化
n_sub <- nrow(sub_df)
edges_sub <- cbind(mst_sub$kid, 2:n_sub)
g_sub <- graph_from_edgelist(edges_sub, directed = FALSE)
# クラスター内での次数を格納
sub_df$Cluster_Degree <- degree(g_sub)
} else {
sub_df$Cluster_Degree <- 0
}
results_list[[cl]] <- sub_df
}
return(do.call(rbind, results_list))
}
# --- 2. 計算の実行 ---
# ca_df と ca_full_coord は前回のスクリプトから引き継ぎます
ca_cluster_df <- calc_cluster_hubs(ca_df, ca_full_coord)
# --- 3. クラスターごとのハブ・ランキング表示 ---
cat("\n■ 各クラスター内でのハブ項目(次数上位)\n")
ca_cluster_df %>%
group_by(Cluster) %>%
arrange(Cluster, desc(Cluster_Degree)) %>%
select(Cluster, Name, Cluster_Degree) %>%
print(n = Inf)
# --- 4. 可視化:クラスター内ハブ強度を反映 ---
# 注:この可視化では「全体MST」ではなく「クラスター内MST」を線として引きます
plot_cluster_internal_mst <- function(df, full_coords) {
p <- ggplot(df, aes(x = Dim1, y = Dim2))
# 各クラスターごとにMSTの線を追加
for (cl in levels(df$Cluster)) {
sub_indices <- which(df$Cluster == cl)
if (length(sub_indices) > 1) {
sub_df <- df[sub_indices, ]
d_sub <- dist(full_coords[sub_indices, ])
mst_segs <- get_mst_segments(sub_df, d_sub)
p <- p + geom_segment(data = mst_segs,
aes(x = x, y = y, xend = xend, yend = yend),
color = "gray80", alpha = 0.6)
}
}
# 点とラベルの描画(サイズに Cluster_Degree を使用)
p + geom_point(aes(color = Cluster, size = Cluster_Degree), alpha = 0.7) +
geom_text(aes(label = Name, color = Cluster),
vjust = -1.5, fontface = "bold",
family = "HiraKakuProN-W3", show.legend = FALSE) +
scale_size_continuous(range = c(3, 10)) + # 可視化のためにハブの強調度を調整
theme_minimal(base_family="HiraKakuProN-W3") +
expand_limits(x = range(df$Dim1)*1.5, y = range(df$Dim2)*1.5) +
coord_cartesian(clip = "off") +
scale_color_brewer(palette = "Set1") +
labs(title = "Intra-Cluster Hub Analysis (CA)",
subtitle = "MST computed independently for each cluster",
x = "Dimension 1", y = "Dimension 2", size = "Cluster Degree")
}
# 実行
plot_cluster_internal_mst(ca_cluster_df, ca_full_coord)
2. 分析の展開
2.1 思考実験/仮想シナリオ
以下は、2024年衆議院議員選挙と今回の選挙(投票日2026年2月8日)までの政治状況——自公連立の解消や中道改革連合の登場など——に基づく仮想シナリオであり、実際の開票結果とは異なるものです。
情勢調査(組織力や知名度)の影響をゼロとし、純粋に「今の有権者が求める政策的座標(中道・改革)」に辻氏がジャストフィットしているなら、グラフは以下のようになります(集中モデル)。
Tsjの円: 最大(ハブ次数が最も高い)
Takeda/Murakamiの円: 左右の端へ移動し、縮小
MST(最小全域木): 全ての候補者からTsj(中心)へ向かって線が伸びる「スター型」のネットワーク
Tsj(Tsuji): 辻候補(MKA 中道改革連合)
Takeda: 武田候補(LDP 自民党)
Murakami: 村上候補(JIP 維新)
Shiki: 志岐候補(SDP 社民党)
対応分析のグラフの第1軸を『社会観(あるいは組織性)』、第2軸を『体制との距離』と定義すると、今回の選挙は、強固な体制側の引力(武田氏)に対し、中心から全方位を繋ごうとするハブ(辻氏)がどこまで迫れるか、という構図として読み解くことができる。
このシミュレーションの前提のデータは、公明党と立憲民主党の比例代表得票数を各市町村で合計して中道改革連合の比例代表得票数と仮定し、その候補者のCOR(候補者超過達成比率)を1と仮定したものである。
[分散モデル:もうひとつのシミュレーション]
このモデルでは、有権者が「中道」に集中せず、社会観や体制への距離において多様な意見に広く散らばっている状態を想定しています。
グラフの中の数値は、「有権者が広範囲に分散している状況下で、候補者の立ち位置(ポジショニング)によって生じる得票率の差」を説明するためのシミュレーション数値(合計は100%)。
[参政党候補の参入]
参政党(井上氏)の立候補は、福岡11区の勢力図を「より分散モデル(多極化)に近づける」効果があります。
辻氏(MKA)にとって: 敵陣営(保守・右派)が細分化されることは追い風になります。
武田氏(LDP)にとって: 盤石だった保守層の「端(エッジ)」が削られるリスクになります。
井上氏が獲得する「1〜2万票」の出処が、もし「武田氏の組織」からなのか、「村上氏の改革票」からなのかによって、今夜の最終的な順位が入れ替わる可能性があります。
衆院選福岡11区に相当する市町村での参院選2025年7月のデータ
市町村名,参政党 得票数
田川市,"2,438"
行橋市,"4,668"
豊前市,"1,542"
香春町,505
添田町,453
糸田町,442
川崎町,618
大任町,283
赤村,162
福智町,"1,193"
苅田町,"2,466"
みやこ町,958
吉富町,427
上毛町,456
築上町,"1,004"
合計,"17,615"
2.2 衆議院議員選挙2026年(投票日2月8日)の実際の開票結果に基づく分析
以下は開票率100%時点でのグラフ。この座標は2024年の構造を反映している。また、CDPとNKPは、もとのまま独立のものとしている。

公明党の得票が強く反映される地域構造においては、「中道連合」よりも、連立解消まで続いてきた福岡11区における自公協力の実績と整合的な候補(武田候補)との結びつきが、結果として優勢に現れている。
【図A:ハブとしての理想】 辻候補を「中道」の象徴として原点(中心)に置いた場合。戦略的には全方位を繋ぐ位置にいますが、周囲の巨大な組織票(武田氏)の引力に、中心地の票が吸い出されていく様子がわかります。
【図B:数学的重心による実態】 立憲と公明の得票実績から算出した「理論上の重心」に辻候補を置いた場合。実は、今回の『中道改革連合』のポテンシャルは、もっと組織(左)側に根を張るべきものでした。しかし、実際の得票サイズを見ると、左側のNKP(公明)から票を吸着できず、右側のCDP(立憲)の勢力圏に孤立してしまったことが一目で理解できます。
3. 新聞社報道
【衆院選2026】福岡県内小選挙区の出口調査分析(西日本新聞、2026年2月10日)