호쌤
호쌤 Just For Fun

[Python 데이터 시각화] SVG 파일을 활용한 지도 시각화

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[Python 데이터 시각화] SVG 파일을 활용한 지도 시각화≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

[Python 데이터 시각화] SVG 파일을 활용한 지도 시각화

SVG(Scalable Vector Graphics)는 JPEG, PNG와 같은 그래픽 포맷(Graphic format)의 하나로서 벡터 기반이기 때문에 리사이징이 되어도 전혀 깨지지 않고 모든 해상도에서 자유자재로 활용할 수 있는 이미지 형식 입니다.

SVG파일 포멧은 XML로 구성되어 있기 때문에 BeautilfulSoup 패키지를 활용하여 HTML 파싱과 같은 구현과정을 통해 원하는 부분을 취득, 변형 할 수 있습니다.

#01. 패키지 가져오기

pip install –upgrade bs4

1
2
3
4
5
6
7
8
9
# jupyter 상에서 SVG 이미지를 표시하기 위한 패키지
from IPython.display import SVG
# TAG로부터 원하는 내용을 추출하는 클래스 -> SVG 이미지의 핸들링을 위함
from bs4 import BeautifulSoup

from pandas import DataFrame
from pandas import ExcelFile

import numpy

#02. 데이터 수집 (서울시 구별 노인여가복지시설 / 공공데이터포털)

수업시간중의 샘플 파일은 원본 엑셀 파일에서 어느정도의 전처리가 이루어진 결과물입니다.

1
2
3
4
# 엑셀 파일을 원격으로 내려받아 데이터프레임으로 변환 (다소 시간이 소요된다.)
xlsx = ExcelFile("http://itpaper.co.kr/demo/py/senior_lsf.xlsx")
df = xlsx.parse(xlsx.sheet_names[0])
df
▶ 출력결과
COUNTY NUMBER
0 Jongno-gu 61
1 Jung-gu 53
2 Yongsan-gu 110
3 Seongdong-gu 155
4 Gwangjin-gu 103
5 Dongdaemun-gu 146
6 Jungnang-gu 128
7 Seongbuk-gu 158
8 Gangbuk-gu 111
9 Dobong-gu 139
10 Nowon-gu 252
11 Eunpyeong-gu 154
12 Seodaemun-gu 103
13 Mapo-gu 160
14 Yangcheon-gu 192
15 Gangseo-gu 215
16 Guro-gu 192
17 Geumcheon-gu 75
18 Yeongdeungpo-gu 208
19 Dongjak-gu 143
20 Gwanak-gu 127
21 Seocho-gu 129
22 Gangnam-gu 184
23 Songpa-gu 173
24 Gangdong-gu 140

#02. 지도 가져오기

1) 지도 파일 열기

위키미디어에서 Seoul districts.svg 키워드로 검색하여 서울 지도 이미지를 내려받아 map_seoul.svg라는 이름으로 작업 폴더에 추가

svg

https://commons.wikimedia.org/wiki/File:Seoul_districts.svg?uselang=ko

혹은 다음의 URL에서 내려받을 수 있습니다. http://itpaper.co.kr/demo/py/map_seoul.svg

내려받은 svg 파일을 open()함수로 연다.

svg파일은 그래픽 포멧이지만 XML코드로 되어 있는 텍스트 파일의 종류이므로 open() 함수를 통해 읽어들일 경우 XML 소스코드 원본을 얻을 수 있다.

1
2
3
4
5
map_svg = None
with open('res/map_seoul.svg', 'r') as f:
    map_svg = f.read()
    
map_svg

출력결과는 XML 형식의 소스코드이다.

jupyter에서는 줄바꿈,들여쓰기가 적용되지 않은 원시데이터 형태의 텍스트를 출력하지만 여기서는 줄바꿈과 들여쓰기를 적용하여 정리한 결과물의 스크린샷을 표시했다.

<path> 태그 안에서 id속성이 각 구의 이름을 의미하는 속성이고, fill은 해당 지역을 표시하는 색상값, d는 해당 지역을 그래픽에서 표시하기 위한 2d 좌표값이다.

SVG 시각화는 XML 코드를 BeautifulSoup으로 파싱하여 내가 원하는 지역명을 id속성값으로 갖는 <path>태그에 대한 fill 속성을 다른 색상으로 치환하는 방식으로 진행된다.

▶ 출력결과

svg

2) 원하는 내용만 가져오기

svg파일의 내용을 BeautifulSoup객체로 변환한 후 id속성을 갖는 path 태그만 추출

lxml관련 경고가 표시될 경우 무시.

1
2
3
soup = BeautifulSoup(map_svg)
paths = soup.select('path[id]')
paths
▶ 출력결과

좌표값을 의미하는 d속성은 여기서는 의미 없으므로 생략하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[<path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Dobong-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Dongdaemun-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Dongjak-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Eunpyeong-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Gangbuk-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Gangdong-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Gangseo-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Geumcheon-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Guro-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Gwanak-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Gwangjin-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Gangnam-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Jongno-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Jung-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Jungnang-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Mapo-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Nowon-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Seocho-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Seodaemun-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Seongbuk-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Seongdong-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Songpa-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Yangcheon-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Yeongdeungpo-gu"></path>,
 <path clip-rule="evenodd" d="... 생략 ..." fill="#C8C8C8" fill-rule="evenodd" id="Yongsan-gu"></path>]

#03. 데이터 시각화

1) 시각화 준비

단계는 분석가가 임의로 정한다.

색상값을 1단계 ~ 높은단계 순으로 점점 진한 색상이 되도록 구성

1
2
# 사용할 색상값 (단계별로 6개 색상 준비)
colors = ['#F1EEF6', '#D4B9DA', '#C994C7', '#DF65B9', '#DD1C77', '#980043']

