대기업 본사 지도

공정거래위원회에서 지정한 상위 대기업 본사 주소를 기준으로 서울시 지도에 로고를 입혀 시각화 합니다.

지도
대기업
공정거래위원회
로고
저자
소속
공개

2022년 11월 24일

1 데이터

대기업 주소를 지도에 로고를 입혀 시각화하기 위해 필요한 데이터는 다음과 같다.

  1. 공정거래위원회 지정 최신 공시대상기업집단: 공정위 뉴스 2022년 대기업집단 지정결과
자료출처: www.ftc.go.kr

1.1 대기업 집단 순위

공정위 2022년 기준 공시대상 대기업집단 지정결과를 확인할 수 있다.

library(tidyverse)
library(readxl)

rank_raw <- read_excel(glue::glue("{here::here()}/data/220428(조간) 2022년도 대기업집단 지정결과_별첨1.xlsx"), sheet = "22년", skip = 4)

rank_tbl <- rank_raw %>% 
  set_names(c("순위_22", "순위_21", "변동", "기업명", "동일인", "계열사_22", "계열사_21", "자산_22", "자산_21")) %>% 
  filter(변동 !="제외") %>% 
  select(기업명, 동일인, 계열사수=계열사_22, 자산총액 = 자산_22) %>% 
  mutate(계열사수 = parse_number(계열사수),
         자산총액 = parse_number(자산총액)/1000) %>% 
  filter(!is.na(기업명))

rank_tbl
# A tibble: 76 × 4
   기업명     동일인             계열사수 자산총액
   <chr>      <chr>                 <dbl>    <dbl>
 1 삼성       이재용                   60    484. 
 2 에스케이   최태원                  186    292. 
 3 현대자동차 정의선                   57    258. 
 4 엘지       구광모                   73    168. 
 5 롯데       신동빈                   85    122. 
 6 포스코     포스코홀딩스(주)         38     96.3
 7 한화       김승연                   91     80.4
 8 지에스     허창수                   93     76.8
 9 현대중공업 정몽준                   36     75.3
10 농협       농업협동조합중앙회       53     67.0
# … with 66 more rows

1.2 본사 주소

fnguide 에서 기업주소록에서 엑셀파일로 가-하, A-Z, 0-9 기업본사주소가 담긴 정보를 다운로드 받아 후처리한다.

company_list <- fs::dir_ls(glue::glue("{here::here()}/data/company_xlsx"))

company_raw <- map_df(company_list, read_excel)

company_raw
# A tibble: 2,553 × 6
   종목명           시장   홈페이지                   본사주소    대표…¹  IR담당
   <chr>            <chr>  <chr>                      <chr>       <chr>   <chr> 
 1 가비아           코스닥 ir.gabia.com               경기도 성…  1544-4… 02-82…
 2 가온미디어       코스닥 www.kaonmedia.co.kr        경기도 성…  031-72… 031-7…
 3 가온전선         코스피 www.gaoncable.com          경기도 군…  031-80… 031-8…
 4 가온칩스         코스닥 www.gaonchips.com          경기도 성…  031-69… <NA>  
 5 감성코퍼레이션   코스닥 www.virtualtek.co.kr       서울특별시… 02-314… 070-4…
 6 강남제비스코     코스피 www.jevisco.com            부산광역시… 051-89… 051-8…
 7 강스템바이오텍   코스닥 www.kangstem.com           서울시 강…  02-888… 02-20…
 8 강원랜드         코스피 kangwonland.high1.com      강원도 정…  033-59… 033-5…
 9 강원에너지       코스닥 www.kwb21.com              전라북도 …  031-35… 02-66…
10 갤럭시아머니트리 코스닥 www.galaxiamoneytree.co.kr 서울시 강…  1566-0… 070-4…
# … with 2,543 more rows, and abbreviated variable name ¹​대표전화

1.3 데이터 결합

rank_tbl %>% 
  left_join(company_raw, by = c("기업명" = "종목명")) %>% 
  filter(!is.na(본사주소))
