OK版 RPubs公表済み

# --- 1. 設定:AONF標準フォーマットの定義 ---
AONF_CAPTION <- "Archives from 2026 Onward and Notes for the Future\n2026年以降の記録 | [https://ab.cocolog-nifty.com/note/](https://ab.cocolog-nifty.com/note/)"

library(dplyr)
## 
## 次のパッケージを付け加えます: 'dplyr'
## 以下のオブジェクトは 'package:stats' からマスクされています:
## 
##     filter, lag
## 以下のオブジェクトは 'package:base' からマスクされています:
## 
##     intersect, setdiff, setequal, union
library(stringr)
library(ggplot2)
library(tidyr)

# --- 2. データの読み込み ---
# DID人口密度データ
did_data <- read.csv("FEI_CITY_260320115508.csv", skip = 1, fileEncoding = "UTF-8", check.names = FALSE, na.strings = "-")
# 選挙結果生データ
elec_raw <- read.csv("data_PC_fixed.csv", fileEncoding = "UTF-8", check.names = FALSE)


head(elec_raw)
##   municipality 日本共産党 日本維新の会 無所属連合 日本保守党 立憲民主党 参政党
## 1       門司区       2361         1921        126       2249       5077   4970
## 2     小倉北区       3803         3357        313       5025       7420  10500
## 3     小倉南区       4392         3965        284       5101       9975  12703
## 4       若松区       2548         1436        105       1933       3923   4957
## 5     八幡東区       1540         1303        108       1569       3438   3712
## 6     八幡西区       5108         4946        414       6047      12677  15203
##   国民民主党 チームみらい 日本誠真会 社会民主党 れいわ新選組 日本改革党
## 1       3806          757        306        999         2661         35
## 2       9143         1858        614       1465         5010         56
## 3      10912         1613        675       1687         6518         86
## 4       3802          567        282        701         2468         34
## 5       3134          596        185        664         1762         27
## 6      12931         2043        749       2282         7552         94
##   自由民主党 再生の道 公明党 NHK党   KWM   SHM TMN  NAS   NKD  ITO  FRK  YMG
## 1       7973      321   6226      432  4181  7945 366  802  5533 1744  696 2014
## 2      13332      710   8703      950 10277 11162 730 1201 11830 3140 1935 3368
## 3      15551      881  10783      919 11354 13981 781 1387 14060 3721 1605 3784
## 4       6524      285   4037      312  4250  5207 348  571  5472 1323  612 2411
## 5       5556      250   3812      328  3644  4797 236  540  4140 1144  606 1366
## 6      18848     1011  12939     1063 13877 16542 884 1943 17440 4597 2092 4558
##   MRK   MTS  MOR  OKZ   NOD
## 1 242  7369 1791 2196  5488
## 2 441 11826 3959 4139  8346
## 3 533 13726 4169 5461 11794
## 4 202  5712 1506 2040  4324
## 5 173  5047 1248 1426  3671
## 6 655 16646 4826 6263 13696
# --- 3. データの前処理(DID密度算出と結合) ---
did_processed <- did_data %>%
  rename(region = 1, pop_did = 2, area_did = 3) %>%
  mutate(
    pop_did = as.numeric(gsub(",", "", as.character(pop_did))),
    area_did = as.numeric(gsub(",", "", as.character(area_did))),
    DID_Density = pop_did / area_did,
    match_key = str_extract(region, "[^ ]+$")
  ) %>%
  filter(!is.na(DID_Density) & pop_did > 0)

# ここで確実に 'merged_final' を作成
merged_final <- inner_join(did_processed, elec_raw, by = c("match_key" = "municipality"))