2) 지도의 각 구역만큼 반복

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
for p in paths:
    #print(p['id'])

    # 데이터프레임에서 지역명에 대한 복지시설 수 조회하기
    tmp_df = df.query("COUNTY == '" + p['id'] + "'")
    #print(tmp_df)
    
    # 복지시설 수
    count = tmp_df.loc[tmp_df.index[0], 'NUMBER']
    #print("%s >> %d" % (p['id'], count ))
    
    # 복지시설 수에 따라 단계값 설정 (단계는 색상값의 수에 따름)
    if count > 250:   color_index = 5
    elif count > 200: color_index = 4
    elif count > 150: color_index = 3
    elif count > 100: color_index = 2
    elif count > 50:  color_index = 1
    else:             color_index = 0
    
    # 가져온 svg 이미지의 path 태그들의 fill 속성에 선정한 단계의 색상값 적용
    p['fill'] = colors[color_index]
      
    print(p)
▶ 출력결과

<path>태그의 fill 속성이 회색(#C8C8C8)에서 for문에서 지정한 색상값으로 변경되었음을 확인할 수 있다.

좌표값을 의미하는 d속성은 여기서는 의미 없으므로 생략하였다. … 생략 …

3) 재구성된 내용을 추출하여 새로운 svg 소스코드 얻기

1
2
3
4
5
new_svg = soup.prettify()

# jupyter에서 svg 이미지 표시하기
# -> SVG(소스문자열)  혹은 SVG(파일경로)
SVG(new_svg)
▶ 출력결과

svg

파일로 저장

1
2
with open('new_svg.svg', 'w') as f:
    f.write(new_svg)

#04. 전국의 학교 분포 시각화

1) 데이터 수집

1
2
3
4
# 엑셀 파일을 원격으로 내려받아 데이터프레임으로 변환 (다소 시간이 소요된다.)
xlsx = ExcelFile("http://itpaper.co.kr/demo/py/school2019.xlsx")
학교df = xlsx.parse(xlsx.sheet_names[0])
학교df
▶ 출력결과
학교ID 학교명 학교급구분 설립일자 설립형태 본교분교구분 운영상태 소재지지번주소 소재지도로명주소 시도교육청코드 시도교육청명 교육지원청코드 교육지원청명 생성일자 변경일자 위도 경도 데이터기준일자 제공기관코드 제공기관명
0 B000001838 서울휘경초등학교 초등학교 1959-10-10 공립 본교 운영 서울특별시 동대문구 휘경동 302-2 서울특별시 동대문구 망우로6길 48 7010000 서울특별시교육청 7021000 서울특별시동부교육지원청 2013-11-29 2019-09-10 37.585736 127.058122 2019-09-16 7001220 한국교원대학교
1 B000001839 서울동답초등학교 초등학교 1984-05-23 공립 본교 운영 서울특별시 동대문구 답십리동 2-24 서울특별시 동대문구 답십리로60길 12 7010000 서울특별시교육청 7021000 서울특별시동부교육지원청 2013-11-29 2019-09-10 37.571817 127.064205 2019-09-16 7001220 한국교원대학교
2 B000001840 서울답십리초등학교 초등학교 1962-11-29 공립 본교 운영 서울특별시 동대문구 답십리동 274 서울특별시 동대문구 전농로3길 23 7010000 서울특별시교육청 7021000 서울특별시동부교육지원청 2013-11-29 2019-09-10 37.569003 127.055423 2019-09-16 7001220 한국교원대학교
3 B000001841 서울신답초등학교 초등학교 1972-05-09 공립 본교 운영 서울특별시 동대문구 답십리동 463-13 서울특별시 동대문구 천호대로 177 7010000 서울특별시교육청 7021000 서울특별시동부교육지원청 2013-11-29 2019-09-10 37.573001 127.043399 2019-09-16 7001220 한국교원대학교
4 B000001842 서울용두초등학교 초등학교 1948-11-01 공립 본교 운영 서울특별시 동대문구 용두동 237-1 서울특별시 동대문구 천호대로13길 43 7010000 서울특별시교육청 7021000 서울특별시동부교육지원청 2013-11-29 2019-09-10 37.575743 127.028885 2019-09-16 7001220 한국교원대학교
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
11868 B000027396 평택새빛초등학교 초등학교 2019-09-01 공립 본교 운영 경기도 평택시 칠원동 산36-34 경기도 평택시 신촌2로 33(칠원동) 7530000 경기도교육청 7631000 경기도평택교육지원청 2013-11-29 2019-09-10 37.024922 127.105114 2019-09-16 7001220 한국교원대학교
11869 B000027418 마장초등학교 초등학교 1920-12-04 공립 본교 운영 경기도 이천시 마장면 오천리 19-1 경기도 이천시 마장면 오천로 130 7530000 경기도교육청 7741000 경기도이천교육지원청 2013-11-29 2019-09-10 37.246497 127.358475 2019-09-16 7001220 한국교원대학교
11870 B000027505 인천중산초등학교 초등학교 2019-03-01 공립 본교 운영 인천광역시 중구 중산동 1887-3 인천광역시 중구 두미포로 100 7310000 인천광역시교육청 7321000 인천광역시남부교육지원청 2013-11-29 2019-09-10 37.494695 126.565599 2019-09-16 7001220 한국교원대학교
11871 B000027506 인천중산중학교 중학교 2019-03-01 공립 본교 운영 인천광역시 중구 중산동 1914-2 인천광역시 중구 두미포로 189 7310000 인천광역시교육청 7321000 인천광역시남부교육지원청 2013-11-29 2019-09-10 37.498222 126.571277 2019-09-16 7001220 한국교원대학교
11872 B000027509 해누리중학교 중학교 2019-03-01 공립 본교 운영 서울특별시 송파구 가락동 479 서울특별시 송파구 송파대로37길 95 7010000 서울특별시교육청 7071000 서울특별시강동송파교육지원청 2013-11-29 2019-09-10 37.497612 127.102533 2019-09-16 7001220 한국교원대학교

