당원과 정당 수입지출

당원수

저자
소속

1 데이터셋

1.1 2022년

1.1.1 당원수

코드
library(tidyverse)
library(testthat)

party_2022 <- tribble(
  ~구분, ~당원수, ~분포비, ~등록된시도당수, ~시도당평균당원수,
  "합계", 10653090, 100.0, 347, 30701,
  "더불어민주당", 4849578, 45.5, 17, 285269,
  "국민의힘", 4298593, 40.4, 17, 252858,
  "정의당", 48892, 0.5, 17, 2876,
  "기본소득당", 19874, 0.2, 6, 3312,
  "시대전환", 8904, 0.1, 7, 1272,
  "가나코리아", 5363, 0.1, 5, 1073,
  "가자평화인권당", 6481, 0.1, 6, 1080,
  "가자환경당", 7480, 0.1, 6, 1247,
  "거지당", 10782, 0.1, 8, 1348,
  "국가혁명당", 32543, 0.3, 16, 2034,
  "국민대통합당", 6248, 0.1, 5, 1250,
  "국민참여신당", 5773, 0.1, 5, 1155,
  "기독당", 5272, 0.0, 5, 1054,
  "깨어있는시민연대당", 6490, 0.1, 5, 1298,
  "남북통일당", 5324, 0.0, 5, 1065,
  "노동당", 11127, 0.1, 7, 1590,
  "녹색당", 8399, 0.1, 5, 1680,
  "대한국민당", 5456, 0.1, 5, 1091,
  "대한당", 5565, 0.1, 5, 1113,
  "대한민국당", 6726, 0.1, 5, 1345,
  "더밝은미래당", 5248, 0.0, 5, 1050,
  "미래당", 12946, 0.1, 6, 2158,
  "민생당", 377538, 3.5, 11, 34322,
  "민중민주당", 9869, 0.1, 7, 1410,
  "새누리당", 36159, 0.3, 7, 5166,
  "신한반도당", 8687, 0.1, 8, 1086,
  "신한반도평화체제당", 6543, 0.1, 6, 1091,
  "여성의당", 7858, 0.1, 5, 1572,
  "열린민주당", 6305, 0.1, 6, 1051,
  "우리공화당", 423216, 4.0, 13, 32555,
  "자유당", 5462, 0.1, 5, 1092,
  "자유민주당", 8288, 0.1, 5, 1658,
  "자유의새벽당", 11256, 0.1, 5, 2251,
  "자유통일당", 199350, 1.9, 16, 12459,
  "중소자영업당", 5823, 0.1, 5, 1165,
  "직능자영업당", 5184, 0.0, 5, 1037,
  "진보당", 91620, 0.9, 16, 5726,
  "충청의미래당", 5360, 0.1, 5, 1072,
  "친박신당", 8312, 0.1, 6, 1385,
  "통일한국당", 11978, 0.1, 6, 1996,
  "한국국민당", 6880, 0.1, 6, 1147,
  "한국독립당", 6649, 0.1, 6, 1108,
  "한국복지당", 7071, 0.1, 7, 1010,
  "한나라당", 5790, 0.1, 5, 1158,
  "한류연합당", 9247, 0.1, 7, 1321,
  "혁명21", 8941, 0.1, 6, 1490,
  "홍익당", 6640, 0.1, 5, 1328
) |> 
  slice(2:n()) 


party_2022 |> 
  summarise(당원수 = sum(당원수)) # 10,653,090
#> # A tibble: 1 × 1
#>     당원수
#>      <dbl>
#> 1 10653090

# 당원수의 합계를 테스트하는 함수
test_that("Sum of 당원수 is correct", {
  # 실제 데이터로부터 당원수의 합계 계산
  calculated_sum <- sum(party_2022$당원수)

  # 기대하는 합계 값 (예시로 10653090을 사용합니다)
  expected_sum <- parse_number('10,653,090')

  # 계산된 합계와 기대하는 합계를 비교
  expect_equal(calculated_sum, expected_sum)
})
#> Test passed 😀

1.1.2 시도별

코드
library(tibble)

sido_party_2022 <- tribble(
  ~구분, ~합계, ~더불어민주당, ~국민의힘, ~정의당, ~기본소득당, ~시대전환, ~가나코리아, ~가자평화인권당, ~가자환경당, ~거지당, ~국가혁명당, ~국민대통합당,
  "합계", 10653090, 4849578, 4298593, 48892, 19874, 8904, 5363, 6481, 7480, 10782, 32543, 6248,
  "서울", 1854755, 863508, 678753, 9453, 3182, 1392, 1123, 1042, 1473, 1478, 3582, 1643,
  "부산", 554370, 165043, 264645, 2190, 4124, 0, 0, 1103, 1413, 1300, 3023, 0,
  "대구", 362994, 45308, 239323, 1194, 0, 1160, 0, 0, 0, 1450, 1649, 0, 
  "인천", 489052, 185594, 236693, 4578, 3059, 0, 1017, 0, 0, 1026, 1758, 0, 
  "광주", 535184, 389125, 63980, 2346, 2717, 1050, 0, 0, 1080, 1164, 1242,  0,
  "대전", 372594, 149968, 196951, 1299, 0, 0, 0, 1016, 1149, 0, 2027,   0,
  "울산", 267310, 67364, 166758, 1372,  0, 1116, 0, 0, 0, 1711, 1423,  0,
  "세종", 42921, 19536, 15022, 1063, 0, 0, 0, 0, 0, 0, 1236, 0, 
  "경기", 2071257, 933330, 853968, 9871, 5723, 1935, 1035, 1106, 1178, 1504, 4808, 1403,
  "강원", 355141, 119366, 210233, 1077, 0, 0, 1095, 0, 0, 0, 1434,  0, 
  "충북", 387660, 156788, 194237, 1091, 0, 0, 0, 0, 0, 0, 1496, 1059, 
  "충남", 509474, 216930, 243337, 1460, 0, 0, 1093, 0, 0, 0, 1785, 1057,
  "전북", 817983, 660208, 72813, 3369, 0, 1121, 0, 1101, 0, 0, 1286, 1086,  
  "전남", 756584, 574962, 58828, 3883, 1069, 1130, 0, 0, 1023, 0, 0, 0,
  "경북", 516815, 48731, 385151, 1303, 0, 0, 0, 0, 0, 0, 1495, 0,
  "경남", 569774, 151515, 339374, 2143, 0, 0, 0, 1113, 1313,  0, 2762, 0,
  "제주", 189222, 102302, 78527, 1200, 0, 0, 0, 0, 0, 0, 1537, 0
) |> 
  slice(2:n())
  
sido_party_2022 |> 
  summarise(합계 = sum(합계)) # 10,653,090
#> # A tibble: 1 × 1
#>       합계
#>      <dbl>
#> 1 10653090


# 단위 테스트
test_that("Sum of 더불어민주당 and 국민의힘 is correct", {
  # 더불어민주당의 총합 계산
  sum_democratic <- sum(sido_party_2022$더불어민주당, na.rm = TRUE)
  # 국민의힘의 총합 계산
  sum_national_power <- sum(sido_party_2022$국민의힘, na.rm = TRUE)

  # 예상되는 총합
  expected_sum_democratic <- 4849578
  expected_sum_national_power <- 4298593

  # 계산된 총합과 예상 총합 비교
  expect_equal(sum_democratic, expected_sum_democratic)
  expect_equal(sum_national_power, expected_sum_national_power)
})
#> Test passed 🥳

1.1.3 당비 납부자수

코드
library(tibble)