head(merged_final)
##                     region pop_did area_did DID_Density match_key 日本共産党
## 1   福岡県 北九州市 門司区   78081    16.75    4661.552    門司区       2361
## 2   福岡県 北九州市 若松区   67705    17.57    3853.443    若松区       2548
## 3   福岡県 北九州市 戸畑区   57163    16.33    3500.490    戸畑区       1909
## 4 福岡県 北九州市 小倉北区  181525    28.58    6351.470  小倉北区       3803
## 5 福岡県 北九州市 小倉南区  183803    28.07    6548.023  小倉南区       4392
## 6 福岡県 北九州市 八幡東区   61232    14.47    4231.652  八幡東区       1540
##   日本維新の会 無所属連合 日本保守党 立憲民主党 参政党 国民民主党 チームみらい
## 1         1921        126       2249       5077   4970       3806          757
## 2         1436        105       1933       3923   4957       3802          567
## 3         1150         88       1530       2721   3261       3030          539
## 4         3357        313       5025       7420  10500       9143         1858
## 5         3965        284       5101       9975  12703      10912         1613
## 6         1303        108       1569       3438   3712       3134          596
##   日本誠真会 社会民主党 れいわ新選組 日本改革党 自由民主党 再生の道 公明党
## 1        306        999         2661         35       7973      321   6226
## 2        282        701         2468         34       6524      285   4037
## 3        171        514         1497         16       4979      180   3074
## 4        614       1465         5010         56      13332      710   8703
## 5        675       1687         6518         86      15551      881  10783
## 6        185        664         1762         27       5556      250   3812
##   NHK党   KWM   SHM TMN  NAS   NKD  ITO  FRK  YMG MRK   MTS  MOR  OKZ   NOD
## 1      432  4181  7945 366  802  5533 1744  696 2014 242  7369 1791 2196  5488
## 2      312  4250  5207 348  571  5472 1323  612 2411 202  5712 1506 2040  4324
## 3      277  3340  4003 195  389  3756  970  570 1734 156  4346 1188 1230  3073
## 4      950 10277 11162 730 1201 11830 3140 1935 3368 441 11826 3959 4139  8346
## 5      919 11354 13981 781 1387 14060 3721 1605 3784 533 13726 4169 5461 11794
## 6      328  3644  4797 236  540  4140 1144  606 1366 173  5047 1248 1426  3671
# --- 4. 得票率の計算(ここが重要です) ---
# 候補者略号リストを除外
candidates_list <- c("KWM", "SHM", "TMN", "NAS", "NKD", "ITO", "FRK", "YMG", "MRK", "MTS", "MOR", "OKZ", "NOD")

# 「政党のみ」のリストを作成(市区町村名と個人名を除外)
party_list <- names(elec_raw)[!names(elec_raw) %in% c("municipality", candidates_list)]

# 各自治体の合計得票数(政党のみ)を算出し、得票率(_rate)に変換
merged_final <- merged_final %>%
  mutate(Total_Votes = rowSums(select(., all_of(party_list)), na.rm = TRUE)) # ← ここで閉じカッコを補完しました

for (p in party_list) {
  # 各政党の得票を「政党の合計得票数」で割って100を掛け、パーセントにします
  merged_final[[paste0(p, "_rate")]] <- (merged_final[[p]] / merged_final$Total_Votes) * 100
}