11873 rows × 20 columns

2) 데이터 전처리 및 정제

필요한 필드만 추출하기

1
2
학교추출df = 학교df.filter(['학교명', '학교급구분', '소재지도로명주소'])
학교추출df
▶ 출력결과
학교명 학교급구분 소재지도로명주소
0 서울휘경초등학교 초등학교 서울특별시 동대문구 망우로6길 48
1 서울동답초등학교 초등학교 서울특별시 동대문구 답십리로60길 12
2 서울답십리초등학교 초등학교 서울특별시 동대문구 전농로3길 23
3 서울신답초등학교 초등학교 서울특별시 동대문구 천호대로 177
4 서울용두초등학교 초등학교 서울특별시 동대문구 천호대로13길 43
... ... ... ...
11868 평택새빛초등학교 초등학교 경기도 평택시 신촌2로 33(칠원동)
11869 마장초등학교 초등학교 경기도 이천시 마장면 오천로 130
11870 인천중산초등학교 초등학교 인천광역시 중구 두미포로 100
11871 인천중산중학교 중학교 인천광역시 중구 두미포로 189
11872 해누리중학교 중학교 서울특별시 송파구 송파대로37길 95

11873 rows × 3 columns

데이터 정제

각 열별로 결측치 확인
1
학교추출df.isna().sum()
▶ 출력결과
1
2
3
4
학교명         0
학교급구분       0
소재지도로명주소    1
dtype: int64
결측치가 존재하므로 해당 데이터 삭제
1
2
3
최종df = 학교추출df.copy()
최종df.dropna(inplace=True)
최종df.isna().sum()
▶ 출력결과
1
2
3
4
학교명         0
학교급구분       0
소재지도로명주소    0
dtype: int64

주소에서 시,도 이름만 추출하기

주소값에서 첫 번째 공백의 위치를 별도 컬럼으로 추가함
1
2
최종df['idx'] = 최종df['소재지도로명주소'].str.find(' ').astype(int)
최종df
▶ 출력결과
학교명 학교급구분 소재지도로명주소 idx
0 서울휘경초등학교 초등학교 서울특별시 동대문구 망우로6길 48 5
1 서울동답초등학교 초등학교 서울특별시 동대문구 답십리로60길 12 5
2 서울답십리초등학교 초등학교 서울특별시 동대문구 전농로3길 23 5
3 서울신답초등학교 초등학교 서울특별시 동대문구 천호대로 177 5
4 서울용두초등학교 초등학교 서울특별시 동대문구 천호대로13길 43 5
... ... ... ... ...
11868 평택새빛초등학교 초등학교 경기도 평택시 신촌2로 33(칠원동) 3
11869 마장초등학교 초등학교 경기도 이천시 마장면 오천로 130 3
11870 인천중산초등학교 초등학교 인천광역시 중구 두미포로 100 5
11871 인천중산중학교 중학교 인천광역시 중구 두미포로 189 5
11872 해누리중학교 중학교 서울특별시 송파구 송파대로37길 95 5

11872 rows × 4 columns

주소에서 첫 번째 공백의 위치까지 잘라낸 값을 새로운 컬럼으로 추가

전체 반복문 처리이므로 다소 시간이 소요됨

1
2
3
4
5
6
7
8
9
결과df = 최종df.copy()

for i in 결과df.index:
    addr = 결과df.loc[i, '소재지도로명주소']
    idx = 결과df.loc[i, 'idx']
    city = addr[:idx]
    결과df.loc[i, '시도'] = city
    
결과df
▶ 출력결과
학교명 학교급구분 소재지도로명주소 idx 시도
0 서울휘경초등학교 초등학교 서울특별시 동대문구 망우로6길 48 5 서울특별시
1 서울동답초등학교 초등학교 서울특별시 동대문구 답십리로60길 12 5 서울특별시
2 서울답십리초등학교 초등학교 서울특별시 동대문구 전농로3길 23 5 서울특별시
3 서울신답초등학교 초등학교 서울특별시 동대문구 천호대로 177 5 서울특별시
4 서울용두초등학교 초등학교 서울특별시 동대문구 천호대로13길 43 5 서울특별시
... ... ... ... ... ...
11868 평택새빛초등학교 초등학교 경기도 평택시 신촌2로 33(칠원동) 3 경기도
11869 마장초등학교 초등학교 경기도 이천시 마장면 오천로 130 3 경기도
11870 인천중산초등학교 초등학교 인천광역시 중구 두미포로 100 5 인천광역시
11871 인천중산중학교 중학교 인천광역시 중구 두미포로 189 5 인천광역시
11872 해누리중학교 중학교 서울특별시 송파구 송파대로37길 95 5 서울특별시

11872 rows × 5 columns

3) 데이터 분석 - 지역별, 학교별 집계

사용할 컬럼 추출

그룹분석 결과를 피벗테이블로 재구성하기 위해 as_index=False 파라미터를 사용하여 인덱스를 병합하지 않도록 지정한다.

1
2
결과추출df = 결과df.filter(['시도','학교급구분','학교명'])
결과추출df
▶ 출력결과
시도 학교급구분 학교명
0 서울특별시 초등학교 서울휘경초등학교
1 서울특별시 초등학교 서울동답초등학교
2 서울특별시 초등학교 서울답십리초등학교
3 서울특별시 초등학교 서울신답초등학교
4 서울특별시 초등학교 서울용두초등학교
... ... ... ...
11868 경기도 초등학교 평택새빛초등학교
11869 경기도 초등학교 마장초등학교
11870 인천광역시 초등학교 인천중산초등학교
11871 인천광역시 중학교 인천중산중학교
11872 서울특별시 중학교 해누리중학교