# A tibble: 23 × 9
   기업명     동일인 계열사수 자산총액 시장   홈페이지    본사…¹  대표…²  IR담당
   <chr>      <chr>     <dbl>    <dbl> <chr>  <chr>       <chr>   <chr>   <chr> 
 1 한화       김승연       91     80.4 코스피 www.hanwha… 서울시… 02-729… 02-72…
 2 현대중공업 정몽준       36     75.3 코스피 www.hhi.co… 울산광… 052-20… 052-2…
 3 신세계     이명희       53     61.1 코스피 www.shinse… 서울시… 02-727… 02-72…
 4 한진       조원태       33     35.2 코스피 www.hanjin… 서울시… 02-728… 02-72…
 5 카카오     김범수      136     32.2 코스피 www.kakaoc… 제주도… 1577-3… 1577-…
 6 두산       박정원       21     26.3 코스피 www.doosan… 서울시… 02-339… 02-33…
 7 DL         이준용       42     24.8 코스피 www.dlhold… 서울특… 02-201… 02-20…
 8 현대백화점 정지선       23     18.2 코스피 www.ehyund… 서울특… 02-549… 02-54…
 9 하림       김홍국       55     15.4 코스닥 www.harim.… 전북 …  063-86… 063-8…
10 효성       조현준       53     14.8 코스피 www.hyosun… 서울시… 02-707… 02-70…
# … with 13 more rows, and abbreviated variable names ¹​본사주소, ²​대표전화

2 데이터 시즌2

KRX 정보데이터시스템 웹사이트에서 시가총액 상위 기업정보를 가져온다. 이를 앞선 상장사 주소정보와 매칭을 하게 되면 지오코딩을 위한 기본 데이터 준비는 마무리된다.

marcap_raw <- read_excel(glue::glue("{here::here()}/data/krx_marcap_202211.xlsx"))

marcap_tbl <- marcap_raw %>% 
  mutate(시가총액 = 시가총액/10^12) %>% 
  select(종목명, 시가총액)

marcap_address <- marcap_tbl %>% 
  left_join(company_raw) %>% 
  filter(종목명 !="삼성전자우") %>% 
  mutate(본사주소 = ifelse(종목명 == "NAVER", "경기도 성남시 분당구 정자일로 95", 본사주소)) %>% 
  # SK 주소가 여러곳 찍힘 (KAKAO 버그인 듯...)
  mutate(본사주소 = case_when(종목명 == "SK" ~ "서울 종로구 서린동 99",
                              종목명 == "SK이노베이션" ~ "서울 종로구 서린동 99",
                              TRUE ~ 본사주소))

marcap_address %>% 
  write_rds(glue::glue("{here::here()}/data/marcap_address.rds"))

2.1 지오코딩

현재까지 준비한 데이터는 텍스트 주소정보로 이를 지도위에 뿌리기 위해서는 지오코딩을 통해 위경도를 계산해야만 한다.

2.1.1 지오코딩 함수

카카오 지도 API를 사용해서 주소 텍스트를 넣게 되면 위경도를 반환하는 함수를 제작한다.

library(httr)
library(jsonlite)

# usethis::edit_r_environ()

get_geocodes <- function(address) {
  # HTTP 요청을 실행합니다. 
  address_res <- GET(url = 'https://dapi.kakao.com/v2/local/search/address.json',
             query = list(query = address),
             add_headers(Authorization = paste0("KakaoAK ", Sys.getenv("KAKAO_MAP_API_KEY"))))
  
  # KPMG 지리정보 데이터프레임
  address_list <- address_res %>% 
    content(as = 'text') %>% 
    fromJSON()
  
  ## 도로명주소
  long_lat <- address_list$documents$road_address %>% 
    dplyr::select(x, y) %>% 
    mutate(across(.cols = c(x, y), as.numeric))
  
  return(long_lat)
}
# 주소를 지정합니다. 
kpmg_addr <- '서울특별시 강남구 역삼동 737' 
get_geocodes(kpmg_addr)
         x        y
