조선 국왕 수명 데이터 분석
-
위키피디아에서 조선의 국와 정보를 크롤링합니다.
if (!require(rvest)) install.packages('rvest')
library(rvest)
if (!require(tidyverse)) install.packages('tidyverse')
library(tidyverse)
get_required_info = function(rows, order){
clean_table = rows[order] %>% # 한글자씩 쪼갠다.
strsplit(split = '') %>%
unlist() %>%
str_replace('[^가-힣0-9]', 'N') %>% # (한글, 숫자)가 아닌 문자는 불필요하므로 N으로 치환한다.
paste(collapse = '') %>% # 모든 문자를 합친 다음 N을 기준으로 다시 나눈다.
strsplit('N') %>%
unlist()
order_index = grep('^제.{1,}대$', clean_table)
order = clean_table[order_index]
name_index = grep('^.{1,2}[조|종|군]$', clean_table)[1]
name = clean_table[name_index]
years_index = grep('^.{1,}년$', clean_table)
years <- # 순서대로 출생, 사망, 즉위, 퇴위
clean_table[years_index] %>%
substr(1, 4)
grave_index = grep('^.{1,3}[릉|묘]$', clean_table)
grave = clean_table[grave_index]
return(c(order, name, years, grave))
}
target_url <- 'https://ko.wikipedia.org/wiki/%EC%A1%B0%EC%84%A0_%EA%B5%AD%EC%99%95'
unclean_table <-
read_html(target_url, encoding = 'UTF-8') %>%
html_nodes('table[class=wikitable]') %>%
html_nodes('tbody') %>%
html_nodes('tr') %>%
html_text()
# 필요로 하는 데이터는 모두 '제'로 시작한다.
# '제'로 시작하지 않는 데이터는 불필요하므로 제거한다.
requiredRows_index <- str_detect(unclean_table, '^제')
requiredRows <- unclean_table[requiredRows_index]
last_order = 26
kings_info <- vector('list', last_order)
for (i in 1:last_order){
kings_info[[i]] = get_required_info(requiredRows, i)
}
kings_info = do.call('rbind', kings_info)
colnames(kings_info) = c('order', 'name', 'birth', 'death', 'king_start', 'king_end', 'grave')
write.table(kings_info, 'Joseon_king.txt', row.names=FALSE)
kings_info
-
왕의 수명을 출생년도 기준으로 동의보감 편찬 이전과 이후로 나누었을 때, 유의미한 차이가 있는가?
kings_info <- data.frame(kings_info)
kings_info[, c('birth', 'death')] =
kings_info[, c('birth', 'death')] %>%
unlist() %>%
as.numeric()
kings_info =
kings_info %>%
mutate(age = death - birth)
plot(kings_info$birth, kings_info$age,
xlab = 'birth_year',
ylab = 'age',
main = '동의보감 1610년')
Donguibogam = 1610
abline(v = Donguibogam, col = 'red')
abline(lm(kings_info$age ~ kings_info$birth)) # 회귀선
# 상자그림
kings_info['class'] =
ifelse(kings_info['birth'] <= 1610, 'Before', 'After') %>%
factor(levels = c('Before', 'After'))
boxplot(kings_info$age ~ kings_info$class,
xlab = 'group',
ylab = 'age',
main = '동의보감 이전과 이후')