11872 rows × 3 columns

시,도의 데이터 분포 확인

전북, 전남, 충북, 충남, 대구의 이름에 대한 이상치가 존재하므로 보정이 필요하다.

1
결과추출df['시도'].value_counts()
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
경기도        2415
서울특별시      1308
경상남도        972
경상북도        960
전라남도        859
전라북도        766
충청남도        726
강원도         650
부산광역시       618
인천광역시       521
충청북도        475
대구광역시       447
광주광역시       313
대전광역시       300
울산광역시       241
제주특별자치도     200
세종특별자치시      90
충북            3
경남            3
전북            2
경북            1
전남            1
대구            1
Name: 시도, dtype: int64

시,도 이름 보정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
값보정df = 결과추출df.copy()

# 보정해야 할 이름 조건 나열
conditions = [  (결과추출df['시도'] == '경남'),
                (결과추출df['시도'] == '경북'),
                (결과추출df['시도'] == '전남'),
                (결과추출df['시도'] == '전북'),
                (결과추출df['시도'] == '충남'),
                (결과추출df['시도'] == '충북'),
                (결과추출df['시도'] == '대구')  ]

# 보정될 이름값 나열
name = ['경상남도', '경상북도', '전라남도', '전라북도', '충청남도', '충청북도', '대구광역시']

# 시도 이름 보정
# -> default는 모든 조건이 맞지 않을 경우의 적용할 값
# -> 여기서는 `시도` 컬럼의 값을 그대로 사용하도록 지정
값보정df['시도'] = numpy.select(conditions, name, default=값보정df['시도'])

값보정df
▶ 출력결과
시도 학교급구분 학교명
0 서울특별시 초등학교 서울휘경초등학교
1 서울특별시 초등학교 서울동답초등학교
2 서울특별시 초등학교 서울답십리초등학교
3 서울특별시 초등학교 서울신답초등학교
4 서울특별시 초등학교 서울용두초등학교
... ... ... ...
11868 경기도 초등학교 평택새빛초등학교
11869 경기도 초등학교 마장초등학교
11870 인천광역시 초등학교 인천중산초등학교
11871 인천광역시 중학교 인천중산중학교
11872 서울특별시 중학교 해누리중학교

11872 rows × 3 columns

그룹분석

그룹분석 결과를 피벗테이블로 재구성하기 위해 as_index=False 파라미터를 사용하여 인덱스를 병합하지 않도록 지정한다.

1
2
집계df = 값보정df.groupby(['시도', '학교급구분'], as_index=False).count()
집계df
▶ 출력결과
시도 학교급구분 학교명
0 강원도 고등학교 110
1 강원도 중학교 162
2 강원도 초등학교 378
3 경기도 고등학교 474
4 경기도 중학교 635
5 경기도 초등학교 1306
6 경상남도 고등학교 190
7 경상남도 중학교 266
8 경상남도 초등학교 519
9 경상북도 고등학교 184
10 경상북도 중학교 269
11 경상북도 초등학교 508
12 광주광역시 고등학교 67
13 광주광역시 중학교 90
14 광주광역시 초등학교 156
15 대구광역시 고등학교 93
16 대구광역시 중학교 126
17 대구광역시 초등학교 229
18 대전광역시 고등학교 62
19 대전광역시 중학교 88
20 대전광역시 초등학교 150
21 부산광역시 고등학교 142
22 부산광역시 중학교 172
23 부산광역시 초등학교 304
24 서울특별시 고등학교 320
25 서울특별시 중학교 385
26 서울특별시 초등학교 603
27 세종특별자치시 고등학교 18
28 세종특별자치시 중학교 24
29 세종특별자치시 초등학교 48
30 울산광역시 고등학교 57
31 울산광역시 중학교 63
32 울산광역시 초등학교 121
33 인천광역시 고등학교 125
34 인천광역시 중학교 135
35 인천광역시 초등학교 261
36 전라남도 고등학교 141
37 전라남도 중학교 254
38 전라남도 초등학교 465
39 전라북도 고등학교 136
40 전라북도 중학교 209
41 전라북도 초등학교 423
42 제주특별자치도 고등학교 34
43 제주특별자치도 중학교 47
44 제주특별자치도 초등학교 119
45 충청남도 고등학교 118
46 충청남도 중학교 188
47 충청남도 초등학교 420
48 충청북도 고등학교 84
49 충청북도 중학교 126
50 충청북도 초등학교 268

컬럼이름 변경

1
2
집계결과df = 집계df.rename(columns={'학교명': '학교수'})
집계결과df
▶ 출력결과
시도 학교급구분 학교수
0 강원도 고등학교 110
1 강원도 중학교 162
2 강원도 초등학교 378
3 경기도 고등학교 474
4 경기도 중학교 635
5 경기도 초등학교 1306
6 경상남도 고등학교 190
7 경상남도 중학교 266
8 경상남도 초등학교 519
9 경상북도 고등학교 184
10 경상북도 중학교 269
11 경상북도 초등학교 508
12 광주광역시 고등학교 67
13 광주광역시 중학교 90
14 광주광역시 초등학교 156
15 대구광역시 고등학교 93
16 대구광역시 중학교 126
17 대구광역시 초등학교 229
18 대전광역시 고등학교 62
19 대전광역시 중학교 88
20 대전광역시 초등학교 150
21 부산광역시 고등학교 142
22 부산광역시 중학교 172
23 부산광역시 초등학교 304
24 서울특별시 고등학교 320
25 서울특별시 중학교 385
26 서울특별시 초등학교 603
27 세종특별자치시 고등학교 18
28 세종특별자치시 중학교 24
29 세종특별자치시 초등학교 48
30 울산광역시 고등학교 57
31 울산광역시 중학교 63
32 울산광역시 초등학교 121
33 인천광역시 고등학교 125
34 인천광역시 중학교 135
35 인천광역시 초등학교 261
36 전라남도 고등학교 141
37 전라남도 중학교 254
38 전라남도 초등학교 465
39 전라북도 고등학교 136
40 전라북도 중학교 209
41 전라북도 초등학교 423
42 제주특별자치도 고등학교 34
43 제주특별자치도 중학교 47
44 제주특별자치도 초등학교 119
45 충청남도 고등학교 118
46 충청남도 중학교 188
47 충청남도 초등학교 420
48 충청북도 고등학교 84
49 충청북도 중학교 126
50 충청북도 초등학교 268

