대통령 해외순방

대통령 해외순방 데이터 분석

저자
소속

1 데이터셋

1.1 문재인

코드
library(tidyverse)
library(rvest)

moon_html <- read_html("https://ko.wikipedia.org/wiki/문재인의_대통령_순방_목록")

moon_raw <- moon_html |> 
  html_elements("table") |> 
  html_table()

moon_h3 <- moon_html |> 
  html_elements("h3") |> 
  html_text()

names(moon_raw) <- moon_h3[1:6]

map_df(moon_raw[c(1:5)], rbind)
#> # A tibble: 58 × 5
#>    나라           장소             일자                `세부 내용`         사진 
#>    <chr>          <chr>            <chr>               <chr>               <lgl>
#>  1 미국           워싱턴 D.C.      6월 28일~7월 3일    공식 실무 방문.[1]  NA   
#>  2 독일           베를린, 함부르크 7월 5일~7월 8일     2017년 함부르크 G2… NA   
#>  3 러시아         블라디보스토크   9월 6일~9월 7일     공식 방문. 동방경…  NA   
#>  4 미국           뉴욕             9월 19일~9월 21일   실무 방문. 유엔 총… NA   
#>  5 인도네시아     자카르타         11월 8일~11월 10일  국빈 방문.[11]      NA   
#>  6 베트남         다낭             11월 10일~11월 12일 2017년 다낭 APEC …  NA   
#>  7 필리핀         마닐라           11월 12일~11월 14일 동아시아 정상회의 … NA   
#>  8 중화인민공화국 베이징시, 충칭시 12월 13일~12월 16일 국빈 방문.[16]      NA   
#>  9 베트남         하노이           3월 22일~3월 24일   국빈 방문.[17]      NA   
#> 10 아랍에미리트   아부다비, 두바이 3월 24일~3월 27일   공식 방문.[18]      NA   
#> # ℹ 48 more rows

moon_tbl <- moon_h3 |> 
  enframe() |> 
  mutate(연도 = str_remove(value, "년\\[편집\\]")) |> 
  filter(str_detect(연도, "\\d{4}")) |> 
  mutate(data = moon_raw[c(1:5)]) |> 
  unnest(data) |> 
  select(연도, 나라, 장소, 일자, 세부내용=`세부 내용`) |>
  separate(일자, into = c("출국", "도착"), sep = "~") |> 
  mutate(도착 = ifelse(is.na(도착), 출국, 도착)) |> 
  mutate(출국일 = str_glue("{연도}-{출국}"),
         도착일 = str_glue("{연도}-{도착}")) |> 
  mutate(출국일 = parse_date(출국일, "%Y-%m월 %d일"),
         도착일 = parse_date(도착일, "%Y-%m월 %d일")) |> 
  select(출국일, 도착일, 국가 = 나라, 장소) |> 
  mutate(기간 = (출국일 %--% 도착일) / ddays(1) +1)

1.2 윤석열

코드
tour_yoon_html <- rvest::read_html(URLencode("https://namu.wiki/w/윤석열 정부/외교"))

tour_yoon_raw <- tour_yoon_html |> 
  html_elements("table") |> 
  html_table()

tour_yoon_dat <- bind_rows(
  tour_yoon_raw[[10]] |> 
    janitor::row_to_names(row_number = 1) |> 
    mutate(연도 = 2022),
  tour_yoon_raw[[11]] |> 
    janitor::row_to_names(row_number = 1) |> 
    mutate(연도 = 2023))


tour_yoon_tbl <- tour_yoon_dat |>
  separate(일자, into = c("출국일", "귀국일"), sep = "~") |>
  mutate(귀국일 = ifelse(is.na(귀국일), "15일", 귀국일)) |> # 우크라이나
  separate(출국일, into = c("출국월", "출국일"), sep = "월 ?") |> 
  mutate(귀국월 = 출국월,
         귀국일 = parse_number(귀국일)) |> 
  mutate(출국날짜 = ymd(paste(연도, 출국월, 출국일, sep = "-")),
         귀국날짜 = ymd(paste(연도, 귀국월, 귀국일, sep = "-"))) |> 
  mutate(상대국 = str_remove(상대국, "\\s?행정구")) |>
  select(출국날짜, 귀국날짜, 상대국, 상대방, 비고)