payer_2022 <- tribble(
  ~정당, ~당원수, ~납부자수, ~당비납부비율, ~등록된시도당수,
  "합계", 10653090, 2521436, 23.7, 347,
  "더불어민주당", 4849578, 1402809, 28.9, 17,
  "국민의힘", 4298593, 897336, 20.9, 17,
  "정의당", 48892, 22949, 46.9, 17,
  "기본소득당", 19874, 1013, 5.1, 6,
  "시대전환", 8904, 274, 3.1, 7,
  "가나코리아", 5363, NA, NA, 5,
  "가자평화인권당", 6481, NA, NA, 6,
  "가자환경당", 7480, NA, NA, 6,
  "거지당", 10782, NA, NA, 8,
  "국가혁명당", 32543, 7581, 23.3, 16,
  "국민대통합당", 6248, NA, NA, 5,
  "국민참여신당", 5773, NA, NA, 5,
  "기독당", 5272, NA, NA, 5,
  "깨어있는시민연대당", 6490, 35, 0.5, 5,
  "남북통일당", 5324, 216, 4.1, 5,
  "노동당", 11127, 2698, 24.2, 7,
  "녹색당", 8399, 4223, 50.3, 5,
  "대한국민당", 5456, NA, NA, 5,
  "대한당", 5565, NA, NA, 5,
  "대한민국당", 6726, 85, 1.3, 5,
  "더밝은미래당", 5248, NA, NA, 5,
  "미래당", 12946, 1322, 10.2, 6,
  "민생당", 377538, 7727, 2.0, 11,
  "민중민주당", 9869, 58, 0.6, 7,
  "새누리당", 36159, 713, 2.0, 7,
  "신한반도당", 8687, 20, 0.2, 8,
  "신한반도평화체제당", 6543, NA, NA, 6,
  "여성의당", 7858, 1138, 14.5, 5,
  "열린민주당", 6305, 902, 14.3, 6,
  "우리공화당", 423216, 53503, 12.6, 13,
  "자유당", 5462, 40, 0.7, 5,
  "자유민주당", 8288, 590, 7.1, 5,
  "자유의새벽당", 11256, 2276, 20.2, 5,
  "자유통일당", 199350, 66973, 33.6, 16,
  "중소자영업당", 5823, NA, NA, 5,
  "직능자영업당", 5184, NA, NA, 5,
  "진보당", 91620, 44765, 48.9, 16,
  "충청의미래당", 5360, 1, 0.0, 5,
  "친박신당", 8312, 218, 2.6, 6,
  "통일한국당", 11978, 103, 0.9, 6,
  "한국국민당", 6880, 106, 1.5, 6,
  "한국독립당", 6649, 60, 0.9, 6,
  "한국복지당", 7071, NA, NA, 7,
  "한나라당", 5790, NA, NA, 5,
  "한류연합당", 9247, 117, 1.3, 7,
  "혁명21", 8941, 1449, 16.2, 6,
  "홍익당", 6640, 136, 2.0, 5
) |> 
  slice(2:n())

payer_2022 |> 
  summarise( 당원수 = sum(당원수)) # 10,653,090
#> # A tibble: 1 × 1
#>     당원수
#>      <dbl>
#> 1 10653090

# 단위 테스트
test_that("Sum of 당원수 and 납부자수 is correct", {
  # 당원수 총합 계산
  sum_members <- sum(payer_2022$당원수, na.rm = TRUE)
  # 납부자수 총합 계산
  sum_payers <- sum(payer_2022$납부자수, na.rm = TRUE)

  # 예상되는 총합
  expected_sum_members <- 10653090
  expected_sum_payers <- 2521436

  # 계산된 총합과 예상 총합 비교
  expect_equal(sum_members, expected_sum_members)
  expect_equal(sum_payers, expected_sum_payers)
})
#> Test passed 😸

1.1.4 수입내역

단위: 백만원

코드
# R에서 데이터프레임 생성
income_2022 <- tribble(
  ~구분, ~합계, ~전년도이월, ~당비, ~기탁금, ~후원회기부금, ~보조금, ~차입금, ~기타,
  "합계", 547471, 56287, 107892, 337, 6201, 140249, 71006, 165499,
  "더불어민주당", 262553, 33808, 52588, 164, 244, 68463, 34988, 72298,
  "국민의힘", 215350, 14685, 29031, 141, 1652, 60287, 30951, 78603,
  "정의당", 20172, 1177, 3587, 23, 835, 9504, 1251, 3795,
  "기본소득당", 3970, 232, 2242, 0, 57, 107, 0, 1332,
  "시대전환", 283, 20, 87, 2, 9, 69, 0, 96,
  "기타 정당", 45143, 6365, 20357, 7, 3404, 1819, 3816, 9375
) |> 
  slice(2:n())

# 데이터프레임 확인
income_2022 |> 
  summarise(당비 = sum(당비)) # 107,892
#> # A tibble: 1 × 1
#>     당비
#>    <dbl>
#> 1 107892

# 단위 테스트
test_that("Sum of 당비 and 기탁금 is correct", {
  # 당비 총합 계산
  sum_dangbi <- sum(income_2022$당비, na.rm = TRUE)
  # 기탁금 총합 계산
  sum_gitakgeum <- sum(income_2022$기탁금, na.rm = TRUE)

  # 예상되는 총합 (여기서는 예시값을 사용합니다. 실제 값으로 대체해야 합니다.)
  expected_sum_dangbi <- 107892 # 예시 값
  expected_sum_gitakgeum <- 337 # 예시 값

  # 계산된 총합과 예상 총합 비교
  expect_equal(sum_dangbi, expected_sum_dangbi)
  expect_equal(sum_gitakgeum, expected_sum_gitakgeum)
})
#> Test passed 🎊

1.1.5 지출내역

단위: 백만원

코드
# R에서 데이터프레임 생성
expense_2022 <- tribble(
  ~구분, ~합계, ~선거비용, ~기본경비, ~정책개발비, ~조직활동비, ~여성정치발전비, ~청년정치발전비, ~그밖의경비,
  "합계", 437321, 121531, 106586, 19626, 133354, 5303, 1801, 49120,
  "더불어민주당", 193485, 55698, 40054, 7443, 47749, 2774, 748, 39019,
  "국민의힘", 179147, 48332, 48838, 9667, 64962, 2034, 843, 4471,
  "정의당", 19666, 4260, 5962, 1252, 5013, 399, 158, 2622,
  "기본소득당", 3884, 1104, 466, 97, 2204, 4, 2, 7,
  "시대전환", 241, 0, 219, 0, 1, 3, 2, 16,
  "기타 정당", 40898, 12137, 11047, 1167, 13425, 89, 48, 2985
) |> 
  slice(2:n())

# 데이터프레임 확인
expense_2022 |> 
  summarise(선거비용 = sum(선거비용)) # 121,531
#> # A tibble: 1 × 1
#>   선거비용
#>      <dbl>
#> 1   121531

# 단위 테스트
test_that("Sum of 선거비용 and 조직활동비 is correct", {
  # 선거비용 총합 계산
  sum_election_expenses <- sum(expense_2022$선거비용, na.rm = TRUE)
  # 조직활동비 총합 계산
  sum_organizational_expenses <- sum(expense_2022$조직활동비, na.rm = TRUE)

  # 예상되는 총합 (여기서는 예시값을 사용합니다. 실제 값으로 대체해야 합니다.)
  expected_sum_election_expenses <- 121531 # 예시 값
  expected_sum_organizational_expenses <- 133354 # 예시 값

  # 계산된 총합과 예상 총합 비교
  expect_equal(sum_election_expenses, expected_sum_election_expenses)
  expect_equal(sum_organizational_expenses, expected_sum_organizational_expenses)
})
#> Test passed 🌈

1.2 2021년

1.2.1 당원수

코드
library(tidyverse)

party_2021 <- tribble(
  ~구분, ~당원수, ~분포비, ~등록된_시도당수, ~시도당_평균당원수,
  "합계", 10429577, 100, 355, 29379,
  "더불어민주당", 4853266, 46.5, 17, 285486,
  "국민의힘", 4070005, 39.0, 17, 239412,
  "정의당", 50618, 0.5, 17, 2978,
  "국민의당", 20185, 0.2, 7, 2884,
  "열린민주당", 42944, 0.4, 5, 8589,
  "기본소득당", 19814, 0.2, 5, 3963,
  "시대전환", 8458, 0.1, 5, 1692,
  "가가례도인연합", 6538, 0.1, 6, 1090,
  "가나코리아", 5365, 0.1, 5, 1073,
  "가자평화인권당", 6481, 0.1, 6, 1080,
  "가자환경당", 7480, 0.1, 6, 1247,
  "거지당", 10782, 0.1, 8, 1348,
  "국가혁명당", 32153, 0.3, 16, 2010,
  "국민대통합당", 6248, 0.1, 5, 1250,
  "국민참여신당", 5773, 0.1, 5, 1155,
  "국민혁명당", 148164, 1.4, 13, 11397,
  "기독당", 5272, 0.1, 5, 1054,
  "깨어있는시민연대당", 6490, 0.1, 5, 1298,
  "남북통일당", 5324, 0.1, 5, 1065,
  "노동당", 11039, 0.1, 7, 1577,
  "녹색당", 8452, 0.1, 5, 1690,
  "대한국민당", 5585, 0.1, 5, 1117,
  "대한당", 5565, 0.1, 5, 1113,
  "대한민국당", 6721, 0.1, 5, 1344,
  "독도한국당", 6631, 0.1, 6, 1105,
  "미래당", 12935, 0.1, 6, 2156,
  "민생당", 378309, 3.6, 11, 34392,
  "민중민주당", 9872, 0.1, 7, 1410,
  "새누리당", 36170, 0.3, 7, 5167,
  "신자유민주연합", 5362, 0.1, 5, 1072,
  "신한반도당", 8872, 0.1, 8, 1109,
  "여성의당", 9571, 0.1, 5, 1914,
  "우리공화당", 411337, 3.9, 13, 31641,
  "자유당", 5368, 0.1, 5, 1074,
  "자유민주당", 7092, 0.1, 5, 1418,
  "자유의새벽당", 11707, 0.1, 5, 2341,
  "중소자영업당", 5823, 0.1, 5, 1165,
  "직능자영업당", 5184, 0.0, 5, 1037,
  "진보당", 85718, 0.8, 16, 5357,
  "친박신당", 8310, 0.1, 6, 1385,
  "친박연대", 5257, 0.1, 5, 1051,
  "통일한국당", 11971, 0.1, 6, 1995,
  "한국국민당", 6879, 0.1, 6, 1147,
  "한국복지당", 7071, 0.1, 7, 1010,
  "한나라당", 5790, 0.1, 5, 1158,
  "한류연합당", 9305, 0.1, 7, 1329,
  "한반도미래연합", 8498, 0.1, 8, 1062,
  "혁명21", 11179, 0.1, 6, 1863,
  "홍익당", 6644, 0.1, 5, 1329
) |> 
  slice(2:n()) 