집계결과를 피벗 테이블로 재배치

1
2
pivot_df = 집계결과df.pivot('시도', '학교급구분', '학교수')
pivot_df
▶ 출력결과
학교급구분 고등학교 중학교 초등학교
시도
강원도 110 162 378
경기도 474 635 1306
경상남도 190 266 519
경상북도 184 269 508
광주광역시 67 90 156
대구광역시 93 126 229
대전광역시 62 88 150
부산광역시 142 172 304
서울특별시 320 385 603
세종특별자치시 18 24 48
울산광역시 57 63 121
인천광역시 125 135 261
전라남도 141 254 465
전라북도 136 209 423
제주특별자치도 34 47 119
충청남도 118 188 420
충청북도 84 126 268

4) 데이터 시각화

SVG 파일 열기

위키미디어에서 Korea districts.svg 키워드로 검색하여 서울 지도 이미지를 내려받아 map_korea.svg라는 이름으로 작업 폴더에 추가

svg

https://commons.wikimedia.org/wiki/File:District_map_of_South_Korea_2013.png

혹은 다음의 URL에서 내려받을 수 있습니다. http://itpaper.co.kr/demo/py/map_korea.svg

1
2
3
4
5
map_svg = None
with open('./res/map_korea.svg', 'r', encoding='utf-8') as f:
    map_svg = f.read()
    
SVG(map_svg)
▶ 출력결과

svg

지도 시각화 준비

사용할 색상값 (단계별로 6개 색상 준비)
1
2
colors = ['#F1EEF6', '#D4B9DA', '#C994C7', '#DF65B9', '#DD1C77', '#980043']
colors
▶ 출력결과
1
['#F1EEF6', '#D4B9DA', '#C994C7', '#DF65B9', '#DD1C77', '#980043']
svg 데이터 로드
1
2
soup = BeautifulSoup(map_svg)
soup

아래의 출력 결과는 실제 jupyter에서 표시하는 전체 문자열에서 이 이미지의 좌표를 지정하는 d속성값을 제외하고 보기 편하게 줄정렬을 처리한 코드이다.

각각의 태그에 id 속성으로 시,도,구,군의 이름이 명시되어 있고 stroke 속성과 fill 속성으로 선과 면의 색상을 지정하고 있음을 알 수 있다.

