# --- 1. 設定:AONF標準フォーマットの定義 ---
AONF_CAPTION <- "Archives from 2026 Onward and Notes for the Future\n2026年以降の記録 | 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)
library(Hmisc)
##
## 次のパッケージを付け加えます: 'Hmisc'
## 以下のオブジェクトは 'package:dplyr' からマスクされています:
##
## src, summarize
## 以下のオブジェクトは 'package:base' からマスクされています:
##
## format.pval, units
# --- 2. 編集済みDIDデータの読み込み ---
# エディタで1行(タイトル行)のみ残して整理したファイルを使用
did_data <- read.csv("FEI_CITY_260320115508.csv",
skip = 1,
fileEncoding = "UTF-8",
check.names = FALSE,
na.strings = "-") # "-" をあらかじめ NA として処理
str(did_data)
## 'data.frame': 45 obs. of 3 variables:
## $ 地域 : chr "福岡県 北九州市 門司区" "福岡県 北九州市 若松区" "福岡県 北九州市 戸畑区" "福岡県 北九州市 小倉北区" ...
## $ A1801_人口集中地区人口【人】 : chr "78,081" "67,705" "57,163" "181,525" ...
## $ A1802_人口集中地区面積【km2】: num 16.8 17.6 16.3 28.6 28.1 ...
did_processed <- did_data %>%
rename(
region = 1, # 1番目の列:地域
pop_did = 2, # 2番目の列:人口集中地区人口
area_did = 3 # 3番目の列:人口集中地区面積
) %>%
mutate(
# 数値への強制変換(カンマ除去)。NA生成の警告は filter で処理されるため無視してOKです
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)
# --- 3. 選挙データの読み込み ---
elec_data <- read.csv("data_PC_fixed.csv", fileEncoding = "UTF-8", check.names = FALSE)
str(elec_data)
## 'data.frame': 72 obs. of 30 variables:
## $ municipality: chr "門司区" "小倉北区" "小倉南区" "若松区" ...
## $ 日本共産党 : int 2361 3803 4392 2548 1540 5108 1909 5834 3181 3356 ...
## $ 日本維新の会: int 1921 3357 3965 1436 1303 4946 1150 8201 5523 5435 ...
## $ 無所属連合 : int 126 313 284 105 108 414 88 548 420 541 ...
## $ 日本保守党 : int 2249 5025 5101 1933 1569 6047 1530 10236 8532 8268 ...
## $ 立憲民主党 : int 5077 7420 9975 3923 3438 12677 2721 15805 8520 9628 ...
## $ 参政党 : int 4970 10500 12703 4957 3712 15203 3261 23856 19361 15730 ...
## $ 国民民主党 : int 3806 9143 10912 3802 3134 12931 3030 21113 17338 14660 ...
## $ チームみらい: int 757 1858 1613 567 596 2043 539 4415 3495 4735 ...
## $ 日本誠真会 : int 306 614 675 282 185 749 171 1164 815 1024 ...
## $ 社会民主党 : int 999 1465 1687 701 664 2282 514 3163 1710 1901 ...
## $ れいわ新選組: int 2661 5010 6518 2468 1762 7552 1497 10207 7252 5647 ...
## $ 日本改革党 : int 35 56 86 34 27 94 16 126 118 77 ...
## $ 自由民主党 : int 7973 13332 15551 6524 5556 18848 4979 24690 16170 17431 ...
## $ 再生の道 : int 321 710 881 285 250 1011 180 1384 1044 993 ...
## $ 公明党 : int 6226 8703 10783 4037 3812 12939 3074 14419 10086 6053 ...
## $ NHK党 : int 432 950 919 312 328 1063 277 1675 1398 1150 ...
## $ KWM : int 4181 10277 11354 4250 3644 13877 3340 22553 18589 16964 ...
## $ SHM : int 7945 11162 13981 5207 4797 16542 4003 17804 12193 7719 ...
## $ TMN : int 366 730 781 348 236 884 195 1456 1004 1162 ...
## $ NAS : int 802 1201 1387 571 540 1943 389 2782 1803 1635 ...
## $ NKD : int 5533 11830 14060 5472 4140 17440 3756 26676 21655 17794 ...
## $ ITO : int 1744 3140 3721 1323 1144 4597 970 7450 5139 4709 ...
## $ FRK : int 696 1935 1605 612 606 2092 570 4047 3223 4206 ...
## $ YMG : int 2014 3368 3784 2411 1366 4558 1734 4918 2714 2642 ...
## $ MRK : int 242 441 533 202 173 655 156 862 721 522 ...
## $ MTS : int 7369 11826 13726 5712 5047 16646 4346 24103 15449 16569 ...
## $ MOR : int 1791 3959 4169 1506 1248 4826 1188 7985 6629 6706 ...
## $ OKZ : int 2196 4139 5461 2040 1426 6263 1230 8452 6224 4929 ...
## $ NOD : int 5488 8346 11794 4324 3671 13696 3073 17937 9579 10891 ...
# 候補者略号リスト
candidates_list <- c("KWM", "SHM", "TMN", "NAS", "NKD", "ITO", "FRK", "YMG", "MRK", "MTS", "MOR", "OKZ", "NOD")
# アルファベット略号を除外して「政党」のリストを作成
party_list <- names(elec_data)[!names(elec_data) %in% c("municipality", candidates_list)]
# 得票率の計算(全数値列の合計を分母にする)
elec_data <- elec_data %>%
mutate(Total_Votes = rowSums(select(., where(is.numeric)), na.rm = TRUE))
for (p in party_list) {
elec_data[[paste0(p, "_rate")]] <- (elec_data[[p]] / elec_data$Total_Votes) * 100
}
# --- 4. データの結合 ---
merged_final <- inner_join(did_processed, elec_data, by = c("match_key" = "municipality"))
# --- 5. 相関分析のサマリー作成 ---
rate_cols <- paste0(party_list, "_rate")
df_corr <- lapply(rate_cols, function(col) {
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, "有意な相関あり", "有意性なし"))
df_corr
## Party Correlation p_value Significant
## cor...1 日本共産党 -0.36494811 7.951822e-02 有意性なし
## cor...2 日本維新の会 0.57655863 3.187014e-03 有意な相関あり
## cor...3 無所属連合 0.61098666 1.516372e-03 有意な相関あり
## cor...4 日本保守党 0.80918187 1.689529e-06 有意な相関あり
## cor...5 立憲民主党 -0.22866759 2.824839e-01 有意性なし
## cor...6 参政党 0.32013023 1.272471e-01 有意性なし
## cor...7 国民民主党 0.47218007 1.982080e-02 有意な相関あり
## cor...8 チームみらい 0.87279105 2.669694e-08 有意な相関あり
## cor...9 日本誠真会 0.74158660 3.370505e-05 有意な相関あり
## cor...10 社会民主党 -0.04539297 8.331870e-01 有意性なし
## cor...11 れいわ新選組 -0.50109174 1.261959e-02 有意な相関あり
## cor...12 日本改革党 -0.10157212 6.367408e-01 有意性なし
## cor...13 自由民主党 -0.41774085 4.223390e-02 有意な相関あり
## cor...14 再生の道 0.51936903 9.297956e-03 有意な相関あり
## cor...15 公明党 -0.66300923 4.141411e-04 有意な相関あり
## cor...16 NHK党 0.56257593 4.213755e-03 有意な相関あり
# --- 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)
)
