assemblykor provides seven built-in datasets from the
Korean National Assembly for teaching quantitative methods in political
science:
legislators: 963 MP records (20th-22nd
assemblies)bills: 64,900 legislative billswealth: 3,215 legislator-year asset
declarationsseminars: 5,962 legislator-year
seminar activity recordsspeeches: 15,795 committee speech
records (22nd, Science & ICT)votes: 8,611 plenary vote tallies
(20th-22nd)roll_calls: 549,513 member-level roll
call votes (22nd)data(legislators)
str(legislators)
#> 'data.frame': 963 obs. of 15 variables:
#> $ member_id : chr "XQ98168F" "60490713" "IH436704" "8I61593E" ...
#> $ assembly : int 20 20 20 20 20 20 20 20 20 20 ...
#> $ name : chr "강길부" "강병원" "강석진" "강석호" ...
#> $ name_hanja : chr "姜吉夫" "姜炳遠" "姜錫振" "姜碩鎬" ...
#> $ name_eng : chr "KANG GHILBOO" "KANG BYUNGWON" "KANG SEOGJIN" "KANG SEOKHO" ...
#> $ party : chr "무소속" "더불어민주당" "자유한국당" "자유한국당" ...
#> $ party_elected: chr "무소속" "더불어민주당" "새누리당" "새누리당" ...
#> $ district : chr "울산 울주군" "서울 은평구을" "경남 산청군함양군거창군합천군" "경북 영양군영덕군봉화군울진군" ...
#> $ district_type: chr "constituency" "constituency" "constituency" "constituency" ...
#> $ committees : chr "교육문화체육관광위원회, 예산결산특별위원회, 4차 산업혁명 특별위원회, 산업통상자원중소벤처기업위원회" "국회운영위원회, 환경노동위원회, 정치발전 특별위원회, 예산결산특별위원회, 헌법재판소장(이진성) 임명동의에 관한 "| __truncated__ "국회운영위원회, 보건복지위원회, 예산결산특별위원회, 농림축산식품해양수산위원회" "안전행정위원회, 행정안전위원회, 정치개혁 특별위원회, 정보위원회, 외교통일위원회, 농림축산식품해양수산위원회" ...
#> $ gender : chr "M" "M" "M" "M" ...
#> $ birth_date : Date, format: "1942-06-05" "1971-07-09" ...
#> $ seniority : int 4 1 1 3 4 1 1 2 1 1 ...
#> $ n_bills : int 314 1078 694 585 1131 393 1478 934 1284 1056 ...
#> $ n_bills_lead : int 21 94 53 43 89 74 75 55 78 64 ...boxplot(n_bills_lead ~ seniority, data = legislators,
xlab = "Terms served", ylab = "Bills proposed (as lead)",
main = "Seniority and Legislative Productivity",
col = "lightblue")Bill counts vary widely at every level of seniority. The median is highest among members in their first or second term.
data(bills)
# Top 5 outcomes
outcome_counts <- sort(table(bills$result), decreasing = TRUE)
barplot(outcome_counts[1:5], las = 2, col = "steelblue",
main = "Most Common Bill Outcomes")Most bills expire at the end of the assembly term (임기만료폐기). Only a small fraction pass in their original form (원안가결).
bills$month <- format(bills$propose_date, "%Y-%m")
monthly <- aggregate(bill_id ~ month, data = bills, FUN = length)
names(monthly) <- c("month", "count")
monthly <- monthly[order(monthly$month), ]
plot(seq_len(nrow(monthly)), monthly$count, type = "l",
xlab = "Month (index)", ylab = "Bills proposed",
main = "Monthly Bill Proposals (20th-22nd Assembly)")The wealth dataset is a legislator-year panel ideal for
practicing fixed-effects regression.
data(wealth)
# Distribution of net worth
hist(wealth$net_worth / 1e6, breaks = 50, col = "coral",
main = "Legislator Net Worth Distribution",
xlab = "Net Worth (billion KRW)")wealth$re_share <- ifelse(wealth$total_assets > 0,
wealth$real_estate / wealth$total_assets, NA)
boxplot(re_share ~ year, data = wealth,
xlab = "Year", ylab = "Real estate / total assets",
main = "Real Estate as Share of Legislator Wealth",
col = "lightyellow")Korean legislators hold a large share of their wealth in real estate, reflecting broader patterns in Korean household wealth.
data(seminars)
# Governing vs opposition party
gov_means <- tapply(seminars$cross_party_ratio,
seminars$is_governing, mean, na.rm = TRUE)
barplot(gov_means, names.arg = c("Opposition", "Governing"),
ylab = "Cross-party ratio", col = c("dodgerblue", "tomato"),
main = "Cross-Party Seminar Collaboration")Governing-party legislators tend to have lower cross-party collaboration in policy seminars, a pattern consistent with the “closing ranks” hypothesis.
All datasets share the member_id and/or
assembly columns:
library(dplyr)
# Merge legislators with wealth
leg_wealth <- legislators %>%
inner_join(wealth, by = "member_id", relationship = "many-to-many")
# Productivity vs wealth
leg_wealth %>%
group_by(district_type) %>%
summarise(
n = n(),
median_net_worth = median(net_worth / 1e6, na.rm = TRUE),
median_bills = median(n_bills_lead, na.rm = TRUE)
)
#> # A tibble: 2 × 4
#> district_type n median_net_worth median_bills
#> <chr> <int> <dbl> <dbl>
#> 1 constituency 4950 1.50 64
#> 2 proportional 528 1.25 68data(votes)
# Yes-vote share distribution
votes$yes_rate <- votes$yes / votes$voted
hist(votes$yes_rate, breaks = 40, col = "lightgreen",
main = "Distribution of Yes-Vote Share",
xlab = "Proportion yes")Most bills pass with near-unanimous support. The left tail reveals contested legislation where party discipline breaks down.
data(roll_calls)
library(dplyr)
# Party discipline: how often do members vote with their party majority?
party_votes <- roll_calls %>%
group_by(bill_id, party) %>%
mutate(party_majority = names(which.max(table(vote)))) %>%
ungroup() %>%
mutate(with_party = vote == party_majority)
party_votes %>%
group_by(party) %>%
summarise(
n_members = n_distinct(member_id),
discipline = mean(with_party, na.rm = TRUE)
) %>%
filter(n_members >= 5) %>%
arrange(desc(discipline))
#> # A tibble: 4 × 3
#> party n_members discipline
#> <chr> <int> <dbl>
#> 1 조국혁신당 14 0.880
#> 2 더불어민주당 178 0.832
#> 3 국민의힘 112 0.715
#> 4 무소속 8 0.710data(speeches)
# Who speaks most in committee?
leg_speeches <- speeches[speeches$role == "legislator", ]
speaker_counts <- sort(table(leg_speeches$speaker_name), decreasing = TRUE)
barplot(speaker_counts[1:10], las = 2, col = "plum",
main = "Top 10 Most Active Speakers (Sci & ICT Committee)")For text analysis, download the bill propose-reason texts:
For network analysis, download the full co-sponsorship records:
See vignette("codebook") for the full data dictionary,
or ?get_bill_texts and ?get_proposers for
download function details.