너무 긴 코드를 축약할 목적으로 d속성을 제외하고 제시하는 것 입니다. d속성을 제거할 경우 그래픽이 표시될 좌표데이터가 유실되기 때문에 실습에서는 d속성을 그대로 유지해야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<svg enable-background="new 0 0 509 716.105" height="716.105px" id="Layer_1" version="1.1" viewbox="0 0 509 716.105" width="509px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px">
    <g id="서울특별시">
        <path fill="#B9B9B9" id="강동구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="송파구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="광진구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="중랑구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="노원구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="강남구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="성동구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="동대문구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="성북구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="강북구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="도봉구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="서초구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="용산구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="중구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="종로구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="은평구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="서대문구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="마포구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="강서구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="양천구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="구로구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="금천구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="관악구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="동작구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="영등포구" stroke="#FFFFFF" />
    </g>
    <g id="인천광역시">
        <g id="강화군">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
        <path fill="#B9B9B9" id="계양구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="부평구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="서구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="연수구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="남구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="남동구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="동구" stroke="#FFFFFF" />
        <g id="중구_1_">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
        <g id="옹진군">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
    </g>
    <g id="경기도">
        <path fill="#B9B9B9" id="김포시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="고양시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="파주시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="양주시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="의정부시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="동두천시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="연천군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="포천시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="구리시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="남양주시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="하남시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="양평군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="가평군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="여주군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="광주시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="성남시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="과천시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="의왕시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="용인시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="안양시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="부천시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="광명시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="시흥시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="이천시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="수원시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="군포시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="안산시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="오산시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="평택시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="안성시" stroke="#FFFFFF" />
        <g id="화성시">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
    </g>
    <g id="강원도">
        <path fill="#B9B9B9" id="철원군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="화천군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="춘천시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="홍천군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="횡성군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="원주시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="양구군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="인제군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="고성군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="속초시" stroke="#FFFFFF" />
        <path enable-background="new    " fill="#B9B9B9" id="양양군" opacity="0.98" stroke="#FFFFFF" />
        <path enable-background="new    " fill="#B9B9B9" id="평창군" opacity="0.98" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="강릉시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="정선군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="동해시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="영월군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="태백시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="삼척시" stroke="#FFFFFF" />
    </g>
    <g id="충청북도">
        <path fill="#B9B9B9" id="진천군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="음성군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="충주시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="제천시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="단양군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="괴산군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="증평군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="청주시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="보은군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="옥천군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="영동군" stroke="#FFFFFF" />
    </g>
    <g id="대전광역시">
        <path fill="#B9B9B9" id="유성구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="서구_3_" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="중구_5_" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="대덕구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="동구_4_" stroke="#FFFFFF" />
    </g>
    <g id="충청남도">
        <path fill="#B9B9B9" id="천안시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="계룡시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="공주시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="아산시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="당진시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="예산군" stroke="#FFFFFF" />
        <g id="서산시">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
        <g id="태안시">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
        <path fill="#B9B9B9" id="홍성군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="청양군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="논산시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="금산군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="부여군" stroke="#FFFFFF" />
        <g id="보령시">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
        <path fill="#B9B9B9" id="서천군" stroke="#FFFFFF" />
    </g>
    <g id="제주특별자치도">
        <g id="제주시_1_">
            <path fill="#B9B9B9" id="제주시" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
        <g id="서귀포시">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
    </g>
    <g id="경상북도">
        <path fill="#B9B9B9" id="문경시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="상주시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="예천군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="영주시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="봉화군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="영양군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="울진군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="안동시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="의성군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="김천시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="구미시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="성주군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="고령군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="칠곡군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="군위군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="영덕군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="청송군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="포항시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="영천시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="경산시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="청도군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="경주시" stroke="#FFFFFF" />
        <g id="울릉군">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
    </g>
    <g id="대구광역시">
        <path fill="#B9B9B9" id="동구_3_" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="북구_2_" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="수성구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="중구_4_" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="서구_2_" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="남구_3_" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="달서구" stroke="#FFFFFF" />
        <g id="달성군">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
    </g>
    <g id="울산광역시">
        <path fill="#B9B9B9" id="북구_1_" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="중구_3_" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="동구_2_" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="남구_2_" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="울주군" stroke="#FFFFFF" />
    </g>
    <g id="경상남도">
        <path fill="#B9B9B9" id="거창군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="합천군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="함양군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="창녕군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="밀양시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="양산시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="김해시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="창원시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="함안군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="의령군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="산청군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="진주시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="고성군_1_" stroke="#FFFFFF" />
        <g id="거제시">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
        <path fill="#B9B9B9" id="사천시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="하동군" stroke="#FFFFFF" />
        <g id="남해군">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
        <g id="통영시">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
    </g>
    <g id="부산광역시">
        <path fill="#B9B9B9" id="기장군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="북구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="금정구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="동래구" stroke="#FFFFFF" />
        <g id="강서구_1_">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
        <path fill="#B9B9B9" id="사상구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="사하구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="연제구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="해운대구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="부산진구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="수영구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="남구_1_" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="동구_1_" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="서구_1_" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="중구_2_" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="영도구" stroke="#FFFFFF" />
    </g>
    <g id="전라북도">
        <path fill="#B9B9B9" id="무주군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="진안군" stroke="#FFFFFF" />
        <g id="전주시">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
        <g id="완주군">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
        <path fill="#B9B9B9" id="익산시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="장수군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="남원군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="임실군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="순창군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="정읍시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="김제시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="부안군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="고창군" stroke="#FFFFFF" />
        <g id="군산시">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
    </g>
    <g id="광주광역시">
        <path fill="#B9B9B9" id="광산구" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="북구_3_" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="동구_5_" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="남구_4_" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="서구_4_" stroke="#FFFFFF" />
    </g>
    <g id="전라남도">
        <path fill="#B9B9B9" id="구례군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="곡성군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="담양군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="장성군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="영광군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="함평군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="순천시" stroke="#FFFFFF" />
        <g id="광양시">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
        <g id="여수시">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
        <path fill="#B9B9B9" id="화순군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="나주시" stroke="#FFFFFF" />
        <g id="무안군">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
        <path fill="#B9B9B9" id="목포시" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="영암군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="보성군" stroke="#FFFFFF" />
        <g id="고흥군">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
        <path fill="#B9B9B9" id="장흥군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="강진군" stroke="#FFFFFF" />
        <path fill="#B9B9B9" id="해남군" stroke="#FFFFFF" />
        <g id="진도군">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
        <g id="완도군">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
        <g id="신안군">
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
            <path fill="#B9B9B9" stroke="#FFFFFF" />
        </g>
    </g>
    <g id="레이어_19">
        <path fill="none" stroke="#000000" />
        <path fill="none" stroke="#000000" />
        <path fill="none" stroke="#000000" />
        <path fill="none" stroke="#000000" />
        <path fill="none" stroke="#000000" />
    </g>
    <path fill="#B9B9B9" id="세종특별자치시" stroke="#FFFFFF" />
</svg>
id 속성을 갖는 <g>태그와 <path>태그 추출

<g>태그는 시도를 의미하는 단위이고, <path>는 구,군을 의미하는 <g>의 하위 요소이다.

1
2
glist = soup.select("svg > g[id], svg > path[id]")
glist

아래의 출력 결과는 실제 jupyter에서 표시하는 전체 문자열에서 이 이미지의 좌표를 지정하는 d속성값을 제외하고 보기 편하게 줄정렬을 처리한 코드이다.

너무 긴 코드를 축약할 목적으로 d속성을 제외하고 제시하는 것 입니다. d속성을 제거할 경우 그래픽이 표시될 좌표데이터가 유실되기 때문에 실습에서는 d속성을 그대로 유지해야 합니다.