tour_yoon_tbl
#> # A tibble: 21 × 5
#>    출국날짜   귀국날짜   상대국       상대방                           비고     
#>    <date>     <date>     <chr>        <chr>                            <chr>    
#>  1 2022-06-27 2022-06-30 스페인       북대서양 조약 기구               "첫 국외…
#>  2 2022-09-18 2022-09-19 영국         -                                "엘리자… 
#>  3 2022-09-20 2022-09-22 미국         국제연합                         "첫 UN … 
#>  4 2022-09-22 2022-09-23 캐나다       쥐스탱 트뤼도 총리               "첫 정상…
#>  5 2022-11-11 2022-11-14 캄보디아     아세안                           ""       
#>  6 2022-11-14 2022-11-15 인도네시아   G20                              ""       
#>  7 2023-01-14 2023-01-17 아랍에미리트 무함마드 빈 자이드 알나얀 대통령 "국빈방… 
#>  8 2023-01-17 2023-01-20 스위스       -                                "세계경… 
#>  9 2023-03-16 2023-03-17 일본         기시다 후미오 총리               "2023년 …
#> 10 2023-04-24 2023-04-30 미국         조 바이든 대통령                 "2023년 …
#> # ℹ 11 more rows

2 문재인 해외순방

2.1

코드
library(countrycode)

country_codes <- data.frame(
  "국가" = c("노르웨이", "뉴질랜드", "덴마크", "독일", "라오스", "러시아", "말레이시아", "미국", "미얀마", "바티칸 시국", "베트남", "벨기에", "브루나이", "사우디아라비아", "스웨덴", "스페인", "싱가포르", "아랍에미리트", "아르헨티나", "영국", "오스트레일리아", "오스트리아", "우즈베키스탄", "이집트", "이탈리아", "인도", "인도네시아", "일본", "조선민주주의인민공화국", "중화인민공화국", "체코", "카자흐스탄", "캄보디아", "태국", "투르크메니스탄", "파푸아뉴기니", "프랑스", "핀란드", "필리핀", "헝가리"),
  "영문_국가명" = c("Norway", "New Zealand", "Denmark", "Germany", "Laos", "Russia", "Malaysia", "United States", "Myanmar", "Vatican City", "Vietnam", "Belgium", "Brunei", "Saudi Arabia", "Sweden", "Spain", "Singapore", "United Arab Emirates", "Argentina", "United Kingdom", "Australia", "Austria", "Uzbekistan", "Egypt", "Italy", "India", "Indonesia", "Japan", "North Korea", "China", "Czech Republic", "Kazakhstan", "Cambodia", "Thailand", "Turkmenistan", "Papua New Guinea", "France", "Finland", "Philippines", "Hungary"),
  "iso2c" = c("NO", "NZ", "DK", "DE", "LA", "RU", "MY", "US", "MM", "VA", "VN", "BE", "BN", "SA", "SE", "ES", "SG", "AE", "AR", "GB", "AU", "AT", "UZ", "EG", "IT", "IN", "ID", "JP", "KP", "CN", "CZ", "KZ", "KH", "TH", "TM", "PG", "FR", "FI", "PH", "HU")
)

moon_tbl |> 
  group_by(국가) |> 
  summarise(방문수 = n(),
            연도 = str_c(str_glue("{lubridate::year(출국일)}"), collapse = ",")) |> 
  left_join(country_codes, by = "국가") |> 
  mutate(대륙 = countrycode(iso2c, "iso2c", "continent")) |>
  arrange(desc(방문수)) |>
  select(-영문_국가명) |> 
  select(iso2c, everything()) |> 
  gt(groupname_col = "대륙") |> 
  fmt_flag(columns = iso2c) |> 
  cols_label(
    iso2c = ""
  ) |> 
  cols_align("center") |> 
  tab_header(
    title = md("문재인 대통령 해외 순방"),
    subtitle = md("2017년 5월 10일 ~ 2021년 5월 9일")
  ) |>
