한국은행 API를 활용한 경제 데이터 시각화 – Python으로 쉽게 따라하기

한국은행 API 홈페이지 갈무리 이미지
( 한국은행 API 홈페이지 갈무리 이미지 )

한국은행 API를 이용하면, 경제 데이터를 손쉽게 조회하고 시각화할 수 있습니다. 특히 Python과 함께 사용하면 데이터 분석 및 고급 시각화까지 가능합니다. 이번 포스트에서는 한국은행 Open API를 사용하는 방법을 소개하고, 데이터 시각화로 인사이트를 도출하는 과정을 자세히 설명드리겠습니다.

한국은행 Open API란 무엇인가요?

한국은행 API는 한국은행의 경제통계시스템(ECOS) 데이터를 개발자와 연구자들이 쉽게 사용할 수 있도록 제공하는 서비스입니다. API를 사용하면 실시간 경제 데이터를 직접 조회할 수 있습니다. 예를 들어, 원/달러 환율, 코스피 지수, 외환보유액 등을 손쉽게 가져와 분석할 수 있습니다.

한국은행 API 사용 방법

1. 샘플 데이터 조회 (테스트용)

샘플 데이터는 인증키 없이 간단한 테스트를 위한 예제 데이터입니다. 다음과 같은 URL을 사용해 100대 통계지표 중 10개의 샘플 데이터를 조회할 수 있습니다. 아래 URL을 복사해서 웹브라우저 주소창에 입력하면 아래와 같은 내역을 확인할 수 있습니다.

10개의 샘플 데이터 조회 URL

https://ecos.bok.or.kr/api/KeyStatisticList/sample/xml/kr/1/10
10개의 샘플 데이터 조회결과 캡쳐 이미지
(10개의 샘플 데이터 조회결과 캡쳐 이미지)

2. 인증키를 이용한 100대 통계지표 조회

100대 통계지표 데이터 모두를 조회하려면 인증키를 발급받아야 합니다.

  • 인증키 발급 방법: 한국은행 ECOS 웹사이트에 접속해서 우측상단 “인증키 신청“을 통해서 OpenAPI 인증키 신청이 가능합니다. 신청을 완료하면 이메일로도 인증키가 전송이 되고, 해당 웹사이트 MyPage 메뉴에서 확인이 가능합니다.
  • 인증키 사용 예제: 아래의 URL에서 “인증키” 부분에 확인한 인증키를 입력하고 브라우저를 통해서 확인하면 아래와 같이 100대 통계지표가 xml 형태로 나타나게 됩니다.
https://ecos.bok.or.kr/api/KeyStatisticList/인증키/xml/kr/1/100
100대 통계지표 데이터 조회결과 캡쳐 이미지
(100대 통계지표 데이터 조회결과 캡쳐 이미지)

Python을 사용한 경제 데이터 시각화

이제 Python을 사용해 한국은행 API에서 데이터를 가져와 바로 아래 그림과 같이 Python 시각화 작업을 해보겠습니다.

한국은행 API 활용한 Python 시각화 결과 이미지
(한국은행 API 활용한 Python 시각화 결과 이미지)

Python 코드 예제

import requests
import pandas as pd
import matplotlib.pyplot as plt
import xml.etree.ElementTree as ET

# 한국은행 API URL 및 인증키 설정
url = "https://ecos.bok.or.kr/api/KeyStatisticList/MN16GNV2T0LWMVGWNQ9K/xml/kr/1/100"

# API 호출 및 데이터 수집
response = requests.get(url)
data = response.text

# XML 데이터 파싱 및 필요한 데이터 추출
root = ET.fromstring(data)
rows = []
for row in root.findall("row"):
    indicator = row.find("KEYSTAT_NAME").text
    if indicator in ["원/달러 환율(종가)", "외환보유액"]:
        rows.append({
            "indicator": indicator,
            "value": float(row.find("DATA_VALUE").text),
            "unit": row.find("UNIT_NAME").text,
            "date": pd.to_datetime(row.find("CYCLE").text, errors='coerce')
        })