party_2021 |> 
  summarise(당원수 = sum(당원수)) # 10,429,577
#> # A tibble: 1 × 1
#>     당원수
#>      <dbl>
#> 1 10429577

1.2.2 시도별

코드
library(tibble)

sido_party_2021 <- tribble(
  ~구분, ~합계, ~더불어민주당, ~국민의힘, ~정의당, ~국민의당, ~열린민주당, ~기본소득당, ~시대전환, ~가가례도인연합, ~가나코리아, ~가자평화인권당, ~가자환경당,
  "합계", 10429577, 4853266, 4070005, 50618, 20185, 42944, 19814, 8458, 6538, 5365, 6481, 7480,
  "서울", 1830842, 858016, 633807, 9882, 6847, 24768, 3254, 1290, 1041, 1123, 1042, 1472,
  "부산", 530951, 158779, 245492, 2257, NA, 3996, 4436, NA, NA, NA, 1103, 1414,
  "대구", 340866, 41126, 221321, 1228, 1138, NA, NA, NA, NA, NA, NA, NA,
  "인천", 462086, 180174, 226077, 4661, 1686, NA, 3063, NA, 1103, 1017, NA, NA,
  "광주", 544234, 398357, 56614, 2372, 1814, 5680, 3363, 1051, NA, NA, NA, 1080,
  "대전", 372618, 151895, 191034, 1345, 3099, NA, NA, NA, NA, NA, 1016, NA,
  "울산", 250177, 59315, 159387, 1390, NA, 4009, NA, NA, NA, NA, NA, NA,
  "세종", 39355, 18972, 13300, 1070, NA, NA, NA, NA, NA, NA, NA, NA,
  "경기", 1992315, 915531, 795874, 10394, 3703, NA, 5698, 1400, 1142, 1035, 1106, 1178,
  "강원", 353634, 121301, 211046, 1143, NA, NA, NA, NA, 1081, 1095, NA, NA,
  "충북", 380942, 158913, 188375, 1149, 1898, NA, NA, NA, NA, NA, NA, NA,
  "충남", 514251, 223238, 240892, 1519, NA, NA, NA, NA, 1086, 1095, NA, NA,
  "전북", 832477, 676755, 70693, 3449, NA, NA, NA, 2308, 1085, NA, 1101, NA,
  "전남", 772029, 591321, 54630, 3981, NA, 4491, NA, 2409, NA, NA, NA, 1023,
  "경북", 492060, 44788, 363621, 1361, NA, NA, NA, NA, NA, NA, NA, NA,
  "경남", 531808, 148649, 323319, 2226, NA, NA, NA, NA, NA, NA, 1113, 1313,
  "제주", 188932, 106136, 74523, 1191, NA, NA, NA, NA, NA, NA, NA, NA
) |> 
  slice(2:n())
  
sido_party_2021 |> 
  summarise(합계 = sum(합계))
#> # A tibble: 1 × 1
#>       합계
#>      <dbl>
#> 1 10429577

1.2.3 당비 납부자수

코드
library(tibble)

payer_2021 <- tribble(
  ~정당, ~당원수, ~납부자수, ~당비납부비율, ~등록된_시도당수,
  "합계", 10429577, 2133765, 20.5, 355,
  "더불어민주당", 4853266, 1295909, 26.7, 17,
  "국민의힘", 4070005, 609090, 15.0, 17,
  "정의당", 50618, 26470, 52.3, 17,
  "국민의당", 20185, 4683, 23.2, 7,
  "열린민주당", 42944, 10383, 24.2, 5,
  "기본소득당", 19814, 809, 4.1, 5,
  "시대전환", 8458, 61, 0.7, 5,
  "가가례도인연합", 6538, NA, NA, 6,
  "가나코리아", 5365, 5, 0.1, 5,
  "가자평화인권당", 6481, NA, NA, 6,
  "가자환경당", 7480, NA, NA, 6,
  "거지당", 10782, 301, 2.8, 8,
  "국가혁명당", 32153, 8549, 26.6, 16,
  "국민대통합당", 6248, NA, NA, 5,
  "국민참여신당", 5773, NA, NA, 5,
  "국민혁명당", 148164, 53720, 36.3, 13,
  "기독당", 5272, NA, NA, 5,
  "깨어있는시민연대당", 6490, 35, 0.5, 5,
  "남북통일당", 5324, 216, 4.1, 5,
  "노동당", 11039, 2781, 25.2, 7,
  "녹색당", 8452, 3469, 41.0, 5,
  "대한국민당", 5585, NA, NA, 5,
  "대한당", 5565, NA, NA, 5,
  "대한민국당", 6721, 167, 2.5, 5,
  "독도한국당", 6631, NA, NA, 6,
  "미래당", 12935, 1311, 10.1, 6,
  "민생당", 378309, 9881, 2.6, 11,
  "민중민주당", 9872, 57, 0.6, 7,
  "새누리당", 36170, 844, 2.3, 7,
  "신자유민주연합", 5362, 322, 6.0, 5,
  "신한반도당", 8872, 20, 0.2, 8,
  "여성의당", 9571, 2487, 26.0, 5,
  "우리공화당", 411337, 50287, 12.2, 13,
  "자유당", 5368, 40, 0.7, 5,
  "자유민주당", 7092, 733, 10.3, 5,
  "자유의새벽당", 11707, 2615, 22.3, 5,
  "중소자영업당", 5823, NA, NA, 5,
  "직능자영업당", 5184, NA, NA, 5,
  "진보당", 85718, 46158, 53.8, 16,
  "친박신당", 8310, 241, 2.9, 6,
  "친박연대", 5257, NA, NA, 5,
  "통일한국당", 11971, 94, 0.8, 6,
  "한국국민당", 6879, 106, 1.5, 6,
  "한국복지당", 7071, NA, NA, 7,
  "한나라당", 5790, NA, NA, 5,
  "한류연합당", 9305, 119, 1.3, 7,
  "한반도미래연합", 8498, NA, NA, 8,
  "혁명21", 11179, 1659, 14.8, 6,
  "홍익당", 6644, 143, 2.2, 5
)

payer_2021 |> 
  summarise( 당원수 = sum(당원수))
#> # A tibble: 1 × 1
#>     당원수
#>      <dbl>
#> 1 20859154

1.2.4 수입내역

단위: 백만원

코드
# R에서 데이터프레임 생성
income_2021 <- tribble(
  ~"구분", ~"합계", ~"전년도이월", ~"당비", ~"기탁금", ~"후원회기부금", ~"보조금", ~"차입금", ~"기타",
  "합계", 196317, 63629, 61507, 774, 4375, 46278, 3970, 15784,
  "더불어민주당", 89396, 36400, 28402, 348, 350, 21060, 0, 2836,
  "국민의힘", 57990, 15222, 12030, 305, 1352, 18500, 0, 10581,
  "정의당", 12293, 2629, 3807, 51, 896, 3075, 1322, 513,
  "국민의당", 2774, 547, 443, 22, 67, 1364, 0, 331,
  "열린민주당", 3090, 731, 835, 21, 100, 1294, 0, 109,
  "기본소득당", 1099, 25, 925, 0.5, 15, 32, 0, 101,
  "시대전환", 263, 29, 84, 0.5, 32, 28, 0, 90,
  "기타정당", 29412, 8046, 14981, 26, 1563, 925, 2648, 1223
)