# 結果の確認(最初の数行を表示)
head(merged_final)
##                     region pop_did area_did DID_Density match_key 日本共産党
## 1   福岡県 北九州市 門司区   78081    16.75    4661.552    門司区       2361
## 2   福岡県 北九州市 若松区   67705    17.57    3853.443    若松区       2548
## 3   福岡県 北九州市 戸畑区   57163    16.33    3500.490    戸畑区       1909
## 4 福岡県 北九州市 小倉北区  181525    28.58    6351.470  小倉北区       3803
## 5 福岡県 北九州市 小倉南区  183803    28.07    6548.023  小倉南区       4392
## 6 福岡県 北九州市 八幡東区   61232    14.47    4231.652  八幡東区       1540
##   日本維新の会 無所属連合 日本保守党 立憲民主党 参政党 国民民主党 チームみらい
## 1         1921        126       2249       5077   4970       3806          757
## 2         1436        105       1933       3923   4957       3802          567
## 3         1150         88       1530       2721   3261       3030          539
## 4         3357        313       5025       7420  10500       9143         1858
## 5         3965        284       5101       9975  12703      10912         1613
## 6         1303        108       1569       3438   3712       3134          596
##   日本誠真会 社会民主党 れいわ新選組 日本改革党 自由民主党 再生の道 公明党
## 1        306        999         2661         35       7973      321   6226
## 2        282        701         2468         34       6524      285   4037
## 3        171        514         1497         16       4979      180   3074
## 4        614       1465         5010         56      13332      710   8703
## 5        675       1687         6518         86      15551      881  10783
## 6        185        664         1762         27       5556      250   3812
##   NHK党   KWM   SHM TMN  NAS   NKD  ITO  FRK  YMG MRK   MTS  MOR  OKZ   NOD
## 1      432  4181  7945 366  802  5533 1744  696 2014 242  7369 1791 2196  5488
## 2      312  4250  5207 348  571  5472 1323  612 2411 202  5712 1506 2040  4324
## 3      277  3340  4003 195  389  3756  970  570 1734 156  4346 1188 1230  3073
## 4      950 10277 11162 730 1201 11830 3140 1935 3368 441 11826 3959 4139  8346
## 5      919 11354 13981 781 1387 14060 3721 1605 3784 533 13726 4169 5461 11794
## 6      328  3644  4797 236  540  4140 1144  606 1366 173  5047 1248 1426  3671
##   Total_Votes 日本共産党_rate 日本維新の会_rate 無所属連合_rate 日本保守党_rate
## 1       40220        5.870214          4.776231       0.3132770        5.591745
## 2       33914        7.513121          4.234240       0.3096067        5.699711
## 3       24936        7.655598          4.611806       0.3529034        6.135707
## 4       72259        5.263012          4.645788       0.4331640        6.954151
## 5       86045        5.104306          4.608054       0.3300599        5.928293
## 6       27984        5.503145          4.656232       0.3859348        5.606775
##   立憲民主党_rate 参政党_rate 国民民主党_rate チームみらい_rate 日本誠真会_rate
## 1        12.62307    12.35704        9.462954          1.882148       0.7608155
## 2        11.56749    14.61638       11.210709          1.671876       0.8315150
## 3        10.91193    13.07748       12.151107          2.161534       0.6857555
## 4        10.26862    14.53106       12.653095          2.571306       0.8497211
## 5        11.59277    14.76321       12.681736          1.874600       0.7844732
## 6        12.28559    13.26472       11.199257          2.129788       0.6610921
##   社会民主党_rate れいわ新選組_rate 日本改革党_rate 自由民主党_rate
## 1        2.483839          6.616111      0.08702138        19.82347
## 2        2.066993          7.277231      0.10025358        19.23689
## 3        2.061277          6.003369      0.06416426        19.96712
## 4        2.027429          6.933392      0.07749900        18.45030
## 5        1.960602          7.575106      0.09994770        18.07310
## 6        2.372784          6.296455      0.09648370        19.85420
##   再生の道_rate 公明党_rate NHK党_rate
## 1     0.7981104    15.47986     1.0740925
## 2     0.8403609    11.90364     0.9199741
## 3     0.7218479    12.32756     1.1108438
## 4     0.9825766    12.04417     1.3147151
## 5     1.0238829    12.53181     1.0680458
## 6     0.8933676    13.62207     1.1720983
# --- 5. 相関分析のサマリー作成 ---
rate_cols <- paste0(party_list, "_rate")
df_corr <- lapply(rate_cols, function(col) {
  # merged_final の中の 'DID_Density' と 各得票率の相関を計算
  res <- cor.test(merged_final$DID_Density, merged_final[[col]])
  data.frame(Party = sub("_rate$", "", col), Correlation = res$estimate, p_value = res$p.value)
}) %>% 
  bind_rows() %>%
  mutate(Significant = ifelse(p_value < 0.05, "有意な相関あり", "有意性なし"))

# --- 6. 可視化(AONF標準フォーマット) ---
ggplot(df_corr, aes(x = reorder(Party, Correlation), y = Correlation, fill = Significant)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  scale_fill_manual(values = c("有意な相関あり" = "#d73027", "有意性なし" = "#bdbdbd")) +
  labs(
    title = "DID人口密度と各政党得票率の相関係数",
    subtitle = "福岡県内自治体、2025年参院選比例代表",
    x = "政党",
    y = "相関係数 (r)",
    caption = AONF_CAPTION
  ) +
  theme_minimal(base_family = "HiraKakuProN-W3") +
  theme(
    legend.position = "bottom",
    plot.caption = element_text(size = 8, hjust = 1, color = "darkgrey", lineheight = 1.2)
  )