▶ 출력결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
[<g id="서울특별시">
<path fill="#B9B9B9" id="강동구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="송파구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="광진구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="중랑구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="노원구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="강남구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="성동구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="동대문구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="성북구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="강북구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="도봉구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="서초구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="용산구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="중구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="종로구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="은평구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="서대문구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="마포구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="강서구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="양천구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="구로구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="금천구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="관악구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="동작구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="영등포구" stroke="#FFFFFF"></path>
</g>, <g id="인천광역시">
<g id="강화군">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
<path fill="#B9B9B9" id="계양구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="부평구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="서구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="연수구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="남구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="남동구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="동구" stroke="#FFFFFF"></path>
<g id="중구_1_">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
<g id="옹진군">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
</g>, <g id="경기도">
<path fill="#B9B9B9" id="김포시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="고양시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="파주시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="양주시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="의정부시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="동두천시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="연천군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="포천시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="구리시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="남양주시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="하남시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="양평군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="가평군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="여주군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="광주시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="성남시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="과천시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="의왕시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="용인시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="안양시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="부천시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="광명시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="시흥시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="이천시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="수원시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="군포시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="안산시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="오산시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="평택시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="안성시" stroke="#FFFFFF"></path>
<g id="화성시">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
</g>, <g id="강원도">
<path fill="#B9B9B9" id="철원군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="화천군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="춘천시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="홍천군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="횡성군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="원주시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="양구군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="인제군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="고성군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="속초시" stroke="#FFFFFF"></path>
<path enable-background="new    " fill="#B9B9B9" id="양양군" opacity="0.98" stroke="#FFFFFF"></path>
<path enable-background="new    " fill="#B9B9B9" id="평창군" opacity="0.98" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="강릉시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="정선군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="동해시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="영월군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="태백시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="삼척시" stroke="#FFFFFF"></path>
</g>, <g id="충청북도">
<path fill="#B9B9B9" id="진천군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="음성군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="충주시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="제천시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="단양군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="괴산군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="증평군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="청주시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="보은군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="옥천군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="영동군" stroke="#FFFFFF"></path>
</g>, <g id="대전광역시">
<path fill="#B9B9B9" id="유성구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="서구_3_" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="중구_5_" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="대덕구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="동구_4_" stroke="#FFFFFF"></path>
</g>, <g id="충청남도">
<path fill="#B9B9B9" id="천안시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="계룡시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="공주시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="아산시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="당진시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="예산군" stroke="#FFFFFF"></path>
<g id="서산시">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
<g id="태안시">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
<path fill="#B9B9B9" id="홍성군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="청양군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="논산시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="금산군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="부여군" stroke="#FFFFFF"></path>
<g id="보령시">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
<path fill="#B9B9B9" id="서천군" stroke="#FFFFFF"></path>
</g>, <g id="제주특별자치도">
<g id="제주시_1_">
<path fill="#B9B9B9" id="제주시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
<g id="서귀포시">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
</g>, <g id="경상북도">
<path fill="#B9B9B9" id="문경시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="상주시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="예천군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="영주시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="봉화군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="영양군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="울진군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="안동시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="의성군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="김천시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="구미시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="성주군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="고령군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="칠곡군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="군위군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="영덕군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="청송군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="포항시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="영천시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="경산시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="청도군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="경주시" stroke="#FFFFFF"></path>
<g id="울릉군">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
</g>, <g id="대구광역시">
<path fill="#B9B9B9" id="동구_3_" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="북구_2_" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="수성구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="중구_4_" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="서구_2_" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="남구_3_" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="달서구" stroke="#FFFFFF"></path>
<g id="달성군">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
</g>, <g id="울산광역시">
<path fill="#B9B9B9" id="북구_1_" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="중구_3_" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="동구_2_" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="남구_2_" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="울주군" stroke="#FFFFFF"></path>
</g>, <g id="경상남도">
<path fill="#B9B9B9" id="거창군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="합천군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="함양군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="창녕군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="밀양시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="양산시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="김해시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="창원시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="함안군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="의령군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="산청군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="진주시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="고성군_1_" stroke="#FFFFFF"></path>
<g id="거제시">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
<path fill="#B9B9B9" id="사천시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="하동군" stroke="#FFFFFF"></path>
<g id="남해군">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
<g id="통영시">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
</g>, <g id="부산광역시">
<path fill="#B9B9B9" id="기장군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="북구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="금정구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="동래구" stroke="#FFFFFF"></path>
<g id="강서구_1_">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
<path fill="#B9B9B9" id="사상구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="사하구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="연제구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="해운대구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="부산진구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="수영구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="남구_1_" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="동구_1_" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="서구_1_" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="중구_2_" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="영도구" stroke="#FFFFFF"></path>
</g>, <g id="전라북도">
<path fill="#B9B9B9" id="무주군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="진안군" stroke="#FFFFFF"></path>
<g id="전주시">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
<g id="완주군">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
<path fill="#B9B9B9" id="익산시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="장수군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="남원군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="임실군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="순창군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="정읍시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="김제시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="부안군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="고창군" stroke="#FFFFFF"></path>
<g id="군산시">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
</g>, <g id="광주광역시">
<path fill="#B9B9B9" id="광산구" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="북구_3_" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="동구_5_" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="남구_4_" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="서구_4_" stroke="#FFFFFF"></path>
</g>, <g id="전라남도">
<path fill="#B9B9B9" id="구례군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="곡성군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="담양군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="장성군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="영광군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="함평군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="순천시" stroke="#FFFFFF"></path>
<g id="광양시">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
<g id="여수시">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
<path fill="#B9B9B9" id="화순군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="나주시" stroke="#FFFFFF"></path>
<g id="무안군">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
<path fill="#B9B9B9" id="목포시" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="영암군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="보성군" stroke="#FFFFFF"></path>
<g id="고흥군">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
<path fill="#B9B9B9" id="장흥군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="강진군" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" id="해남군" stroke="#FFFFFF"></path>
<g id="진도군">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
<g id="완도군">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
<g id="신안군">
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
<path fill="#B9B9B9" stroke="#FFFFFF"></path>
</g>
</g>, <g id="레이어_19">
<path fill="none" stroke="#000000"></path>
<path fill="none" stroke="#000000"></path>
<path fill="none" stroke="#000000"></path>
<path fill="none" stroke="#000000"></path>
<path fill="none" stroke="#000000"></path>
</g>, <path fill="#B9B9B9" id="세종특별자치시" stroke="#FFFFFF"></path>]

