2장 UN Comtrade API 추출#

NOTE: 이 장에서 예시적으로 소개하는 모든 데이터 추출 작업은 UN Comtrade에서 자신의 인증키(subscription key)를 발급받아야만 실행됩니다.

UN Comtrade는 국제무역 데이터베이스로서 가장 광범위하고, 세부적이면서, 신뢰도가 높다. UN Comtrade 데이터를 보다 효율적으로 다운로드받는 방법은 API를 통해 프로그래밍적으로 데이터를 가져오는 것이다.

이 장에서는 최근 UN Comtrade 측에서 발표한 파이썬 comtradeapicall 패키지를 이용해 UN Comtrade 데이터를 API를 통해 다운로드받는 방법을 소개한다. UN Comtrade 데이터베이스 인증키를 얻는 방법과 comtradeapicall 패키지를 설치하는 방법 등 데이터를 추출하기 위한 사전작업에 대해 설명한다. 또한 comtradeapicall에서 제공하는 여러 함수들의 사용법을 살펴보고, 함수에 들어 있는 여러 파라미터들의 의미와 설정 방법을 소개한다.

그런 다음, 이를 실제 UN Comtrade 데이터 추출에 적용하고, 그렇게 해서 다운로드받은 데이터를 사용하여 무역지표를 분석하는 것을 예시적으로 보여준다.

1. 개요#

UN Comtrade 데이터#

UN Comtrade는 세계 각국의 무역 데이터를 제공하는 가장 중요한 데이터베이스이다. 전 세계 대부분의 국가와 지역의 무역 데이터를 담고 있으며, 연도별, 월별, 그리고 일부 분야에서는 일별 데이터까지 제공한다. 데이터 분류가 상세하다는 점도 장점인데, 국가 간의 수출입 활동을 다양한 수준(총계, 세부 품목 등)에서 보여준다. 수출입 국가, 무역 품목, 무역 흐름(수출, 수입, 재수출, 재수입) 등을 세부적으로 구분하여 제공한다. 데이터가 정기적으로 업데이트되어 최신 무역 동향을 파악할 수 있다. UN Comtrade 데이터는 정확성 면에서도 장점을 지닌다. 각국의 관세청 및 통계청으로부터 데이터를 수집하며, 수집된 데이터는 검증 과정을 거치고, 국제 기준에 따라 표준화된다. 데이터 품질을 유지하기 위해 여러 단계의 검증과 교차확인 절차를 거친다.

이처럼 연구자들에게는 여러 가지로 중요하고 유용한 데이터베이스이면서도 누구에게나 무료로 접근이 가능하다는 점이 또 다른 장점이다. 유료인 프리미엄 서비스(한 번에 추출할 수 있는 데이터 용량이 훨씬 크며, 기타 추가적인 기능을 제공)가 있기는 하지만, 프리미엄 회원이 아니더라도 누구나 인터넷을 통해 UN Comtrade 데이터베이스에서 데이터를 추출할 수 있다. UN Comtrade에 대한 자세한 설명은 UN Comtrade Docs에 나와 있다.

오픈 API#

UN Comtrade 데이터를 얻는 방법은 먼저 웹사이트를 통한 방법이 있다. 해당 웹사이트 상에서 드롭다운 메뉴를 통해 원하는 대상이나 항목을 선택하는 방식이다. 그러나 UN Comtrade 데이터를 보다 효율적으로 다운로드받는 방법은 웹사이트가 아니라 오픈 API(Application Programming Interface)를 통해 프로그래밍적으로 데이터를 가져오는 것이다. API는 소프트웨어 간의 상호작용을 가능하게 하는 인터페이스로 이를 사용해 상대방 서버에 데이터를 프로그래밍적으로 요청하고, 그 응답을 받아오는 방식이다. API를 사용함으로써 데이터를 조각조각 가져와 일일이 결합시킬 필요 없이, 코드로 원하는 데이터를 한 번에 요청하고 다운로드받아 그것을 곧바로 분석에 사용할 수 있어 효율적이다.

오픈 API 데이터는 공개된 API를 통해 접근할 수 있는 데이터로, 특정 기관, 조직, 또는 서비스가 외부 개발자나 사용자에게 데이터를 제공하기 위해 개방한 API이다.

특징

  1. 공개성: 누구나 접근 가능하거나, 간단한 인증 절차를 통해 데이터를 활용할 수 있음.

  2. 자동화된 데이터 접근: API를 통해 실시간 또는 정기적으로 데이터를 프로그래밍 방식으로 요청하고 받을 수 있음.

  3. 구조화된 형식: 주로 JSON, XML, CSV 등 구조화된 데이터 형식으로 제공되어 쉽게 활용 가능.

  4. 다양한 활용성: 데이터를 가공하거나 분석하여 맞춤형 애플리케이션, 보고서, 연구 등 다양한 목적으로 사용 가능.

UN Comtrade 데이터 API로 접근#

그런데 UN Comtrade 데이터를 API를 통해 다운로드받는 것이 대용량의 데이터를 한 번에 가져올 수 있어서 효율적이라는 것이지, 그 과정이 쉬운 것은 아니다. 오히려 번거롭고 복잡한 편이라 할 수 있다. 왜냐하면 자신이 원하는 데이터를 API를 통해 요청하기 위해서는 파이썬 등 컴퓨터 언어를 이용한 코딩 작업, 또는 Stata 등 통계패키지에 의한 코딩 작업이 필요하기 때문이다. 이를 수행하기 위해서는 API 호출 프로그램을 알아야 할 뿐 아니라, 연구자 본인이 원하는 데이터 항목에 해당하는 코드를 정확히 알아내 API 호출 프로그램을 만들어야 한다.

가령 “2022년 세계 모든 나라별로 연간 상품 수출 데이터를 HS(Harmonized System) 기준 모든 품목에 대해 얻고자 하는 경우”를 생각해보자. 이를 실행하기 위해서는 각각의 조건(즉, “모든 나라”, “연간”, “수출”, “HS 기준”, “모든 품목” 등등)에 해당하는 코드를 알아내 API 호출 프로그램을 짜야 한다. 이와 같은 작업에 처음 접근하는 사람에게는 진입장벽이 높은 편이라 할 수 있다.

HS(Harmonized System)는 국제적으로 통일된 상품 분류 체계다. 세계관세기구(WCO)가 개발했으며, 상품에 6자리 코드를 부여하여 전 세계적으로 무역 통계를 수집하고 분석하는 데 사용된다. SITC(Standard International Trade Classification)는 유엔통계국(UN Statistics Division)이 개발한 분류 체계로, 국제 무역 데이터를 분석하고 비교하는 데 사용된다. SITC는 상품을 경제적 활동에 맞게 그룹화하여 1자리에서 5자리 코드로 세분화한다. BEC(Broad Economic Categories) 역시 유엔통계국이 개발한 분류 체계로, 상품과 서비스를 경제적 용도에 따라 분류한다. BEC는 주로 자본재, 중간재, 소비재로 나누며, 경제 분석과 무역 연구에 활용된다.

comtradeapicall 패키지#

이런 사정을 감안하여 UN Comtrade 측에서 2023년 1월 comtradeapicall이라는 파이썬 패키지를 만들어 공개했다. 이는 파이썬을 사용해 UN Comtrade API를 호출하여 데이터를 추출하고 다운로드하는 작업을 쉽게 수행할 수 있도록 해준다. UN Comtrade API 호출 프로그램을 연구자 본인이 처음부터 만들 필요 없이 이미 짜여진 프로그램 속에 자신이 원하는 부분만 채워넣는 방식으로 작업을 수행할 수 있게 해준다.

여기서는 파이썬 comtradeapicall 패키지를 이용해 UN Comtrade 데이터를 다운로드받는 방법을 소개한다. UN Comtrade 데이터베이스 인증키를 얻는 방법과 comtradeapicall 패키지를 설치하는 방법 등 데이터를 추출하기 위한 사전작업에 대해 설명한다. 또한 comtradeapicall이 제공하는 여러 함수들의 사용법을 살펴보고, 함수에 들어 있는 여러 파라미터들의 의미와 설정 방법을 소개한다. 그런 다음, 이상의 설명을 실제 UN Comtrade 데이터 추출에 적용하고, 그렇게 해서 다운로드받은 데이터를 사용하여 무역지표를 계산하는 것을 예시적으로 보여준다.

2. 사전 작업#

UN Comtrade API 인증키 획득#

