Search
📍

전국 헬스장과 드럭스토어 맵핑

0. 개요

전국 헬스장과 특정 드럭스토어 간 거리와 지역별 분포 파악
기간: 1주일 (2023.03.07~2023.03.15)
팀원: 1인 (혼자)
사용 툴
Google Map
Google Spread Sheet
R
최종 산출물
Google Map (링크 고객사에게 공유)

1. 비즈니스 목표

신규 출시 제품의 유통 채널 선정을 위한 근거 마련

2. 주요 업무

데이터 수집
전국 드럭 스토어 도로명 주소 및 좌표
전국 헬스장 도로명 주소 및 좌표
수집된 매장 데이터 구글맵에 업로드하여 시각화

3. 데이터 수집

드럭스토어와 헬스장 간 거리를 확인하기 위해선 해당 매장들의 정확한 좌표 또는 주소가 나와 있는 데이터를 확보 필요
수집 경로
드럭스토어: 해당 공식 웹페이지에서 스크래핑
헬스장: 행정안전부의

3.1. 드럭스토어

드럭스토어 공식 홈페이지 → 매장 데이터 스크래핑 → 구글 스프레드 시트 → 지오코딩 → 구글맵 업로드

3.1.1. Source

공식 홈페이지 내 ‘매장 안내’ 페이지에서 웹 스크래핑 추출
2023년 3월 8일 기준 운영 중인 매장 1316개
전국 매장 중 공식 매장으로 보기 어려운 팝업 매장 1개 제외

3.1.2. Tool

Listly (click) 활용하여 웹 스크래핑하였음.
Chrome 확장 프로그램 추가하여 실행 후 매장정보 표 추출
Google Spread Sheet → 확장 프로그램 (Google Workspace Marketplace) → Google by Awesome Table (click)
스프레드 시트 내 확장프로그램 통해 지오코딩 실행
해당 프로그램의 지오코딩 한도 존재. 1일 1,000개 주소만 변환 가능
2일에 걸쳐 1,316개 주소를 위도, 경도로 변환하였음

3.2. 헬스장

3.2.1. Source

지방인허가 데이터(LOCAL DATA, click) 설명
본 과업을 수행하기 위해 지방인허가 데이터의 카테고리에서 [생활] - [체육] - [체력단련장업] 데이터(csv 파일)을 다운로드하였음
구글맵에 정확한 위치를 표시하기 위해선 Geo Data가 필요함. 그러나 지방인허가데이터는 일반적인 위경도가 아닌 좌표값을 제공함
헬스장의 매장 수는 드럭스토어에 비해 10배 가량 되기 때문에 드럭스토어와 같은 방법으로 위경도를 추출하고 맵핑하는 데 뚜렷한 한계를 지님. 따라서 더 체계적인 방법이 필요하여 R 프로그래밍 수행하였음

3.2.2. Tool

sf library in R
sf 라이브러리에는 지리공간 벡터 데이터 분석을 위한 패키지들 있음
spData, spDataLarge 패키지에는 지리공간의 데이터 샘플 등 있으니 참고
참고자료 (01, 02, 03, 04)
참고자료: 자세한 좌표 (01, 02)
기존 XY 좌표를 위도와 경도로 변환하는 작업은 아래와 같다.
library(pacman) pacman::p_load(readxl, sf, sp, rgdal, xlsx) #라이브러리 호출 df <- read_xlsx("경로/헬스장.xlsx", sheet = "TABLE") #데이터 로드 #getOption("digits") #options("digits" = 15)
R
복사
Issue 1: XY좌표값의 소수점을 호출하면서 표시되지 않는 문제
기존 문자(character) 타입인 변수를 as.numeric 함수로 변환하면서 정보 유실
엑셀 파일 자체에서 미리 숫자로 변환해놓아도 데이터 로드 과정에서 유실
getOption 함수를 통해 현재 표시되고 있는 소수점 자리수 확인 (default: 7)
해당 옵션을 option 함수를 통해 15자리로 수정하여 문제 해결
coord <- df[,13:14] #13열:X좌표값 / 14열: Y좌표값 #아래는 EPSG:2097로 지정한 경우 #point_localdb <- st_as_sf(coord, coords = c('좌표정보(X)','좌표정보(Y)'), crs = '+proj=tmerc +lat_0=38 +lon_0=127 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs +towgs84=-115.80,474.99,674.11,1.16,-2.31,-1.63,6.43') point_localdb <- st_as_sf(coord, coords = c('좌표정보(X)','좌표정보(Y)'), crs = '+proj=tmerc +lat_0=38 +lon_0=127.0028902777778 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs +towgs84=-115.80,474.99,674.11,1.16,-2.31,-1.63,6.43') #변경 후 좌표값의 좌표계 형식 지정(4326 = WGS84) point_localdb_tf <- st_transform(point_localdb, crs = 4326) str(point_localdb_tf) df_done <- cbind(df, point_localdb_tf$geometry)
R
복사
#최종 파일 추출 write.csv(df_done,"경로/헬스장_위도경도추가.csv", fileEncoding = "cp949")
R
복사
Issue 2: geometry type의 벡터 추출
텍스트(csv) 파일로 추출하는 것으로 우선 모면…
Issue 3: 글자 깨짐
R에서 데이터 프레임 그대로 추출하면 깨짐. encoding 필요
fileEncoding = “UTF-8” 옵션 추가

4. 산출물

4.1. Goolge Map

다음 사진과 같이 드럭스토어(Red)와 헬스장(Blue) 표시
구글맵 링크 고객사에게 전달

5. 기타

5.1. 지방인허가 데이터 좌표 정보 오류

지방인허가데이터의 홈페이지 '데이터 활용가이드'에서 좌표정보는 중부원점TM(EPSG:2097)이라고 소개됨.
그러나 제공되는 데이터에 해당 좌표정보로 지정하여 위도·경도 변환 시 오류 발생
구글맵, 네이버맵 등에서 나오는 위치와 200m 가량 차이 발생
EPSG:2097 → EPSG:5174
EPSG:5174(Bessel 1841, TM직각좌표계)로 지정해야 오류 최소화됨.
지방인허가데이터에서 사용자들에게 잘못된 정보 제공하는 것으로 추정

5.2. 스크래핑(Scraping)과 크롤링(Crawling)

특 정 웹페이지에서 데이터를 추출하는 것을 웹 스크래핑, 여러 웹 페이지를 자동으로 탐색하고 데이터를 수집하는 것을 크롤링
웹 스크래핑: 웹 페이지의 특정한 부분에서 원하는 데이터 추출
주로 정해진 웹 페이지에서 일정한 데이터 추출을 위해 사용
예시) 특정 뉴스 사이트에서 제목, 작성일, 내용 수집
크롤링: 여러 웹페이지를 자동 탐색하고 데이터를 수집하는 프로세스
웹 사이트의 구조를 따라 웹 페이지를 자동으로 탐색하고, 원하는 데이터를 추출
예시) 온라인 쇼핑몰 내 여러 페이지를 조회하며 제품 정보 수집

5.2. 구글맵 업로드 한계

구글맵의 My Map에서 장소 업로드 시 1개 레이어에 최대 2000개까지 가능
2000개 이상의 장소 업로드가 필요하다면 지역별로 나누어 업로드 필요