6장 국제무역 빅데이터 관리#
국제무역 데이터는 여러 국가(또는 기업), 다양한 제품, 그리고 여러 시점에 걸쳐 기록되므로, 이를 종합한 데이터는 방대한 규모를 가지는 경우가 많다. 특히, UNCTAD(유엔무역개발회의)가 제공하는 비관세조치(NTM: Non-Tariff Measures) 데이터는 관측 개수가 1억 건을 넘어서는 대규모 빅데이터에 해당한다. 이러한 방대한 데이터를 다룰 때는 저장, 로딩, 전처리, 분석 과정에서 다양한 기술적·실무적 문제가 발생할 수 있다. 본 장에서는 UNCTAD의 NTM 데이터를 활용하여 이러한 빅데이터 처리 과정에서 흔히 발생하는 문제(특히, 메모리 부족 문제)를 살펴보고, 이를 효과적으로 해결할 수 있는 방법들을 탐색한다.
1. UNCTAD 비관세조치 데이터 사례#
UNCTAD NTM 프로그램#
비관세조치(NTM: Non-Tariff Measures)는 관세 외에 무역에 영향을 미칠 수 있는 정책으로, 보건·안전·환경 보호뿐만 아니라 무역 규제에도 중요한 역할을 한다. 이러한 조치에는 독성 물질의 최대 허용 기준과 같은 안전 소비를 위한 제품 요구사항, 수입쿼터 및 원산지 규칙과 같은 전통적인 무역 정책이 포함된다.
UNCTAD 비관세조치 프로그램에서는 NTM에 해당하는 정책의 범위를 정의하고, 공통된 NTM 분류 체계를 개발하며, 데이터를 수집·공유하고, 투명성과 우수한 규제 관행 강화를 위한 정책 지원을 제공한다. NTM에 대한 개요는 비관세조치 A to Z에서도 확인할 수 있다.
UNCTAD TRAINS Database에는 NTM 및 관세 데이터가 포함되어 있다. 이 TRAINS 포털에서는 제품(HS 분류), 경제권, 지역, NTM 유형별로 쉽게 접근할 수 있는 정보를 제공한다. 120개 이상의 경제권을 대상으로 하며, 여러 연도의 데이터를 포함한다.
2. NTM 빅데이터 구조#
출처: Metadata for Non-tariff Measures Bulk Download Database: Variables in the ‘Researcher file’
기본 구조#
TRAINS NTM 데이터베이스는 100개 이상의 국가에 대한 포괄적인 데이터를 포함하고 있다. 이 데이터는 제품, 조치 유형, 조치를 부과하는 국가, 영향을 받는 국가 등에 대해 체계적인 정보를 제공한다. 특히 Non-Tariff Measures Data for Researchers는 일괄(bulk) 다운로드가 가능한 빅데이터로서, 통계 분석에 보다 일관성 있고 적합한 형태로 제공된다. 일괄 다운로드를 통해 제공되는 NTM 데이터는 발생 빈도와 같은 기술적 통계(descriptive statistics)를 생성하는 데 활용될 수 있으며, 이는 보다 복잡한 평가 모델에서 변수로도 사용될 수 있다.
일괄 다운로드를 통해 제공되는 NTM 데이터는 CSV 및 STATA 형식으로 제공되며, 분석 단위는 다음 다섯 가지 요소의 조합을 기반으로 한다.
비관세장벽(NTM)을 시행하는 국가(Reporter)
교역 상대국(Partner)
HS 6단위 수준에서 영향을 받는 제품
최대 4자리까지 세분화된 NTM 코드
데이터 수집 연도
이 다섯 가지 조합은 데이터베이스에서 한 번만 기록된다. 이 각 조합에 대해 nbr로 시작되는 변수들은 원본 데이터에서 동일한 조합이 몇 번 발견되었는지를 나타낸다.
그런데 모든 국가에서 매년 데이터를 수집한 것은 아님을 인지해야 한다. 일부 국가는 매년 데이터가 존재하지만, 일부 국가는 특정 시점에 한두 개의 데이터만 존재할 수도 있다. 또한, 규제의 발행 연도와 데이터 수집 연도를 혼동해서는 안 된다. 예를 들어, 특정 국가의 데이터가 2020년에 수집되었다면, 데이터베이스에는 해당 연도에 시행된 모든 규제가 포함된다. 하지만 이 규제 중 일부는 2010년부터 시행된 것일 수도 있으며, 여전히 무역에 영향을 미친다면 2020년 데이터베이스에 포함된다.
수평적 조치 및 부분적용#
어떤 조치가 모든 HS 코드에 동시에 영향을 미친다면 이를 수평적 조치(horizontal measure)라고 한다. 예를 들어, 기업이 수입 또는 수출을 허가받기 위해 반드시 무역업자로 등록해야 하는 경우, 이는 제품의 종류와 관계없이 모든 무역 활동에 적용되므로 수평적 조치로 간주된다. 비수평적 조치(non-horizontal measures)와 구별된다.
부분적용(Partial Coverage)이란 특정 조치가 제품 전체에 적용되지 않고, 특정 조건에서만 적용되거나 가장 세분화된 제품 코드의 일부 하위 범주에만 영향을 미치는 경우를 의미한다. 부분적용은 HS6 코드 내에서도 특정 관세품목 코드(8자리 이상)에는 적용되고, 다른 코드에는 적용되지 않을 수 있다. 완전적용(Full Coverage)과 구별된다.
통계 분석에서 수평적 조치를 제외하는 것은 필수적이다. 만약 수평적 조치를 포함하면, 빈도 지수(Frequency Index)와 적용 비율(Coverage Ratio)이 1이 되어버려 국가의 규제 패턴을 왜곡할 수 있다. 즉, 일부 행정적 성격을 가진 수평적 조치 몇 개만으로도 모든 제품이 규제를 받는 것처럼 보일 수 있으며, 이는 NTM의 다양성을 반영하지 못하게 된다. 따라서 수평적 조치를 제외함으로써 보다 정교한 규제 환경 분석이 가능해진다.
주요 변수#
주요 변수는 다음과 같다.
ntm_all: 모든 유형의 NTM을 포함한 총 개수
ntm_FullCoverage: 특정 제품에 완전적용되는 NTM 개수
ntm_PartialCoverage: 특정 제품에 부분적용되는 NTM 개수
ntm_H: 수평적 조치의 개수
ntm_nonH: 비수평적 조치의 개수
보다 세부적인 구분을 위해, 아래의 추가 변수가 제공된다.
ntm_FullCov_H: 수평적 조치 중 모든 제품에 완전적용되는 NTM 개수
ntm_PartialC_H: 수평적 조치 중 모든 제품에 부분적용되는 NTM 개수
ntm_FullCov_nonH: 수평적 조치를 제외한, 특정 제품에 완전적용되는 NTM 개수
과거 UNCTAD 분석에서 주요 변수로 사용됨
ntm_PartialC_nonH: 수평적 조치를 제외한, 특정 제품에 부분적용되는 NTM 개수
3. NTM 빅데이터 로딩#
NTM 빅데이터를 다음과 같이 그냥 일반적인 파일처럼 불러들이면 오류(
MemoryError)가 발생한다.이 오류는 Pandas가 대용량 CSV 파일을 읽는 과정에서 메모리 부족으로 인해 발생하는 문제다.
배치 처리: 데이터세트가 매우 클 경우, 데이터를 한 번에 처리하지 않고 배치 단위로 처리할 수 있다. pandas의
chunksize파라미터를 사용하면 파일을 작은 덩어리로 나누어 처리할 수 있다.
import pandas as pd
file_path = r"C:\Comtrade\Data\NTM_hs6_2010_2022_H4V12.csv"
df = pd.read_csv(file_path)
MemoryError: Unable to allocate 14.6 GiB for an array with shape (14, 140197410) and data type int64
ChatGPT 해결책 제안#
이 오류는 메모리 부족(MemoryError) 문제로, 주피터 노트북에서 14.6GB 크기의 배열을 로드하려고 했지만, 시스템 메모리가 부족해서 할당할 수 없는 경우 발생합니다. 해결 방법은 여러 가지가 있으며, 문제의 원인과 상황에 따라 적절한 방법을 선택해야 합니다.
1. 데이터 로딩 방식을 최적화하기
데이터 유형(Dtype) 줄이기
기본적으로 Pandas는 int64, float64와 같은 데이터 타입을 사용하지만, 더 작은 메모리를 차지하는 데이터 타입을 사용하면 메모리 사용량을 크게 줄일 수 있습니다.
import pandas as pd
# 데이터 로딩 시 dtype 지정
dtype_dict = {
'col1': 'int32', # 64비트 대신 32비트 사용
'col2': 'float32' # 64비트 대신 32비트 사용
}
df = pd.read_csv('bigdata.csv', dtype=dtype_dict)
int8, int16, float16, float32 등의 더 작은 데이터 타입을 활용하면 메모리를 효율적으로 사용 가능.
필요 없는 컬럼 제거
데이터 파일을 읽기 전에 사용하지 않는 컬럼을 제외하면 메모리를 절약할 수 있음.
df = pd.read_csv("bigdata.csv", usecols=["col1", "col3", "col5"]) # 필요한 컬럼만 로드
데이터 일부만 로드하기(chunking)
전체 데이터를 한 번에 로드하지 않고 작은 조각(chunk)으로 나눠서 처리하면 메모리 사용량을 줄일 수 있음.
chunk_size = 1000000 # 한 번에 100만 개 행씩 읽기
df_list = []
for chunk in pd.read_csv("bigdata.csv", chunksize=chunk_size):
df_list.append(chunk) # 필요한 처리를 한 후 리스트에 저장
df = pd.concat(df_list, ignore_index=True) # 최종 데이터프레임으로 합치기
파일 압축된 상태에서 로딩하기
CSV 파일이 클 경우 압축된 파일(.zip, .gz)을 사용하면 로딩 속도와 메모리 사용을 최적화할 수 있음.
df = pd.read_csv("bigdata.csv.gz", compression='gzip')
2. 시스템 설정 변경
가상 메모리(Swap) 늘리기
램이 부족한 경우 가상 메모리(Swap Memory)를 추가적으로 설정하면 도움이 될 수 있음.
리눅스/맥:
sudo fallocate -l 10G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile윈도우: 가상 메모리 설정 → “제어판 > 시스템 > 고급 시스템 설정 > 성능 설정 > 가상 메모리 변경”
RAM 사용량 확인 후 불필요한 프로세스 종료
메모리 사용량 확인 (
htop,top,task manager)주피터 노트북에서 불필요한 커널 종료
jupyter notebook list로 실행 중인 커널 확인 후, 필요 없는 커널 종료.
3. 데이터 저장 형식 변경
CSV 대신 Parquet, Feather 사용
CSV 대신 Parquet 또는 Feather 포맷을 사용하면 메모리 사용을 최적화할 수 있음.
df.to_parquet("bigdata.parquet") # Parquet 저장
df = pd.read_parquet("bigdata.parquet") # Parquet 로드
df.to_feather("bigdata.feather") # Feather 저장
df = pd.read_feather("bigdata.feather") # Feather 로드
Parquet와 Feather는 압축률이 높고, 메모리 효율적으로 데이터를 로딩할 수 있음.
4. 병렬 처리 활용
Dask 사용(대용량 데이터 프레임)
Pandas보다 더 큰 데이터를 처리할 수 있는 Dask 활용:
import dask.dataframe as dd
df = dd.read_csv("bigdata.csv")
df.compute() # 연산 수행 후 Pandas 데이터프레임으로 변환
Dask는 데이터를 메모리에 한 번에 로드하지 않고, 필요할 때만 메모리에 로딩하여 연산 수행.
PySpark 활용
빅데이터 처리용 PySpark 사용:
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("BigData").getOrCreate()
df = spark.read.csv("bigdata.csv", header=True, inferSchema=True)
df.show()
PySpark는 대량의 데이터를 분산 처리하여 메모리 부담을 줄일 수 있음.
메모리에서 객체 제거하기#
아래 코드는 Python에서 불필요한 객체를 삭제하고 메모리를 최적화하는 방법이다.
del df는 메모리에서df변수를 제거하는 역할을 한다.하지만, Python의 가비지 컬렉터(Garbage Collector, GC)가 즉시 메모리를 해제하는 것은 아니다. 일반적으로 변수를 삭제해도 다른 곳에서 참조 중이면 완전히 제거되지 않을 수 있다.
gc.collect()는 Python의 가비지 컬렉터를 수동으로 실행하여 사용되지 않는 메모리를 즉시 반환하도록 한다. 대규모 객체가 삭제된 후에도 메모리가 즉시 반환되지 않을 때 유용하다.
import gc
del df # df 삭제
gc.collect() # 가비지 컬렉션 실행
처음 100만행 로딩#
import pandas as pd
import time
file_path = r"C:\Comtrade\Data\NTM_hs6_2010_2022_H4V12.csv"
start_time = time.time() # 시작 시간 기록
# 데이터 일부 확인 (메모리 절약을 위해 chunksize 사용)
chunk_size = 1000000 # 100만 행씩 불러오기
df_chunks = pd.read_csv(file_path, chunksize=chunk_size, low_memory=False)
# 첫 번째 청크만 확인
df = next(df_chunks)
end_time = time.time() # 종료 시간 기록
elapsed_time = end_time - start_time
minutes = int(elapsed_time // 60)
seconds = elapsed_time % 60
print(f"데이터 로딩 시간: {minutes}분 {seconds:.2f}초")
데이터 로딩 시간: 0분 4.64초
100만행씩 나눠서 전체 데이터 로딩#
데이터 로딩 성공함!
start_time = time.time()
df_list = []
for chunk in df_chunks:
df_list.append(chunk)
df = pd.concat(df_list, ignore_index=True)
end_time = time.time()
elapsed_time = end_time - start_time
minutes = int(elapsed_time // 60)
seconds = elapsed_time % 60
print(f"전체 데이터 로딩 시간: {minutes}분 {seconds:.2f}초")
df # 데이터 확인: 관측수 1억 4,019만개, 변수 19개
전체 데이터 로딩 시간: 11분 3.00초
Year Reporter ReporterISON PartnerISON Partner HSCode NTMCode ntm_all ntm_nonH ntm_H ntm_FullCoverage ntm_FullCov_nonH ntm_FullCov_H ntm_PartialCoverage ntm_PartialC_nonH ntm_PartialC_H HSNomenclature NTMNomenclature latest_year_flag
0 2020 TUR 792 376 ISR 10514 A11 2 2 0 2 2 0 0 0 0 H4 M4 1
1 2016 TUR 792 380 ITA 10514 A11 1 1 0 1 1 0 0 0 0 H4 M4 0
2 2020 TUR 792 380 ITA 10514 A11 1 1 0 1 1 0 0 0 0 H4 M4 1
3 2016 TUR 792 384 CIV 10514 A11 1 1 0 1 1 0 0 0 0 H4 M4 0
4 2020 TUR 792 384 CIV 10514 A11 1 1 0 1 1 0 0 0 0 H4 M4 1
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
140197405 2014 USA 842 192 CUB 970600 P9 1 0 1 1 0 1 0 0 0 H4 M4 0
140197406 2017 USA 842 192 CUB 970600 P9 1 0 1 1 0 1 0 0 0 H4 M4 0
140197407 2018 USA 842 192 CUB 970600 P9 1 0 1 1 0 1 0 0 0 H4 M4 0
140197408 2019 USA 842 192 CUB 970600 P9 1 0 1 1 0 1 0 0 0 H4 M4 0
140197409 2022 USA 842 192 CUB 970600 P9 1 0 1 1 0 1 0 0 0 H4 M4 1
140197410 rows × 19 columns
변수 설명
출처: Metadata for Non-tariff Measures Bulk Download Database: Variables in the ‘Researcher file’
변수명 |
설명 |
|---|---|
Year |
데이터 수집 연도 |
ReporterISON |
비관세조치(NTM)를 부과하는 국가의 숫자 코드 |
Reporter |
비관세조치(NTM)를 부과하는 국가의 문자 코드 |
PartnerISON |
영향을 받는 상대국의 숫자 코드 |
Partner |
영향을 받는 상대국의 문자 코드 |
HSNomenclature |
HS 버전 코드 (H4는 HS 2012, H5는 HS 2017 등을 의미) |
HSCode |
HS 제품 코드 |
NTMNomenclature |
국제 비관세조치(NTM) 분류 버전 (최신 버전은 M4) |
NTMCode |
비관세조치(NTM) 분류 코드 |
ntm_all |
동일한 신고국, 상대국, HS 6단위 코드, NTM 코드, 연도에서 모든 유형의 NTM 요구사항 개수 |
ntm_nonH |
동일한 신고국, 상대국, HS 6단위 코드, NTM 코드, 연도에서 수평적 조치를 제외한 NTM 요구사항 개수 (완전적용 및 부분적용 포함) |
ntm_H |
동일한 신고국, 상대국, HS 6단위 코드, NTM 코드, 연도에서 수평적 조치만 포함한 NTM 요구사항 개수 (완전적용 및 부분적용 포함) |
ntm_FullCoverage |
동일한 신고국, 상대국, HS 6단위 코드, NTM 코드, 연도에서 부분적용 조치를 제외한 NTM 요구사항 개수 (수평적 및 비수평적 조치를 포함하여 완전히 적용된 경우만 집계) |
ntm_FullCov_nonH |
동일한 신고국, 상대국, HS 6단위 코드, NTM 코드, 연도에서 부분적용 조치를 제외한 NTM 요구사항 개수 (비수평적 조치만 포함, 완전적용된 경우만 집계) |
ntm_FullCov_H |
동일한 신고국, 상대국, HS 6단위 코드, NTM 코드, 연도에서 부분적용 조치를 제외한 NTM 요구사항 개수 (수평적 조치만 포함, 모든 제품에 영향을 미치는 경우만 집계) |
ntm_PartialCoverage |
동일한 신고국, 상대국, HS 6단위 코드, NTM 코드, 연도에서 부분적용된 NTM 요구사항 개수 (수평적 및 비수평적 조치를 포함하여 부분적용된 경우만 집계) |
ntm_PartialC_nonH |
동일한 신고국, 상대국, HS 6단위 코드, NTM 코드, 연도에서 부분적용된 NTM 요구사항 개수 (비수평적 조치만 포함, 부분적용된 경우만 집계) |
ntm_PartialC_H |
동일한 신고국, 상대국, HS 6단위 코드, NTM 코드, 연도에서 부분적용된 NTM 요구사항 개수 (수평적 조치만 포함, 모든 제품에 영향을 미치는 경우만 집계) |
latest_year_flag |
특정 신고국의 최신 데이터 수집 연도에 해당하면 1 (패널 데이터에서 해당 국가의 최신 연도를 나타냄) |
NTMCode
코드 |
설명 |
|---|---|
A |
기술적 요구사항 (Technical requirements) |
B |
적합성 평가 (Conformity assessment) |
C |
선적 전 검사 및 기타 입국 절차 (Pre-shipment inspection and other entry formalities) |
D |
수수료, 세금 및 기타 준관세 조치 (Charges, taxes and other para-tariff measures) |
E |
수량 통제 조치 (Quantity control measures) |
F |
금융 조치 (Finance Measures) |
G |
가격 통제 조치 (Price control measures) |
H |
반경쟁적 조치 (Anti-competitive measures) |
I |
무역 관련 투자 조치 (Trade related investment measures) |
J |
유통 제한 (Distribution restrictions) |
K |
판매 후 서비스 제한 (Restriction of post-sales services) |
L |
보조금 (Subsidies) |
M |
정부 조달 제한 (Government procurement restrictions) |
N |
지적재산권 (Intellectual property) |
O |
원산지 규정 및 관련 원산지 증명서 (Rules of origin and related certificate of origin) |
P |
수출 관련 조치 (Export related measures) |
빅데이터 처리 오류 발생#
아래 코드는 보고국이 한국(410)인 경우만을 필터링하기 위한 것이나, 다음과 같은 오류 메시지가 나옴.
df_kor = df[df['ReporterISON'] == 410]
import gc
del df # df 삭제
gc.collect() # 가비지 컬렉션 실행
4. NTM 빅데이터 한국 자료 필터링#
메모리 절약을 위해 파일을 배치 단위로 읽어온 다음, 각 배치에서 ‘ReporterISON’이 410인 행만 필터링한다.
모든 필터링된 데이터를 하나로 합친다.
import pandas as pd
import time
file_path = r"C:\Comtrade\Data\NTM_hs6_2010_2022_H4V12.csv"
start_time = time.time()
chunk_size = 1000000 # 배치 크기 설정 (1백만 행 단위)
df_filtered_list = [] # 필터링된 결과를 저장할 리스트
# 파일을 배치 단위로 읽어오기
chunks = pd.read_csv(file_path, chunksize=chunk_size)
for chunk in chunks:
# 각 배치에서 'ReporterISON'이 410인 행만 필터링
df_filtered_chunk = chunk[chunk['ReporterISON'] == 410]
# 필터링된 데이터를 리스트에 추가
df_filtered_list.append(df_filtered_chunk)
# 모든 필터링된 데이터를 하나로 합치기
df_kor = pd.concat(df_filtered_list, ignore_index=True)
end_time = time.time()
elapsed_time = end_time - start_time
minutes = int(elapsed_time // 60)
seconds = elapsed_time % 60
print(f"전체 데이터 로딩 시간: {minutes}분 {seconds:.2f}초")
# 결과 저장 및 확인
df_kor.to_csv('../Data/NTM_KOR.csv', index=False)
df_kor
전체 데이터 로딩 시간: 5분 57.57초
Year Reporter ReporterISON PartnerISON Partner HSCode NTMCode ntm_all ntm_nonH ntm_H ntm_FullCoverage ntm_FullCov_nonH ntm_FullCov_H ntm_PartialCoverage ntm_PartialC_nonH ntm_PartialC_H HSNomenclature NTMNomenclature latest_year_flag
0 2016 KOR 410 0 WLD 10121 A14 1 1 0 0 0 0 1 1 0 H4 M4 1
1 2016 KOR 410 0 WLD 10121 A31 1 1 0 0 0 0 1 1 0 H4 M4 1
2 2016 KOR 410 0 WLD 10121 A32 1 1 0 0 0 0 1 1 0 H4 M4 1
3 2016 KOR 410 0 WLD 10121 A41 1 1 0 0 0 0 1 1 0 H4 M4 1
4 2016 KOR 410 0 WLD 10121 A62 1 1 0 0 0 0 1 1 0 H4 M4 1
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
478223 2016 KOR 410 0 WLD 970600 E1 1 1 0 0 0 0 1 1 0 H4 M4 1
478224 2016 KOR 410 0 WLD 970600 F71 1 1 0 0 0 0 1 1 0 H4 M4 1
478225 2016 KOR 410 0 WLD 970600 P14 1 1 0 0 0 0 1 1 0 H4 M4 1
478226 2016 KOR 410 0 WLD 970600 P33 1 1 0 0 0 0 1 1 0 H4 M4 1
478227 2016 KOR 410 0 WLD 970600 P7 1 1 0 0 0 0 1 1 0 H4 M4 1
478228 rows × 19 columns
NTM 한국 데이터#
import pandas as pd
df_kor = pd.read_csv('../Data/NTM_KOR.csv')
df_kor.describe()
| Year | ReporterISON | PartnerISON | HSCode | ntm_all | ntm_nonH | ntm_H | ntm_FullCoverage | ntm_FullCov_nonH | ntm_FullCov_H | ntm_PartialCoverage | ntm_PartialC_nonH | ntm_PartialC_H | latest_year_flag | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| count | 478228.0 | 478228.0 | 478228.000000 | 478228.000000 | 478228.000000 | 478228.000000 | 478228.0 | 478228.000000 | 478228.000000 | 478228.0 | 478228.000000 | 478228.000000 | 478228.0 | 478228.0 |
| mean | 2016.0 | 410.0 | 356.605584 | 419197.864512 | 2.783948 | 2.783948 | 0.0 | 0.513094 | 0.513094 | 0.0 | 2.270854 | 2.270854 | 0.0 | 1.0 |
| std | 0.0 | 0.0 | 286.307255 | 336597.382237 | 5.468467 | 5.468467 | 0.0 | 1.285197 | 1.285197 | 0.0 | 5.511215 | 5.511215 | 0.0 | 0.0 |
| min | 2016.0 | 410.0 | 0.000000 | 10121.000000 | 1.000000 | 1.000000 | 0.0 | 0.000000 | 0.000000 | 0.0 | 0.000000 | 0.000000 | 0.0 | 1.0 |
| 25% | 2016.0 | 410.0 | 68.000000 | 80720.000000 | 1.000000 | 1.000000 | 0.0 | 0.000000 | 0.000000 | 0.0 | 0.000000 | 0.000000 | 0.0 | 1.0 |
| 50% | 2016.0 | 410.0 | 336.000000 | 300190.000000 | 1.000000 | 1.000000 | 0.0 | 0.000000 | 0.000000 | 0.0 | 1.000000 | 1.000000 | 0.0 | 1.0 |
| 75% | 2016.0 | 410.0 | 608.000000 | 843069.000000 | 1.000000 | 1.000000 | 0.0 | 1.000000 | 1.000000 | 0.0 | 1.000000 | 1.000000 | 0.0 | 1.0 |
| max | 2016.0 | 410.0 | 926.000000 | 970600.000000 | 26.000000 | 26.000000 | 0.0 | 24.000000 | 24.000000 | 0.0 | 26.000000 | 26.000000 | 0.0 | 1.0 |
# 'HSCode'의 값이 6자리인 관측 필터링
df_kor[df_kor['HSCode'].astype(str).str.len() == 6]
| Year | Reporter | ReporterISON | PartnerISON | Partner | HSCode | NTMCode | ntm_all | ntm_nonH | ntm_H | ntm_FullCoverage | ntm_FullCov_nonH | ntm_FullCov_H | ntm_PartialCoverage | ntm_PartialC_nonH | ntm_PartialC_H | HSNomenclature | NTMNomenclature | latest_year_flag | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 126558 | 2016 | KOR | 410 | 0 | WLD | 100111 | A14 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | H4 | M4 | 1 |
| 126559 | 2016 | KOR | 410 | 4 | AFG | 100111 | A19 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | H4 | M4 | 1 |
| 126560 | 2016 | KOR | 410 | 8 | ALB | 100111 | A19 | 2 | 2 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | H4 | M4 | 1 |
| 126561 | 2016 | KOR | 410 | 10 | ATA | 100111 | A19 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | H4 | M4 | 1 |
| 126562 | 2016 | KOR | 410 | 12 | DZA | 100111 | A19 | 2 | 2 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | H4 | M4 | 1 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 478223 | 2016 | KOR | 410 | 0 | WLD | 970600 | E1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | H4 | M4 | 1 |
| 478224 | 2016 | KOR | 410 | 0 | WLD | 970600 | F71 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | H4 | M4 | 1 |
| 478225 | 2016 | KOR | 410 | 0 | WLD | 970600 | P14 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | H4 | M4 | 1 |
| 478226 | 2016 | KOR | 410 | 0 | WLD | 970600 | P33 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | H4 | M4 | 1 |
| 478227 | 2016 | KOR | 410 | 0 | WLD | 970600 | P7 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | H4 | M4 | 1 |
351670 rows × 19 columns