API Key는 API를 사용할 때 사용자를 인증(확인)하고 해당 사용자가 어떤 데이터나 서비스를 사용할 수 있는지 권한을 부여하기 위한 고유한 식별자이다. 이는 마치 웹사이트에 로그인할 때 사용하는 사용자 이름과 비밀번호와 같은 역할을 한다.

  • UN Comtrade API를 사용하려면 인증키가 필요하다.

  • 인증키를 얻기 위해서는 UN Comtrade API portal에 방문한다. 로그인 단추(“Azure Active Directory B2C”)를 클릭하면 새로운 창이 생기면서 로그인 정보의 입력을 요구한다.

  • 이미 @un.org 계정이 있거나 여기에 새로이 가입하는 경우 이를 통해 로그인할 수 있다.

  • 또는 자신의 Gmail 계정과 비밀번호를 사용하여 UN Comtrade에 계정을 설정할 수 있다.

  • 로그인 후 상단 메뉴에서 Products를 선택한다.

  • 프리미엄 등급이 아닐 경우 Free APIs를 선택한다.

  • 원하는 구독 이름을 만들고 Subscribe를 클릭하면 인증키가 생성된다.

  • 인증키가 발급되면 상단 메뉴의 Profile에서 확인할 수 있다.

  • 인증키가 사용 도중 중단되는 경우, Profile에서 재발급받을 수 있다.

데이터베이스별 API 종류#

인증키의 종류에 따라 UN Comtrade 데이터베이스 접근이 차등화되며, 그 내용이 아래 표에 나와 있다(출처). Free API 인증키(즉, 무료 회원)인 경우에는 비동기(asynchronous) 요청이나 대용량 다운로드(bulk download)를 할 수 없다. UN Comtrade 데이터베이스별로 무료 또는 유료(프리미엄) 인증키가 필요하고, 인증키 없이 접근 가능한 경우도 있다.

데이터베이스

내용

comtrade - v1

Free API. 무역 데이터 및 메타데이터. 인증키가 필요함.

comtradeAsync - v1

Premium API. 비동기 요청(asynchronous request). 이메일로 결과 알림을 받음. 인증키가 필요함.

comtradebulk - v1

Premium API. 대용량 파일. 인증키가 필요함.

experimental - v1

AIS(선박자동식별시스템) 데이터를 사용하여 해상 무역을 추정한 실험적 데이터.

public - v1

Free API. 무역 데이터 미리보기. 인증키가 필요하지 않음.

comtradeapicall 패키지 설치#

comtradeapicall는 파이썬 패키지로서 UN Comtrade API를 호출하여 데이터를 추출하고 다운로드하는 작업을 쉽게 수행할 수 있도록 해준다. 파이썬 프롬프트 창에서 다음을 실행하면 파이썬에 comtradeapicall 패키지가 설치된다.

pip install comtradeapicall

파이썬을 주피터 노트북의 셀에서 설치할 경우 %pip install comtradeapicall을 실행시킨다. comtradeapicall 설치 후에는 다음과 같이 pandasnumpy 라이브러리와 함께 comtradeapicall 패키지를 불러들이고, 이미 받아놓은 인증키를 지정해 놓으면 UN Comtrade API 호출 준비가 완료된다.

import pandas as pd
import numpy as np
import comtradeapicall
subscription_key = '자신의 인증키’ 

3. comtradeapicall 사용법#

comtradeapicall 패키지는 API 호출에 필요한 함수들을 데이터베이스 별로, 그리고 필요한 기능별로 만들어 놓았다.(자세한 것은 comtradeapicall 패키지 참조.) comtradeapicall 패키지를 설치하면 다음과 같은 함수를 사용할 수 있다.

함수 종류#

구  분

함  수

가져오기/미리보기

previewTarifflineData(SelectionCriteria, query_option)
getFinalData(subscription_key, SelectionCriteria, query_option)
getTarifflineData(subscription_key, SelectionCriteria, query_option)
_previewFinalData
_previewTarifflineData
_getFinalData
_getTarifflineData

데이터 Availability 확인

_getFinalDataAvailability(SelectionCriteria)
getFinalDataAvailability(subscription_key, SelectionCriteria)
_getTarifflineDataAvailability(SelectionCriteria)
getTarifflineDataAvailability(subscription_key, SelectionCriteria)
getFinalDataBulkAvailability(subscription_key, SelectionCriteria, [publishedDateFrom], [publishedDateTo])
getTarifflineDataBulkAvailability(subscription_key, SelectionCriteria, [publishedDateFrom], [publishedDateTo])
getLiveUpdate(subscription_key)

대용량 데이터 다운로드

bulkDownloadFinalData(subscription_key, directory, SelectionCriteria, decompress, [publishedDateFrom], [publishedDateTo])
bulkDownloadFinalClassicData(subscription_key, directory, SelectionCriteria, decompress, [publishedDateFrom], [publishedDateTo])
bulkDownloadTarifflineData(subscription_key, directory, SelectionCriteria, decompress, [publishedDateFrom], [publishedDateTo])

비동기적 추출
이메일로 통보(최대 250만 레코드)

submitAsyncFinalDataRequest(subscription_key, SelectionCriteria, query_option)
submitAsyncTarifflineDataRequest(subscription_key, SelectionCriteria, query_option)
checkAsyncDataRequest(subscription_key, [batchId])
downloadAsyncFinalDataRequest(subscription_key, directory, SelectionCriteria, query_option)
downloadAsyncTarifflineDataRequest(subscription_key, directory, SelectionCriteria, query_option)

메타데이터, 노트, 레퍼런스 추출

_getMetadata(SelectionCriteria, showHistory)
getMetadata(subscription_key, SelectionCriteria, showHistory)
listReference([category])
getReference(category)

표준단위값(SUV: Standard Unit Values) 추출

getSUV(subscription_key, SelectionCriteria, [qtyUnitCode])

선박자동식별시스템(AIS) 데이터 추출

getAIS(subscription_key, AISSelectionCriteria, [vesselTypeCode])

comtradeapicall 패키지 함수 사용법#

위 표에 정리돼 있는 함수들 중에서, Free API 인증키로 가장 많이 사용하는 함수는 다음 두 가지일 것이다.

getFinalData(subscription_key, SelectionCriteria, query_option)
getTarifflineData(subscription_key, SelectionCriteria, query_option)

이들 두 함수 모두 데이터를 불러오는 데 사용하는 함수이다. 두 함수는 구조가 거의 동일한데, 단지 함수 이름에 FinalTariffline 부분만 다르다. 아래 표에 나와 있는 대부분의 함수 이름이 FinalTariffline 두 종류로 돼 있는 것을 알 수 있다. Tariffline 데이터는 각 국가에서 제출한 HS 원본 데이터이다. 즉, 어떤 범주별로 합쳐진 고수준 데이터(예: 총 상품, 파트너로서의 WORLD)가 없으며, 이상값 탐지나 수량 추정도 없다. 또한, 데이터는 BEC(Broad Economic Categories), SITC(Standard International Trade Classification)와 같은 다른 분류로 변환되지 않는다.

위의 두 개 함수의 괄호안에 세 가지 종류의 인수(argument)가 있는데, 이들 인수를 사용해 자신이 원하는 데이터를 지정하게 된다. 첫 번째 인수인 subscription_key는 이미 앞 장에서 획득 방법을 설명했다. 두 번째 범주인 SelectionCriteria가 핵심인데, 여기에 속하는 파라미터들이 아래 표에 정리돼 있다. 가령 SelectionCriteria 범주의 첫 번째 파라미터인 typeCode의 경우, 상품 유형을 선택하는 것으로서 필요한 값을 문자(“str”)로 지정하며, 상품이면 C로 표시한다.

comtradeapicall 파라미터(1)#

구분

세부 사항

SelectionCriteria

- typeCode(str): 상품 유형. 상품 (C) 또는 서비스 (S)
- freqCode(str): 관측 시간 간격. 연간 (A) 또는 월간 (M)
- clCode(str): 상품 분류 및 버전 (HS, SITC)
- period(str): 연도와 월 조합 (월간) 또는 연도 (연간)
- reporterCode(str): 통계 관련 국가 또는 지리적 영역
- cmdCode(str): 분류 코드와 사용하는 상품 코드
- flowCode(str): 무역 흐름 (수출, 재수출, 수입, 재수입 등)
- partnerCode(str): 주요 상대국 또는 지리적 영역
- partner2Code(str): 보조 상대국 또는 지리적 영역
- customsCode(str): 세관 또는 통계 절차
- motCode(str): 운송 방식 (국가 경제 영토 이동 시)

query_option

- maxRecords(int): 반환 레코드 수 제한
- format_output(str): 출력 형식 (CSV, JSON)
- aggregateBy(str): 쿼리 집계 옵션
- breakdownMode(str): classic 모드 (상대국/상품별) 또는 plus 모드 (세분화)
- countOnly(bool): True 설정 시 실제 레코드 수 반환
- includeDesc(bool): 설명 포함 여부

AIS SelectionCriteria

