본문 바로가기
인공지능/데이터분석

소상공인시장진흥공단_상가정보 데이터셋

by hyunji00pj 2025. 1. 17.

1. 공공데이터

공공데이터(data.go.kr)는 대한민국 정부에서 운영하는 공공데이터 포털로, 공공기관이 보유한 다양한 데이터를 국민과 기업, 개발자 등에게 개방하여 활용할 수 있도록 제공하는 플랫폼입니다. 데이터를 파일 형식(Excel, CSV 등)으로 다운로드하거나, API 형태로 실시간 연동하여 사용할 수 있습니다.

 

1. "소상공인시장진흥공단_상가(상권)정보"을 검색 후  압축파일을 다운로드합니다.

2. 압축을 해제하고 "서울" csv 데이터를 구글드라이브에 업로드합니다.

https://www.data.go.kr/data/15083033/fileData.do

 

소상공인시장진흥공단_상가(상권)정보_20240930

영업 중인 전국 상가업소 데이터를 제공합니다.<br/>(상호명, 업종코드, 업종명, 지번주소, 도로명주소, 경도, 위도 등)<br/><br/>[데이터 변경 안내] <br/><br/>1. 상권업종분류 : 표준산업분류 기반 업

www.data.go.kr

 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
shop = pd.read_csv('/content/drive/MyDrive/KDT 시즌4/9. LLM 서비스 기초/10.데이터 분석/Data/소상공인시장진흥공단_상가(상권)정보_서울_202409.csv', low_memory=False)
shop
#low_memory=False 메모리 불러오는거 문제 없게

pd.set_option('display.max_columns', 40)
shop

 

컬럼을 다 볼수 있게 max_columns 40으로 조정

shop.info()

shop.columns
# Index(['상가업소번호', '상호명', '지점명', '상권업종대분류코드', '상권업종대분류명', '상권업종중분류코드',
#       '상권업종중분류명', '상권업종소분류코드', '상권업종소분류명', '표준산업분류코드', '표준산업분류명', '시도코드',
#       '시도명', '시군구코드', '시군구명', '행정동코드', '행정동명', '법정동코드', '법정동명', '지번코드',
#       '대지구분코드', '대지구분명', '지번본번지', '지번부번지', '지번주소', '도로명코드', '도로명', '건물본번지',
#       '건물부번지', '건물관리번호', '건물명', '도로명주소', '구우편번호', '신우편번호', '동정보', '층정보',
#       '호정보', '경도', '위도'],
#      dtype='object')
view_columns = ['상호명', '지점명', '상권업종대분류명', '상권업종중분류명','상권업종소분류명', '시도명', '시군구명', '도로명', '도로명주소','경도', '위도']
shop = shop[view_columns]
shop.head()

shop.isnull().sum()

!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('경도')  # x축 레이블
plt.ylabel('위도')  # y축 레이블 #x축에는 경도 y축에는 위도
plt.grid(True)  # 그리드 추가
plt.show()  # 그래프 출력

맵을 보면 모양으로 봐서는 서울의 소상공인 데이터 셋인것 같다

len(shop)
# 466022
shop.loc[shop['도로명주소'].str.startswith('서울')]

shop.loc[~shop['도로명주소'].str.startswith('서울')]

도로명주소가 서울로 시작하지 않는 값이 혹시나 있나 확인

없음

 

2. Seaborn

Seaborn은 파이썬 데이터 시각화 라이브러리로, Matplotlib을 기반으로 하여 더 간결하고 미려한 그래프를 쉽게 그릴 수 있도록 설계된 도구입니다. Seaborn은 기본 스타일이 세련되고 미려하여 추가적인 스타일 설정 없이도 깔끔한 그래프를 그릴 수 있습니다.

https://seaborn.pydata.org/

 

seaborn: statistical data visualization — seaborn 0.13.2 documentation

seaborn: statistical data visualization

seaborn.pydata.org

pip install seaborn
import seaborn as sns
plt.figure(figsize=(14, 10))
sns.scatterplot(data=shop, x='경도', y='위도', hue='시군구명') # hue='시군구명' 범례 설정

서울에는 컴퓨터 학원이 몇개나 있는지 한번 찾아서 맵에 그려보도록 하자

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

shop_edu = shop[shop['상권업종대분류명'] == '교육']
shop_edu

shop_edu_etc = shop_edu[shop_edu['상권업종중분류명'] == '기타 교육']
shop_edu_etc

shop_edu_etc_computer = shop_edu_etc[shop_edu_etc['상권업종소분류명'] == '컴퓨터 학원']
shop_edu_etc_computer

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

3. Folium

Folium은 파이썬에서 대화형 지도(interactive map)를 생성할 수 있는 라이브러리입니다. 특히, 지리 데이터(Geospatial Data) 시각화에 최적화되어 있으며, 간단한 코드로 복잡한 지도 기능을 구현할 수 있도록 도와줍니다.

pip install folium
import folium
map_folium = folium.Map(location=[37.56652479270633, 126.9779129116262], zoom_start=15)
#Map 메소드를 이용해서 로케이션에 위도 경도를 넣고 지도 확대 수치를 zoom_start 여기에 넣어서 저장
popup = folium.Popup('서울특별시청', max_width=200)
#마커를 클릭했을때 뜨는 메세지를 popup에 저장 메세지의 가로 사이즈 설정
folium.Marker(location=[37.56652479270633, 126.9779129116262], popup=popup).add_to(map_folium)
#마커 (핀)을 찍어줌 지도 안에 포함된 위경도를 설정해서  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

저 위에 있는 칙칙한 핀들도 바꿀수 있다 한번 바꿔보자

#마커 바꾸는 방법
icon = folium.CustomIcon('/content/police.png',icon_size=(48,48))

#아이콘 바꾸기 icon=folium.Icon(icon='star',color='red')
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

edu_map = folium.Map(location=[data['위도'].mean(),data['경도'].mean()],zoom_start=12)

for i in data.index:
    edu_name = data.loc[i,'상호명'] + " - " + data.loc[i,'도로명주소']
    # print(edu_name)
    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

아까 컴퓨터 학원을 분류해 낸걸로 지도에 핀을 찍어보자