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
•
◦
Chrome 확장 프로그램 추가하여 실행 후 매장정보 표 추출
•
◦
스프레드 시트 내 확장프로그램 통해 지오코딩 실행
◦
해당 프로그램의 지오코딩 한도 존재. 1일 1,000개 주소만 변환 가능
◦
2일에 걸쳐 1,316개 주소를 위도, 경도로 변환하였음
3.2. 헬스장
3.2.1. Source
•
본 과업을 수행하기 위해 지방인허가 데이터의 카테고리에서 [생활] - [체육] - [체력단련장업] 데이터(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. 지방인허가 데이터 좌표 정보 오류
•
•
그러나 제공되는 데이터에 해당 좌표정보로 지정하여 위도·경도 변환 시 오류 발생
◦
구글맵, 네이버맵 등에서 나오는 위치와 200m 가량 차이 발생
•
EPSG:2097 → EPSG:5174
◦
EPSG:5174(Bessel 1841, TM직각좌표계)로 지정해야 오류 최소화됨.
•
지방인허가데이터에서 사용자들에게 잘못된 정보 제공하는 것으로 추정
5.2. 스크래핑(Scraping)과 크롤링(Crawling)
특 정 웹페이지에서 데이터를 추출하는 것을 웹 스크래핑, 여러 웹 페이지를 자동으로 탐색하고 데이터를 수집하는 것을 크롤링
•
웹 스크래핑: 웹 페이지의 특정한 부분에서 원하는 데이터 추출
◦
주로 정해진 웹 페이지에서 일정한 데이터 추출을 위해 사용
◦
예시) 특정 뉴스 사이트에서 제목, 작성일, 내용 수집
•
크롤링: 여러 웹페이지를 자동 탐색하고 데이터를 수집하는 프로세스
◦
웹 사이트의 구조를 따라 웹 페이지를 자동으로 탐색하고, 원하는 데이터를 추출
◦
예시) 온라인 쇼핑몰 내 여러 페이지를 조회하며 제품 정보 수집
5.2. 구글맵 업로드 한계
•
구글맵의 My Map에서 장소 업로드 시 1개 레이어에 최대 2000개까지 가능
•
2000개 이상의 장소 업로드가 필요하다면 지역별로 나누어 업로드 필요