- typeCode(str): 상품 유형. 상품 (C)만 해당
- freqCode(str): 시간 간격. 일간 (D)
- datefrom(str) 및 dateto(str): 관측 날짜 (ASCII 형식)
- countryareaCode(str): 국가 코드 (getReference(‘ais:countriesareas’)로 확인 가능)
- vesselTypeCode(str): 운송 선박 유형 (getReference(‘ais:vesseltypes’)로 확인 가능)
- flowCode(str): 무역 흐름 (수출, 수입)

comtradeapicall 파라미터(2)#

  • 다음은 Free API 인증키로 접근 가능한 comtrade - v1 데이터베이스를 호출할 때 사용하는 comtrade - v1 파라미터이다.

파라미터

필수 여부

타입

내용

typeCode

true

string

무역 유형: 상품은 C, 서비스는 S

freqCode

true

string

무역 빈도: 연간은 A, 월간은 M

clCode

true

string

상품 분류: HS, SITC, BEC, EBOPS

reporterCode

false

string

보고국 코드 (쉼표(,)로 구분된 3자리 숫자 국가 코드)

period

false

string

연도 또는 월. 연도는 4자리 숫자. 월은 YYYYMM 형식. 다중값 입력은 쉼표(,)로 구분.

partnerCode

false

string

상대국 코드 (쉼표(,)로 구분된 3자리 숫자 국가 코드)

partner2Code

false

string

두 번째 상대국 코드 (쉼표(,)로 구분된 3자리 숫자 국가 코드)

cmdCode

false

string

상품 코드. 다중값 입력은 쉼표(,)로 구분.

flowCode

false

string

무역흐름/하위흐름 코드(수출, 재수출, 수입, 재수입 등). 다중 값 입력은 쉼표(,)로 구분.

customsCode

false

string

세관 코드. 다중값 입력은 쉼표(,)로 구분.

motCode

false

string

운송 방식 코드. 다중값 입력은 쉼표(,)로 구분.

aggregateBy

false

csv

결과를 aggregate하려는 파라미터를 쉼표(,)로 구분된 리스트로 추가.

breakdownMode

false

csv

‘classic’은 상세한 형태, ‘aggregated’는 큰 범주로 묶어 요약된 형태로 제공함.

includeDesc

false

boolean

데이터 변수의 설명 포함 여부

comtradeapicall 패키지 함수의 인수 중 세 번째 범주인 query_option은 데이터의 형식에 관한 요청 사항이다. 가령 query_option 범주의 첫 번째 파라미터인 _maxRecords는 최대 레코드(관측) 개수를 지정하는 것으로서 정수(int)로 표기해야 한다. 또 다른 파라미터인 includeDesc는 항목에 대한 설명을 포함시킬지를 선택하는 것으로서 부울값(bool), 즉 True 또는 False로 표기한다. query_optionbreakdownMode의 경우에는 classicplus 두 가지 옵션이 있는데, 후자가 보다 세분화된 데이터를 제공한다.

한편, 위 파라미터(2) 표의 맨 하단에 나와 있는 AIS(선박자동식별시스템) 기반 데이터의 SelectionCriteria의 경우, 표의 맨 위에 나와 있는 일반적인 무역 통계의 선택사항과는 약간 다른 형태인 것을 알 수 있다. UN Comtrade 데이터베이스에는 AIS(Automatic Identification System) 데이터를 사용하여 해상 무역량을 추정한 실험적 데이터가 있다. IMF(국제통화기금)의 Cerdeiro 등 (2020)은 AIS 원시 데이터를 사용하여 세계 해상 무역량 지표를 추정하는 시스템을 구축했다. AIS 데이터에 머신러닝 기법을 적용하여 세계 전체, 양국, 그리고 국가 내 수준에서 무역량을 추정하는 방식이다. 이를 통해 해상 무역량을 사실상 실시간으로 추정하는 것이 가능하다.

이상의 설명에서 짐작할 수 있듯이 UN Comtrade 데이터를 API를 통해 제대로 추출하기 위해서는 자신이 원하는 조건에 해당하는 코드를 잘 찾아서 제대로 입력해야 하고, 데이트를 불러온 다음에는 각 컬럼 변수 이름(코드)의 의미를 잘 알아야 한다. UN Comtrade 데이터의 각 항목(코드)의 의미와 종류에 대해서는 UN Comtrade List of References에 자세히 나와 있다.

comtradeapicall 패키지 사용 절차#

(1) UN Comtrade API 인증키 지정

# comtradeapicall 패키지 설치(처음 한 번만 설치하면 됨)
# %pip install comtradeapicall
import pandas as pd
import numpy as np
import comtradeapicall
# 아래 따옴표 안에 자신의 인증키를 복붙해 넣는다.

subscription_key = '자신의 인증키'

(2) 원하는 comtradeapicall 함수 선택

  • 아래에서는 comtradeapicall 함수 사용법의 간단한 예를 소개하고, UN Comtrade 데이터를 다운로드받는 예제는 다음 절에서 설명한다.

# 전체 추출 결과를 알기 위해 모든 컬럼이 출력되도록 설정
pd.set_option('display.max_columns',  None)
# 세 글자로 된 나라 코드를 숫자 코드로 전환(한국의 경우 세 글자는 'KOR'이고 숫자 코드는 410임)

country_code = comtradeapicall.convertCountryIso3ToCode('KOR')
country_code
'410'
# 보고국(reporter) 코드 리스트 반환

mydf = comtradeapicall.getReference('reporter')
mydf
id text reporterCode reporterDesc reporterNote reporterCodeIsoAlpha2 reporterCodeIsoAlpha3 entryEffectiveDate isGroup entryExpiredDate
0 4 Afghanistan 4 Afghanistan Afghanistan AF AFG 1900-01-01T00:00:00 False NaN
1 8 Albania 8 Albania Albania AL ALB 1900-01-01T00:00:00 False NaN
2 12 Algeria 12 Algeria Algeria DZ DZA 1900-01-01T00:00:00 False NaN
3 20 Andorra 20 Andorra Andorra AD AND 1900-01-01T00:00:00 False NaN
4 24 Angola 24 Angola Angola AO AGO 1900-01-01T00:00:00 False NaN
... ... ... ... ... ... ... ... ... ... ...
250 887 Yemen 887 Yemen Yemen YE YEM 1991-01-01T00:00:00 False NaN
251 890 Yugoslavia (...1991) 890 Yugoslavia (...1991) Former Yugoslavia YU YUG 1900-01-01T00:00:00 False 1991-12-31T00:00:00
252 894 Zambia 894 Zambia Zambia ZM ZMB 1965-01-01T00:00:00 False NaN
253 836 Zanzibar and Pemba Isd (...1964) 836 Zanzibar and Pemba Isd (...1964) Former Zanzibar and Pemba Island NaN _ZP 1900-01-01T00:00:00 False 1964-12-31T00:00:00
254 716 Zimbabwe 716 Zimbabwe Zimbabwe ZW ZWE 1965-01-01T00:00:00 False NaN

255 rows × 10 columns

4. Comtrade 데이터 다운로드 예제#

  • github의 comtradeapicall 사이트에는 보다 많은 예제 코드가 나와있다.

한국의 2022년 상품 수출#

아래 명령문은 getFinalData 함수를 사용해 “Final” 데이터를 불러들이는 것으로서,

  • 한국(reporterCode=‘410’)이

  • 전 세계(partnerCode=’000’)를 대상으로

  • 2022년(period=’2022’)

  • 연간(freqCode=’A’)으로

  • 상품(typeCode=’C’)을

  • 수출(flowCode=’X’)한 금액을

  • HS 기준(clCode=’HS’)

  • 모든 품목(cmdCode=None)에 대해

  • 클래식 형태(breakdownMode=’classic’)로 얻기 위한 것이다.

data = comtradeapicall.getFinalData(
    subscription_key, 
    typeCode='C', 
    freqCode='A', 
    clCode='HS', 
    period='2022', 
    reporterCode='410', 
    cmdCode=None, 
    flowCode='X', 
    partnerCode='000', 
    partner2Code=None, 
    customsCode=None, 
    motCode=None, 
    maxRecords=None, 
    format_output='JSON', 
    aggregateBy=None, 
    breakdownMode='classic', 
    countOnly=None, 
    includeDesc=True)
data
    typeCode	freqCode	refPeriodId	refYear	refMonth	period	reporterCode	reporterISO	reporterDesc	flowCode	flowDesc	partnerCode	partnerISO	partnerDesc	partner2Code	partner2ISO	partner2Desc	classificationCode	classificationSearchCode	isOriginalClassification	cmdCode	cmdDesc	aggrLevel	isLeaf	customsCode	customsDesc	mosCode	motCode	motDesc	qtyUnitCode	qtyUnitAbbr	qty	isQtyEstimated	altQtyUnitCode	altQtyUnitAbbr	altQty	isAltQtyEstimated	netWgt	isNetWgtEstimated	grossWgt	isGrossWgtEstimated	cifvalue	fobvalue	primaryValue	legacyEstimationFlag	isReported	isAggregate
