본문 바로가기
데이터 분석

상권별 업종 밀집 통계 예제

by 코낄2 2023. 12. 23.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

shop = pd.read_csv('/content/drive/MyDrive/KDT/데이터분석/데이터/shop_201806_01.csv')
pd.set_option('display.max_columns', 40)

shop.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 499328 entries, 0 to 499327
Data columns (total 39 columns):
 #   Column     Non-Null Count   Dtype  
---  ------     --------------   -----  
 0   상가업소번호     499328 non-null  int64  
 1   상호명        499327 non-null  object 
 2   지점명        66741 non-null   object 
 3   상권업종대분류코드  499328 non-null  object 
 4   상권업종대분류명   499328 non-null  object 
 5   상권업종중분류코드  499328 non-null  object 
 6   상권업종중분류명   499328 non-null  object 
 7   상권업종소분류코드  499328 non-null  object 
 8   상권업종소분류명   499328 non-null  object 
 9   표준산업분류코드   470597 non-null  object 
 10  표준산업분류명    470597 non-null  object 
 11  시도코드       499328 non-null  int64  
 12  시도명        499328 non-null  object 
 13  시군구코드      499328 non-null  int64  
 14  시군구명       499328 non-null  object 
 15  행정동코드      499328 non-null  int64  
 16  행정동명       499328 non-null  object 
 17  법정동코드      499328 non-null  int64  
 18  법정동명       499328 non-null  object 
 19  지번코드       499328 non-null  int64  
 20  대지구분코드     499328 non-null  int64  
 21  대지구분명      499328 non-null  object 
 22  지번본번지      499328 non-null  int64  
 23  지번부번지      412776 non-null  float64
 24  지번주소       499328 non-null  object 
 25  도로명코드      499328 non-null  int64  
 26  도로명        499328 non-null  object 
 27  건물본번지      499328 non-null  int64  
 28  건물부번지      64827 non-null   float64
 29  건물관리번호     499328 non-null  object 
 30  건물명        225178 non-null  object 
 31  도로명주소      499328 non-null  object 
 32  구우편번호      499328 non-null  int64  
 33  신우편번호      499319 non-null  float64
 34  동정보        43908 non-null   object 
 35  층정보        308195 non-null  object 
 36  호정보        71972 non-null   object 
 37  경도         499328 non-null  float64
 38  위도         499328 non-null  float64
dtypes: float64(5), int64(11), object(23)
memory usage: 148.6+ MB
  • 필요한 컬럼만 다시 저장
# shop.columns
view_columns = ['상호명','지점명','상권업종대분류명','상권업종중분류명','상권업종소분류명','시도명','시군구명','지번주소','도로명주소','도로명','경도','위도']
shop = shop[view_columns]
shop.head()

  • null값 확인
shop.isnull().sum()

상호명              1
지점명         432587
상권업종대분류명         0
상권업종중분류명         0
상권업종소분류명         0
시도명              0
시군구명             0
지번주소             0
도로명주소            0
도로명              0
경도               0
위도               0
dtype: int64
# 한글 사용할 때!
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
 
plt.rc('font', family = 'NanumBarunGothic')
shop.plot.scatter(x= '경도', y='위도', grid=True, figsize=(6,8))

  • 서울 데이터만 남기기. str.startswith()
# 도로명 주소 컬럼이 '서울'로 시작하는 사람
shop_seoul = shop.loc[shop['도로명주소'].str.startswith('서울')]

# ~ 붙이면 반대
shop_except_seoul = shop.loc[~shop['도로명주소'].str.startswith('서울')]
shop_seoul.plot.scatter(x='경도', y='위도', grid = True, figsize=(10,8))

# 시군구명 별로 다르게 표시
plt.figure(figsize=(14, 10))
sns.scatterplot(data = shop_seoul, x='경도', y='위도', hue='시군구명')

shop_seoul['상권업종대분류명'].value_counts()

음식          112894
소매          106490
생활서비스        57266
학문/교육        27717
의료           15299
부동산          13164
관광/여가/오락      9536
숙박            2790
스포츠            112
Name: 상권업종대분류명, dtype: int64
shop_seoul_edu= shop_seoul[shop_seoul['상권업종대분류명'] == '학문/교육']
shop_seoul_edu.shape
// (27717, 12)
plt.figure(figsize=(14, 10))
sns.scatterplot(data = shop_seoul_edu, x='경도', y='위도', hue='상권업종중분류명')

