※ 데이터 분석보다는 Seaborn과 Folium을 사용 해보는 것에 초점을 뒀습니다.
1. 공공데이터
- 공공데이터는 대한민국 정부에서 운영하는 공공데이터 포털로, 공공기관이 보유한 다양한 데이터를 국민과 기업, 개발자 등에게 개방하여 활용할 수 있도록 제공하는 플랫폼입니다.
- 데이터를 파일 형식(Excel, CSV 등)으로 다운로드 하거나, API 형태로 실시간 연동하여 사용할 수 있습니다.
2. 데이터 셋 확인
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# low_memory = False : 너무 큰 데이터라면 사용함
shop = pd.read_csv('/content/drive/MyDrive/(상위폴더1)/(상위폴더2)/Data/소상공인시장진흥공단_상가(상권)정보_서울_202409.csv', low_memory=False)
shop
# 컬럼 수가 많아서 set_option을 통해 40개까지 볼 수 있도록 조절
pd.set_option('display.max_columns', 40)
shop.info()
shop.columns
# 이번 데이터 분석에 필요한 컬럼들만 사용하기
view_columns = ['상호명', '지점명', '상권업종대분류명', '상권업종중분류명', '상권업종소분류명', '시도명', '시군구명', '도로명', '도로명주소', '경도', '위도']
shop = shop[view_columns]
shop.head()
# 결측값 개수 확인
shop.isnull().sum()
3. Seaborn
- Seaborn은 파이썬 데이터 시각화 라이브러리로, Matplotlib을 기반으로 하여 더 간결하고 미려한 그래프를 쉽게 그릴 수 있도록 설계된 도구입니다.
#Seaborn 라이브러리 설치 및 사용
!pip install seaborn
import seaborn as sns
#pyplot 한글 설정
# 이전 포스팅에 했던 pyplot 한글 지원 테크닉
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
plt.rc('font', family='NanumBarunGothic')
# 산점도 그리기
plt.figure(figsize=(10,8))
plt.scatter(shop['경도'], shop['위도'])
plt.xlabel('경도')
plt.ylabel('위도')
# 격자 무늬
plt.grid(True)
plt.show()
# 서울로 시작하지 않은 문자열이 있는지 확인
shop.loc[~shop['도로명주소'].str.startswith('서울')]
※ plt로 그렸던 산점도보다 간결하고 깔끔하게 그릴 수 있습니다.
plt.figure(figsize=(14,10))
# data에는 DataFrame이 들어가고 hue는 범례(반드시 있는 컬럼으로 해야함)
sns.scatterplot(data=shop, x='경도', y='위도', hue='시군구명')
# 교육으로 대분류 되어있는 데이터들 뽑기
shop_edu = shop[shop['상권업종대분류명'] == '교육']
shop_edu.shape
plt.figure(figsize=(14,10))
sns.scatterplot(data=shop_edu, x='경도', y='위도', hue='상권업종대분류명')
# 기타 교육으로 중분류 되어있는 데이터들 뽑기(shop_edu에서)
shop_edu_etc = shop_edu[shop_edu['상권업종중분류명'] == '기타 교육']
shop_edu_etc.shape
plt.figure(figsize=(14,10))
sns.scatterplot(data=shop_edu_etc, x='경도', y='위도', hue='상권업종중분류명')
# 컴퓨터 학원으로 소분류 되어있는 데이터들 뽑기
shop_edu_etc_computer = shop_edu_etc[shop_edu_etc['상권업종소분류명'] == '컴퓨터 학원']
shop_edu_etc_computer.shape
plt.figure(figsize=(14,10))
# data에는 df이 들어가고 hue는 범례(반드시 있는 컬럼으로 해야함)
sns.scatterplot(data=shop_edu_etc_computer, x='경도', y='위도', hue='상권업종소분류명')
4. Folium
- Folium은 파이썬에서 대화형 지도(interactive map)를 생성할 수 있는 라이브러리 입니다.
- 특히, 지리 데이터(Geospatial Data) 시각화에 최적화 되어있으며, 간단한 코드로 복잡한 지도 기능을 구현할 수 있도록 도와줍니다.
#Folium라이브러리 설치 및 사용
!pip install folium
import folium
※ 입력값은 정보 확인 후 입력하였습니다.
# 최초 지도의 중앙 경도, 위도 값을 설정 후 확대 정도를 설정함
map_folium = folium.Map(location=[37.56652479270633, 126.9779129116262], zoom_start=15)
# popup : 지도에 핀을 꽂을 수 있도록 함
popup = folium.Popup('서울특별시청', max_width=200)
folium.Marker(location=[37.56652479270633, 126.9779129116262], popup=popup).add_to(map_folium)
popup = folium.Popup('덕수궁', max_width=200)
folium.Marker(location=[37.56585320879458, 126.97514572197248], popup=popup).add_to(map_folium)
popup = folium.Popup('서울지방경찰청', max_width=200)
folium.Marker(location=[37.57504045678939, 126.97195576938117], popup=popup).add_to(map_folium)
popup = folium.Popup('광화문', max_width=200)
folium.Marker(location=[37.57617987638928, 126.97694467807803], popup=popup).add_to(map_folium)
popup = folium.Popup('영풍문고-종로본점', max_width=200)
folium.Marker(location=[37.56999947440024, 126.98228391170936], popup=popup).add_to(map_folium)
map_folium
# 핀(popup)을 커스터마이징 할 수 있는 모듈
from folium.features import CustomIcon
icon = CustomIcon('police.png', icon_size=(48, 48))
map_folium = folium.Map(location=[37.56652479270633, 126.9779129116262], zoom_start=15)
popup = folium.Popup('서울특별시청', max_width=200)
folium.Marker(location=[37.56652479270633, 126.9779129116262], popup=popup, icon=folium.Icon(icon='star', color='red')).add_to(map_folium)
popup = folium.Popup('덕수궁', max_width=200)
folium.Marker(location=[37.56585320879458, 126.97514572197248], popup=popup, icon=folium.Icon(icon='ok', color='pink')).add_to(map_folium)
popup = folium.Popup('서울지방경찰청', max_width=200)
folium.Marker(location=[37.57504045678939, 126.97195576938117], popup=popup, icon=icon).add_to(map_folium)
popup = folium.Popup('광화문', max_width=200)
folium.Marker(location=[37.57617987638928, 126.97694467807803], popup=popup).add_to(map_folium)
# CircleMarker(): 원의 범위를 마커로 설정
popup = folium.Popup('내 땅', max_width=200)
folium.CircleMarker(location=[37.56999947440024, 126.98228391170936], popup=popup, radius=30, color='blue', fill_color='deepskyblue').add_to(map_folium)
map_folium
※ 진행중인 데이터 셋을 그려보겠습니다.
data = shop_edu_etc_computer
adu_map = folium.Map(location=[data['위도'].mean(), data['경도'].mean()], zoom_start=12)
for i in data.index :
edu_name = data.loc[i, '상호명'] + '-' + data.loc[i, '도로명주소']
popup = folium.Popup(edu_name, max_width=500)
folium.Marker(location=[data.loc[i, '위도'], data.loc[i, '경도']], popup=popup).add_to(adu_map)
adu_map