반응형

이전에 전세계 발전사업현황에 대한 업데이트에 이어, 국내 발전사업허가 현황을 버블차트로 나타내고자 합니다. 앞서, 게시했던 글에서 문제점 중 하나가 colorbar를 활용해서 편하게 색깔을 표시했지만, 에너지원별로 색의 구분이 쉽지 않았는데요. 이번에는 색에 대한 지정(xkcd)을 통해 좀 더 명확하게 에너지원별로 구분이 될 수 있게끔 하고자 합니다.

우선, 중요한 버전은 다음과 같습니다. Basemap에 대한 설명과 설치에 버전의 영향을 좀 받기 때문에 관련한 내용은 앞서 언급한 전세계 발전사업현황 시각화 글을 참고(링크)하여 주시기 바랍니다.

Version
Python = 3.8.5
numpy = 1.21.3
pandas = 1.1.3
matplotlib = 3.4.3
basemap = 1.2.2

목적은 전기위원회에서 제공하고 있는 발전사업허가 획득 프로젝트들의 현황을 에너지원, 용량, 위치에 대한 정보를 한꺼번에 보여줄 수 있는 시각화를 진행하는 것 입니다. 전반적인 흐름을 간략하게 표현하자면 다음과 같습니다.

  1. Basemap을 이용해 한반도 그리기
  2. 데이터 확보 및 처리
  3. 버블차트 생성

1. Basemap을 이용해 한반도 그리기

우선, 목적한 시각화를 위해 밑그림이 필요합니다. Basemap에는 여러 기능을 제공하고 있는데, 'merc'를 이용해 그려보았습니다. 편의를 위해 draw_hanbando()란 함수를 만들어 Basemap 객체를 관리하도록 했습니다.

%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import os

os.environ['PROJ_LIB'] = '가상환경 위치'

def draw_hanbando():
    # 한반도 그려내기 
    plt.figure(figsize=(10,10))
    m = Basemap(projection='merc', lat_0=37.35, lon_0=126.58, resolution = 'h',
                urcrnrlat=40, llcrnrlat=33, llcrnrlon=122, urcrnrlon=132)
    m.drawcoastlines()
    m.drawcountries()
    m.drawmapboundary()
    # 위도, 경도를 설정해 한반도가 보이게끔
    parallels = np.arange(30.,50.,1.)
    m.drawparallels(parallels,labels=[True,False,False,False])
    meridians = np.arange(120.,150.,2.)
    m.drawmeridians(meridians,labels=[True,False,False,True])
    return m

m = draw_hanbando()
m

위 코드를 실행하면 아래와 같이 그림이 잘 나오는 걸 확인할 수 있습니다.

2. 데이터 확보 및 처리

다음은 데이터를 확보하고 목적에 부합하게끔 적절하게 처리가 필요합니다. 다행스럽게도(?), 우리나라는 발전사업허가를 취득한 프로젝트들에 대해서 현황대장을 공개하고 있습니다. (링크)를 따라가면 '3MW 초과 발전사업 허가대장'이라는 제목의 공지글을 확인할 수 있는데, 매달 혹은 분기별로 업데이트를 진행하고 있습니다. 아쉬운 점은 불허가 데이터는 없다는 것인데, 이번 글의 목적이 발전사업허가 획득 현황을 보고자함이니 불허건들에 대해서는 다루지 않겠습니다.

위 게시글에 가면, pdf로 된 파일이 있는데 개인적으론 adobe의 힘을 빌어 엑셀로 변환해 사용했습니다. 그리고 데이터를 확인하면, 중복(변경 건) 및 표준화되지 않은 데이터들(용량, 에너지원)이 있는데, 중복은 제거하고 용량 및 에너지원은 약간 노가다로 표준화를 진행했습니다.

이렇게 전처리한 데이터셋을 이용해 14가지의 에너지원으로 분류하여 아래와 같이 정리했습니다. 참고로, 에너지원별로 색에 대한 구분을 확실하게 하기 위해 matplotlib의 color guide에서 이야기하는 색 레퍼런스 중 xkcd를 참조하여 작성했습니다.