# 데이터프레임으로 변환
df = pd.DataFrame(rows)

# 한글 → 영문 레이블 변환
df['indicator_english'] = df['indicator'].replace({
    "원/달러 환율(종가)": "KRW/USD Exchange Rate",
    "외환보유액": "Foreign Exchange Reserves"
})

# 데이터프레임 확인
print(df)

# 이중 Y축을 사용하여 시각화
fig, ax1 = plt.subplots(figsize=(10, 6))

# 첫 번째 Y축: 원/달러 환율
exchange_rate_data = df[df['indicator'] == "원/달러 환율(종가)"]
ax1.bar(exchange_rate_data['indicator_english'], 
        exchange_rate_data['value'], 
        color='blue', label="KRW/USD Exchange Rate")

ax1.set_xlabel("Indicator")
ax1.set_ylabel("Value (KRW)", color='blue')
ax1.tick_params(axis='y', labelcolor='blue')

# 첫 번째 Y축 막대 그래프 위에 레이블 추가
for i, value in enumerate(exchange_rate_data['value']):
    ax1.text(i, value + (value * 0.02), f"{value:,.1f}", ha='center', color='blue')

# 두 번째 Y축: 외환보유액
ax2 = ax1.twinx()
reserves_data = df[df['indicator'] == "외환보유액"]
ax2.bar(reserves_data['indicator_english'], 
        reserves_data['value'], 
        color='red', label="Foreign Exchange Reserves", alpha=0.7)

ax2.set_ylabel("Value (Thousand USD)", color='red')
ax2.tick_params(axis='y', labelcolor='red')

# 두 번째 Y축 막대 그래프 위에 레이블 추가
for i, value in enumerate(reserves_data['value']):
    ax2.text(i + 1, value + (value * 0.02), f"{value:,.0f}", ha='center', color='red')

# 그래프 제목 및 스타일링
plt.title(f"Bank of Korea Key Indicators ({df['date'].iloc[0].date()})")
plt.tight_layout()
plt.show()

정리하기

한국은행 API를 이용하면 경제 데이터를 손쉽게 수집하고 Python을 활용해 고급 시각화를 구현할 수 있습니다. 특히, 시각화 결과를 통해 경제의 흐름을 보다 직관적으로 이해할 수 있습니다. 데이터 분석과 시각화는 경제적 의사결정에 중요한 도구가 될 수 있으니, 직접 활용해보시기 바랍니다.

참고로, 다른 종류의 API 활용한 파이썬 분석이 궁금하신 분은 Python과 CryptoCompare API로 30일간의 비트코인 달러 차트 분석하기 포스트를 참고해 보시기 바랍니다!

#Python 시각화 코드 상세해설

1. 라이브러리 임포트

import requests
import pandas as pd
import matplotlib.pyplot as plt
import xml.etree.ElementTree as ET
  • requests: HTTP 요청을 통해 API와 통신하기 위해 사용됩니다.
  • pandas: 데이터 조작 및 분석을 위한 강력한 라이브러리입니다.
  • matplotlib.pyplot: 데이터 시각화를 위한 라이브러리입니다.
  • xml.etree.ElementTree: XML 데이터를 파싱하기 위해 사용됩니다.

2. API URL 설정

url = "https://ecos.bok.or.kr/api/KeyStatisticList/MN16GNV2T0LWMVGWNQ9K/xml/kr/1/100"

한국은행 API의 URL을 설정합니다. 이 URL은 XML 형식의 통계 데이터를 제공합니다.

3. 데이터 수집

response = requests.get(url)
data = response.text
  • requests.get(url)을 통해 API에 GET 요청을 보내고 응답을 response에 저장합니다.
  • response.text를 사용하여 XML 데이터를 문자열로 가져옵니다.

4. XML 데이터 파싱