# 데이터프레임 확인
income_2021 |> 
  summarise(당비 = sum(당비))
#> # A tibble: 1 × 1
#>     당비
#>    <dbl>
#> 1 123014

1.2.5 지출내역

단위: 백만원

코드
# R에서 데이터프레임 생성
expense_2021 <- tribble(
  ~"구분", ~"합계", ~"선거비용", ~"기본경비", ~"정책개발비", ~"조직활동비", ~"여성정치발전비", ~"그밖의경비",
  "합계", 137932, 549, 65988, 17203, 44927, 4930, 4333,
  "더불어민주당", 55624, 0, 24578, 5354, 23348, 2136, 208,
  "국민의힘", 44224, 0, 20789, 9175, 9817, 1952, 2491,
  "정의당", 10511, 260, 6478, 1175, 1602, 367, 629,
  "국민의당", 2222, 0, 848, 485, 577, 195, 117,
  "열린민주당", 1518, 0, 912, 94, 351, 150, 11,
  "기본소득당", 873, 229, 427, 76, 136, 4, 1,
  "시대전환", 243, 0, 223, 4, 8, 4, 4,
  "기타정당", 22717, 60, 11733, 841, 9088, 122, 873
)

# 데이터프레임 확인
expense_2021 |> 
  summarise(선거비용 = sum(선거비용))
#> # A tibble: 1 × 1
#>   선거비용
#>      <dbl>
#> 1     1098

1.3 2020년

1.3.1 시도별

코드
# R에서 데이터프레임 생성
sido_party_2020 <- data.frame(
  구분 = c("합계", "서울", "부산", "대구", "인천", "광주", "대전", "울산", "세종", "경기", "강원", "충북", "충남", "전북", "전남", "경북", "경남", "제주"),
  더불어민주당 = c(4053466, 732483, 148679, 38874, 148971, 334034, 122231, 49331, 15889, 764856, 91291, 135103, 168409, 578593, 478573, 41698, 131459, 72992),
  국민의힘 = c(3489924, 552794, 218624, 196849, 197176, 51999, 170297, 147025, 10539, 670052, 168159, 155963, 183772, 65861, 50544, 304372, 280395, 65503),
  정의당 = c(53080, 11190, 2311, 1265, 4968, 2369, 1434, 1498, 1094, 10370, 1186, 1234, 1529, 3563, 4030, 1479, 2362, 1198),
  국민의당 = c(16023, 4721, NA, 1030, 1606, 1746, 2805, NA, NA, 2393, NA, 1722, NA, NA, NA, NA, NA, NA),
  열린민주당 = c(40456, 23431, 3731, NA, NA, 5202, NA, 3834, NA, NA, NA, NA, NA, NA, 4258, NA, NA, NA),
  기본소득당 = c(19879, 3281, 4457, NA, 3616, 3050, NA, NA, NA, 5475, NA, NA, NA, NA, NA, NA, NA, NA),
  시대전환 = c(6945, 1771, NA, NA, NA, 1051, NA, NA, NA, 1210, NA, NA, NA, 1121, 1792, NA, NA, NA),
  가나코리아 = c(5365, 1123, NA, NA, 1017, NA, NA, NA, NA, 1035, 1095, NA, 1095, NA, NA, NA, NA, NA),
  가자평화 = c(6707, 1026, 1026, NA, NA, NA, 1016, NA, NA, 1106, NA, NA, NA, 1101, NA, NA, 1432, NA),
  인권당 = c(7487, 1471, 1415, NA, NA, 1080, NA, NA, NA, 1178, NA, NA, NA, NA, 1030, NA, 1313, NA)
) |> 
  slice(2:n()) |> 
  as_tibble()

# 데이터프레임 확인
sido_party_2020 |> 
  as_tibble() |> 
  summarise(민주당 = sum(더불어민주당))
#> # A tibble: 1 × 1
#>    민주당
#>     <dbl>
#> 1 4053466

1.3.2 당비 납부자수

코드
# R에서 데이터프레임 생성
payer_2020 <- data.frame(
  정당 = c("합계", "더불어민주당", "국민의힘", "정의당", "국민의당", "열린민주당", "기본소득당", "시대전환", "가나코리아", "가자!평화인권당", "가자환경당", "거지당", "국가혁명당", "국민새정당", "국민참여신당"),
  당원수 = c(8771263, 4053466, 3489924, 53080, 16023, 40456, 19879, 6945, 5365, 6707, 7487, 9505, 29757, 9032, 5773),
  납부자수 = c(1433446, 896296, 347322, 39872, 3369, 12098, 1435, 77, 10, NA, 2, NA, 5889, NA, NA),
  당비납부비율 = c(16.3, 22.1, 10.0, 75.1, 21.0, 29.9, 7.2, 1.1, 0.2, NA, NA, NA, 19.8, NA, NA),
  등록된시도당수 = c(332, 17, 17, 17, 7, 5, 5, 5, 5, 6, 6, 8, 17, 8, 5)
) |> 
  slice(2:n()) |> 
  as_tibble()

# 데이터프레임 확인
payer_2020 |> 
  summarise(당원수 = sum(당원수))
#> # A tibble: 1 × 1
#>    당원수
#>     <dbl>
#> 1 7753399

1.3.3 수입내역

코드
# R에서 데이터프레임 생성
income_2020 <- tribble(
  ~"구분", ~"합계", ~"전년도이월", ~"당비", ~"기탁금", ~"후원회기부금", ~"보조금", ~"차입금", ~"기타",
  "합계", 311220, 45278, 67895, 962, 6095, 90718, 60154, 40118,
  "더불어민주당", 95045, 20643, 31211, 305, 403, 32706, 1840, 7937,
  "국민의힘", 120989, 11301, 13383, 350, 541, 36115, 43897, 15402,
  "정의당", 22597, 2084, 5156, 60, 1723, 5679, 2070, 5825,
  "국민의당", 9045, 0, 242, 0, 60, 1017, 3482, 4244,
  "열린민주당", 10245, 0, 881, 0, 505, 968, 4234, 3657,
  "기본소득당", 633, 18, 392, 0, 55, 16, 48, 104,
  "시대전환", 220, 6, 65, 0, 25, 15, 50, 59,
  "기타정당", 52446, 11226, 16565, 247, 2783, 14202, 4533, 2890
) |> 
  as_tibble()

# 데이터프레임 확인
income_2020 |> 
  summarise(당비 = sum(당비))
#> # A tibble: 1 × 1
#>     당비
#>    <dbl>
#> 1 135790

1.3.4 지출내역

코드
# 추가로 만들어야 하는 데이터프레임
expense_2020 <- tribble(
  ~"구분", ~"합계", ~"선거비용", ~"기본경비", ~"정책개발비", ~"조직활동비", ~"여성정치발전비", ~"그밖의경비",
  "합계", 248036, 31066, 115856, 14449, 58610, 5235, 22820,
  "더불어민주당", 58549, 4058, 21682, 4274, 22438, 1891, 4206,
  "국민의힘", 104155, 4844, 69579, 6410, 14364, 1877, 7081,
  "정의당", 21042, 4709, 7384, 1180, 6345, 340, 1084,
  "국민의당", 8512, 3911, 1022, 130, 415, 115, 2919,
  "열린민주당", 9517, 3544, 685, 53, 603, 96, 4536,
  "기본소득당", 633, 53, 341, 53, 165, 1, 20,
  "시대전환", 197, 0, 121, 71, 2, 0, 3,
  "기타정당", 45431, 9947, 15042, 2278, 14278, 915, 2971
)

# 데이터프레임 확인
expense_2020 |> 
  summarise(선거비용 = sum(선거비용))
#> # A tibble: 1 × 1
#>   선거비용
#>      <dbl>
#> 1    62132

1.4 2019년

1.4.1 시도별

코드
library(readxl)

sido_party_2019 <- read_excel("data/2019.xlsx", sheet="page01")

sido_party_2019 <- sido_party_2019 |> 
  filter(구분 != "합계")

sido_party_2019 |> 
  summarise(당원수 = sum(합계))
#> # A tibble: 1 × 1
#>    당원수
#>     <dbl>
#> 1 8657559

1.4.2 당비 납부자수

코드
payer_2019 <- read_excel("data/2019.xlsx", sheet="page02")