tab_footnote(
  footnote = md("데이터 출처: [위키백과](https://ko.wikipedia.org/wiki/문재인의_대통령_순방_목록)")
) |>   
  gt_theme_538() |> 
  ## 표 전체 합계 -------------------------------------
  grand_summary_rows(
    columns = 방문수,
    fns =  list(label = "", fn = "sum"),
    fmt = ~ fmt_integer(.),
    side = "bottom"
  )
문재인 대통령 해외 순방
2017년 5월 10일 ~ 2021년 5월 9일
국가 방문수 연도
Americas
미국 8 2017,2017,2018,2018,2019,2019,2021,2021
아르헨티나 1 2018
Europe
러시아 2 2017,2018
바티칸 시국 2 2018,2021
영국 2 2021,2021
이탈리아 2 2018,2021
노르웨이 1 2019
덴마크 1 2018
독일 1 2017
벨기에 1 2018
스웨덴 1 2019
스페인 1 2021
오스트리아 1 2021
체코 1 2018
프랑스 1 2018
핀란드 1 2019
헝가리 1 2021
Asia
베트남 2 2017,2018
싱가포르 2 2018,2018
아랍에미리트 2 2018,2022
일본 2 2018,2019
조선민주주의인민공화국 2 2018,2018
중화인민공화국 2 2017,2019
태국 2 2019,2019
라오스 1 2019
말레이시아 1 2019
미얀마 1 2019
브루나이 1 2019
사우디아라비아 1 2022
우즈베키스탄 1 2019
인도 1 2018
인도네시아 1 2017
카자흐스탄 1 2019
캄보디아 1 2019
투르크메니스탄 1 2019
필리핀 1 2017
Oceania
뉴질랜드 1 2018
오스트레일리아 1 2021
파푸아뉴기니 1 2018
Africa
이집트 1 2022
58
데이터 출처: 위키백과

2.2 지도

코드
library(viridis)
library(sf)
extrafont::loadfonts()
sf_use_s2(FALSE)

moon_tour <- moon_tbl |> 
  group_by(국가) |> 
  summarise(방문수 = n(),
            연도 = str_c(str_glue("{lubridate::year(출국일)}"), collapse = ",")) |> 
  left_join(country_codes, by = "국가")

world_map <- rnaturalearth::ne_countries(scale = 50, returnclass = "sf")
  
country_centroid <- inner_join(st_centroid(world_map), moon_tour, 
                              by = c("iso_a2" = "iso2c"))

country_centroid <- bind_cols(country_centroid,
          st_coordinates(country_centroid) |> 
            as_tibble() |> 
            set_names(c("lon", "lat")))

moon_map <- left_join(world_map, moon_tour, by = c("iso_a2" = "iso2c"))

moon_map |> 
  filter(continent != "Antarctica") |> 
  mutate(방문수 = factor(방문수, levels = c(1, 2, 8),
                      labels = c("1회", "2회", "8회"))) |>
  ggplot() +
    geom_sf(aes(fill = 방문수)) +
    scale_fill_manual(values = c("gray50", "skyblue", "blue"), 
                      na.value = "transparent",
                      breaks = c("1회", "2회", "8회", NA),
                      labels = c("1회", "2회", "8회", "방문 없음")) +
    labs(
      title = "문재인 대통령 해외순방") +
    theme_void(base_family = "NanumGothic") +
    theme(legend.position = "bottom") +
    ggrepel::geom_text_repel(
      data = country_centroid |> select(국가, lon, lat) |> st_drop_geometry(),
          aes(label = 국가, x = lon, y = lat),
          size = 3, segment.size = 0.2
      )

2.3 태평양 중심지도

코드
world_map <- rnaturalearth::ne_countries(scale = 50, returnclass = "sf") %>%
  st_make_valid() |> 
  filter(continent != "Antarctica")

