garret

[Python, folium] colab에서 동물병원 데이터 시각화 1 본문

Data/Data visualization

[Python, folium] colab에서 동물병원 데이터 시각화 1

_Sun_ 2023. 1. 7. 18:01

이전에 colab으로 했던 지도시각화 작업을 포스팅으로 정리하고자 한다. 

 

데이터 전처리 과정

데이터는 공공데이터 포털의 동물병원 데이터를 사용했다. 

 

 

행정안전부_동물병원_20220531

동물을 진료하거나 동물의 질병을 예방하는 기관정보 데이터로 인허가일자, 영업상태, 사업장명, 소재지주소 등의 정보 확인이 가능합니다.<br/><br/>* 좌표계 : 중부원점TM(EPSG:2097)<br/>

www.data.go.kr

 

 

 

encoding 없이 불러오면 오류 뜨니 참고.

 

original = pd.read_csv('행정안전부_동물병원.csv', encoding='cp949')
original.info()

 

데이터 구성은 이렇다. 

 

 

 

 

 

영업중인 데이터만 고르고 좌표정보가 null인 건 삭제했다

 

# 영업중인 데이터만 추출
original_open = original[original['영업상태명']=='영업/정상']

# 좌표정보가 null인 Row 삭제
hospital_loc = original_open.dropna(subset=['좌표정보(x)']).reset_index()

# 해당 컬럼에서 null인 row 삭제
hospital_loc= hospital_loc.dropna(subset=['소재지전화','도로명전체주소','도로명우편번호']).reset_index()

 

 

 

원 데이터는 좌표가 중부원점TM(EPSG:2097)로 설정되어 있어서 위도경도(WGS84)로 변환해줬다. 

검색해보니 pyproj 라이브러리 사용해서 간단하게 하길래 설치해서 돌렸더니 바로 변환되었다. 

 

# 중부원점TM 좌표를 위도경도로 변환
from pyproj import Proj, transform

proj_1 = Proj(init='epsg:2097')
proj_2 = Proj(init='epsg:4326')

converted = transform(proj_1, proj_2, hospital_loc['좌표정보(x)'].values, hospital_loc['좌표정보(y)'].values)
hospital_loc['lon'] = converted[0]
hospital_loc['lat'] = converted[1]

 

 

# 필요한 컬럼만 고르기
hospital = hospital_loc[['상세영업상태명', '소재지전화','도로명전체주소','도로명우편번호','사업장명','lon','lat']]

 

 

도로명 주소에서 시도를 추출했다.

# 도로명전체주소에서 시도만 추출
hospital['region'] = hospital['도로명전체주소'].str.split(' ').str[0]

 

 

# 전처리한 데이터프레임 csv로 저장
hospital.to_csv('/gdrive/MyDrive/Petom/csv_files/hospital.csv', encoding = 'utf-8')

 

 

 

folium MarkerCluster으로 지도 시각화

folium은 지리 공간 데이터를 시각화하는데 사용되는 python 라이브러리.

간단하게 쓸 수 있는 편이라 많이들 쓰는 것 같다. 

 

MarkerCluster는 지도를 축소하면 marker들을 하나의 무리로 보이게 만드는 옵션이다.

import folium
from folium.plugins import MarkerCluster

sub_df = hospital[hospital['region']=='서울특별시'].reset_index()

# 지도 중심 위경도 지정
center = [37.541, 126.986]
m_s = folium.Map(
    location=[center[0], center[1]],
    zoom_start=12
)

coords = sub_df[['lat', 'lon','name']]


marker_cluster = MarkerCluster().add_to(m_s)

for lat, lon, name in zip(coords['lat'], coords['lon'], coords['name']):
    folium.Marker([lat, lon], tooltip = name, icon = folium.Icon(color="red")).add_to(marker_cluster)
m_s

 

tooltip 옵션을 추가해서 마커에 마우스를 대면 병원 이름이 뜨게 만들었다. 

 

 

 

 

 

 

 

여기서 생긴 문제!

전국 동물병원 시각화를 해서 html로 저장하고 싶었는데 전국으로 범위를 넓히면 시각화가 안 뜨는 오류가 발생했다.

찾아보니 folium은 데이터가 너무 많으면 안 될수도 있다고 한다. 

 

 

 

다음포스팅에서는 이런 이유로 pydeck을 이용한 시각화 과정을 다뤄보겠다.