payer_2019 <- payer_2019 |> 
  filter(정당 != "합계") |> 
  mutate(납부자수 = parse_number(납부자수))

payer_2019 |> 
  summarise(당원수 = sum(당원수))
#> # A tibble: 1 × 1
#>    당원수
#>     <dbl>
#> 1 8657559

1.4.3 수입내역

코드
income_2019 <- read_excel("data/2019.xlsx", sheet="page03")

income_2019 <- income_2019 |> 
  filter(구분 != "합계")

income_2019 |> 
  summarise(당비 = sum(당비))
#> # A tibble: 1 × 1
#>    당비
#>   <dbl>
#> 1 44581

1.4.4 지출내역

코드
expense_2019 <- read_excel("data/2019.xlsx", sheet="page04")

expense_2019 <- expense_2019 |> 
  filter(구분 != "합계")

expense_2019 |> 
  summarise(합계 = sum(합계))
#> # A tibble: 1 × 1
#>     합계
#>    <dbl>
#> 1 113009

1.5 2018년

1.5.1 시도별

코드
library(readxl)

sido_party_2018 <- read_excel("data/2018.xlsx", sheet="page01")

sido_party_2018 <- sido_party_2018 |> 
  filter(구분 != "합계")

sido_party_2018 |> 
  summarise(당원수 = sum(합계))
#> # A tibble: 1 × 1
#>    당원수
#>     <dbl>
#> 1 7825929

1.5.2 당비 납부자수

코드
payer_2018 <- read_excel("data/2018.xlsx", sheet="page02")

payer_2018 <- payer_2018 |> 
  filter(정당 != "합계") |> 
  mutate(납부자수 = parse_number(납부자수))

payer_2018 |> 
  summarise(당원수 = sum(당원수))
#> # A tibble: 1 × 1
#>    당원수
#>     <dbl>
#> 1 7825929

1.5.3 수입내역

코드
income_2018 <- read_excel("data/2018.xlsx", sheet="page03")

income_2018 <- income_2018 |> 
  filter(구분 != "합계")

income_2018 |> 
  summarise(당비 = sum(당비))
#> # A tibble: 1 × 1
#>    당비
#>   <dbl>
#> 1 71631

1.5.4 지출내역

코드
expense_2018 <- read_excel("data/2018.xlsx", sheet="page04")

expense_2018 <- expense_2018 |> 
  filter(구분 != "합계")

expense_2018 |> 
  summarise(합계 = sum(합계))
#> # A tibble: 1 × 1
#>     합계
#>    <dbl>
#> 1 194196

1.6 2017년

1.6.1 시도별

코드

# tribble 함수를 이용해 DataFrame 생성
sido_party_2017 <- tribble(
  ~구분, ~합계, ~더불어민주당, ~자유한국당, ~국민의당, ~바른정당, ~정의당, ~민중당, ~대한애국당, ~가자코리아, ~경제애국당, ~공화당,
  "합계", 7507952, 3568111, 3227708, 285023, 67053, 40362, 46539, 41685, 5288, 6779, 6568,
  "서울", 1283838, 640138, 511970, 39119, 10777, 8224, 4684, 10272, 1114, 1185, 1034,
  "부산", 360443, 135736, 190581, 8890, 2673, 1895, 2955, 2597, 1030, NA, NA,
  "대구", 245098, 32984, 179375, 4147, 4557, 1796, 1120, 6200, 1059, NA, NA,
  "인천", 361923, 135400, 188407, 6430, 3310, 2937, 1595, 2262, 1011, NA, NA,
  "광주", 407488, 300064, 51398, 38655, 1419, 1443, 7131, 1090, NA, NA, NA,
  "대전", 297531, 106025, 167572, 6366, 1451, 1928, 2206, 1920, 1072, NA, NA,
  "울산", 183212, 34606, 135216, 2181, 2389, 1385, 3289, 1082, NA, NA, NA,
  "세종", 24495, 13104, 9306, 1008, NA, NA, NA, NA, NA, NA, NA,
  "경기", 1353048, 628929, 620356, 31616, 15947, 7171, 7839, 8970, 1031, 1159, 1069,
  "강원", 264107, 80527, 162328, 7696, 1679, 1248, 1172, 1924, 1039, NA, NA,
  "충북", 283900, 121696, 145490, 6021, 1358, 1003, 1106, 1293, NA, NA, NA,
  "충남", 351195, 148353, 177742, 8025, 1922, 1115, 1554, 1412, 1093, NA, NA,
  "전북", 674426, 545688, 63866, 48931, 1773, 2585, 2155, 1070, NA, NA, NA,
  "전남", 561645, 427648, 50169, 66262, 1208, 3364, 6111, NA, NA, NA, NA,
  "경북", 323115, 33684, 257338, 4417, 9145, 1920, 1575, 2248, 1180, NA, NA,
  "경남", 391553, 115964, 251957, 4199, 5208, 1527, 1795, 1795, NA, NA, NA,
  "제주", 140935, 67565, 64637, 2068, 2587, 1824, NA, NA, NA, NA, NA
) |> 
  filter(구분 != "합계")

# DataFrame 확인
sido_party_2017 |> 
  summarise(합계 = sum(합계))
#> # A tibble: 1 × 1
#>      합계
#>     <dbl>
#> 1 7507952

1.6.2 당비 납부자수

코드
# tribble 함수를 사용하여 데이터 프레임을 생성한다
payer_2017 <- tribble(
  ~"정당", ~"당원수", ~"납부자수", ~"당비납부", ~"비율(%)", ~"등록된시·도당수",
  "합계", 7507952, 1320976, NA, 17.6, 285,
  "더불어민주당", 3568111, 834573, NA, 23.4, 17,
  "자유한국당", 3227708, 335000, NA, 10.4, 17,
  "국민의당", 285023, 44371, NA, 15.6, 16,
  "바른정당", 67053, 29712, NA, 44.3, 16,
  "정의당", 40362, 25687, NA, 63.6, 15,
  "민중당", 46539, 25960, NA, 55.8, 15,
  "대한애국당", 41685, 9579, NA, 23.0, 12,
  "가자코리아", 5288, NA, NA, NA, 5,
  "경제애국당", 6779, 6, NA, 0.1, 6,
  "공화당", 6568, NA, NA, NA, 6,
  "국민대통합당", 7161, NA, NA, NA, 6,
  "국민새정당", 8983, NA, NA, NA, 8,
  "국민행복당", 5253, 125, NA, 2.4, 5,
  "국제녹색당", 12019, NA, NA, NA, 11,
  "그린불교연합당", 5411, NA, NA, NA, 5,
  "기독당", 6442, NA, NA, NA, 5,
  "기독자유당", 9206, 2, NA, NA, 8,
  "노동당", 11823, 4784, NA, 40.5, 7,
  "녹색당", 9308, 5725, NA, 61.5, 5,
  "늘푸른한국당", 20863, 262, NA, 1.3, 17,
  "대한민국당", 6360, 134, NA, 2.1, 5,
  "민중민주당", 6461, 19, NA, 0.3, 5,
  "사회민주당", 4653, 38, NA, 0.8, 5,
  "새누리당", 30603, 3784, NA, 12.4, 7,
  "우리미래", 6269, 993, NA, 15.8, 5,
  "인권정당", 6537, NA, NA, NA, 6,
  "진리대한당", 5458, NA, NA, NA, 5,
  "친박연대", 5257, NA, NA, NA, 5,
  "통일한국당", 5787, 20, NA, 0.3, 5,
  "통합민주당", 5262, NA, NA, NA, 5,
  "한국국민당", 6832, 106, NA, 1.6, 6,
  "한나라당", 5789, NA, NA, NA, 5,
  "한누리평화통일당", 7064, NA, NA, NA, 7,
  "한반도미래연합", 7392, NA, NA, NA, 7,
  "홍익당", 6643, 96, NA, 1.4, 5
) |> 
  filter(정당 != "합계")

payer_2017 |> 
  summarise(당원수 = sum(당원수))
#> # A tibble: 1 × 1
#>    당원수
#>     <dbl>
#> 1 7507952

1.6.3 수입내역

코드
# tibble 패키지 로드
library(tibble)