root = ET.fromstring(data)
rows = []
for row in root.findall("row"):
    indicator = row.find("KEYSTAT_NAME").text
    if indicator in ["원/달러 환율(종가)", "외환보유액"]:
        rows.append({
            "indicator": indicator,
            "value": float(row.find("DATA_VALUE").text),
            "unit": row.find("UNIT_NAME").text,
            "date": pd.to_datetime(row.find("CYCLE").text, errors='coerce')
        })
  • XML 데이터를 파싱하여 ElementTree 객체를 생성합니다.
  • rows라는 빈 리스트를 초기화하여 필요한 정보를 저장합니다.
  • <row> 요소를 반복하면서 지표명(KEYSTAT_NAME), 값(DATA_VALUE), 단위(UNIT_NAME), 날짜(CYCLE)를 추출합니다.
  • 여기서는 “원/달러 환율(종가)”와 “외환보유액”만 추출하여 리스트에 추가합니다.

5. DataFrame 생성

df = pd.DataFrame(rows)

수집한 데이터를 pandas DataFrame으로 변환하여 쉽게 조작할 수 있도록 합니다.

6. 영어 레이블 추가

df['indicator_english'] = df['indicator'].replace({
    "원/달러 환율(종가)": "KRW/USD Exchange Rate",
    "외환보유액": "Foreign Exchange Reserves"
})

DataFrame에 새로운 열을 추가하여 한글 지표명을 영어로 변환합니다.

7. DataFrame 확인

print(df)

DataFrame의 내용을 콘솔에 출력하여 수집된 데이터를 확인합니다.

8. 이중 Y축을 사용한 시각화

fig, ax1 = plt.subplots(figsize=(10, 6))

여기서 그림과 서브플롯을 생성합니다. ax1은 첫 번째 데이터 세트를 그리는 데 사용됩니다.

첫 번째 Y축: 원/달러 환율 그리기
exchange_rate_data = df[df['indicator'] == "원/달러 환율(종가)"]
ax1.bar(exchange_rate_data['indicator_english'], 
        exchange_rate_data['value'], 
        color='blue', label="KRW/USD Exchange Rate")

파란색 막대를 사용하여 KRW/USD 환율에 대한 막대 차트를 생성합니다.

첫 번째 Y축 막대 그래프 위에 레이블 추가
for i, value in enumerate(exchange_rate_data['value']):
    ax1.text(i, value + (value * 0.02), f"{value:,.1f}", ha='center', color='blue')

이 코드는 각 막대 위에 해당 값을 표시합니다. value + (value * 0.02)는 값보다 약간 위쪽에 레이블을 위치시키기 위해 사용됩니다. f"{value:,.1f}"는 값을 천 단위로 구분하고 소수점 첫째 자리까지 표시합니다.

두 번째 Y축: 외환보유액 그리기
ax2 = ax1.twinx()
reserves_data = df[df['indicator'] == "외환보유액"]
ax2.bar(reserves_data['indicator_english'], 
        reserves_data['value'], 
        color='red', label="Foreign Exchange Reserves", alpha=0.7)

여기서는 두 번째 y축(ax2)을 생성하여 ax1과 동일한 x축을 공유하게 합니다. 외환보유액에 대해 빨간색으로 막대를 그립니다.

두 번째 Y축 막대 그래프 위에 레이블 추가
for i, value in enumerate(reserves_data['value']):
    ax2.text(i + 1, value + (value * 0.02), f"{value:,.0f}", ha='center', color='red')

두 번째 y축의 막대 위에도 해당 값을 표시합니다. i + 1을 사용하여 외환보유액의 위치를 조정하고, value + (value * 0.02)로 레이블의 위치를 조정합니다.

그래프 제목 및 스타일링
plt.title(f"Bank of Korea Key Indicators ({df['date'].iloc[0].date()})")
plt.tight_layout()
plt.show()

그래프 제목을 설정하고 레이아웃을 조정한 후 그래프를 표시합니다.

유사한 게시물