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이다.
특징
공개성: 누구나 접근 가능하거나, 간단한 인증 절차를 통해 데이터를 활용할 수 있음.
자동화된 데이터 접근: API를 통해 실시간 또는 정기적으로 데이터를 프로그래밍 방식으로 요청하고 받을 수 있음.
구조화된 형식: 주로 JSON, XML, CSV 등 구조화된 데이터 형식으로 제공되어 쉽게 활용 가능.
다양한 활용성: 데이터를 가공하거나 분석하여 맞춤형 애플리케이션, 보고서, 연구 등 다양한 목적으로 사용 가능.
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 설치 후에는 다음과 같이 pandas 및 numpy 라이브러리와 함께 comtradeapicall 패키지를 불러들이고, 이미 받아놓은 인증키를 지정해 놓으면 UN Comtrade API 호출 준비가 완료된다.
import pandas as pd
import numpy as np
import comtradeapicall
subscription_key = '자신의 인증키’
3. comtradeapicall 사용법#
comtradeapicall 패키지는 API 호출에 필요한 함수들을 데이터베이스 별로, 그리고 필요한 기능별로 만들어 놓았다.(자세한 것은 comtradeapicall 패키지 참조.) comtradeapicall 패키지를 설치하면 다음과 같은 함수를 사용할 수 있다.
함수 종류#
구 분 |
함 수 |
|---|---|
가져오기/미리보기 |
• |
데이터 Availability 확인 |
• |
대용량 데이터 다운로드 |
• |
비동기적 추출 |
• |
메타데이터, 노트, 레퍼런스 추출 |
• |
표준단위값(SUV: Standard Unit Values) 추출 |
• |
선박자동식별시스템(AIS) 데이터 추출 |
• |
comtradeapicall 패키지 함수 사용법#
위 표에 정리돼 있는 함수들 중에서, Free API 인증키로 가장 많이 사용하는 함수는 다음 두 가지일 것이다.
getFinalData(subscription_key, SelectionCriteria, query_option)
getTarifflineData(subscription_key, SelectionCriteria, query_option)
이들 두 함수 모두 데이터를 불러오는 데 사용하는 함수이다. 두 함수는 구조가 거의 동일한데, 단지 함수 이름에 Final과 Tariffline 부분만 다르다. 아래 표에 나와 있는 대부분의 함수 이름이 Final과 Tariffline 두 종류로 돼 있는 것을 알 수 있다. Tariffline 데이터는 각 국가에서 제출한 HS 원본 데이터이다. 즉, 어떤 범주별로 합쳐진 고수준 데이터(예: 총 상품, 파트너로서의 WORLD)가 없으며, 이상값 탐지나 수량 추정도 없다. 또한, 데이터는 BEC(Broad Economic Categories), SITC(Standard International Trade Classification)와 같은 다른 분류로 변환되지 않는다.
위의 두 개 함수의 괄호안에 세 가지 종류의 인수(argument)가 있는데, 이들 인수를 사용해 자신이 원하는 데이터를 지정하게 된다. 첫 번째 인수인 subscription_key는 이미 앞 장에서 획득 방법을 설명했다. 두 번째 범주인 SelectionCriteria가 핵심인데, 여기에 속하는 파라미터들이 아래 표에 정리돼 있다. 가령 SelectionCriteria 범주의 첫 번째 파라미터인 typeCode의 경우, 상품 유형을 선택하는 것으로서 필요한 값을 문자(“str”)로 지정하며, 상품이면 C로 표시한다.
comtradeapicall 파라미터(1)#
구분 |
세부 사항 |
|---|---|
SelectionCriteria |
- |
query_option |
- |
AIS SelectionCriteria |
- |
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_option 중 breakdownMode의 경우에는 classic과 plus 두 가지 옵션이 있는데, 후자가 보다 세분화된 데이터를 제공한다.
한편, 위 파라미터(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 나라 각각에 대해 데이터를 다운로드받아
pandas의concat함수를 사용해 이를 병합(이 경우 세로로 쌓는 방식)해나가는 방식을 사용했다.[주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()
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()