# define a long & slim polygon that overlaps the meridian line & set its CRS to match
# that of world Centered in lon 133

offset <- 180 - 150

polygon <- st_polygon(x = list(rbind(
  c(-0.0001 - offset, 90),
  c(0 - offset, 90),
  c(0 - offset, -90),
  c(-0.0001 - offset, -90),
  c(-0.0001 - offset, 90)
))) %>%
  st_sfc() %>%
  st_set_crs(4326)

world_pacific <- world_map |> 
  st_difference(polygon) |> 
  st_transform(crs = "+proj=eqc +x_0=0 +y_0=0 +lat_0=0 +lon_0=150")

ggplot(data = world_pacific, aes(group = admin)) +
  geom_sf(fill = "grey") +
  theme_void()

코드
moon_pacific_map <- left_join(world_pacific, moon_tour, by = c("iso_a2" = "iso2c"))

pacific_centroid <- inner_join(st_centroid(moon_pacific_map), moon_tour, 
                              by = c("iso_a2" = "iso2c"))

pacific_country_centroid <- bind_cols(pacific_centroid,
          st_coordinates(pacific_centroid) |> 
            as_tibble() |> 
            set_names(c("lon", "lat")))


moon_pacific_map |> 
  mutate(방문수 = factor(방문수, levels = c(1, 2, 8),
                      labels = c("1회", "2회", "8회"))) |>
  ggplot() +
    geom_sf(aes(fill = 방문수)) +
    scale_fill_manual(values = c("gray50", "skyblue", "blue"), 
                      na.value = "transparent",
                      breaks = c("1회", "2회", "8회", NA),
                      labels = c("1회", "2회", "8회", "방문 없음")) +
    # labs(title = "문재인 대통령 해외순방") +
    theme_void(base_family = "NanumGothic") +
    theme(legend.position = "bottom") +
    ggrepel::geom_text_repel(
      data = pacific_country_centroid |> select(국가.x, lon, lat) |> st_drop_geometry(),
          aes(label = 국가.x, x = lon, y = lat),
          size = 3, segment.size = 0.2
      )

3 윤석열 해외순방

3.1

코드


yoon_country_data <- data.frame(
  상대국 = c("스페인", "영국", "미국", "캐나다", "캄보디아", "인도네시아", "아랍에미리트", "스위스", "일본", "미국", "일본", "프랑스", "베트남", "리투아니아", "폴란드", "우크라이나", "미국", "인도네시아", "인도", "사우디아라비아", "카타르"),
  영문명 = c("Spain", "United Kingdom", "United States", "Canada", "Cambodia", "Indonesia", "United Arab Emirates", "Switzerland", "Japan", "United States", "Japan", "France", "Vietnam", "Lithuania", "Poland", "Ukraine", "United States", "Indonesia", "India", "Saudi Arabia", "Qatar"),
  ISO2 = c("ES", "GB", "US", "CA", "KH", "ID", "AE", "CH", "JP", "US", "JP", "FR", "VN", "LT", "PL", "UA", "US", "ID", "IN", "SA", "QA")
) 

tour_yoon_tbl |> 
  group_by(상대국) |> 
  summarise(방문수 = n(),
            연도 = str_c(str_glue("{lubridate::year(출국날짜)}"), collapse = ",")) |> 
  ungroup() |> 
  left_join(distinct(yoon_country_data)) |> 
  mutate(대륙 = countrycode(ISO2, "iso2c", "continent")) |> 
  arrange(desc(방문수)) |>
  select(-영문명) |> 
  select(ISO2, everything()) |> 
  gt(groupname_col = "대륙") |> 
  fmt_flag(columns = ISO2) |> 
  cols_label(
    ISO2 = ""
  ) |> 
  cols_align("center") |> 
  tab_header(
    title = md("윤석열 대통령 해외 순방"),
    subtitle = md("2022년 6월 27일 ~ 2023년 10월 26일")
  ) |>
