2026年2月15日 (日)

福岡11区出口調査結果について、西日本新聞の記事から、「公表されないグラフ」を想像する。

円グラフは明瞭な認識を阻害し、記述されず可視化されないデータは、存在しないかのように扱われる。

Screenshot-20260217-at-194755 Screenshot-20260217-at-193315 Screenshot-20260217-at-193333Screenshot-20260217-at-193350 Screenshot-20260217-at-194257

次の表で「ー」は記事中で明示されていない箇所を示す(0%という意味ではない)。続く帯グラフでは空白として表示している。

※ここで示す割合は「支持政党(支持層)ごとに、どの候補へ投票したか」を表す推定値であり、「各候補の得票の内訳(投票者の支持政党構成)」を直接示すものではない。

Screenshot-20260216-at-102414
Screenshot-20260216-at-90223

中道支持層の約7割が辻に、2割が村上に、1割が武田に投票したと読み取れる。なお、出口調査の『支持政党』は自己申告であり、比例で投票した政党と一致するとは限らない。また、出口調査は標本調査であり、一定の誤差を含む。数値の公表においてそのことが考慮された可能性がある。


Screenshot-20260215-at-114655
出所:【衆院選2026】福岡県内小選挙区の出口調査分析 自民の勢い広がる(西日本新聞、2026年2月10日)

|

2026年2月10日 (火)

衆院選2024年福岡11区の比例代表得票率からみた2026年の選挙の結果

この投稿は結論を提示するものではなく、2024年比例代表得票率を用いた2026年選挙結果の解釈可能性を検討するための分析メモである。

Screenshot-20260211-at-173440

Screenshot-20260211-at-160804

Screenshot-20260211-at-171145

 

自民党と公明党が連立を組んでいた2024年の衆院選福岡11区のデータで公明党と立憲民主党の得票を合わせると得票率は33.3%になり、自民党の得票率25.4%を超える。
2026年に突然おこなわれることになった衆議院議員選挙に際して公明党と立憲民主党が合流して結成された中道改革連合は、福岡11区において、その合計の得票率を当てにすることができたのだろうか。1つは、自公連立時の「小選挙区は自民党、比例は公明党」という協定は公明党の比例代表得票率にどの程度影響していたのだろうかという問題である。自民党候補の支持者の一部が比例代表で公明党に投票していたはずである。

Screenshot-20260211-at-153437

 

Screenshot-20260211-at-165513

Screenshot-20260210-at-151548
【解説人語】与党対決、自民陣営「比例は中道」の背景は 福岡11区(朝日新聞、2026年2月2日)

2026年2月8日に開票された福岡11区の選挙で当選したのは、2024年の衆院選では落選した自民党の武田候補であった。ここから浮かび上がるのは、いわゆるスプリット投票の規模である。引用した「解説人語」(朝日新聞)でも触れられているように、この選挙で武田候補に投票し、比例代表で「(公明党の流れを汲む)中道」に投票した有権者はどの程度存在したのだろうか。西日本新聞の出口調査によれば、「中道新人の辻智之氏は中道支持層の7割に浸透した」という。問題は、残る3割の動向である。彼らの一部が武田候補に投票していた可能性は否定できない。もっとも、福岡11区の正確な政党得票率およびCOR(候補者超過達成比率)は現時点では算出できないため、確定的な評価は困難である。少なくとも、小選挙区で当選したのは自民党の武田候補であった。

Screenshot-20260210-at-214244 Screenshot-20260210-at-211923

Screenshot-20260210-at-212351

 

リベラルや進歩派という表現は必ずしも的確ではないが、立憲民主党の支持者が比例代表において他の3野党に流れるということもあったかもしれない。

Screenshot-20260211-at-163557

さらに、各種世論調査でつねに最大の割合を占める「無党派層」の動きや選挙の投票率にも注目する必要がある。2024年選挙を基準にして無党派層の動向を「第3極政党」の得票率からさぐるために用意したのが以下のグラフである。

Screenshot-20260211-at-170015

現時点では正確な政党得票率やCOR(候補者超過達成比率)を算出できないため、結論は留保する。

なお、西日本新聞社の出口調査結果を参考にすると、中道支持層の約7割が辻に、約2割が村上に、約1割が武田に投票したと読み取れる。次の表で「ー」は記事中で明示されていない箇所を示す(0%という意味ではない)。

Screenshot20260216at102414
福岡11区出口調査結果について、西日本新聞の記事から、「公表されないグラフ」を想像する。

|

2026年2月 6日 (金)

クラスターのハブの特定:衆院選2024年福岡11区の政党と候補者

Screenshot-20260206-at-141744Screenshot-20260206-at-143321

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

Screenshot-20260208-at-201606
対象: 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日)までの政治状況——自公連立の解消や中道改革連合の登場など——に基づく仮想シナリオであり、実際の開票結果とは異なるものです。

Screenshot-20260210-at-140248