# tribble 함수를 이용해 DataFrame 생성
income_2017 <- tribble(
  ~`구분`, ~`합계`, ~`전년도이월`, ~`당비`, ~`기탁금`, ~`후원회기부금`, ~`보조금`, ~`차입금`, ~`기타`,
  "합 계", 399421, 39181, 46017, 4479, 4859, 84276, 88290, 132319,
  "더 불 어 민 주 당", 139442, 8239, 14040, 1444, 330, 24965, 40887, 49537,
  "자 유 한 국 당", 124191, 25005, 12191, 1413, 294, 24583, 25143, 35562, 
  "국 민 의 당", 90282, 4620, 2097, 1342, 4, 17678, 19570, 44971,
  "바 른 정 당", 16108, 32, 3273, 5, 903, 11483, 12, 400,
  "정 의 당", 13652, 669, 4059, 275, 1446, 5492, 656, 1055,
  "민 중 당", 5158, 125, 3160, 0, 790, 28, 595, 460,
  "대 한 애 국 당", 945, 0, 521, 0, 400, 7, 2, 15,
  "기 타 정 당", 9643, 491, 6676, 0, 692, 40, 1425, 319
) |> 
  mutate(구분 = str_remove_all(구분, "\\s")) |> 
  filter(구분 != "합계")

# DataFrame 확인
income_2017
#> # A tibble: 8 × 9
#>   구분           합계 전년도이월  당비 기탁금 후원회기부금 보조금 차입금  기타
#>   <chr>         <dbl>      <dbl> <dbl>  <dbl>        <dbl>  <dbl>  <dbl> <dbl>
#> 1 더불어민주당 139442       8239 14040   1444          330  24965  40887 49537
#> 2 자유한국당   124191      25005 12191   1413          294  24583  25143 35562
#> 3 국민의당      90282       4620  2097   1342            4  17678  19570 44971
#> 4 바른정당      16108         32  3273      5          903  11483     12   400
#> 5 정의당        13652        669  4059    275         1446   5492    656  1055
#> 6 민중당         5158        125  3160      0          790     28    595   460
#> 7 대한애국당      945          0   521      0          400      7      2    15
#> 8 기타정당       9643        491  6676      0          692     40   1425   319

1.6.4 지출내역

코드
# tribble 함수를 이용해 DataFrame 생성
expense_2017 <- tribble(
  ~`구분`, ~`합계`, ~`선거비용`, ~`기본경비`, ~`정책개발비`, ~`조직활동비`, ~`여성정치발전비`, ~`그밖의경비`,
  "합 계", 366341, 133900, 76293, 16992, 42509, 4727, 91920,
  "더 불 어 민 주 당", 132145, 46114, 24973, 4254, 15288, 1287, 40229,
  "자 유 한 국 당", 109761, 32835, 27333, 8371, 11042, 1706, 28474,
  "국 민 의 당", 83101, 41915, 9343, 2907, 7869, 918, 20149,
  "바 른 정 당", 13437, 4774, 5121, 336, 2543, 536, 127,
  "정 의 당", 12866, 3532, 5318, 1046, 1620, 274, 1076,
  "민 중 당", 5016, 909, 1694, 18, 1624, 4, 767,
  "대 한 애 국 당", 873, 0, 276, 0, 595, 0, 2,
  "기 타 정 당", 9142, 3821, 2235, 60, 1928, 2, 1096
) |> 
  mutate(구분 = str_remove_all(구분, "\\s")) |> 
  filter(구분 != "합계")

# DataFrame 확인
expense_2017
#> # A tibble: 8 × 8
#>   구분    합계 선거비용 기본경비 정책개발비 조직활동비 여성정치발전비 그밖의경비
#>   <chr>  <dbl>    <dbl>    <dbl>      <dbl>      <dbl>          <dbl>      <dbl>
#> 1 더불… 132145    46114    24973       4254      15288           1287      40229
#> 2 자유… 109761    32835    27333       8371      11042           1706      28474
#> 3 국민…  83101    41915     9343       2907       7869            918      20149
#> 4 바른…  13437     4774     5121        336       2543            536        127
#> 5 정의…  12866     3532     5318       1046       1620            274       1076
#> 6 민중…   5016      909     1694         18       1624              4        767
#> 7 대한…    873        0      276          0        595              0          2
#> 8 기타…   9142     3821     2235         60       1928              2       1096

1.7 2016년

1.7.1 시도별

코드
library(readxl)

sido_party_2016 <- read_excel("data/2016.xlsx", sheet="page01")

sido_party_2016 <- sido_party_2016 |> 
  filter(구분 != "합계")

sido_party_2016 |> 
  summarise(당원수 = sum(합계))
#> # A tibble: 1 × 1
#>    당원수
#>     <dbl>
#> 1 6101987

1.7.2 당비 납부자수

코드
payer_2016 <- read_excel("data/2016.xlsx", sheet="page02")

payer_2016 <- payer_2016 |> 
  filter(정당 != "합계")

payer_2016 |> 
  summarise(당원수 = sum(당원수))
#> # A tibble: 1 × 1
#>    당원수
#>     <dbl>
#> 1 6101987

1.7.3 수입내역

코드
income_2016 <- read_excel("data/2016.xlsx", sheet="page03")

income_2016 <- income_2016 |> 
  filter(구분 != "합계")

income_2016 |> 
  summarise(당비 = sum(당비))
#> # A tibble: 1 × 1
#>    당비
#>   <dbl>
#> 1 42068

1.7.4 지출내역

코드
expense_2016 <- read_excel("data/2016.xlsx", sheet="page04")

expense_2016 <- expense_2016 |> 
  filter(구분 != "합계")

expense_2016 |> 
  summarise(합계 = sum(합계))
#> # A tibble: 1 × 1
#>     합계
#>    <dbl>
#> 1 175825

1.8 2015년

1.8.1 시도별

코드
library(readxl)

sido_party_2015 <- read_excel("data/2015.xlsx", sheet="page01")

sido_party_2015 <- sido_party_2015 |> 
  filter(구분 != "합계")

sido_party_2015 |> 
  summarise(당원수 = sum(합계))
#> # A tibble: 1 × 1
#>    당원수
#>     <dbl>
#> 1 5837061

1.8.2 당비 납부자수

코드
payer_2015 <- read_excel("data/2015.xlsx", sheet="page02")

payer_2015 <- payer_2015 |> 
  filter(정당 != "합계")

payer_2015 |> 
  summarise(당원수 = sum(당원수))
#> # A tibble: 1 × 1
#>    당원수
#>     <dbl>
#> 1 5743354

1.8.3 수입내역

코드
income_2015 <- read_excel("data/2015.xlsx", sheet="page03")

income_2015 <- income_2015 |> 
  filter(구분 != "합계")

income_2015 |> 
  summarise(당비 = sum(당비))
#> # A tibble: 1 × 1
#>    당비
#>   <dbl>
#> 1 22154

1.8.4 지출내역

코드
expense_2015 <- read_excel("data/2015.xlsx", sheet="page04")

expense_2015 <- expense_2015 |> 
  filter(구분 != "합계")

expense_2015 |> 
  summarise(합계 = sum(합계))
#> # A tibble: 1 × 1
#>    합계
#>   <dbl>
#> 1 82361

1.9 2014년

1.9.1 시도별

코드
# tibble 패키지 로드
library(tibble)

# tribble 함수로 DataFrame 생성
sido_party_2014 <- tribble(
  ~`구분`, ~`합계`, ~`새누리당`, ~`새정치 민주연합`, ~`정의당`, ~`겨레자유`, ~`평화통일당 경제민주당`, ~`공화당`, ~`국제녹색당`,
  "합계", 5245611, 2708085, 2430111, 18184, 5340, 6121, 6661, 11993,
  "서울", 854469, 440230, 392397, 2870, 1073, 1119, 1031, 1080,
  "부산", 261053, 155380, 100032, 1152, 0, 0, 1130, 1084,
  "대구", 142209, 116729, 22132, 1274, 0, 0, 0, 0,
  "인천", 264772, 164672, 88937, 1483, 1050, 1039, 0, 1198,
  "광주", 290523, 50746, 236369, 0, 0, 0, 0, 1079,
  "대전", 235967, 152724, 75706, 1105, 0, 1014, 1072, 0,
  "울산", 128820, 112527, 14198, 1073, 0, 0, 0, 0,
  "세종", 15216, 8942, 6274, 0, 0, 0, 0, 0,
  "경기", 945114, 543051, 383963, 2756, 1031, 1489, 1068, 1062,
  "강원", 189618, 136025, 47140, 1078, 1093, 0, 0, 1050,
  "충북", 203365, 118325, 81530, 0, 0, 0, 1290, 1030,
  "충남", 224028, 150430, 68173, 0, 1093, 0, 0, 1030,
  "전북", 506132, 59028, 442007, 1554, 0, 0, 1070, 1190,
  "전남", 405205, 45805, 354887, 1224, 0, 0, 0, 1092,
  "경북", 214150, 184736, 23390, 1365, 0, 1460, 0, 1098,
  "경남", 259914, 200703, 57202, 0, 0, 0, 0, 0,
  "제주", 105056, 68032, 35774, 1250, 0, 0, 0, 0
) |> 
  filter(구분 != "합계")