tab_footnote(
  footnote = md("데이터 출처: [위키백과](https://namu.wiki/w/%EC%9C%A4%EC%84%9D%EC%97%B4%20%EC%A0%95%EB%B6%80/%EC%99%B8%EA%B5%90#s-4)")) |>   
  gt_theme_538() |> 
  ## 표 전체 합계 -------------------------------------
  grand_summary_rows(
    columns = 방문수,
    fns =  list(label = "", fn = "sum"),
    fmt = ~ fmt_integer(.),
    side = "bottom"
  )
윤석열 대통령 해외 순방
2022년 6월 27일 ~ 2023년 10월 26일
상대국 방문수 연도
Americas
미국 3 2022,2023,2023
캐나다 1 2022
Asia
인도네시아 2 2022,2023
일본 2 2023,2023
베트남 1 2023
사우디아라비아 1 2023
아랍에미리트 1 2023
인도 1 2023
카타르 1 2023
캄보디아 1 2022
Europe
리투아니아 1 2023
스위스 1 2023
스페인 1 2022
영국 1 2022
우크라이나 1 2023
폴란드 1 2023
프랑스 1 2023
21
데이터 출처: 위키백과

3.2 지도

코드

yoon_tour <- tour_yoon_tbl |> 
  group_by(상대국 ) |> 
  summarise(방문수 = n(),
            연도 = str_c(str_glue("{lubridate::year(출국날짜)}"), collapse = ",")) |> 
  left_join(distinct(yoon_country_data))

world_map <- rnaturalearth::ne_countries(scale = 50, returnclass = "sf")
  
country_centroid <- inner_join(st_centroid(world_map), yoon_tour, 
                              by = c("iso_a2" = "ISO2"))

country_centroid <- bind_cols(country_centroid,
          st_coordinates(country_centroid) |> 
            as_tibble() |> 
            set_names(c("lon", "lat")))

yoon_map <- left_join(world_map, yoon_tour, by = c("iso_a2" = "ISO2"))

yoon_map |> 
  filter(continent != "Antarctica") |> 
  mutate(방문수 = factor(방문수, levels = c(1, 2, 3),
                      labels = c("1회", "2회", "3회"))) |>
  ggplot() +
    geom_sf(aes(fill = 방문수)) +
    scale_fill_manual(values = c("gray50", "pink", "red"), 
                      na.value = "transparent",
                      breaks = c("1회", "2회", "3회", NA),
                      labels = c("1회", "2회", "3회", "방문 없음")) +
    labs(
      title = "윤석열 대통령 해외순방") +
    theme_void(base_family = "NanumGothic") +
    theme(legend.position = "bottom") +
    ggrepel::geom_text_repel(
      data = country_centroid |> select(상대국, lon, lat) |> st_drop_geometry(),
          aes(label = 상대국, x = lon, y = lat),
          size = 3, segment.size = 0.2
      )

3.3 태평양 중심지도

코드
yoon_pacific_map <- left_join(world_pacific, yoon_tour, by = c("iso_a2" = "ISO2"))

yoon_pacific_centroid <- inner_join(st_centroid(yoon_pacific_map), yoon_tour, 
                              by = c("iso_a2" = "ISO2"))

yoon_pacific_country_centroid <- bind_cols(yoon_pacific_centroid,
          st_coordinates(yoon_pacific_centroid) |> 
            as_tibble() |> 
            set_names(c("lon", "lat")))


yoon_pacific_map |> 
  mutate(방문수 = factor(방문수, levels = c(1, 2, 3),
                      labels = c("1회", "2회", "3회"))) |>
  ggplot() +
    geom_sf(aes(fill = 방문수)) +
    scale_fill_manual(values = c("gray50", "pink", "red"), 
                      na.value = "transparent",
                      breaks = c("1회", "2회", "3회", NA),
                      labels = c("1회", "2회", "3회", "방문 없음")) +
    # labs(title = "윤석열 대통령 해외순방") +
    theme_void(base_family = "NanumGothic") +
    theme(legend.position = "bottom") +
    ggrepel::geom_text_repel(
      data = yoon_pacific_country_centroid |> select(상대국.x, lon, lat) |> st_drop_geometry(),
          aes(label = 상대국.x, x = lon, y = lat),
          size = 3, segment.size = 0.2
      )