shop_seoul_edu_computer = shop_seoul_edu[shop_seoul_edu['상권업종중분류명'] =='학원-컴퓨터']
shop_seoul_edu_computer.shape
// (215, 12)

plt.figure(figsize=(14, 10))
sns.scatterplot(data= shop_seoul_edu_computer, x='경도', y='위도', hue='상권업종소분류명')

✔️ folium

Folium은 Python에서 지리적 데이터를 시각화하기 위한 라이브러리 중 하나입니다. 이 라이브러리는 Leaflet.js를 기반으로 하며, 인터랙티브하게 지도를 생성하고 표시하는 기능을 제공합니다. Folium을 사용하면 웹 기반 지도를 생성하고 이를 사용자에게 제공할 수 있습니다.

https://python-visualization.github.io/folium/latest/

 

Folium — Folium 0.1.dev1+g0f4d57f documentation

Folium builds on the data wrangling strengths of the Python ecosystem and the mapping strengths of the Leaflet.js library. Manipulate your data in Python, then visualize it in a Leaflet map via Folium. Concepts Folium makes it easy to visualize data that

python-visualization.github.io

설치 : !pip install folium

import folium

# folium.Map(location=[위도, 경도], zoom_start=배율, ...)
# Marker(): location 속성으로 지정한 위치에 마커를 생성
# popup(): 마커를 클릭했을 때, 표시 할 문자열 생성
# add_to(): 작성된 마커를 지도에 추가

map_folium = folium.Map(location = [37.500043085219545, 127.03557801473566], zoom_start = 17)
popup = folium.Popup('코리아IT아카데미', max_width=200)
folium.Marker(location=[37.500043085219545, 127.03557801473566], popup=popup).add_to(map_folium)
map_folium

# 지도: 37.56652479270633, 126.9779129116262
# 서울특별시청: 37.56652479270633, 126.9779129116262
# 덕수궁: 37.56585320879458, 126.97514572197248
# 서울지방경찰청: 37.57504045678939, 126.97195576938117
# 광화문: 37.57617987638928, 126.97694467807803
# 영풍문고-종로본점: 37.56999947440024, 126.98228391170936
from folium.features import CustomIcon

icon_image = '/content/2542067_ambulance_emergency_light_police_icon.png'
icon = CustomIcon(icon_image, icon_size=(45, 45))

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(color='red', icon='star')).add_to(map_folium)
popup = folium.Popup('덕수궁', max_width=200)
folium.Marker(location=[37.56585320879458, 126.97514572197248], popup=popup,
              icon=folium.Icon(color='pink', icon='ok')).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= 50, color='red', fill_color='#EC4074').add_to(map_folium)

data = shop_seoul_edu_computer
edu_map = folium.Map(location=[data['위도'].mean(), data['경도'].mean()], zoom_start=12)
for i in data.index:
    # 코리아IT아카데미 - 서울 강남구 역삼동 ...
    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(edu_map)

edu_map

data1 = shop_seoul.loc[shop_seoul['상권업종중분류명']=='커피점/카페',:]
data2 = data1.loc[data1['시군구명']=='강남구',:]

coffee_map = folium.Map(location=[data2['위도'].mean(), data2['경도'].mean()], zoom_start=14)
for i in data2.index:
    # 코리아IT아카데미 - 서울 강남구 역삼동 ...
    coffee_name = data2.loc[i, '상호명'] + ' - ' + data2.loc[i, '도로명주소']
    popup = folium.Popup(coffee_name, max_width=500)
    folium.Marker(location=[data2.loc[i, '위도'], data2.loc[i, '경도']], popup=popup).add_to(coffee_map)

coffee_map

'데이터 분석' 카테고리의 다른 글

boxplot / 따릉이 실시간 데이터 예제  (0) 2023.12.24
가상 쇼핑몰 데이터 예제  (0) 2023.12.16
Matplotlib  (0) 2023.12.10
판다스3  (0) 2023.12.08
판다스2  (0) 2023.12.08