1 127.0365 37.50002
# get_geocodes('서울 종로구 서린동 99')

2.1.2 지오코딩 실행

기업수가 제법 되기 때문에 데이터프레임으로 주소를 앞서 개발한 사용자정의함수 get_geocodes()에 보내 위경도 정보를 받아 후속 분석 업무에 효율적으로 사용할 수 있도록 준비한다. 네이버 주소에 우편번호가 포함되어 있어 이를 위경도 좌표로 변환하는 과정에 오류가 있어 이를 발견하고 확인한 후 모든 종목에 대한 데이터를 깔끔하게 정리해둔다.

marcap_geocode <- marcap_address %>% 
  mutate(geocode_data = map(본사주소, safely(get_geocodes, otherwise = NA_real_)))

marcap_geocode_tbl <- marcap_geocode %>% 
  # select(종목명, geocode_data) %>% 
  mutate(result = map(geocode_data, "result")) %>% 
  # mutate(check = map_lgl(result, is.data.frame)) %>% 
  # filter(check) %>% 
  select(종목명, 홈페이지, 시가총액, 본사주소, result) %>% 
  unnest(result) 
  
marcap_geocode_tbl %>% 
  write_rds(glue::glue("{here::here()}/data/marcap_geocode.rds"))

3 시각화

3.1 지도

시가총액 상위 기업 본사 위치를 지도에 올리기 위해서 지도가 필요하다. 이를 위해서 leaflet 패키지가 필요하고 전체 지도를 표시하는 것은 의미가 없기 때문에 해당 본사가 위치한 특히 본사가 몰려있는 수도권에 한정하여 지도를 가져온다.

library(leaflet)
library(fontawesome)

marcap_geocode <- 
  read_rds(glue::glue("{here::here()}/data/marcap_geocode.rds")) 
  

## 서울경기도 중심
lat_lng_tbl <- marcap_geocode %>% 
  filter(str_detect(본사주소, "서울|경기")) %>% 
  summarise(lat_mean = mean(y),
            lng_mean = mean(x))

leaflet(marcap_geocode) %>%
  setView(lat = lat_lng_tbl$lat_mean, 
          lng = lat_lng_tbl$lng_mean, zoom=11) %>%
  addTiles()

3.2 본사위치

본사위치를 다른 곳과 달리하여 시각화를 한다.

# 시각화 아이콘
landmark_icons <- awesomeIconList(
  "학교" = makeAwesomeIcon(
    icon = "school",
    markerColor = "blue",
    library = "fa",
    text = fa("school")
  ),
  "기업" = makeAwesomeIcon(
    icon = "walking",
    markerColor = "green",
    library = "fa",
    text = fa("walking")
  )
)

marcap_geocode %>% 
  add_row(종목명 = "한양대", 홈페이지="https://www.hanyang.ac.kr/", 시가총액 = 0,
          본사주소 = "서울 성동구 왕십리로 222", 
          x = 127.0454092, y = 37.5571759) %>% 
  mutate(구분 = ifelse(종목명 == "한양대", "학교", "기업")) %>% 
  leaflet() %>%
    setView(lat = lat_lng_tbl$lat_mean, 
            lng = lat_lng_tbl$lng_mean, zoom=11) %>%
    addProviderTiles('CartoDB.Positron') %>%
    addAwesomeMarkers(lat =~y, lng = ~x,
                      clusterOptions = markerClusterOptions(),
                      icon = ~ landmark_icons[구분],
                      popup = ~ as.character(paste0("<strong>", paste0("회사:",`종목명`),
                                                   "</strong><br>",
                                                   "-------------------------------------<br>",
                                                   "&middot; 시총: ", round(`시가총액`,1), "조<br>",
                                                   "&middot; 주소: ", `본사주소`, "<br>",
                                                   "&middot; 홈페이지: ", `홈페이지`, "<br>"
                     )))  
일치 없음