4 문재인 1년6개월

4.1

코드
moon_early_tbl <- moon_tbl |> 
  filter(출국일 <= as.Date("2018-11-10")) # 2017년 5월 10일 이후로 1년 6개월

moon_early_tbl |> 
  group_by(국가) |> 
  summarise(방문수 = n(),
            연도 = str_c(str_glue("{lubridate::year(출국일)}"), collapse = ",")) |> 
  left_join(country_codes, by = "국가") |> 
  mutate(대륙 = countrycode(iso2c, "iso2c", "continent")) |>
  arrange(desc(방문수)) |>
  select(-영문_국가명) |> 
  select(iso2c, everything()) |> 
  gt(groupname_col = "대륙") |> 
  fmt_flag(columns = iso2c) |> 
  cols_label(
    iso2c = ""
  ) |> 
  cols_align("center") |> 
  tab_header(
    title = md("문재인 대통령 임기초반 해외 순방"),
    subtitle = md("2017년 5월 10일 ~ 2018년 11월 10일")
  ) |>
tab_footnote(
  footnote = md("데이터 출처: [위키백과](https://ko.wikipedia.org/wiki/문재인의_대통령_순방_목록)")
) |>   
  gt_theme_538() |> 
  ## 표 전체 합계 -------------------------------------
  grand_summary_rows(
    columns = 방문수,
    fns =  list(label = "", fn = "sum"),
    fmt = ~ fmt_integer(.),
    side = "bottom"
  )
문재인 대통령 임기초반 해외 순방
2017년 5월 10일 ~ 2018년 11월 10일
국가 방문수 연도
Americas
미국 4 2017,2017,2018,2018
Europe
러시아 2 2017,2018
덴마크 1 2018
독일 1 2017
바티칸 시국 1 2018
벨기에 1 2018
이탈리아 1 2018
프랑스 1 2018
Asia
베트남 2 2017,2018
조선민주주의인민공화국 2 2018,2018
싱가포르 1 2018
아랍에미리트 1 2018
인도 1 2018
인도네시아 1 2017
일본 1 2018
중화인민공화국 1 2017
필리핀 1 2017
23
데이터 출처: 위키백과

4.2 태평양 중심지도

코드

moon_early_tour <- moon_early_tbl |> 
  group_by(국가) |> 
  summarise(방문수 = n(),
            연도 = str_c(str_glue("{lubridate::year(출국일)}"), collapse = ",")) |> 
  left_join(country_codes, by = "국가")

moon_early_pacific_map <- left_join(world_pacific, moon_early_tour, by = c("iso_a2" = "iso2c"))

early_pacific_centroid <- inner_join(st_centroid(moon_early_pacific_map), moon_tour, 
                              by = c("iso_a2" = "iso2c"))

early_pacific_country_centroid <- bind_cols(early_pacific_centroid,
          st_coordinates(early_pacific_centroid) |> 
            as_tibble() |> 
            set_names(c("lon", "lat")))


moon_early_pacific_map |> 
  mutate(방문수 = factor(방문수, levels = c(1, 2, 4),
                      labels = c("1회", "2회", "4회"))) |>
  ggplot() +
    geom_sf(aes(fill = 방문수)) +
    scale_fill_manual(values = c("gray50", "skyblue", "blue"), 
                      na.value = "transparent",
                      breaks = c("1회", "2회", "4회", NA),
                      labels = c("1회", "2회", "4회", "방문 없음")) +
    # labs(title = "문재인 대통령 해외순방") +
    theme_void(base_family = "NanumGothic") +
    theme(legend.position = "bottom") +
    ggrepel::geom_text_repel(
      data = early_pacific_country_centroid |> select(국가.x, lon, lat) |> st_drop_geometry(),
          aes(label = 국가.x, x = lon, y = lat),
          size = 3, segment.size = 0.2
      )