情勢調査(組織力や知名度)の影響をゼロとし、純粋に「今の有権者が求める政策的座標(中道・改革)」に辻氏がジャストフィットしているなら、グラフは以下のようになります(集中モデル)。
Tsjの円: 最大(ハブ次数が最も高い)
Takeda/Murakamiの円: 左右の端へ移動し、縮小
MST(最小全域木): 全ての候補者からTsj(中心)へ向かって線が伸びる「スター型」のネットワーク

Screenshot-20260209-at-112707

Tsj(Tsuji): 辻候補(MKA 中道改革連合)
Takeda: 武田候補(LDP 自民党)
Murakami: 村上候補(JIP 維新)
Shiki: 志岐候補(SDP 社民党)

対応分析のグラフの第1軸を『社会観(あるいは組織性)』、第2軸を『体制との距離』と定義すると、今回の選挙は、強固な体制側の引力(武田氏)に対し、中心から全方位を繋ごうとするハブ(辻氏)がどこまで迫れるか、という構図として読み解くことができる。 このシミュレーションの前提のデータは、公明党と立憲民主党の比例代表得票数を各市町村で合計して中道改革連合の比例代表得票数と仮定し、その候補者のCOR(候補者超過達成比率)を1と仮定したものである。

[分散モデル:もうひとつのシミュレーション]
このモデルでは、有権者が「中道」に集中せず、社会観や体制への距離において多様な意見に広く散らばっている状態を想定しています。

Screenshot-20260209-at-112721

