[Python활용 혼자 공간분석해보기] 경기도 선한영향력가게 시각화

Hyejin Beck·2023년 12월 12일

Python

목록 보기
12/23

아이디어

선한영향력을 행사하는 가게 데이터에 한하여, 지도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을 통해 하나하나 상가를 찍을수 있는 형태로 시각화 하겠습니다.

GoogleMap 시각화

# 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')

제법 멋있습니다.

profile
데이터기반 스토리텔링을 통해 인사이트를 얻습니다.

0개의 댓글