아이디어
선한영향력을 행사하는 가게 데이터에 한하여, 지도map어플로 추천/리뷰/길찾아가기/예약 등 할 수 있는 포스팅어플을 만들어도 좋을 듯 합니다.
경기도 선한영향력가게 현황 데이터를 이용하여,
경기도 내의 상업권 지도 시각화 혼자 간단하게 해보기.
############################################
# OS환경 : Mac OS
# VS coda -> Jupyter lab
############################################ 초기셋팅
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib import font_manager, rc
import platform
import matplotlib
import warnings
warnings.filterwarnings('ignore')
############################################ 여기서 Matplotlib 코드를 사용하여 그래프 생성 및 표시
%matplotlib inline
############################################ 시각화 셋팅
import matplotlib.font_manager as fm
import matplotlib.pyplot as plt
## 폰트 설정 및 마이너스 부호 설정
plt.rc('font', family='NanumSquare') #나눔 글꼴로 설정
#plt.rc('font', family='Malgun Gothic') #맑은 고딕으로 설정
plt.rc('font', family='AppleGothic') #맥
plt.rcParams['axes.unicode_minus'] = False #부호
############################################ Google Maps 설치
# !pip install googlemaps
data = pd.read_csv('./learn/data20230930/경기도선한영향력가게현황.csv', encoding='euc-kr')
data.info()

data.head()

data['업종명'].unique()

sns.countplot(data = data , x = '업종명')

data = data[data['업종명']=='식음료']
data.head()

data = data[['시군명','상호명','정제도로명주소','정제WGS84위도','정제WGS84경도']]
data

data.isna().sum()

data[data['정제WGS84위도'].isna()]

위의 착한가게 4곳은 눈물은 머금고 drop시켜줍니다.. 안녕....
data = data.dropna(subset=['정제WGS84위도'])
data.isna().sum()

정제도로명주소에는 NaN값이 있어도 시각화하는데 문제없을듯 합니다.
어자피 위경도로 시각화 하니깐요.
# 클러스터 생성
from folium.plugins import MarkerCluster
m = folium.Map( # 새로운 Map 작성
location=[latitude, longitude],
zoom_start=16
)
coords =data[['정제WGS84위도','정제WGS84경도']] # 위도,경도에 해당하는 값만
# 클러스터링 코드
marker_cluster = MarkerCluster().add_to(m)
# 위도,경도를 반복문으로 상권들을 묶어주기
for lat, lng in zip(coords['정제WGS84위도'], coords['정제WGS84경도']):
folium.Marker([lat, lng], icon=folium.Icon(color='green')).add_to(marker_cluster)
# 클러스터링 해서 보여줌 = 상권을 묶어서 보여줌
m



이건 어떤 기능인지, 뭐라고 부르는 건지 잘 모르겠습니다.
구글링을 해도 잘 모르겠네요.
좀 더 folium기능에 대해 공부하면서 알아가야겠습니다.
클러스터링은 단순히 가게를 묶어서 보내주기 때문에
상가 하나하나 클릭하면서 확인은 어려운듯 합니다.
googlemaps을 통해 하나하나 상가를 찍을수 있는 형태로 시각화 하겠습니다.
# googlemaps 패키지
import googlemaps
gmaps = googlemaps.Client(key='AIzaSyD9xC어쩌구저쩌구이러쿵저러쿵') # API키는 비밀
위도, 경도 검색해서 지도에 찍는 함수를 만들어줍니다.
def viz_map(place):
# Google Maps API로 장소 정보 가져오기
results = gmaps.geocode(place)
lat, lng = None, None
# 모든 결과 확인
for result in results:
location = result['geometry']['location']
lat, lng = location['lat'], location['lng']
print(f'위도 {lat:.3f}, 경도 {lng:.3f}')
break
if lat is None:
return '검색 결과를 찾을 수 없습니다.'
m = folium.Map(
location=[lat, lng],
zoom_start=17,
width=800,
height=400,)
folium.Marker([lat, lng], popup=place).add_to(m)
return m
viz_map('비전5로 37')

다행히 잘 작동됩니다.
import folium
def visualize_locations(data):
# 데이터에서 위도와 경도를 하나씩 추출한 위치 + Map 화면 설정
m = folium.Map(
location=[data.loc[0, '정제WGS84위도'], data.loc[0, '정제WGS84경도']],
zoom_start=10
)
# 데이터에서 한줄 한줄 읽어오는 반복문
for index, row in data.iterrows():
# 가게 하나씩 marker로 찍기
marker = folium.Marker(
# 위치는 각 row의 위도, 경도
location=[row['정제WGS84위도'], row['정제WGS84경도']],
# 마우스커서 갖다대면 각 Row의 상호명
tooltip=row['상호명'],
# 마우스 클릭하면 네이버 검색창으로 이동 = HTML로 팝업관련 기능추가
popup=f"""
<div style='text-align: center;'>
<b>{row['상호명']}</b> ({row['시군명']})<br>
<a href='https://search.naver.com/search.naver?query={row['상호명']}' target='_blank'>네이버로 이동</a>
</div>
""",
# 그리고는 Map에 하나씩 저장합니다.
).add_to(m)
return m
# 함수 실행
visualize_locations(data)

다행히 지도가 잘 나왔습니다.
경기도내의 상가데이터이기 때문에, 다른 지역 상가는 나오지 않습니다.

마우스 커서를 갖다대면 각 가게마다 상호명이 확인됩니다.

마우스로 클릭하면, 상호명과 함께 네이버로이동 을 눌러, 네이버 검색창으로 바로 갈 수 있습니다.

import folium
import pandas as pd
import googlemaps
from folium import plugins
# Google Maps API 초기화
gmaps = googlemaps.Client(key='내구글api키는비밀입니다ㅏ아아아ㅏㅏ')
# 데이터 불러오기
data = pd.read_csv('./learn/data20230930/경기도선한영향력가게현황.csv', encoding='euc-kr')
def visualize_locations(data):
# NaN 값이 있는 행 제거
data = data.dropna(subset=['정제WGS84위도', '정제WGS84경도'])
m = folium.Map(
location=[data.loc[0, '정제WGS84위도'], data.loc[0, '정제WGS84경도']],
zoom_start=10
)
for index, row in data.iterrows():
# NaN 값이 있는 행은 건너뛰기
if pd.notna(row['정제WGS84위도']) and pd.notna(row['정제WGS84경도']):
marker = folium.Marker(
location=[row['정제WGS84위도'], row['정제WGS84경도']],
tooltip=row['상호명'],
popup=f"""
<div style='text-align: center;'>
<b>{row['상호명']}</b> ({row['시군명']})<br>
<a href='https://search.naver.com/search.naver?query={row['상호명']}' target='_blank'>네이버로 이동</a>
</div>
""",
).add_to(m)
return m
# 함수 실행
m = visualize_locations(data)
# HTML 파일로 저장
m.save('good_shops_naver.html')
제법 멋있습니다.