# data importing
dataset = pd.read_csv('dataset.csv', encoding='euc-kr') 
# 에너지원별
# color guide: https://matplotlib.org/stable/tutorials/colors/colors.html
groups = dataset.groupby('에너지')
energy = {
    'IGCC':'xkcd:violet',
    'LNG' : 'xkcd:lilac',
    '바이오매스': 'xkcd:taupe',
    '부생가스':'xkcd:lime',
    '석탄': 'xkcd:charcoal grey',
    '수력': 'xkcd:aqua',
    '연료전지':'xkcd:bright pink',
    '열병합':'xkcd:orange',
    '원자력':'xkcd:pale teal',
    '태양광':'xkcd:red',
    '폐기물':'xkcd:eggplant',
    '폐열' : 'xkcd:steel blue',
    '풍력' : 'xkcd:sky blue',
    '해양' : 'xkcd:bright blue'
}

여기서는 언급하지 않았지만, basemap으로 그림을 그리기 위해서는 (x, y) 형태의 좌표가 필요한데요. 아쉽게도, 발전사업허가대장에서는 정확한 좌표를 제공하고 있지 않습니다. 대신 제공하고 있는 주소가 있는데, 이를 이용해 geocoding이 필요합니다. 지오코딩을 위한 방법론은 구글API, ArcGIS 등 다양한게 있지만, 저는 구글을 이용했습니다.

3. 버블차트 생성

과정 1에서 만든 한반도 지도와 과정 2를 통해 얻은 데이터 및 색구분을 활용해 버블차트를 생성할 차례입니다. 위에서 에너지원별로 groupby로 객체를 에너지원별로 나눈 것을 좌표별로 x, y를 대입하고, 크기(s)는 용량/10 (현재 figure size에서 적절한 크기), 색(c)은 에너지원별로 할 수 있게끔 코드를 작성했습니다.

for name, group in groups:
    try:
        # 다른 프로젝트에서 활용한 데이터셋이다보니 여기서는 '불허여부' 존재
        approval = group[group['불허여부']==0] 
        for i in approval.index:
            x, y = m(approval['longitude'][i], approval['latitude'][i])
            m.scatter(x, y, s=approval['용량'][i]/10, c=energy[name],alpha=0.5)
    except:
        continue
plt.show()

위 코드를 실행시켜주면, 아래와 같이 잘 나오는 것을 확인할 수 있었습니다.


참고:

1) 전기위원회 공지사항: https://www.korec.go.kr/notice/selectNoticeList.do

2) 한반도 지도 그리기: wscode, '[Python/Basemap]기상관측망 시각화'

https://wscode.tistory.com/9

[[Python/Basemap]기상관측망 시각화

개발자 D 주제 : Basemap를 활용한 기상관측망 시각화 작업 데이터 : 종관기상관측(ASOS), 방재기상관측(AWS) 기상자료개방포털 ▶ 데이터 ▶ 메타데이터 ▶ 관측지점정보 (data.kma.go.kr/tme

wscode.tistory.com](https://wscode.tistory.com/9)

3) Matplotlib color guide: https://matplotlib.org/stable/tutorials/colors/colors.html

[Specifying Colors — Matplotlib 3.5.0 documentation

Single character shorthand notation for some basic colors. Note The colors green, cyan, magenta, and yellow do not coincide with X11/CSS4 colors. Their particular shades were chosen for better visibility of colored lines against typical backgrounds.

matplotlib.org](https://matplotlib.org/stable/tutorials/colors/colors.html)

4) Basemap 이용: https://seanpark11.tistory.com/64

[[Matplotlib] mpl-toolkits.basemap을 활용한 세계 발전소 데이터를 활용한 발전원별, 용량별 현황시각화

이전에 folium을 활용하여 데이터를 시각화한 적이 있습니다. 하지만, folium을 활용하면 html 형태로 산출물이 나오기 때문에 다른 프로젝트(웹 등) 적용에는 용이하나, 보고서와 같이 A4에 쓰기에는

seanpark11.tistory.com](https://seanpark11.tistory.com/64)

반응형