0	C	A	20220101	2022	52	2022	410	KOR	Rep. of Korea	X	Export	0	W00	World	0	W00	World	H6	HS	True	24	Tobacco and manufactured tobacco substitutes; ...	2	False	C00	TOTAL CPC	0	0	TOTAL MOT	-1	N/A	0.000000e+00	False	-1	N/A	0.0	False	0.000000e+00	False	0.0	False	None	979071521.0	979071521.0	0	False	True
1	C	A	20220101	2022	52	2022	410	KOR	Rep. of Korea	X	Export	0	W00	World	0	W00	World	H6	HS	True	02	Meat and edible meat offal	2	False	C00	TOTAL CPC	0	0	TOTAL MOT	-1	N/A	0.000000e+00	False	-1	N/A	0.0	False	0.000000e+00	False	0.0	False	None	84965415.0	84965415.0	0	False	True
2	C	A	20220101	2022	52	2022	410	KOR	Rep. of Korea	X	Export	0	W00	World	0	W00	World	H6	HS	True	05	Animal originated products; not elsewhere spec...	2	False	C00	TOTAL CPC	0	0	TOTAL MOT	-1	N/A	0.000000e+00	False	-1	N/A	0.0	False	0.000000e+00	False	0.0	False	None	59207744.0	59207744.0	0	False	True
3	C	A	20220101	2022	52	2022	410	KOR	Rep. of Korea	X	Export	0	W00	World	0	W00	World	H6	HS	True	53	Vegetable textile fibres; paper yarn and woven...	2	False	C00	TOTAL CPC	0	0	TOTAL MOT	-1	N/A	0.000000e+00	False	-1	N/A	0.0	False	0.000000e+00	False	0.0	False	None	9888321.0	9888321.0	0	False	True
4	C	A	20220101	2022	52	2022	410	KOR	Rep. of Korea	X	Export	0	W00	World	0	W00	World	H6	HS	True	14	Vegetable plaiting materials; vegetable produc...	2	False	C00	TOTAL CPC	0	0	TOTAL MOT	-1	N/A	0.000000e+00	False	-1	N/A	0.0	False	0.000000e+00	False	0.0	False	None	484798.0	484798.0	0	False	True
...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...
6230	C	A	20220101	2022	52	2022	410	KOR	Rep. of Korea	X	Export	0	W00	World	0	W00	World	H6	HS	True	2206	Fermented beverages, n.e.c. in chapter 22; (e....	4	False	C00	TOTAL CPC	0	0	TOTAL MOT	7	l	5.841711e+07	True	-1	N/A	0.0	False	5.841711e+07	False	0.0	False	None	49500161.0	49500161.0	2	False	True
6231	C	A	20220101	2022	52	2022	410	KOR	Rep. of Korea	X	Export	0	W00	World	0	W00	World	H6	HS	True	2203	Beer made from malt	4	False	C00	TOTAL CPC	0	0	TOTAL MOT	7	l	1.024642e+08	True	-1	N/A	0.0	False	1.024642e+08	False	0.0	False	None	69474212.0	69474212.0	2	False	True
6232	C	A	20220101	2022	52	2022	410	KOR	Rep. of Korea	X	Export	0	W00	World	0	W00	World	H6	HS	True	2209	Vinegar and substitutes for vinegar obtained f...	4	False	C00	TOTAL CPC	0	0	TOTAL MOT	7	l	5.508541e+07	True	-1	N/A	0.0	False	3.934114e+07	False	0.0	False	None	67268725.0	67268725.0	2	False	True
6233	C	A	20220101	2022	52	2022	410	KOR	Rep. of Korea	X	Export	0	W00	World	0	W00	World	H6	HS	True	2208	Ethyl alcohol, undenatured; of an alcoholic st...	4	False	C00	TOTAL CPC	0	0	TOTAL MOT	7	l	1.333510e+08	True	-1	N/A	0.0	False	1.233497e+08	False	0.0	False	None	187509632.0	187509632.0	2	False	True
6234	C	A	20220101	2022	52	2022	410	KOR	Rep. of Korea	X	Export	0	W00	World	0	W00	World	H6	HS	True	2202	Waters, including mineral and aerated waters, ...	4	False	C00	TOTAL CPC	0	0	TOTAL MOT	7	l	5.237197e+08	True	-1	N/A	0.0	False	5.237197e+08	False	0.0	False	None	630284808.0	630284808.0	2	False	True

6235 rows × 47 columns

UN Comtrade 데이터 각 항목 코드 의미

  • 반환된 UN Comtrade 데이터의 각 항목(코드)들이 무엇을 의미하고, 어떤 종류가 있는지에 대해서는 UN Comtrade List of References에 자세히 나와 있다.

전세계 2022년 상품 수출#

  • 다음은 2022년 연간(A) 상품(C) 수출(X) Final 데이터를 얻기 위한 것이다. 전 세계 모든 나라 각각이 전 세계(000)를 대상으로 수출한 금액을 HS 기준 모든 품목(cmdCode=None)에 대해 얻고자 한다.

  • 전 세계 모든 나라 각각에 대해 데이터를 얻고자 하기 때문에 reporterCode=None으로 하면 되는데, 이렇게 할 경우 Free API 인증키로 다운로드받을 수 있는 레코드 한계(이 경우 한 번에 10만 개 레코드)를 초과함으로써 오류 메지지가 나오게 된다.(아래 결과에서 보듯이 모든 나라를 대상으로 할 경우 관측 갯수가 총 549,162개이다.)

  • 그래서 불가피하게 나라 코드 리스트에 있는 252개주1 나라 각각에 대해 데이터를 다운로드받아 pandasconcat 함수를 사용해 이를 병합(이 경우 세로로 쌓는 방식)해나가는 방식을 사용했다.

    [주1]: UN Comtrade List of References “Reporter” 참조.

  • 개인의 컴퓨팅 환경에 따라 본 데이터를 다운로드받는 시간이 다르겠지만, 여기서는 55분 정도 소요됐다.

  • Free API 구독자의 경우, 한 번에 다운로드받을 수 있는 레코드의 한계는 이런 식(즉, 루프 반복작업)으로 해결하면 되지만, UN Comtrade의 경우, 요청하는 데이터의 누적 용량에도 한도가 있다. 이 한도를 초과할 경우, “Out of call volume quota. Quota will be replenished in 11:05:25.”와 같은 메시지가 뜨면서 일정 시간 사용이 중단된다.

  • 추출된 데이터를 보면, 우리가 요청한 나라는 252개국이지만, 반환된 데이터세트에는 보고국이 144개국인 것으로 나타났다. 2022년 통계가 아직 입력되지 않은 나라도 있겠지만, 우리가 요청한 나라 리스트에는 동독(278: Dem. Rep. of Germany (…1990)), 서독(280: Fed. Rep. of Germany (…1990)) 등 2022년 현재 존재하지 않는 나라도 있기 때문이다.

country_list = [  
     4,   8,  12,  20,  24, 660,  28, 886,  32,  51, 533,  36,  40,
    31,  44,  48,  50,  52, 112,  56,  58,  84, 204,  60,  64,  68,
   535,  70,  72,  92,  76,  96, 100, 854, 108, 132, 116, 120, 124,
   136, 140, 148, 152, 156, 344, 446, 170, 174, 178, 184, 188, 384,
   191, 192, 531, 196, 203, 200, 408, 278, 180, 866, 720, 208, 262,
   212, 214, 588, 218, 818, 222, 226, 232, 233, 748, 231, 230, 234,
   280, 242, 246, 251, 254, 258, 583, 266, 270, 268, 276, 288, 292,
   300, 304, 308, 312, 320, 324, 624, 328, 332, 336, 340, 348, 352,
   699, 356, 360, 364, 368, 372, 376, 380, 388, 392, 400, 398, 404,
   296, 414, 417, 418, 428, 422, 426, 430, 434, 440, 442, 450, 454,
   458, 462, 466, 470, 584, 474, 478, 480, 175, 484, 496, 499, 500,
   504, 508, 104, 580, 516, 520, 524, 528, 530, 532, 540, 554, 558,
   562, 566, 570, 807, 579, 512, 582, 586, 585, 591, 590, 592, 598,
   600, 459, 604, 608, 616, 620, 634, 410, 498, 868, 638, 717, 642,
   643, 646, 461, 652, 654, 659, 658, 662, 534, 666, 670, 882, 674,
   678, 682, 686, 688, 891, 690, 694, 702, 703, 705,  90, 706, 710,
   728, 711, 724, 144, 275, 729, 736, 740, 752, 757, 760, 762, 835,
   764, 626, 768, 772, 776, 780, 788, 792, 795, 796, 798, 800, 804,
   784, 826, 834, 858, 850, 842, 841, 810, 860, 548, 862, 704, 876,
   887, 890, 894, 836, 716
]
import time
# 시작 시간 기록
start_time = time.time()

import pandas as pd

# 각 호출로 얻은 데이터프레임을 저장할 리스트
dataframes = []

# country_list에서 각 국가의 데이터를 가져와 데이터프레임 리스트에 추가
for country in country_list:
    data = comtradeapicall.getFinalData(
        subscription_key, 
        typeCode='C',
        freqCode='A', 
        clCode='HS', 
        period='2022', 
        reporterCode=str(country), 
        cmdCode=None, 
        flowCode='X',
        partnerCode='000', 
        partner2Code=None, 
        customsCode=None, 
        motCode=None, 
        maxRecords=None, 
        format_output='JSON',
        aggregateBy=None, 
        breakdownMode='classic', 
        countOnly=None, 
        includeDesc=True
    )
    # 불러온 데이터프레임을 리스트에 추가
    dataframes.append(data)

# 리스트의 데이터프레임을 세로로 연결
df = pd.concat(dataframes, ignore_index=True)

# 최종 데이터프레임을 저장
df.to_csv('../Data/comtrade_year.csv', index=False)

# 종료 시간 기록
end_time = time.time()
# 실행 시간 계산
execution_time = end_time - start_time
# 분과 초로 변환
minutes = int(execution_time // 60)
seconds = int(execution_time % 60)
print(f"실행 시간: {minutes}분 {seconds}초")
df
실행 시간: 54분 6초

        typeCode	freqCode	refPeriodId	refYear	refMonth	period	reporterCode	reporterISO	reporterDesc	flowCode	flowDesc	partnerCode	partnerISO	partnerDesc	partner2Code	partner2ISO	partner2Desc	classificationCode	classificationSearchCode	isOriginalClassification	cmdCode	cmdDesc	aggrLevel	isLeaf	customsCode	customsDesc	mosCode	motCode	motDesc	qtyUnitCode	qtyUnitAbbr	qty	isQtyEstimated	altQtyUnitCode	altQtyUnitAbbr	altQty	isAltQtyEstimated	netWgt	isNetWgtEstimated	grossWgt	isGrossWgtEstimated	cifvalue	fobvalue	primaryValue	legacyEstimationFlag	isReported	isAggregate
0	C	A	20220101	2022	52	2022	8	ALB	Albania	X	Export	0	W00	World	0	W00	World	H6	HS	True	01	Animals; live	2	False	C00	TOTAL CPC	0	0	TOTAL MOT	-1	N/A	0.0	False	-1	N/A	0.0	False	0.00	False	0.0	False	None	3.479846e+05	3.479846e+05	0	False	True
1	C	A	20220101	2022	52	2022	8	ALB	Albania	X	Export	0	W00	World	0	W00	World	H6	HS	True	02	Meat and edible meat offal	2	False	C00	TOTAL CPC	0	0	TOTAL MOT	-1	N/A	0.0	False	-1	N/A	0.0	False	0.00	False	0.0	False	None	6.550805e+05	6.550805e+05	0	False	True
2	C	A	20220101	2022	52	2022	8	ALB	Albania	X	Export	0	W00	World	0	W00	World	H6	HS	True	03	Fish and crustaceans, molluscs and other aquat...	2	False	C00	TOTAL CPC	0	0	TOTAL MOT	-1	N/A	0.0	False	-1	N/A	0.0	False	0.00	False	0.0	False	None	7.013100e+07	7.013100e+07	0	False	True
3	C	A	20220101	2022	52	2022	8	ALB	Albania	X	Export	0	W00	World	0	W00	World	H6	HS	True	0302	Fish; fresh or chilled, excluding fish fillets...	4	False	C00	TOTAL CPC	0	0	TOTAL MOT	-1	N/A	0.0	False	-1	N/A	0.0	False	0.00	False	0.0	False	None	7.950215e+05	7.950215e+05	0	False	True
4	C	A	20220101	2022	52	2022	8	ALB	Albania	X	Export	0	W00	World	0	W00	World	H6	HS	True	04	Dairy produce; birds' eggs; natural honey; edi...	2	False	C00	TOTAL CPC	0	0	TOTAL MOT	-1	N/A	0.0	False	-1	N/A	0.0	False	0.00	False	0.0	False	None	7.537882e+06	7.537882e+06	0	False	True
...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...
549157	C	A	20220101	2022	52	2022	716	ZWE	Zimbabwe	X	Export	0	W00	World	0	W00	World	H5	HS	True	9507	Fishing rods, fish-hooks and other line fishin...	4	False	C00	TOTAL CPC	0	0	TOTAL MOT	-1	N/A	0.0	False	-1	N/A	0.0	False	7.64	False	0.0	False	None	3.096600e+02	3.096600e+02	0	False	True
549158	C	A	20220101	2022	52	2022	716	ZWE	Zimbabwe	X	Export	0	W00	World	0	W00	World	H5	HS	True	9606	Buttons, press-fasteners, snap-fasteners and p...	4	False	C00	TOTAL CPC	0	0	TOTAL MOT	8	kg	51.0	False	8	kg	51.0	False	51.00	False	0.0	False	None	5.763900e+02	5.763900e+02	0	False	True
549159	C	A	20220101	2022	52	2022	716	ZWE	Zimbabwe	X	Export	0	W00	World	0	W00	World	H5	HS	True	9610	Slates and boards, with writing or drawing sur...	4	False	C00	TOTAL CPC	0	0	TOTAL MOT	8	kg	15.0	False	8	kg	15.0	False	15.00	False	0.0	False	None	1.492000e+01	1.492000e+01	0	False	True
549160	C	A	20220101	2022	52	2022	716	ZWE	Zimbabwe	X	Export	0	W00	World	0	W00	World	H5	HS	True	9704	Stamps, postage or revenue; stamp-postmarks, f...	4	False	C00	TOTAL CPC	0	0	TOTAL MOT	8	kg	91.0	False	8	kg	91.0	False	91.00	False	0.0	False	None	8.953000e+01	8.953000e+01	0	False	True
549161	C	A	20220101	2022	52	2022	716	ZWE	Zimbabwe	X	Export	0	W00	World	0	W00	World	H5	HS	True	970500	Collections and collectors' pieces; of zoologi...	6	True	C00	TOTAL CPC	0	0	TOTAL MOT	8	kg	81530.5	False	8	kg	81530.5	False	81530.50	False	0.0	False	None	6.888609e+06	6.888609e+06	0	False	True

549162 rows × 47 columns

한미일중의 2022년 상품 수출#

country_list = [156, 392, 410, 842] # 중국, 일본, 한국, 미국
import time
# 시작 시간 기록
start_time = time.time()

import pandas as pd

# 각 호출로 얻은 데이터프레임을 저장할 리스트
dataframes = []

# country_list에서 각 국가의 데이터를 가져와 데이터프레임 리스트에 추가
for country in country_list:
    data = comtradeapicall.getFinalData(
        subscription_key, 
        typeCode='C',
        freqCode='A', 
        clCode='HS', 
        period='2022', 
        reporterCode=str(country), 
        cmdCode=None, 
        flowCode='X',
        partnerCode='000', 
        partner2Code=None, 
        customsCode=None, 
        motCode=None, 
        maxRecords=None, 
        format_output='JSON',
        aggregateBy=None, 
        breakdownMode='classic', 
        countOnly=None, 
        includeDesc=True
    )
    # 불러온 데이터프레임을 리스트에 추가
    dataframes.append(data)

# 리스트의 데이터프레임을 세로로 연결
df = pd.concat(dataframes, ignore_index=True)

# 최종 데이터프레임을 저장
df.to_csv('../Data/comtrade_2022.csv', index=False)

# 종료 시간 기록
end_time = time.time()
# 실행 시간 계산
execution_time = end_time - start_time
# 분과 초로 변환
minutes = int(execution_time // 60)
seconds = int(execution_time % 60)
print(f"실행 시간: {minutes}분 {seconds}초")
df
실행 시간: 1분 12초

    typeCode	freqCode	refPeriodId	refYear	refMonth	period	reporterCode	reporterISO	reporterDesc	flowCode	flowDesc	partnerCode	partnerISO	partnerDesc	partner2Code	partner2ISO	partner2Desc	classificationCode	classificationSearchCode	isOriginalClassification	cmdCode	cmdDesc	aggrLevel	isLeaf	customsCode	customsDesc	mosCode	motCode	motDesc	qtyUnitCode	qtyUnitAbbr	qty	isQtyEstimated	altQtyUnitCode	altQtyUnitAbbr	altQty	isAltQtyEstimated	netWgt	isNetWgtEstimated	grossWgt	isGrossWgtEstimated	cifvalue	fobvalue	primaryValue	legacyEstimationFlag	isReported	isAggregate
0	C	A	20220101	2022	52	2022	156	CHN	China	X	Export	0	W00	World	0	W00	World	H6	HS	True	01	Animals; live	2	False	C00	TOTAL CPC	0	0	TOTAL MOT	-1	N/A	0.000	False	-1	N/A	0.0	False	0.0	True	0.0	False	None	5.423596e+08	5.423596e+08	4	False	True
1	C	A	20220101	2022	52	2022	156	CHN	China	X	Export	0	W00	World	0	W00	World	H6	HS	True	0101	Horses, asses, mules and hinnies; live	4	False	C00	TOTAL CPC	0	0	TOTAL MOT	-1	N/A	0.000	False	-1	N/A	0.0	False	8000.0	False	0.0	False	None	1.200000e+04	1.200000e+04	0	False	True
2	C	A	20220101	2022	52	2022	156	CHN	China	X	Export	0	W00	World	0	W00	World	H6	HS	True	010121	Horses; live, pure-bred breeding animals	6	True	C00	TOTAL CPC	0	0	TOTAL MOT	-1	N/A	0.000	False	8	kg	8000.0	False	8000.0	False	0.0	False	None	1.200000e+04	1.200000e+04	0	False	True
3	C	A	20220101	2022	52	2022	156	CHN	China	X	Export	0	W00	World	0	W00	World	H6	HS	True	0102	Bovine animals; live	4	False	C00	TOTAL CPC	0	0	TOTAL MOT	5	u	42382.455	True	-1	N/A	0.0	False	8260791.0	False	0.0	False	None	5.317696e+07	5.317696e+07	2	False	True
4	C	A	20220101	2022	52	2022	156	CHN	China	X	Export	0	W00	World	0	W00	World	H6	HS	True	010290	Bovine animals; live, other than cattle and bu...	6	True	C00	TOTAL CPC	0	0	TOTAL MOT	5	u	42382.455	True	8	kg	8260791.0	False	8260791.0	False	0.0	False	None	5.317696e+07	5.317696e+07	2	False	True
...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...
25696	C	A	20220101	2022	52	2022	842	USA	USA	X	Export	0	W00	World	0	W00	World	H6	HS	True	970690	Antiques; of an age exceeding 100 years but no...	6	True	C00	TOTAL CPC	0	0	TOTAL MOT	8	kg	146974.000	False	8	kg	146974.0	False	146974.0	False	0.0	False	None	3.248431e+08	3.248431e+08	0	False	True
25697	C	A	20220101	2022	52	2022	842	USA	USA	X	Export	0	W00	World	0	W00	World	H6	HS	True	99	Commodities not specified according to kind	2	False	C00	TOTAL CPC	0	0	TOTAL MOT	-1	N/A	0.000	False	-1	N/A	0.0	False	0.0	False	0.0	False	None	6.295756e+10	6.295756e+10	0	False	True
25698	C	A	20220101	2022	52	2022	842	USA	USA	X	Export	0	W00	World	0	W00	World	H6	HS	True	9999	Commodities not specified according to kind	4	False	C00	TOTAL CPC	0	0	TOTAL MOT	-1	N/A	0.000	False	-1	N/A	0.0	False	0.0	False	0.0	False	None	1.567469e+11	1.567469e+11	0	False	True
25699	C	A	20220101	2022	52	2022	842	USA	USA	X	Export	0	W00	World	0	W00	World	H6	HS	True	999999	Commodities not specified according to kind	6	True	C00	TOTAL CPC	0	0	TOTAL MOT	-1	N/A	0.000	False	-1	N/A	0.0	False	0.0	False	0.0	False	None	1.567469e+11	1.567469e+11	0	False	True
25700	C	A	20220101	2022	52	2022	842	USA	USA	X	Export	0	W00	World	0	W00	World	H6	HS	True	TOTAL	All Commodities	0	False	C00	TOTAL CPC	0	0	TOTAL MOT	-1	N/A	0.000	False	-1	N/A	0.0	False	0.0	True	0.0	False	None	2.062090e+12	2.062090e+12	4	False	True

25701 rows × 47 columns

5. AIS 기반 해상 무역량 데이터#

UN Comtrade 데이터베이스에는 AIS(선박자동식별시스템)주2 데이터를 사용하여 해상 무역을 추정하는 실험적 데이터가 있다. IMF(국제통화기금)의 Cerdeiro 등의 연구진이 개발한 것이다.(Cerdeiro, D. A., Cerdeiro, M. D. A., Komaromi, A., Liu, Y., & Saeed, M. (2020). World seaborne trade in real time: A proof of concept for building AIS-based nowcasts from scratch (No. 20-57). International Monetary Fund. 논문 다운로드)

[주2]: AIS(Automatic Identification System)은 선박이 자신의 위치, 속도, 항로 등의 정보를 주기적으로 발신하여 다른 선박 및 해안 당국과 공유하는 시스템이다. 2002년 국제해사기구(IMO: International Maritime Organization)에 의해 도입되었다. 이후 대부분의 상업용 선박과 큰 여객선에 대해 AIS 탑재가 의무화되었다. 현재 AIS는 전 세계적으로 널리 사용되고 있으며, 해양 안전을 강화하고 해상 교통 관리, 사고 대응, 환경 모니터링, 무역 분석 등 다양한 분야에서 중요한 역할을 하고 있다.

해상 운송은 세계 무역의 핵심이며 실시간으로 추적할 수 있다. 유엔무역개발회의(UNCTAD, 2017)에 따르면 전 세계 상품 무역의 80% 이상이 해상 운송을 통해 이루어지며, 금액으로는 70% 이상을 차지한다. 화물선에는 주기적으로 신호를 전송하는 장치(AIS)가 장착되어 있으며, 선박의 위치, 속도, 흘수(draught) 등의 정보가 들어있다.

Cerdeiro 등(2020)은 AIS 원시 데이터를 사용하여 세계 해상 무역 지표를 구축했다. 절차를 보면, 우선 AIS 메시지에 공간 클러스터링(spatial clustering) 알고리즘을 적용하여 잠재적인 입항 데이터 세트를 구축한다. 이 잠재적인 입항 세트를 공식적인 선박 수준의 미국 입항 기록 데이터와 결합시킨다. 이 공식 데이터를 사용하여 특정 잠재적 입항이 실제 입항인지 여부를 예측하는 분류기를 훈련시킨다. 이를 통해 두 항만 간의 무역량을 추정하고 수입, 수출, 국내 무역량을 식별한다. 요컨대, AIS 데이터에 머신러닝 기법을 적용하여 세계 전체, 양국, 그리고 국가 내 수준에서 무역량을 추정해내는 것이다.

2024년 AIS기반 세계 해양 무역량 추출#

  • 세계 전체 국가 대상

  • 2024년 1월 1일부터 4월 30일까지 일별 데이터

  • AIS 기반 항구 입항 횟수 및 무역량(재화중량톤수 및 미터톤수) 추정치

  • 선박 유형이 DRY BULK인 경우(컨테이너나 탱크가 아니라 곡류, 광석 등 포장하지 않고 입자나 분말상태 그대로 선창에 싣는 화물)를 선택.

df_aistrade = comtradeapicall.getAIS(
    subscription_key, 
    countryareaCode=None, 
    vesselTypeCode='1', 
    dateFrom='2024-01-01', 
    dateTo='2024-04-30'
)
df_aistrade
    typeCode	freqCode	countryareaCode	countryareaDesc	vesselTypeCode	vesselTypeDesc	flowCode	flowDesc	date	num_pc	mtc	dwt	num_pc_ma	mtc_ma	dwt_ma
0	C	D	400	Jordan	1	Bulk	M	Imports	2024-03-21T00:00:00	0.0	0.00	0.0	0.167	3180.029	9091.967
1	C	D	400	Jordan	1	Bulk	M	Imports	2024-03-22T00:00:00	0.0	0.00	0.0	0.167	3180.029	9091.967
2	C	D	400	Jordan	1	Bulk	M	Imports	2024-03-23T00:00:00	0.0	0.00	0.0	0.167	3180.029	9091.967
3	C	D	400	Jordan	1	Bulk	M	Imports	2024-03-24T00:00:00	0.0	0.00	0.0	0.167	3180.029	9091.967
4	C	D	400	Jordan	1	Bulk	M	Imports	2024-03-25T00:00:00	0.0	0.00	0.0	0.167	3180.029	9091.967
...	...	...	...	...	...	...	...	...	...	...	...	...	...	...	...
31609	C	D	504	Morocco	1	Bulk	X	Exports	2024-04-26T00:00:00	1.0	32380.35	81641.0	2.067	34451.279	77027.067
31610	C	D	504	Morocco	1	Bulk	X	Exports	2024-04-27T00:00:00	1.0	23533.03	37782.0	2.100	35235.713	78286.467
31611	C	D	504	Morocco	1	Bulk	X	Exports	2024-04-28T00:00:00	2.0	35757.32	76438.0	2.167	36427.624	80834.400
31612	C	D	504	Morocco	1	Bulk	X	Exports	2024-04-29T00:00:00	0.0	0.00	0.0	2.167	36427.624	80834.400
31613	C	D	504	Morocco	1	Bulk	X	Exports	2024-04-30T00:00:00	1.0	23045.95	37000.0	2.167	36722.909	80783.433

31614 rows × 15 columns

AIS 기반 데이터 항목 코드

항목

내용

typeCode

제품 유형: 상품 또는 서비스

freqCode

관측이 발생하는 시간 간격

date

관측이 측정된 날짜

countryareaCode

측정된 통계 현상이 관련된 국가 또는 지리적 지역

countryareaDesc

국가 또는 지리적 지역에 대한 설명

vesselTypeCode

상품을 운송하는 선박의 상위 분류

vesselTypeDescription

선박 유형 설명

flowCode

무역 흐름 (수출/수입)

flowDesc

무역 흐름에 대한 설명

num_pc

항구 입항 횟수

num_pc_ma

항구 입항 횟수의 30일 이동 평균

dwt

재화중량톤수

dwt_ma

재화중량톤수의 30일 이동 평균

mtc

화물 미터톤수

mtc_ma

화물 미터톤수의 30일 이동 평균

선박유형 코드

vesselTypeCode

vesselTypeDesc

0

Total

1

Bulk

2

Container/general cargo

3

Oil/chemicals

4

Oil/chemicals bunker/movement

5

Vehicles

6

LPG/LNG

7

Foodstuff

  • 세계 모든 나라(countryareaCode=None)를 지정했는데, 아래 보는 것처럼 지역(Africa, Latin America, Euro Area, World)도 포함돼있다.

df_aistrade['countryareaDesc'].unique()
array(['Jordan', 'Comoros', 'Kuwait', 'Latin America', 'Montenegro',
       'Madagascar', 'Myanmar', 'China, Macao SAR', 'N. Mariana Isds',
       'Mauritania', 'Malta', 'Mauritius', 'Maldives', 'Mexico',
       'Malaysia', 'Mozambique', 'Namibia', 'New Caledonia', 'Nigeria',
       'Nicaragua', 'Netherlands', 'Norway', 'New Zealand', 'Oman',
       'Peru', 'French Polynesia', 'Papua New Guinea', 'Philippines',
       'Pakistan', 'Poland', 'Portugal', 'Qatar', 'Romania',
       'Russian Federation', 'Saudi Arabia', 'Seychelles', 'Sudan',
       'Sweden', 'Singapore', 'Slovenia', 'Sierra Leone', 'Senegal',
       'Somalia', 'Suriname', 'El Salvador', 'Saint Maarten', 'Syria',
       'Togo', 'Thailand', 'Timor-Leste', 'Turkmenistan', 'Tunisia',
       'Türkiye', 'Trinidad and Tobago', 'Taiwan, Province of China',
       'United Rep. of Tanzania', 'Ukraine', 'USA', 'Uruguay',
       'Saint Vincent and the Grenadines', 'Venezuela', 'Viet Nam',
       'World', 'Yemen', 'South Africa', 'Africa', 'United Arab Emirates',
       'Angola', 'Argentina', 'Australia', 'Aruba', 'Azerbaijan',
       'Barbados', 'Bangladesh', 'Belgium', 'Bulgaria', 'Bahrain',
       'Benin', 'Bermuda', 'Brunei Darussalam', 'Bonaire', 'Brazil',
       'Bahamas', 'Canada', 'Dem. Rep. of the Congo', 'Congo',
       "Côte d'Ivoire", 'Chile', 'Cameroon', 'China', 'Colombia',
       'Costa Rica', 'Cuba', 'Cabo Verde', 'Curaçao', 'Cyprus', 'Germany',
       'Djibouti', 'Denmark', 'Dominica', 'Dominican Rep.', 'Algeria',
       'Euro Area', 'Ecuador', 'Estonia', 'Egypt', 'Western Sahara',
       'Eritrea', 'Spain', 'Finland', 'Fiji', 'France', 'Gabon',
       'United Kingdom', 'Grenada', 'Georgia', 'Ghana', 'Gambia',
       'Guinea', 'Equatorial Guinea', 'Greece', 'Guatemala', 'Guam',
       'Lithuania', 'Guinea-Bissau', 'Guyana', 'China, Hong Kong SAR',
       'Honduras', 'Morocco', 'Croatia', 'Haiti', 'Indonesia', 'Ireland',
       'Israel', 'India', 'Iraq', 'Iran', 'Iceland', 'Italy', 'Jamaica',
       'Japan', 'Kenya', 'Rep. of Korea', 'Cayman Isds', 'Lebanon',
       'Liberia', 'Libya', 'Cambodia', 'Saint Lucia', 'Sri Lanka',
       'Latvia', 'Nauru', 'Solomon Isds', 'Antigua and Barbuda',
       'Albania'], dtype=object)
# 데이터프레임을 저장
df_aistrade.to_csv('../Data/AIS_2024.csv', index=False)

2024년 세계 해양 무역량 분석#

데이터 로딩#

  • 2024년 1-4월 AIS 기반 추정치

# CSV 파일 읽어오기
df_aistrade = pd.read_csv('../Data/AIS_2024.csv')
  • 다운로드받은 원래의 데이터세트에 들어있는 data 변수에 pandas의 to_datetime 함수를 적용하여 year_month, month, year 변수들을 분해해낸다.

# change to date format, and add year_month column
df_aistrade["date"] = pd.to_datetime(df_aistrade["date"])
df_aistrade["year_month"] = df_aistrade["date"].dt.to_period("M")
df_aistrade["month"] = df_aistrade["date"].dt.strftime('%m') + '(' + df_aistrade["date"].dt.strftime('%b') +')'
df_aistrade["year"] = df_aistrade["date"].dt.year
df_aistrade
typeCode freqCode countryareaCode countryareaDesc vesselTypeCode vesselTypeDesc flowCode flowDesc date num_pc mtc dwt num_pc_ma mtc_ma dwt_ma year_month month year
0 C D 400 Jordan 1 Bulk M Imports 2024-03-21 0.0 0.00 0.0 0.167 3180.029 9091.967 2024-03 03(Mar) 2024
1 C D 400 Jordan 1 Bulk M Imports 2024-03-22 0.0 0.00 0.0 0.167 3180.029 9091.967 2024-03 03(Mar) 2024
2 C D 400 Jordan 1 Bulk M Imports 2024-03-23 0.0 0.00 0.0 0.167 3180.029 9091.967 2024-03 03(Mar) 2024
3 C D 400 Jordan 1 Bulk M Imports 2024-03-24 0.0 0.00 0.0 0.167 3180.029 9091.967 2024-03 03(Mar) 2024
4 C D 400 Jordan 1 Bulk M Imports 2024-03-25 0.0 0.00 0.0 0.167 3180.029 9091.967 2024-03 03(Mar) 2024
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
31609 C D 504 Morocco 1 Bulk X Exports 2024-04-26 1.0 32380.35 81641.0 2.067 34451.279 77027.067 2024-04 04(Apr) 2024
31610 C D 504 Morocco 1 Bulk X Exports 2024-04-27 1.0 23533.03 37782.0 2.100 35235.713 78286.467 2024-04 04(Apr) 2024
31611 C D 504 Morocco 1 Bulk X Exports 2024-04-28 2.0 35757.32 76438.0 2.167 36427.624 80834.400 2024-04 04(Apr) 2024
31612 C D 504 Morocco 1 Bulk X Exports 2024-04-29 0.0 0.00 0.0 2.167 36427.624 80834.400 2024-04 04(Apr) 2024
31613 C D 504 Morocco 1 Bulk X Exports 2024-04-30 1.0 23045.95 37000.0 2.167 36722.909 80783.433 2024-04 04(Apr) 2024

31614 rows × 18 columns

  • 나라가 아닌 4개의 지역(Africa, Latin America, Euro Area, World)은 제외시킨다.

  • 그런 다음 나라별로, 월별로, 수출/수입별로 그룹화하여 무역량(mtc, 미터톤수)을 합친다.

# Exclude specified observations
excluded_areas = ['Africa', 'Latin America', 'Euro Area', 'World']
df_aistrade_country = df_aistrade[~df_aistrade['countryareaDesc'].isin(excluded_areas)]
# countryareaCode, year_month, flowCode별로 그룹화한 후 mtc 값을 합산
df_aistrade_aggregated = df_aistrade_country.groupby(
    ['countryareaDesc', 'year_month', 'flowCode'])['mtc'].sum().reset_index()
df_aistrade_aggregated
countryareaDesc year_month flowCode mtc
0 Albania 2024-01 X 6771.008
1 Albania 2024-02 X 4849.861
2 Albania 2024-03 X 12579.675
3 Albania 2024-04 X 9301.868
4 Algeria 2024-01 M 1045738.688
... ... ... ... ...
1079 Yemen 2024-02 X 56840.047
1080 Yemen 2024-03 M 355716.590
1081 Yemen 2024-03 X 101040.546
1082 Yemen 2024-04 M 368492.200
1083 Yemen 2024-04 X 47794.513

1084 rows × 4 columns

DRY BULK 해양 수출 상위 10개국#

# 조건에 맞는 데이터 필터링
filtered_df = df_aistrade_aggregated[
    (df_aistrade_aggregated['year_month'] == '2024-01') &\
    (df_aistrade_aggregated['flowCode'] == 'X')]

# countryareaDesc별로 그룹화한 후 mtc 값을 합산
aggregated_df = filtered_df.groupby('countryareaDesc')['mtc'].sum().reset_index()

# mtc 전체 합계 계산
aggregated_df['total_mtc'] = aggregated_df['mtc'].sum()

# mtc_ratio 컬럼 생성
aggregated_df['mtc_ratio'] = (aggregated_df['mtc'] / aggregated_df['total_mtc']) * 100

# mtc_ratio를 기준으로 내림차순 정렬
aggregated_df = aggregated_df.sort_values(by='mtc_ratio', ascending=False)

# 결과 출력
aggregated_df.head(10)
countryareaDesc mtc total_mtc mtc_ratio
5 Australia 4.403285e+07 1.540640e+08 28.580877
14 Brazil 1.345683e+07 1.540640e+08 8.734569
21 China 1.084995e+07 1.540640e+08 7.042494
122 USA 9.750158e+06 1.540640e+08 6.328639
101 Russian Federation 7.832200e+06 1.540640e+08 5.083730
56 India 6.781434e+06 1.540640e+08 4.401698
110 South Africa 5.183941e+06 1.540640e+08 3.364796
19 Canada 4.989243e+06 1.540640e+08 3.238421
57 Indonesia 4.751198e+06 1.540640e+08 3.083911
124 United Arab Emirates 4.397753e+06 1.540640e+08 2.854497
import pandas as pd
import matplotlib.pyplot as plt

# 처음 10개 countryareaDesc를 선택하고 나머지는 'Others'로 표시
top_10 = aggregated_df.nlargest(10, 'mtc_ratio')
Others = aggregated_df[~aggregated_df['countryareaDesc'].isin(top_10['countryareaDesc'])]

# 'Others' 행 추가
Others_sum = Others['mtc_ratio'].sum()
Others_row = pd.DataFrame({'countryareaDesc': ['Others'], 'mtc_ratio': [Others_sum]})
top_10 = pd.concat([top_10, Others_row], ignore_index=True)

# 'Others'를 맨 마지막으로 이동
top_10 = top_10[top_10['countryareaDesc'] != 'Others']
top_10 = pd.concat([top_10, Others_row], ignore_index=True)

# 도넛 차트 생성
fig, ax = plt.subplots(figsize=(8, 5), dpi=500)

# 색상 설정 (마지막 'Others'를 회색으로)
colors = plt.cm.tab20.colors[:len(top_10)-1] + ('lightgray',)

# 파이 차트 생성 및 도넛 모양으로 만들기 위해 중심에 구멍을 만듦
wedges, texts, autotexts = ax.pie(top_10['mtc_ratio'], labels=None, autopct='%1.0f%%',
                                  startangle=90, counterclock=False, colors=colors, wedgeprops=dict(width=0.3), pctdistance=0.85)

# 파이 조각의 값을 하얀색으로 표시
for autotext in autotexts:
    autotext.set_color('white')
    autotext.set_fontsize(10)
    autotext.set_ha('center')
    autotext.set_va('center')

# 제목과 레전드 설정
plt.title('Top 10 Countries for DRY BULK Seaborne Exports (Jan-Apr 2024)')
plt.legend(wedges, top_10['countryareaDesc'], title="Country", loc="center left", bbox_to_anchor=(1, 0, 0.5, 1))

# 레이아웃 조정
plt.tight_layout()

# 도표 표시
plt.show()
../_images/d0d1e3a5c40332231c310744e3c9a1f47659b94f2e3b057ba02ace6df7f05d1f.png

DRY BULK 해양 수입 상위 10개국#

# 조건에 맞는 데이터 필터링
filtered_df = df_aistrade_aggregated[
    (df_aistrade_aggregated['year_month'] == '2024-01') &\
    (df_aistrade_aggregated['flowCode'] == 'M')]

# countryareaDesc별로 그룹화한 후 mtc 값을 합산
aggregated_df = filtered_df.groupby('countryareaDesc')['mtc'].sum().reset_index()

# mtc 전체 합계 계산
aggregated_df['total_mtc'] = aggregated_df['mtc'].sum()

# mtc_ratio 컬럼 생성
aggregated_df['mtc_ratio'] = (aggregated_df['mtc'] / aggregated_df['total_mtc']) * 100

# mtc_ratio를 기준으로 내림차순 정렬
aggregated_df = aggregated_df.sort_values(by='mtc_ratio', ascending=False)

# 결과 출력
aggregated_df.head(10)
countryareaDesc mtc total_mtc mtc_ratio
21 China 5.943809e+07 1.628459e+08 36.499587
59 India 1.411652e+07 1.628459e+08 8.668634
67 Japan 1.132958e+07 1.628459e+08 6.957240
102 Rep. of Korea 7.693721e+06 1.628459e+08 4.724540
110 Singapore 7.431817e+06 1.628459e+08 4.563711
126 USA 3.540110e+06 1.628459e+08 2.173901
125 Türkiye 3.412849e+06 1.628459e+08 2.095753
12 Brazil 3.079099e+06 1.628459e+08 1.890805
119 Taiwan, Province of China 2.803895e+06 1.628459e+08 1.721809
114 Spain 2.607585e+06 1.628459e+08 1.601259
import pandas as pd
import matplotlib.pyplot as plt

# 처음 10개 countryareaDesc를 선택하고 나머지는 'Others'로 표시
top_10 = aggregated_df.nlargest(10, 'mtc_ratio')
Others = aggregated_df[~aggregated_df['countryareaDesc'].isin(top_10['countryareaDesc'])]

# 'Others' 행 추가
Others_sum = Others['mtc_ratio'].sum()
Others_row = pd.DataFrame({'countryareaDesc': ['Others'], 'mtc_ratio': [Others_sum]})
top_10 = pd.concat([top_10, Others_row], ignore_index=True)

# 'Others'를 맨 마지막으로 이동
top_10 = top_10[top_10['countryareaDesc'] != 'Others']
top_10 = pd.concat([top_10, Others_row], ignore_index=True)

# 도넛 차트 생성
fig, ax = plt.subplots(figsize=(8, 5), dpi=500)

# 색상 설정 (마지막 'Others'를 회색으로)
colors = plt.cm.tab20.colors[:len(top_10)-1] + ('lightgray',)

# 파이 차트 생성 및 도넛 모양으로 만들기 위해 중심에 구멍을 만듦
wedges, texts, autotexts = ax.pie(top_10['mtc_ratio'], labels=None, autopct='%1.0f%%',
                                  startangle=90, counterclock=False, colors=colors, wedgeprops=dict(width=0.3), pctdistance=0.85)

# 파이 조각의 값을 하얀색으로 표시
for autotext in autotexts:
    autotext.set_color('white')
    autotext.set_fontsize(10)
    autotext.set_ha('center')
    autotext.set_va('center')

# 제목과 레전드 설정
plt.title('Top 10 Countries for DRY BULK Seaborne Imports (Jan-Apr 2024)')
plt.legend(wedges, top_10['countryareaDesc'], title="Country", loc="center left", bbox_to_anchor=(1, 0, 0.5, 1))

# 레이아웃 조정
plt.tight_layout()

# 도표 표시
plt.show()
../_images/3cd40c9f54f615aa74fc82074d3aba7c04ad4c92fce55e0990750f82e129c675.png