중앙일보에서 연례적으로 발표하고 있는 대학평가이며 한국 최초의 대학평가로 매년 가을에 발표하고 있다.
나무위키, 중앙일보 대학평가 웹사이트에서 데이터를 가져와서 전처리 작업을 수행한다.
목적이 연도별 대학순위를 가져오는 것이기 때문에 html_nodes(resp, "table")
명령어를 통하면 손쉽게 표데이터를 rvest
를 통해서 가져올 수 있다.
# 0. 환경설정 -----
library(rvest)
library(tidyverse)
library(plotly)
library(extrafont)
loadfonts()
# 1. 데이터 -----
## 1.1. URL
univ_ranking_url <- "https://namu.wiki/w/%EC%A4%91%EC%95%99%EC%9D%BC%EB%B3%B4%20%EB%8C%80%ED%95%99%ED%8F%89%EA%B0%80"
## 1.2. 표 긁어오기
ur_list <- vector("list", length=0)
Sys.setlocale("LC_ALL", "C")
[1] "C"
resp <- read_html(univ_ranking_url)
# html_nodes(resp, "table")
for(i in 1:4) {
ur_list[[i]] <- resp %>%
html_nodes("table") %>%
.[[i]] %>%
html_table(fill = TRUE)
}
Sys.setlocale("LC_ALL", "Korean")
[1] "LC_COLLATE=Korean_Korea.949;LC_CTYPE=Korean_Korea.949;LC_MONETARY=Korean_Korea.949;LC_NUMERIC=C;LC_TIME=Korean_Korea.949"
데이터를 정제한다. 여러 사람이 데이터를 만지다 보니 일관성 측면에서 이슈가 있어 데이터프레임 형태로 정제작업을 진행한다.
## 1.3. 데이터 정제 -----
ur_2014_df <- ur_list[[1]] %>%
select(1:3) %>%
rename(순위=X1, 대학=X2, 총점=X3) %>%
filter(순위 != "순위") %>%
mutate(순위 = as.integer(순위),
총점=as.integer(총점),
연도=2014L)
ur_2015_df <- ur_list[[2]] %>%
select(1:2) %>%
rename(순위=X1, 대학=X2) %>%
filter(순위 != "순위") %>%
mutate(순위 = as.integer(순위),
연도=2015L,
총점=0)
ur_2016_df <- ur_list[[3]] %>%
rename(순위=X1, 대학=X2, 총점=X3) %>%
filter(순위 != "순위") %>%
mutate(순위 = as.integer(순위),
총점=as.integer(총점),
연도=2016L)
ur_2017_df <- ur_list[[4]] %>%
rename(순위=X1, 대학=X2, 총점=X3) %>%
filter(순위 != "순위") %>%
mutate(순위 = as.integer(순위),
총점=as.integer(총점),
연도=2017L)
ur_df <- bind_rows(ur_2014_df, ur_2015_df) %>%
bind_rows(ur_2016_df) %>%
bind_rows(ur_2017_df) %>%
mutate(총점 = ifelse(총점==0, NA, 총점)) %>%
mutate(대학 = str_replace(대학, "학교", "")) %>%
mutate(대학 = case_when(str_detect(대학, "고려") ~ "고려대(서울)",
str_detect(대학, "건국") ~ "건국대",
str_detect(대학, "한양대(에리카)") ~ "한양대(ERICA)",
TRUE ~ 대학))
ur_df %>%
select(-총점) %>%
spread(연도, 순위, convert = TRUE) %>%
DT::datatable()
인문ㆍ사회ㆍ자연ㆍ공학 등 4개 계열 이상을 갖춘 종합 4년제 대학 대상(포스텍ㆍ카이스트 등은 제외)으로 진행된 2017년 상위 10개을 선정해서 과거 대학순위 변화를 시각화해보자.
# 2. 시각화 -----
top_10_univ_v <- ur_2017_df %>%
filter(순위 <=10) %>%
pull(대학)
ur_g <- ur_df %>%
filter(대학 %in% top_10_univ_v) %>%
ggplot(aes(x=연도, y= 순위, group=대학, color=대학)) +
geom_line(size=1.3) +
geom_point(size=2.5) +
scale_color_manual(values=c(RColorBrewer::brewer.pal(11, "Set3"))) +
theme_minimal(base_family="NanumGothic") +
labs(x="", y="",color="상위10대학") +
scale_y_continuous(trans = "reverse", breaks = 1:20)
ggplotly(ur_g)