# DataFrame 확인
sido_party_2014 |> 
  summarise(합계 = sum(합계))
#> # A tibble: 1 × 1
#>      합계
#>     <dbl>
#> 1 5245611

1.9.2 당비 납부자수

코드
# tribble 함수를 사용하여 데이터 프레임을 생성한다
payer_2014 <- tribble(
  ~"정당", ~"당원수", ~"납부자수", ~"비율(%)", ~"시·도당수",
  "합계", 5245611, 591045, 11.2, 120,
  "새누리당", 2708085, 253552, 9.4, 17,
  "새정치민주연합", 2430111, 316836, 13.0, 17,
  "정의당", 18184, 9921, 54.6, 12,
  "겨레자유평화통일당", 5340, 0, NA, 5,
  "경제민주당", 6121, 0, NA, 5,
  "공화당", 6661, 35, 0.5, 6,
  "국제녹색당", 11993, 0, NA, 11,
  "그린불교연합당", 5155, 0, NA, 5,
  "기독민주당", 5300, 6, 0.1, 5,
  "노동당", 13015, 6552, 50.3, 7,
  "녹색당", 6870, 4122, 60.0, 5,
  "대한민국당", 6029, 0, NA, 5,
  "민주당", 6225, 16, 0.3, 5,
  "새마을당", 5549, 0, NA, 5,
  "새정치국민의당", 5207, 5, 0.1, 5,
  "한나라당", 5766, 0, NA, 5
) |> 
  filter(정당 != "합계")

payer_2014 |> 
  summarise(당원수 = sum(당원수))
#> # A tibble: 1 × 1
#>    당원수
#>     <dbl>
#> 1 5245611

1.9.3 수입내역

코드
# tibble 패키지 로드
library(tibble)

# tribble 함수로 DataFrame 생성
income_2014 <- tribble(
  ~`구분`, ~`합계`, ~`전년도이월`, ~`당비`, ~`기탁금`, ~`보조금`, ~`차입금`, ~`기타`,
  "합계", 201388, 20935, 52086, 9907, 74343, 1186, 42931,
  "새누리당", 97608, 8449, 26404, 4871, 36355, 220, 21309,
  "새정치민주연합", 91737, 11392, 21284, 4466, 33831, 256, 20508,
  "정의당", 8259, 560, 1647, 570, 4157, 514, 811,
  "기타정당", 3784, 534, 2751, NA, NA, 196, 303
) |> 
  filter(구분 != "합계")

# DataFrame 확인
income_2014 |> 
  summarise(합계 = sum(합계))
#> # A tibble: 1 × 1
#>     합계
#>    <dbl>
#> 1 201388

1.9.4 지출내역

코드

expense_2014 <- tribble(
  ~`구분`, ~`합계`, ~`선거비용`, ~`기본경비`, ~`정책개발비`, ~`조직활동비`, ~`여성정치발전비`, ~`그밖의경비`,
  "합계", 159263, 16152, 44310, 14208, 69070, 3693, 11830,
  "새누리당", 77691, 7373, 21257, 9292, 30536, 1832, 7401,
  "새정치민주연합", 70591, 7963, 18955, 4101, 34372, 1646, 3554,
  "정의당", 7592, 422, 2689, 793, 2778, 215, 695,
  "기타정당", 3389, 394, 1409, 22, 1384, NA, 180
) |> 
  filter(구분 != "합계")

expense_2014 |> 
  summarise(합계 = sum(합계))
#> # A tibble: 1 × 1
#>     합계
#>    <dbl>
#> 1 159263

1.10 데이터 정제

1.10.1 시도별 당원수

코드
object_list <- ls()

party_members <- object_list[str_detect(object_list, pattern = "^sido_party_\\d{4}")]

party_members_list <- mget(party_members)

party_members_sido_tbl <- party_members_list |> 
  enframe() |> 
  mutate(year = parse_number(name)) |> 
  mutate(data = map(value, select, 1:4)) |> 
  unnest(data) |> 
  pivot_longer(새누리당:국민의힘, names_to = "정당", values_to = "당원수") |> 
  select(year, 구분, 합계, 정당, 당원수) |>
  mutate(정당명 = case_when(
    str_detect(정당, "국민의힘|새누리당|자유한국당") ~ "국민의힘",
    str_detect(정당, "더불어민주당|민주당|(새정치 민주연합)") ~ "민주당",
    TRUE ~ "기타정당"
  )) |> 
  filter(!is.na(당원수)) |> 
  arrange(desc(year)) |> 
  select(year, 구분, 합계, 정당명, 당원수)

1.10.2 당비 납입당원

코드

payers <- object_list[str_detect(object_list, pattern = "^payer_\\d{4}")]

payers_list <- mget(payers)

payers_members_tbl <- payers_list |> 
  enframe() |> 
  mutate(data = map(value, select, 1:3)) |> 
  unnest(data) |> 
  mutate(연도 = parse_number(name)) |> 
  mutate(정당명 = case_when(
    str_detect(정당, "국민의힘|새누리당|자유한국당") ~ "국민의힘",
    str_detect(정당, "더불어민주당|(새정치민주연합)") ~ "민주당",
    TRUE ~ "기타정당"
  )) |>
  filter(정당명 != "기타정당",
         납부자수 > 10000) |> 
  select(연도, 당원수, 정당명, 납부자수)

payers_members_tbl
#> # A tibble: 18 × 4
#>     연도  당원수 정당명   납부자수
#>    <dbl>   <dbl> <chr>       <dbl>
#>  1  2014 2708085 국민의힘   253552
#>  2  2014 2430111 민주당     316836
#>  3  2015 3020776 국민의힘   378463
#>  4  2015 2671954 민주당     256197
#>  5  2016 2705938 민주당     287114
#>  6  2016 2991365 국민의힘   329952
#>  7  2017 3568111 민주당     834573
#>  8  2017 3227708 국민의힘   335000
#>  9  2018 3579111 민주당     878114
#> 10  2018 3340979 국민의힘   430736
#> 11  2019 4065408 민주당    1026804
#> 12  2019 3475372 국민의힘   373342
#> 13  2020 4053466 민주당     896296
#> 14  2020 3489924 국민의힘   347322
#> 15  2021 4853266 민주당    1295909
#> 16  2021 4070005 국민의힘   609090
#> 17  2022 4849578 민주당    1402809
#> 18  2022 4298593 국민의힘   897336

1.10.3 수입내역

코드

income <- object_list[str_detect(object_list, pattern = "^income_\\d{4}")]

income_list <- mget(income)

income_party_tbl <- income_list |> 
  enframe() |> 
  mutate(data = map(value, select, c(구분, 합계, 당비, 기탁금, 보조금, 차입금))) |>  
  unnest(data) |> 
  mutate(연도 = parse_number(name)) |> 
  mutate(정당명 = case_when(
    str_detect(구분, "국민의힘|새누리당|자유한국당") ~ "국민의힘",
    str_detect(구분, "더불어민주당|(새정치민주연합)") ~ "민주당",
    TRUE ~ "기타정당"
  )) |>
  filter(정당명 != "기타정당",
         당비 > 5000) |> 
  select(연도, 정당명, 합계, 당비, 기탁금, 보조금, 차입금)

income_party_tbl
#> # A tibble: 18 × 7
#>     연도 정당명     합계  당비 기탁금 보조금 차입금
#>    <dbl> <chr>     <dbl> <dbl>  <dbl>  <dbl>  <dbl>
#>  1  2014 국민의힘  97608 26404   4871  36355    220
#>  2  2014 민주당    91737 21284   4466  33831    256
#>  3  2015 국민의힘  56108 11494   2198  19570      0
#>  4  2015 민주당    47523  6125   1999  17747      0
#>  5  2016 민주당    76835 11793   2482  29225  15000
#>  6  2016 국민의힘  86286 17553   2805  33118      0
#>  7  2017 민주당   139442 14040   1444  24965  40887
#>  8  2017 국민의힘 124191 12191   1413  24583  25143
#>  9  2018 민주당    93243 37614   1269  29669   2028
#> 10  2018 국민의힘  82894 14969   1293  27415   4854
#> 11  2019 민주당    58981 19933    647  13822      0
#> 12  2019 국민의힘  47916  9869    642  13593    500
#> 13  2020 민주당    95045 31211    305  32706   1840
#> 14  2020 국민의힘 120989 13383    350  36115  43897
#> 15  2021 민주당    89396 28402    348  21060      0
#> 16  2021 국민의힘  57990 12030    305  18500      0
#> 17  2022 민주당   262553 52588    164  68463  34988
#> 18  2022 국민의힘 215350 29031    141  60287  30951