초등학교 데이터만 시각화하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
for item in glist:
    print(item['id'])
    
    # 지도의 id값(시도이름)이 dataframe의 index에 포함되어 있지 않다면 다음 조건으로 이동
    if item['id'] not in pivot_df.index:
        continue
      
    # 각 지역별 학교 수
    count = pivot_df.loc[ item['id'], '초등학교' ]
    print(count)
    
    # 복지시설 수에 따라 단계값 설정 (단계는 색상값의 수에 따름)
    if count > 500:   color_index = 5
    elif count > 400: color_index = 4
    elif count > 300: color_index = 3
    elif count > 200: color_index = 2
    elif count > 100: color_index = 1
    else:             color_index = 0
        
    # 각 item별 fill속성 확인
    print(item.attrs)
    
    # item에 fill 속성이 있는 경우 -> 세종특별자치시
    if 'fill' in item.attrs:
        item['fill'] = colors[color_index]
    # 그렇지 않은 경우 -> 나머지 지역
    else:
        # 현재 요소(item)의 하위 항목들에게 색상을 적용해야 한다.
        for p in item.select('path'):
            if 'fill' in p.attrs:
                p['fill'] = colors[color_index]
                
초등학교svg = soup.prettify()
SVG(초등학교svg)
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
서울특별시
603
{'id': '서울특별시'}
인천광역시
261
{'id': '인천광역시'}
경기도
1306
{'id': '경기도'}
강원도
378
{'id': '강원도'}
충청북도
268
{'id': '충청북도'}
대전광역시
150
{'id': '대전광역시'}
충청남도
420
{'id': '충청남도'}
제주특별자치도
119
{'id': '제주특별자치도'}
경상북도
508
{'id': '경상북도'}
대구광역시
229
{'id': '대구광역시'}
울산광역시
121
{'id': '울산광역시'}
경상남도
519
{'id': '경상남도'}
부산광역시
304
{'id': '부산광역시'}
전라북도
423
{'id': '전라북도'}
광주광역시
156
{'id': '광주광역시'}
전라남도
465
{'id': '전라남도'}
레이어_19
세종특별자치시
48
{'id': '세종특별자치시', 'fill': '#B9B9B9', 'stroke': '#FFFFFF', 'd': 'M191.876,343.855l-5.375-3.469l-2.313-3.406L183,332.052\n\tl0.625-5.322l0.563-6.178l-4.063-2.072l-4.75-6l1.375-4l-0.625-5.375l-2.625-2.5l1.75-3.25l4.625-0.25l8.875,5.25l4.375-0.125\n\tl0.5,2.125h1.625l-0.5,3.875l-2.75,1.875l1.25,3l2,2.375v4l3.375,1.375l4.306,1.809l1.736,2.055l-0.917,5.168l0.917,2l-2.091,1.171\n\tl0.517,4.106l-1.718,4.191l-3.75,3.875l-3.875,0.125L191.876,343.855z'}

svg

전국의 중학교 분포

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
for item in glist:
    if item['id'] not in pivot_df.index:
        continue
        
    count = pivot_df.loc[ item['id'], '중학교' ]
    print(item['id'], " >> ", count)
    
    # 복지시설 수에 따라 단계값 설정 (단계는 색상값의 수에 따름)
    if count > 500:   color_index = 5
    elif count > 400: color_index = 4
    elif count > 300: color_index = 3
    elif count > 200: color_index = 2
    elif count > 100: color_index = 1
    else:             color_index = 0
        
    # item에 fill 속성이 있는 경우 -> 세종특별자치시
    if 'fill' in item.attrs:
        item['fill'] = colors[color_index]
    # 그렇지 않은 경우 -> 나머지 지역
    else:
        # 현재 요소(item)의 하위 항목들에게 색상을 적용해야 한다.
        for p in item.select('path'):
            if 'fill' in p.attrs:
                p['fill'] = colors[color_index]
        
중학교svg = soup.prettify()
SVG(중학교svg)
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
서울특별시  >>  385
인천광역시  >>  135
경기도  >>  635
강원도  >>  162
충청북도  >>  126
대전광역시  >>  88
충청남도  >>  188
제주특별자치도  >>  47
경상북도  >>  269
대구광역시  >>  126
울산광역시  >>  63
경상남도  >>  266
부산광역시  >>  172
전라북도  >>  209
광주광역시  >>  90
전라남도  >>  254
세종특별자치시  >>  24

svg

전국의 고등학교 분포

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
for item in glist:
    if item['id'] not in pivot_df.index:
        continue
        
    count = pivot_df.loc[ item['id'], '고등학교' ]
    print(item['id'], " >> ", count)
    
    # 복지시설 수에 따라 단계값 설정 (단계는 색상값의 수에 따름)
    if count > 500:   color_index = 5
    elif count > 400: color_index = 4
    elif count > 300: color_index = 3
    elif count > 200: color_index = 2
    elif count > 100: color_index = 1
    else:             color_index = 0
        
    # item에 fill 속성이 있는 경우 -> 세종특별자치시
    if 'fill' in item.attrs:
        item['fill'] = colors[color_index]
    # 그렇지 않은 경우 -> 나머지 지역
    else:
        # 현재 요소(item)의 하위 항목들에게 색상을 적용해야 한다.
        for p in item.select('path'):
            if 'fill' in p.attrs:
                p['fill'] = colors[color_index]
        
고등학교svg = soup.prettify()
SVG(고등학교svg)
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
서울특별시  >>  320
인천광역시  >>  125
경기도  >>  474
강원도  >>  110
충청북도  >>  84
대전광역시  >>  62
충청남도  >>  118
제주특별자치도  >>  34
경상북도  >>  184
대구광역시  >>  93
울산광역시  >>  57
경상남도  >>  190
부산광역시  >>  142
전라북도  >>  136
광주광역시  >>  67
전라남도  >>  141
세종특별자치시  >>  18

svg

Rating:

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[Python 데이터 시각화] SVG 파일을 활용한 지도 시각화≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

comments powered by Disqus