Study

KOSIS(국가통계포털) 대용량통계자료 openAPI 사용

whistory 2022. 12. 2. 09:28
반응형

 

 

kosis 에서 제공하는건,

[통계자료]와 [대용량통계자료] 두가지가 존재한다.

 

현재로썬, [대용량통계자료] 를 쓸일이 없긴한데 일단 테스트를 진행한다.

 

 

 

 

자료등록 URL을 생성하고,  [URL생성]을 누른다.

 

 

 

대용량통계자료는  XLS와  SDMX를 제공한다.

 

XLS는 엑셀형식이고,

SDMX는 KOSIS에서 아래와 같이 설명하고 있다.   

 

KOSIS 공유서비스 자료 제공형태 중에서 SDMX는 XML의 일종으로서 통계에 특화된 XML로 보시면 됩니다.

SDMX는 Statistical Data and Metadata eXchange의 약어로 통계작성기구(기관)간의 다양한 형태의 통계자료를 XML 기반으로 제공하여 교환과 공유를 효율적으로 지원합니다.

SDMX 표준은 국제결제은행(BIS), 유럽중앙은행, 유럽통계처(Eurostat), 국제통화기금(IMF), 경제협력개발기구(OECD), UN 통계국 및 세계은행의 국제기구들로부터 후원을 받고 있습니다.

현재 Version 2.1은 2013년 1월에 ISO(국제표준화기구) 17369로 국제표준 인증을 받았으며 각 국의 통계청과 여러 국제기구에 이르기까지 사용범위가 점차 확대되고 있습니다.

SDMX 표준 및 지침, 개발도구(software), 새로운 소식 등은 현재 SDMX.org 웹사이트를 통해 제공되고 있습니다.

SDMX 파일에 대한 설명(SDMX Version 2.1)

 

구분 설명

DSD        Data Structure Definition의 약어로 통계자료에 대한 의미와 구조를 정의하고 있습니다. 통계청의 통계표를 예를 들면 통계표에 대한 설명과 통계표의 형태를 파악할 수 있는 통계표의 구성정보와 분류, 분류값, 단위, 항목에 대한 상세정보(코드 및 명칭)를 담고 있습니다.
DATA                                   DATA 파일은 DSD에서 정의한 구성정보에 주기, 시점에 따른 수치정보를 정의하고 있습니다. SDMX version 2.1에서는 Generic, StructureSpecific 두 가지 포맷으로 나뉘어져 있으며 이들 포맷사이에는 XML의 형태가 다르다는 차이점이 있습니다.

- Generic : 데이터를 담는 XML 구성요소가 구조를 정의하는 메세지와 독립적인 형태로 이루어져 있으며 통계구성정보 및 수치정보가 각 Element(요소, 항목)로 구성되어 있어 파일크기가 StructureSpecific에 비해 큽니다.

- StructureSpecific : 데이터를 담는 XML 구성요소는 구조를 정의하는 메세지에 의존적인 형태로 이루어져 있으며 통계구성정보 및 수치정보는 하나의 Element(요소, 항목)에 Attribute(속성)로 나열되어 있어 파일크기가 Generic에 비해 작습니다.


 

출처 : https://kosis.kr/openapi/community/community_0403List.jsp

 

 

 

xls 샘플 데이터

sdmx 샘플 데이터 - StructureSpecific(구조화된 수치자료)

xls는 코드 명칭으로 나오는데,

sdmx는 코드값으로 나온다. 코드명칭을 DSD(자료구조정의) 를 통해 따로 가져와야 한다.

sdmx 샘플 데이터 - DSD(자료구조정의)

 

 

 

대용량통계자료는 json 형식이 지원되지 않기 때문에,

beautifulsoup을 이용해야한다.

 

일단 bs 라이브러리를 설치하고 진행한다.

pip3 install bs4

 

 

일단 XLS로 데이터를 조회해서 단순히 뿌려줘본다.

import requests
from bs4 import BeautifulSoup

open_url = "<https://kosis.kr/openapi/statisticsBigData.do?method=getList&apiKey=api_key&format=xls&userStatsId=whiseung/135/DT_135N_1A001A/3/1/20221124104644&prdSe=Y&newEstPrdCnt=1>"
res = requests.get(open_url)
soup = BeautifulSoup(res.content, 'html.parser')
for item in soup.find_all('row'):
    print("######## separate")
    for subItem in item.find_all('data'):
        print(subItem.string)

 

 

 

 

 

데이터를 dataframe 형태로 뿌려줘본다

import pandas as pd
import requests
from bs4 import BeautifulSoup

open_url = "<https://kosis.kr/openapi/statisticsBigData.do?method=getList&apiKey=api_key&format=sdmx&userStatsId=whiseung/135/DT_135N_1A001A/3/1/20221124104644&type=StructureSpecific&prdSe=Y&newEstPrdCnt=1&version=v2_1>"
res = requests.get(open_url)
soup = BeautifulSoup(res.content, 'html.parser')

datalist = soup.find_all('series')

data = []
for item in datalist:
    value = []
    value.append(item.get('item'))
    value.append(item.get('c_a01'))
    value.append(item.get('unit'))
    subitem = item.find('obs')
    value.append(subitem.get('time_period'))
    value.append(subitem.get('obs_value'))

    data.append(value)

df = pd.DataFrame(data)
df.columns = ['item', 'category', 'unit', 'date', 'value']
df.head()
print(df)

 

 

다음에는 해당 데이터를 parquet 형태로 s3에 저장해보겟다.

 

 

반응형