グラフの中の数値は、「有権者が広範囲に分散している状況下で、候補者の立ち位置(ポジショニング)によって生じる得票率の差」を説明するためのシミュレーション数値(合計は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は、もとのまま独立のものとしている。

Screenshot-20260209-at-112733Screenshot-20260209-at-112746

公明党の得票が強く反映される地域構造においては、「中道連合」よりも、連立解消まで続いてきた福岡11区における自公協力の実績と整合的な候補(武田候補)との結びつきが、結果として優勢に現れている。

【図A:ハブとしての理想】 辻候補を「中道」の象徴として原点(中心)に置いた場合。戦略的には全方位を繋ぐ位置にいますが、周囲の巨大な組織票(武田氏)の引力に、中心地の票が吸い出されていく様子がわかります。

【図B:数学的重心による実態】 立憲と公明の得票実績から算出した「理論上の重心」に辻候補を置いた場合。実は、今回の『中道改革連合』のポテンシャルは、もっと組織(左)側に根を張るべきものでした。しかし、実際の得票サイズを見ると、左側のNKP(公明)から票を吸着できず、右側のCDP(立憲)の勢力圏に孤立してしまったことが一目で理解できます。

3. 新聞社報道

Screenshot-20260210-at-111342
【衆院選2026】福岡県内小選挙区の出口調査分析(西日本新聞、2026年2月10日)

|

2026年2月 4日 (水)

2種類のMinimum Spanning Tree (MST)

Screenshot-20260204-at-202358Screenshot-20260204-at-202407

# vegan::spantree

```{r,echo=FALSE,message=FALSE}
# 必要なライブラリの読み込み
library(MASS)    # isoMDS用
library(vegan)   # spantree (MST) 用
library(ggplot2)
library(ggrepel) # ラベル重なり防止用(追加)

# データの読み込み
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)

# MDSの結果をデータフレーム化
mds_df <- as.data.frame(mds_res$points)
colnames(mds_df) <- c("Dim1", "Dim2")
mds_df$label <- rownames(data_t)

# 5. 最小全域木 (MST) の計算
mst_res <- spantree(d)

# MSTの描画用データ(エッジ)の作成
edges <- data.frame(
  x = mds_df$Dim1[2:nrow(mds_df)],
  y = mds_df$Dim2[2:nrow(mds_df)],
  xend = mds_df$Dim1[mst_res$kid],
  yend = mds_df$Dim2[mst_res$kid]
)

# 6. ggplot2による可視化
ggplot(mds_df, aes(x=Dim1, y=Dim2)) +
  # MSTの線を描画
  geom_segment(data=edges, aes(x=x, y=y, xend=xend, yend=yend), 
               color="grey80", linewidth=0.5) +
  # ポイントを描画
  geom_point(aes(color=label), size=3, show.legend = FALSE) +
  # ラベルの表示(geom_textをgeom_text_repelに変更)
  geom_text_repel(aes(label=label), 
                  size=3, 
                  family="HiraKakuProN-W3",
                  max.overlaps = Inf,    # すべてのラベルを強制的に表示
                  box.padding = 0.5,     # ラベル周りの余白
                  point.padding = 0.3,   # 点とラベルの間の余白
                  segment.color = "grey50") + # 引き出し線の色
  # 指定されたテーマの適用
  theme_minimal(base_family="HiraKakuProN-W3") +
  labs(title="政党・候補者の得票傾向によるisoMDSおよび最小全域木",
       subtitle="自治体ごとの得票パターンの類似性に基づく配置",
       x="MDS 第1次元", y="MDS 第2次元")
```

# igraph::mst

```{r,echo=FALSE,message=FALSE}
# 必要なライブラリの読み込み
library(MASS)    # isoMDS用
library(igraph)  # MST計算用
library(ggplot2)
library(ggrepel) # ラベル重なり防止用

# データの読み込み
data_raw <- read.csv("data_PC_fixed.csv", row.names=1)

# 1. データの準備(転置と標準化)
data_t <- t(data_raw)
data_scaled <- scale(data_t)

# 2. 多次元空間での距離行列の計算(全次元の情報を保持)
dist_matrix_full <- dist(data_scaled)

# 3. isoMDSによる次元圧縮(プロット用の2次元座標を作成)
set.seed(123)
# cmdscaleを初期値として使用
init_pos <- cmdscale(dist_matrix_full, k=2)
mds_res <- isoMDS(dist_matrix_full, y = init_pos, k=2)

# 座標データの抽出
mds_coords <- as.data.frame(mds_res$points)
colnames(mds_coords) <- c("Dim1", "Dim2")
rownames(mds_coords) <- rownames(data_t)

# 4. グラフオブジェクトの作成とMSTの計算
g_full <- graph_from_adjacency_matrix(as.matrix(dist_matrix_full), mode = "undirected", weighted = TRUE)
mst_full <- mst(g_full)

# 5. 可視化用データの整形(エッジの座標紐付け)
edges_full <- as_data_frame(mst_full, what = "edges")

edge_coords_full <- data.frame(
  x1 = mds_coords[edges_full$from, 1],
  y1 = mds_coords[edges_full$from, 2],
  x2 = mds_coords[edges_full$to, 1],
  y2 = mds_coords[edges_full$to, 2]
)

# 6. ggplot2 による描画
ggplot() +
  # MSTの枝(ダークグリーンの設定)
  geom_segment(data = edge_coords_full, 
               aes(x = x1, y = y1, xend = x2, yend = y2), 
               color = "darkgreen", alpha = 0.5, linewidth = 0.8) +
  # ノードの描画(ダークレッドの設定)
  geom_point(data = mds_coords, 
             aes(x = Dim1, y = Dim2), 
             color = "darkred", size = 3) +
  # ラベルの描画(ggrepelを使用)
  geom_text_repel(data = mds_coords, 
                  aes(x = Dim1, y = Dim2, label = rownames(mds_coords)),
                  family = "HiraKakuProN-W3", 
                  size = 3, 
                  max.overlaps = 50) + 
  # 軸とテーマの設定
  geom_hline(yintercept = 0, linetype = "dashed", color = "gray80") +
  geom_vline(xintercept = 0, linetype = "dashed", color = "gray80") +
  # アスペクト比を1:1に固定(距離関係を正しく見るため)
  coord_fixed(ratio = 1) +
  theme_minimal(base_family = "HiraKakuProN-W3") +
  labs(
    title = "isoMDSと最小全域木 (MST) : 全次元情報の反映",
    subtitle = paste0("多次元空間での最短距離に基づいたネットワーク (Stress: ", round(mds_res$stress, 2), "%)"),
    x = "MDS Dimension 1",
    y = "MDS Dimension 2"
  )
```





|

参議院議員選挙2025年福岡

Screenshot-20260204-at-183955 Screenshot-20260204-at-185332

|

CAに基づくMST、クラスタリング

Screenshot-20260204-at-171822
 
```{r}
 
##########################################
### 全次元、CAに基づくMST、クラスタリング
### 列変数のみ表示、FactoMineRのCA
##########################################
 
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]
  )
}
 
# --- 4. 可視化関数 (Clustering + MST版) ---
plot_func_combined <- function(df, dist_obj, title) {
  mst_segments <- get_mst_segments(df, dist_obj)
 
  ggplot(df, aes(x = Dim1, y = Dim2)) +
    geom_segment(data = mst_segments, 
                 aes(x = x, y = y, xend = xend, yend = yend), 
                 color = "gray80", linetype = "solid") +
    geom_point(aes(color = Cluster), size = 3) +
    geom_text(aes(label = Name, color = Cluster), 
              vjust = -1.5, fontface = "bold", 
              family = "HiraKakuProN-W3", show.legend = FALSE) +
    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 = title, x = "Dimension 1", y = "Dimension 2", color = "Cluster")
}
 
# --- 5. 実行 ---
# CAのみを出力します
p1 <- plot_func_combined(ca_df, dist(ca_full_coord), "CA: Clustering & Full-Dim MST")
 
# 描画
p1
```
 
 
 

|

MDS Plot with MST

Screenshot-20260204-at-164158Screenshot-20260204-at-164208
 
 
```{r,out.width="100%"}
############################################
### MDS Plot with Minimum Spanning Tree (MST)
############################################
 
 
# 必要パッケージの読み込み
library(ggplot2)
library(ape)
# 【追加】ラベルの重なりを防ぐパッケージ
# install.packages("ggrepel") # もしインストールされていない場合
library(ggrepel) 
 
# 1. データの準備
voting_data <- read.csv("data11ku_PC.csv")
voting_numeric <- voting_data[, 3:ncol(voting_data)]
 
# 2. 規模の影響を除去(得票率に変換)
voting_props <- prop.table(as.matrix(voting_numeric), margin = 1)
party_data_t <- t(voting_props)
colnames(party_data_t) <- voting_data[, 1]
 
# 3. 距離行列とMDSの実行
party_dist <- dist(party_data_t)
party_mds <- cmdscale(party_dist, k = 2)
 
# 4. 最小全域木 (MST) の計算
st <- mst(party_dist)
 
# 5. プロット用データの作成
mds_party_df <- data.frame(
  Dimension1 = party_mds[, 1],
  Dimension2 = party_mds[, 2],
  Name = rownames(party_data_t)
)
 
# MSTの線を描画するためのデータ作成(重複ペアの除去)
edges <- which(as.matrix(st) == 1, arr.ind = TRUE)
edges <- edges[edges[, 1] < edges[, 2], ]
edge_coords <- data.frame(
  x = mds_party_df$Dimension1[edges[, 1]],
  y = mds_party_df$Dimension2[edges[, 1]],
  xend = mds_party_df$Dimension1[edges[, 2]],
  yend = mds_party_df$Dimension2[edges[, 2]]
)
# --------------------------------------------------
 
 
# 6. 描画
ggplot(mds_party_df, aes(x = Dimension1, y = Dimension2)) +
  # MSTの線
  geom_segment(data = edge_coords, aes(x = x, y = y, xend = xend, yend = yend), 
               color = "gray", linetype = "dashed") +
  # 政党の点
  geom_point(color = "red", size = 2) +
 
  # 【変更箇所】geom_text を geom_text_repel に変更
  geom_text_repel(
    aes(label = Name),
    size = 2,
    fontface = "bold",
    family = "HiraKakuProN-W3", # ラベルのフォントも指定
    box.padding = 0.5,          # ラベル周りの余白(調整可能)
    point.padding = 0.3,        # 点とラベルの距離(調整可能)
    force = 10,                 # 重なりを避ける力の強さ(調整可能)
    max.overlaps = Inf          # すべてのラベルを表示しようとする設定
  ) +
 
  # 表示範囲とテーマの設定
  expand_limits(
    x = c(min(mds_party_df$Dimension1) * 1.3, max(mds_party_df$Dimension1) * 1.3),
    y = c(min(mds_party_df$Dimension2) * 1.3, max(mds_party_df$Dimension2) * 1.3)
  ) +
  coord_cartesian(clip = "off") +
  theme_minimal(base_family = "HiraKakuProN-W3") +
  theme(
    plot.margin = margin(t = 60, r = 60, b = 40, l = 60),
    plot.title = element_text(size = 12, face = "bold", vjust = 4)
  ) +
  labs(
    title = "MDS Plot with Minimum Spanning Tree (MST)",
    subtitle = "Lines connect candidates with the most similar voting patterns",
    x = "Coordinate 1",
    y = "Coordinate 2"
  )
```
 
 
```{r}
############################################
### MDS Plot with Minimum Spanning Tree (MST)
############################################
 
 
# 必要パッケージの読み込み
if (!require("ape")) install.packages("ape")
library("ape")
 
# 1. データの準備
voting_data <- read.csv("data11ku_PC.csv")
voting_numeric <- voting_data[, 3:ncol(voting_data)]
 
# 2. 得票率に変換して転置(規模の差を除去)
voting_props <- prop.table(as.matrix(voting_numeric), margin = 1)
party_data_t <- t(voting_props)
colnames(party_data_t) <- voting_data[, 1] # 列名(自治体略称)
 
# 3. 距離計算とMDSの実行
party_dist <- dist(party_data_t)
party_mds <- cmdscale(party_dist, k = 2)
 
# 座標を x, y に格納
x <- party_mds[, 1]
y <- party_mds[, 2]
 
# 4. 最小全域木 (MST) の計算
st <- mst(party_dist)
 
# 5. プロットの作成

# xlim と ylim を 1.5倍 程度に広げて余白を確保
plot(x, y, 
     xlab = "Coordinate 1", 
     ylab = "Coordinate 2",
     main = "MDS with MST (Base R version)",
     xlim = range(x) * 1.5, 
     ylim = range(y) * 1.5, 
     type = "n") # type="n" でまずは点や線を描かずに枠だけ作成
 
# 最小全域木の線を描画(テキストのループ処理を適用)
for (i in 1:nrow(party_data_t)) {
    w1 <- which(st[i, ] == 1)
    segments(x[i], y[i], x[w1], y[w1], col = "gray", lty = 2)
}
 
# 点とラベルの描画
points(x, y, pch = 21, bg = "red", cex = 2)
text(x, y, labels = rownames(party_data_t), pos = 3, cex = 0.7, font = 2)
```
 
 

|

Greenacre's Symbiplot

Screenshot-20260204-at-164529

# [Greenacre's Symbiplot]

```{r}
#####################################
### symbiplot(Greenacre)
### MST用の距離計算:主座標を使用
### 行と列の同時表示
#####################################

# 必要パッケージの読み込み
if (!require("ca")) install.packages("ca")
if (!require("ape")) install.packages("ape")
if (!require("ggrepel")) install.packages("ggrepel")

library(ca)
library(ape)
library(ggplot2)
library(ggrepel)

# 1. データの読み込み
voting_data <- read.csv("data11ku_PC.csv", row.names = 1)
counts <- voting_data[, 2:ncol(voting_data)]

# 2. 対応分析 (CA) の実行
res_ca <- ca(counts)

# 3. Symbiplot用の座標計算 (特異値の平方根を掛ける)
#  の注釈に基づき、sqrt(sv) を適用
sv_sqrt <- diag(sqrt(res_ca$sv))
rows_coord <- as.data.frame(res_ca$rowcoord %*% sv_sqrt)
cols_coord <- as.data.frame(res_ca$colcoord %*% sv_sqrt)

colnames(rows_coord) <- c("Dim1", "Dim2")
rows_coord$Name <- rownames(rows_coord)
rows_coord$Group <- "City"

colnames(cols_coord) <- c("Dim1", "Dim2")
cols_coord$Name <- colnames(counts)
cols_coord$Group <- "Party/Candidate"


# --- 修正版 4. 最小全域木 (MST) の計算 ---

# A. MST用の距離計算:主座標 (Principal Coordinates) を使用
# これにより、元の分割表のカイ二乗距離が保存される
full_principal_coords <- res_ca$colcoord %*% diag(res_ca$sv) # sqrtなしの特異値を掛ける
party_dist_chi2 <- dist(full_principal_coords)
st_tree <- mst(party_dist_chi2)

# B. 可視化用の座標:Symbiplot (Symmetric Biplot) を使用
# ステップ3で作成した cols_coord (sqrt使用) をそのまま描画に使う
edges <- which(as.matrix(st_tree) == 1, arr.ind = TRUE)
edges <- edges[edges[,1] < edges[,2], ] 

edge_df <- data.frame(
  x = cols_coord$Dim1[edges[,1]], y = cols_coord$Dim2[edges[,1]],
  xend = cols_coord$Dim1[edges[,2]], yend = cols_coord$Dim2[edges[,2]]
)


# 5. 可視化
ggplot() +
  # MSTの点線 (政党・候補者間) [cite: 145]
  geom_segment(data = edge_df, aes(x=x, y=y, xend=xend, yend=yend), 
               color = "gray60", linetype = "dotted", linewidth = 0.5) +
  # 自治体のプロット (青色・透過) [cite: 148, 149]
  geom_point(data = rows_coord, aes(x=Dim1, y=Dim2), color = "blue", alpha = 0.3, size = 1.5) +
  geom_text_repel(data = rows_coord, aes(x=Dim1, y=Dim2, label = Name), 
                  color = "blue", size = 2.5, alpha = 0.6, family="HiraKakuProN-W3") +
  # 政党・候補者のプロット (赤色・太字) [cite: 154, 155]
  geom_point(data = cols_coord, aes(x=Dim1, y=Dim2), color = "red", size = 3) +
  geom_text_repel(data = cols_coord, aes(x=Dim1, y=Dim2, label = Name), 
                  color = "red", size = 3.5, fontface = "bold", family="HiraKakuProN-W3",
                  box.padding = 0.5, max.overlaps = Inf) +
  # 原点補助線 [cite: 158, 159]
  geom_vline(xintercept = 0, linetype = "dashed", color = "gray80") +
  geom_hline(yintercept = 0, linetype = "dashed", color = "gray80") +
  # テーマ設定を適用
  theme_minimal(base_family="HiraKakuProN-W3") +
  coord_fixed() + # 距離構造を正しく保つために必須
  labs(title = "Greenacre's Symmetric Biplot (Symbiplot) with MST",
       subtitle = "Scaling: Standard Coordinates * sqrt(Singular Values)",
       x = paste0("Dimension 1 (", round((res_ca$sv[1]^2/sum(res_ca$sv^2))*100, 1), "%)"),
       y = paste0("Dimension 2 (", round((res_ca$sv[2]^2/sum(res_ca$sv^2))*100, 1), "%)"))
```



|

2026年2月 3日 (火)

FactoMineRのCAパッケージのデフォルトはsymmetric map

衆議院議員選挙2024年福岡11区のデータ

Screenshot-20260203-at-124842 Screenshot-20260203-at-124012 Screenshot-20260203-at-124023
```{r,out.width="100%"}
library(readr)
library(ggplot2)
library(ca)
library(FactoMineR)
library(patchwork)
library(vegan)

# データの準備
data <- read_csv("data11ku_PC.csv")
voting_data <- as.data.frame(data[,-1])
rownames(voting_data) <- data[[1]]
# head(voting_data,3)
# tail(voting_data,3)
voting_numeric <- voting_data[, 2:ncol(voting_data)]

# 1. 対応分析 (CA) 
CA(voting_numeric, graph = TRUE)
ca_res <- CA(voting_numeric, graph = FALSE)
ca_df <- data.frame(
  Dim1 = ca_res$col$coord[,1],
  Dim2 = ca_res$col$coord[,2],
  Name = rownames(ca_res$col$coord)
)

# 2. MDS 
voting_props <- prop.table(as.matrix(voting_numeric), margin = 1)
mds_dist <- dist(t(voting_props))
mds_res <- cmdscale(mds_dist, k = 2)
mds_df <- data.frame(
  Dim1 = mds_res[,1],
  Dim2 = mds_res[,2],
  Name = rownames(mds_res)
)

# 3. MSTデータ作成関数
get_mst_segments <- function(df) {
  d <- dist(df[, c("Dim1", "Dim2")])
  mst <- spantree(d)
  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]
  )
}

# 4. 可視化関数 
plot_func_mst <- function(df, title) {
  mst_segments <- get_mst_segments(df)
  
  # 全体(ggplot)には label を指定せず、各レイヤーで必要な aes を指定します
  ggplot(df, aes(x = Dim1, y = Dim2)) +
    # MSTの線 (aesを独立させることで Name を参照しなくなります)
    geom_segment(data = mst_segments, 
                 aes(x = x, y = y, xend = xend, yend = yend), 
                 color = "gray70", linetype = "solid") +
    geom_point(color = "blue", size = 3) +
    # ラベルはここで Name を指定
    geom_text(aes(label = Name), vjust = -1.5, fontface = "bold", family = 
"HiraKakuProN-W3") +
    theme_minimal(base_family="HiraKakuProN-W3") +
    expand_limits(x = range(df$Dim1)*1.5, y = range(df$Dim2)*1.5) +
    coord_cartesian(clip = "off") +
    labs(title = title, x = "Dimension 1", y = "Dimension 2")
}

# 実行
p1 <- plot_func_mst(ca_df, "CA with MST")
p2 <- plot_func_mst(mds_df, "MDS with MST")
# p1 + p2
p1
p2
```


[クラスタリングを付加]

Screenshot-20260203-at-130554 Screenshot-20260203-at-130614

[CA: Clustering & Full-Dim MST]

Screenshot-20260203-at-135420
# 全次元、CA関連のみ

```{r}
library(readr)
library(ggplot2)
library(ca)
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]
  )
}

# --- 4. 可視化関数 (Clustering + MST版) ---
plot_func_combined <- function(df, dist_obj, title) {
  mst_segments <- get_mst_segments(df, dist_obj)
  
  ggplot(df, aes(x = Dim1, y = Dim2)) +
    geom_segment(data = mst_segments, 
                 aes(x = x, y = y, xend = xend, yend = yend), 
                 color = "gray80", linetype = "solid") +
    geom_point(aes(color = Cluster), size = 3) +
    geom_text(aes(label = Name, color = Cluster), 
              vjust = -1.5, fontface = "bold", 
              family = "HiraKakuProN-W3", show.legend = FALSE) +
    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 = title, x = "Dimension 1", y = "Dimension 2", color = "Cluster")
}

# --- 5. 実行 ---
# CAのみを出力します
p1 <- plot_func_combined(ca_df, dist(ca_full_coord), "CA: Clustering & Full-Dim MST")

# 描画
p1
```

|

2026年2月 2日 (月)

福岡11区における有権者支持構造の多角的分析:対応分析、多次元尺度構成法、最小全域木を用いた統合的アプローチ

 

衆院選2024年福岡11区の政党と候補者の対応分析
天気が良かったので列車に乗って田川に行ってみた。
CAとMDSの比較、CA座標距離に基づくMST

 

解説

1. はじめに:複雑な選挙勢力図の解読

選挙データの分析は、単なる得票数の比較という一面的な作業にとどまりません。その真価は、候補者、政党、地域間に存在する複雑な関係性の網の目を解き明かし、有権者の投票行動に潜む深層構造を可視化することにあります。しかし、単一の統計手法に依存した分析は、しばしばデータの多面性を捉えきれず、時に誤解を招く結論を導きかねません。

本レポートの主たる論旨は、選挙データ分析における単一手法の限界を指摘し、統合的アプローチの優越性を論証することにあります。そのための決定的なケーススタディとして、福岡11区の選挙データを取り上げます。本稿では、対応分析(Correspondence Analysis, CA)多次元尺度構成法(Multidimensional Scaling, MDS)、そして最小全域木(Minimum Spanning Tree, MST)という3つの異なる統計手法を統合的に適用し、同選挙区の勢力図を多角的に解明します。

分析の中心となる問いは、武田氏と村上氏という主要候補者の支持構造にどのような質的な違いが存在するのか、そして「自民党と日本維新の会の連立」というマクロな政治的文脈が、有権者の投票行動にどのような影響を与えるかです。これらの問いに対し、本レポートは、統合的フレームワークだからこそ得られる、データが示す客観的な数値を手がかりに、その背後にある構造を慎重に読み解いてみたいと思います。

本稿ではまず、分析に用いる3つの手法の概念的な役割と特長を概説します。続いて、これらの手法を福岡11区のデータに適用した具体的な分析結果を示し、最後に、得られた知見を統合して選挙区全体の力学に関する結論を導き出します。

2. 分析手法の概説:3つのレンズによる勢力図の可視化

選挙の複雑な力学を正しく理解するためには、単一の分析手法に依存するだけでは不十分です。本分析で採用する対応分析(CA)、多次元尺度構成法(MDS)、最小全域木(MST)は、それぞれが異なる情報に焦点を当てることで、勢力図の多層的な構造を明らかにします。本章では、これら3つの手法が持つ概念的な違いと、それらを組み合わせることの戦略的重要性を解説します。

2.1. 対応分析(Correspondence Analysis, CA)

対応分析(CA)は、自治体(クロス集計表の行)と政党・候補者(列)の間の「相関関係」を可視化することに特化した手法です。この分析の核心は、「どの地域が、どの候補者を強く支持しているか」という地理的な支持パターンの特徴を鮮明に描き出すことにあります。CAが用いる距離の概念は、単純なユークリッド距離とは異なり、統計的な関連性の強さを示す「カイ二乗距離」に基づいています。この距離尺度は、カテゴリ間の統計的連関を測定するため、単なる得票数の大小を超えた、特定の地域と候補者の間の有意な結びつきを特定する上でより強力です。

2.2. 多次元尺度構成法(Multidimensional Scaling, MDS)

多次元尺度構成法(MDS)は、候補者や政党間の「純粋な近縁関係」を明らかにすることに焦点を当てます。この手法が可視化するのは、「誰と誰の支持層が重なっているか」という、支持基盤の類似性です。CAが地域と候補者の「相関」を重視するのに対し、MDSは各エンティティ(候補者や政党)間の「位置関係の再現」を最優先します。つまり、得票パターンの類似度に基づいて各候補者や政党を2次元マップ上に配置し、その相対的な近さによって支持層の重なり具合を示すことを目的とします。

2.3. 最小全域木(Minimum Spanning Tree, MST)

最小全域木(MST)は、CAやMDSといった2次元マップの「補助的参照構造」として位置づけられます。CAやMDSは、多次元の選挙データを2次元平面に投影する過程で、必然的に「情報の歪み」を生じさせます。MSTの重要な役割は、この歪みを補正することにあります。具体的には、2次元への投影前の多次元データ空間全体に基づいて、最も統計的に近い関係性の「骨格」を線で結び、可視化します。このアプローチの methodological な正当性は堅固です。なぜなら、CAの主座標空間におけるユークリッド距離は、元の分割表におけるカイ二乗距離を保持するため、全次元距離に基づくMSTは支持構造の近縁性を歪みなく反映するからです。これにより、「2次元マップ上では遠く見えても、多次元空間における本当の最短距離の相手は誰なのか」という問いに、統計的な裏付けをもって答えることができます。

これら3つの手法は、それぞれが選挙区の構造を異なる側面から照らし出す補完的なツールです。次の章では、これらの手法を実際に福岡11区のデータに適用し、得られた具体的な分析結果を考察します。

3. 分析結果と考察:福岡11区の勢力図に潜む多層的構造

本章は、本レポートの核心部分です。前章で概説した3つの手法を福岡11区の選挙データに適用した結果を提示し、それらが相互補完的に機能することで、一見しただけでは分からない複雑な政治力学をいかに明らかにするかを論証します。

3.1. Symbiplotが描く候補者と地域の相関関係

対応分析(CA)の結果をGreenacreの対称バイプロット(Symbiplot)として可視化すると、まず興味深い初期的な洞察が得られます。特筆すべきは、2次元マップ上で武田氏が、自身の所属政党である自民党(LDP)から大きく離れて配置されている点です。この顕著な空間的分離は、両者の「集票の地理的特性」が乖離していることの直接的な可視化に他なりません。端的に言えば、武田候補個人が強みを持つ自治体エリアと、自民党組織が強みを持つ自治体エリアは異なっているのです。

3.2. 最小全域木が暴く「本質的な共通性」

前節の発見は、一見すると候補者と政党の乖離を示唆しますが、最小全域木(MST)を重ね合わせることで、より深い構造が見えてきます。2次元マップ上では遠い武田氏と自民党が、全次元のデータに基づいて計算されたMSTでは直接結ばれているのです。これは極めて重要な事実であり、2次元投影によって生じた見かけ上の距離の裏側に、両者の支持層における「本質的な共通性」が確固として存在することの統計的な証明となります。この事例は、MSTが2次元マップの歪みを補正し、より本質的な関係性を浮き彫りにする強力な診断ツールであることを明確に示しています。

3.3. 武田氏と村上氏の支持構造比較:近接性と異質性の二面性

次に、主要な競合候補である武田氏と村上氏の支持構造を比較します。多次元尺度構成法(MDS)の分析では、「武田氏と村上氏」が最短距離で結ばれ、両者の支持層に強い重なりが存在することが示唆されます。しかし、この知見はCAとMSTの分析結果を統合することで、さらなる奥行きを得ます。

全次元空間における近接性を見ると、武田氏の最短距離の相手はあくまで自民党です。一方で、村上氏は立憲民主党(CDP)などの野党勢力に近い境界領域に位置しており、支持構造に微妙な差異があることが分かります。

この質的な違いは、我々の多角的アプローチによって明らかにされた彼らのネットワーク上のポジションの直接的な帰結です。武田氏のMSTによって確認された自民党との本質的な近接性は、彼の支持基盤が確立された既存の組織票の枠組み内にしっかりと根差していることを示します。 対照的に、村上氏のMDSが示す武田氏との近接性と、CAが示す野党ブロックとの隣接性を組み合わせると、彼の支持基盤がより希薄なものであることが明らかになります。それは、隣接するが異なる政治的領域から有権者を引きつけることに依存する支持基盤なのです。

3.4. 政党間連携と「戦略的投票」の変容

これらの統計的構造分析から得られた知見は、昨今の「自民党と日本維新の会の連立」という政治情勢のレンズを通して解釈することで、絶大な予測力を持ちます。第3.3節で特定された、村上氏が野党勢力に隣接する境界領域を占めるという構造こそが、過去の選挙において彼が「戦略的投票」の受け皿として機能し得た理由に他なりません。

戦略的投票とは、「勝ちそうな非自民候補に票を集めることで結果を変えようとする行動」を指します。かつて村上候補は、この「非自民の受け皿」として自民党への批判票を集約することが可能でした。しかし、自民党と維新の連立は、有権者の認識の上でこの境界線を事実上消去します。与党と連携することで、村上氏は「非自民の受け皿」としての地位を失い、我々の分析が特定した「他勢力の支持層とも地続きの層」が剥落し、彼の得票は所属政党(維新)の基礎支持率へと収束していく可能性が極めて高いと予測されます。

4. 統合的考察と結論

本レポートは、福岡11区の選挙データを事例として、単一の統計手法では見過ごされがちな有権者支持構造の多層的力学を、統合的アプローチによって解明できることを実証しました。この分析は、CA、MDS、MSTを組み合わせることが、いかにしてより深く、信頼性の高い洞察をもたらすかを示しています。

4.1. 統計手法の相補性:単一指標の限界を超える

本分析から得られる最も重要な教訓は、CA、MDS、MSTが決して競合する手法ではなく、選挙区の勢力図を診断するための不可欠な診断ツールキットを構成するという点です。これらはそれぞれ異なる角度から真実の断片を照らし出す相補的な関係にあります。武田氏と自民党の事例が示すように、2次元マップのような単一の指標のみに依存することは、実態とは異なる結論を導きかねません。各手法の役割は、以下のように整理されます。

  • 対応分析(CA): 支持基盤の「地理的」な相関関係を明らかにする。
  • 多次元尺度構成法(MDS): 支持層の「重なり」や類似性を明らかにする。
  • 最小全域木(MST): 2次元投影の歪みを補正し、多次元空間における「本質的」な近接関係の骨格を明らかにする。

4.2. 結論と分析の限界

結論として、福岡11区の勢力図は、候補者個人の資質や政党の公約といったミクロな要因だけでなく、支持層の構造的特性や政党間の連携というマクロな力学によって複雑に形成されていることが、データに基づいて示されました。特に、2次元マップ上の見かけの距離と、多次元データが示す本質的な近接性の間に生じる乖離を特定し、その政治的含意を解明できたことは、本分析の大きな成果です。

最後に、分析の健全性を期すため、本手法の限界についても明確にしておく必要があります。例えば、最小全域木(MST)は、あくまで距離構造に基づく近接性の要約であり、因果関係や政治的な協調関係を直接示すものではありません。また、MSTは2次元配置を完全に置き換えるものではなく、2次元マップに生じる投影歪みを補助的に読み解くための参照構造として用いるべきです。これらの限界を認識した上で、本レポートが提示した多角的な分析アプローチは、今後の選挙分析における有効な方法論の一つとなり得るでしょう。

|