1.10.4 지출내역

코드

expense <- object_list[str_detect(object_list, pattern = "^expense_\\d{4}")]

expense_list <- mget(expense)

expense_party_tbl <- expense_list |> 
  enframe() |> 
  mutate(data = map(value, select, c(구분, 합계, 선거비용, 기본경비, 정책개발비, 조직활동비))) |>  
  unnest(data) |> 
  mutate(연도 = parse_number(name)) |> 
  mutate(정당명 = case_when(
    str_detect(구분, "국민의힘|새누리당|자유한국당") ~ "국민의힘",
    str_detect(구분, "더불어민주당|(새정치민주연합)") ~ "민주당",
    TRUE ~ "기타정당"
  )) |>
  filter(정당명 != "기타정당") |>
  select(연도, 정당명, 합계, 선거비용, 기본경비, 정책개발비, 조직활동비) 

expense_party_tbl
#> # A tibble: 18 × 7
#>     연도 정당명     합계 선거비용 기본경비 정책개발비 조직활동비
#>    <dbl> <chr>     <dbl>    <dbl>    <dbl>      <dbl>      <dbl>
#>  1  2014 국민의힘  77691     7373    21257       9292      30536
#>  2  2014 민주당    70591     7963    18955       4101      34372
#>  3  2015 국민의힘  39564        0    18903       8332       6662
#>  4  2015 민주당    33818      110    17273       4179      10102
#>  5  2016 민주당    68294     4588    37645       3223      20197
#>  6  2016 국민의힘  61772     4705    19855       8631      22875
#>  7  2017 민주당   132145    46114    24973       4254      15288
#>  8  2017 국민의힘 109761    32835    27333       8371      11042
#>  9  2018 민주당    70685     8840    22146       3768      29149
#> 10  2018 국민의힘  59805     7060    20458       6514      13521
#> 11  2019 민주당    38308        0    20317       3420      12599
#> 12  2019 국민의힘  36202        0    15981       6744       8673
#> 13  2020 민주당    58549     4058    21682       4274      22438
#> 14  2020 국민의힘 104155     4844    69579       6410      14364
#> 15  2021 민주당    55624        0    24578       5354      23348
#> 16  2021 국민의힘  44224        0    20789       9175       9817
#> 17  2022 민주당   193485    55698    40054       7443      47749
#> 18  2022 국민의힘 179147    48332    48838       9667      64962

2 분석

2.1 양당 당원

코드
library(ggrepel)


label_man <- function() {
  function(x) {
    paste0(scales::comma(x / 10000), "만")
  }
}


party_members_g <- party_members_sido_tbl |> 
  group_by(year, 정당명) |> 
  summarise(당원수 = sum(당원수)) |>
  ggplot(aes(x = year, y = 당원수, color = 정당명, group = 정당명)) +
    geom_point(size = 3) +
    geom_line() +
    theme_korean() +
    theme(legend.position = "top") +
    labs(x = "",
         y = "당원수",
         title = "양당 당원수 추세",
         caption = "출처: 중앙선관위 '정당의 활동개황 및 회계보고'") +
    scale_y_continuous(labels = label_man()) +
    scale_color_manual(values = c("국민의힘" = "red",
                                  "민주당" = "blue")) +
  geom_text_repel(aes(label = glue::glue("{scales::comma(당원수 / 10000, accuracy=1)}만"), show.legend = FALSE),
                    size = 4.5) 
party_members_g

코드

ggsave( glue::glue("images/당원수_양당.jpeg") , 
        party_members_g,
        device = ragg::agg_jpeg(), 
        width = 297, height = 210, units = "mm")   

2.2 권역별 당원

코드
party_members_sido_g <- party_members_sido_tbl |> 
  mutate(권역 = case_when(
    str_detect(구분, "전북|전남|광주") ~ "광주전라",
    str_detect(구분, "부산|울산|경남|경북") ~ "부울경",
    str_detect(구분, "대구|경북") ~ "대구경북",
    str_detect(구분, "대전|충남|충북|세종") ~ "대전세종충청",
    # str_detect(구분, "제주|강원") ~ "제주강원",
    TRUE ~ 구분)) |> 
  mutate(권역 = factor( 권역, levels = c("서울", "경기", "인천", 
                                     "대전세종충청", "제주", "강원", 
                                     "대구경북", "부울경", "광주전라"))) |> 
  group_by(year, 정당명, 권역) |>
  summarise(당원수 = sum(당원수)) |>
  ggplot(aes(x = year, y = 당원수, color = 정당명, group = 정당명)) +
    geom_point(size = 2.5) +
    geom_line() +
    theme_korean() +
    facet_wrap(vars(권역), scales = "free") +
    theme(legend.position = "top",
          plot.background = element_rect(fill = "white", colour = "white"),
          panel.background = element_rect(fill = "gray99"),
          axis.text.x   = ggplot2::element_text(family = "MaruBuri", size = 9),
          axis.text.y   = ggplot2::element_text(family = "MaruBuri", size = 9),
          axis.title.x    = ggplot2::element_text(family = "MaruBuri", size = 9),
          axis.title.y    = ggplot2::element_text(family = "MaruBuri", size = 9)) +
    labs(x = "",
         y = "당원수",
         title = "양당 권역별 당원수 추세",
         caption = "출처: 중앙선관위 '정당의 활동개황 및 회계보고'") +
    scale_y_continuous(labels = label_man()) +
    scale_color_manual(values = c("국민의힘" = "red",
                                  "민주당" = "blue"))

party_members_sido_g

코드

ggsave( glue::glue("images/당원수_시도별_양당.jpeg") , 
        party_members_sido_g,
        device = ragg::agg_jpeg(), 
        width = 297, height = 210, units = "mm")

2.3 납부당원

코드

payers_members_tbl |> 
  mutate(납부비율 = 납부자수 / 당원수)  |> 
  pivot_longer(c(당원수, 납부자수, 납부비율), names_to = "구분", values_to = "당원수") |>
  mutate(구분 = factor(구분, levels = c("당원수", "납부자수", "납부비율"))) |> 
  ggplot(aes(x = 연도, y = 당원수, color = 정당명, group = 정당명)) +
    geom_point() +
    geom_line() +
    facet_wrap(vars(구분), scales = "free") +
    theme_korean() +
    theme(legend.position = "top") +
    labs(x = "",
         y = "당원수",
         title = "양당 당비 납부자 추세",
         caption = "출처: 중앙선관위 '정당의 활동개황 및 회계보고'") +
    scale_y_continuous(labels = scales::comma) +
    scale_color_manual(values = c("국민의힘" = "red",
                                  "민주당" = "blue"))

2.4 수입내역

코드

income_party_tbl |> 
  pivot_longer(합계:차입금, names_to = "구분", values_to = "금액") |>
  # mutate(구분 = factor(구분, levels = c("합계", "당비"))) |> 
  ggplot(aes(x = 연도, y = 금액, color = 정당명, group = 정당명)) +
    geom_point() +
    geom_line() +
    facet_wrap(vars(구분)) +
    theme_minimal() +
    theme(legend.position = "top") +
    labs(x = "",
         y = "당원수",
         title = "양당 수입내역 추세",
         caption = "출처: 중앙선관위 '정당의 활동개황 및 회계보고'") +
    scale_y_continuous(labels = scales::comma) +
    scale_color_manual(values = c("국민의힘" = "red",
                                  "민주당" = "blue"))

2.5 지출내역

코드

expense_party_tbl |> 
  pivot_longer(합계:조직활동비, names_to = "구분", values_to = "금액") |>
  ggplot(aes(x = 연도, y = 금액, color = 정당명, group = 정당명)) +
    geom_point() +
    geom_line() +
    facet_wrap(vars(구분)) +
    theme_minimal() +
    theme(legend.position = "top") +
    labs(x = "",
         y = "금액(백만원)",
         title = "양당 지출내역 추세",
         caption = "출처: 중앙선관위 '정당의 활동개황 및 회계보고'") +
    scale_y_continuous(labels = scales::comma) +
    scale_color_manual(values = c("국민의힘" = "red",
                                  "민주당" = "blue"))