Phase 1은 WIA 생물다양성 지수 표준(WIA Biodiversity Index Standard)의 이후 모든 기능을 가능하게 하는 기초 데이터 구조를 확립한다. 생물다양성 정보에 대해 정밀하고 기계 판독 가능한 스키마를 정의함으로써, 이 단계는 데이터 파편화 문제를 해결하고 전 지구적 규모의 보전 활동에 필수적인 상호운용성을 만들어 낸다. 이 장에서는 Phase 1 준수를 위한 핵심 데이터 모델, 검증 규칙, 구현 지침을 상세히 설명한다.
핵심 스키마 아키텍처
WIA 데이터 형식은 서로 연결된 다섯 개의 핵심 스키마(종 출현, eDNA 시료, 서식지 분류, 다양성 지수 결과, 분류학 참조)로 구성되며, 각 스키마는 시스템 전체의 참조 무결성을 유지하면서 생물다양성 정보의 서로 다른 측면을 담아낸다.
종 출현 스키마
종 출현(species occurrence) 스키마는 생물다양성 데이터의 기본 단위, 즉 특정 종이 특정 장소와 시간에 관찰되었다는 기록을 표현한다. 이 스키마는 Darwin Core를 확장하는 동시에 현대 생물다양성 모니터링의 요구를 지원하는 필드를 추가한다.
{
"$schema": "https://wia.org/schemas/occurrence/v1.0",
"occurrence_id": "OCC-2025-123456",
"dataset_id": "DS-RAINFOREST-2025",
"species": {
"scientific_name": "Morpho menelaus",
"common_name": "Blue Morpho Butterfly",
"taxonomy": {
"kingdom": "Animalia",
"phylum": "Arthropoda",
"class": "Insecta",
"order": "Lepidoptera",
"family": "Nymphalidae",
"genus": "Morpho",
"species": "menelaus",
"subspecies": null
},
"taxonomic_authority": "Linnaeus, 1758",
"taxon_id": "GBIF:5133523",
"iucn_status": "LC",
"endemic": false
},
"location": {
"latitude": -2.9500,
"longitude": -59.9500,
"coordinate_uncertainty_m": 10,
"datum": "WGS84",
"elevation_m": 45,
"depth_m": null,
"locality": "Reserva Florestal Adolpho Ducke",
"country": "Brazil",
"state_province": "Amazonas",
"protected_area": true,
"habitat_type": "tropical_rainforest",
"habitat_detail": "primary_forest_canopy"
},
"temporal": {
"observation_date": "2025-11-15T09:23:45Z",
"observation_duration_minutes": 180,
"season": "wet",
"time_of_day": "morning"
},
"observation": {
"basis_of_record": "human_observation",
"sampling_protocol": "transect_walk",
"individual_count": 3,
"life_stage": "adult",
"sex": "unknown",
"behavior": "nectaring",
"observer_id": "OBS-2025-BZ047",
"observer_name": "Dr. Maria Santos",
"identification_confidence": 0.98,
"identification_method": "visual",
"identification_verified_by": null,
"evidence": {
"has_photo": true,
"has_sound": false,
"has_specimen": false,
"photo_urls": [
"https://storage.wia.org/obs/2025/11/15/morpho_001.jpg"
]
}
},
"environmental": {
"temperature_c": 28.5,
"humidity_percent": 82,
"cloud_cover_percent": 40,
"wind_speed_ms": 1.2,
"canopy_cover_percent": 95
},
"quality": {
"quality_flag": "validated",
"quality_checks": [
"coordinate_valid",
"taxonomy_verified",
"date_reasonable",
"habitat_match"
],
"validation_date": "2025-11-16T14:30:00Z",
"validator_id": "VAL-2025-042"
},
"provenance": {
"data_source": "field_survey",
"project_name": "Amazon Butterfly Monitoring Program",
"funding_source": "CNPq (Conselho Nacional de Desenvolvimento Científico e Tecnológico)",
"permit_number": "ICMBio-12345-2025",
"created_date": "2025-11-15T12:00:00Z",
"modified_date": "2025-11-16T14:30:00Z",
"license": "CC-BY-4.0"
}
}
필수 필드와 선택 필드
이 스키마는 완전성과 현실적 제약 사이의 균형을 맞추기 위해 필드를 세 단계로 정의한다.
| 필드 단계 | 설명 | 예시 |
|---|---|---|
| 필수(Required) | 유효한 기록이 되려면 반드시 있어야 한다 | occurrence_id, scientific_name, latitude, longitude, observation_date |
| 권장(Recommended) | 가능한 경우 포함해야 한다 | individual_count, habitat_type, observer_id, quality_flag |
| 선택(Optional) | 기록을 보강하지만 핵심적이지는 않다 | behavior, sex, life_stage, 환경 조건 |
eDNA 시료 스키마
환경 DNA(eDNA) 모니터링은 생물다양성 평가에 대한 혁신적인 접근법이다. eDNA 스키마는 현장 채집 정보와 실험실 처리 정보를 모두 담는다.
{
"$schema": "https://wia.org/schemas/edna/v1.0",
"sample_id": "EDNA-2025-UK-089234",
"collection": {
"date": "2025-10-22T11:15:00Z",
"location": {
"latitude": 51.4545,
"longitude": -0.9782,
"water_body_name": "River Thames",
"water_body_type": "river",
"site_description": "River Thames at Reading, town-centre reach"
},
"sampling_method": "filtration",
"volume_liters": 2.0,
"filter_pore_size_um": 0.45,
"filter_type": "cellulose_nitrate",
"replicates": 3,
"water_parameters": {
"temperature_c": 12.3,
"ph": 7.8,
"conductivity_us_cm": 520,
"turbidity_ntu": 15
}
},
"processing": {
"extraction_date": "2025-10-23",
"extraction_method": "qiagen_dneasy_powerwater",
"extraction_kit_lot": "QIA-2025-08-B14",
"dna_concentration_ng_ul": 8.5,
"dna_quality_260_280": 1.85,
"sequencing_platform": "illumina_novaseq_6000",
"sequencing_date": "2025-10-28",
"target_gene": "COI",
"primer_set": "mlCOIintF/jgHCO2198",
"pcr_cycles": 35,
"sequencing_depth": "50000_reads_per_sample"
},
"results": {
"total_reads": 52847,
"quality_filtered_reads": 48932,
"unique_asvs": 247,
"detected_taxa": [
{
"scientific_name": "Salmo trutta",
"common_name": "Brown Trout",
"read_count": 15432,
"asv_count": 8,
"confidence": 0.97,
"taxonomy_database": "BOLD_v4.5"
},
{
"scientific_name": "Rutilus rutilus",
"common_name": "Common Roach",
"read_count": 8921,
"asv_count": 5,
"confidence": 0.94,
"taxonomy_database": "BOLD_v4.5"
},
{
"scientific_name": "Anguilla anguilla",
"common_name": "European Eel",
"read_count": 1247,
"asv_count": 2,
"confidence": 0.99,
"taxonomy_database": "BOLD_v4.5"
}
]
},
"quality": {
"negative_control_contamination": false,
"positive_control_success": true,
"primer_dimer_percentage": 3.2,
"quality_flag": "passed"
}
}
서식지 분류 스키마
표준화된 서식지 분류는 의미 있는 생물다양성 비교를 위해 필수적이다. WIA 스키마는 IUCN 서식지 분류 체계에 맞추면서도 특정 생태계에 유용한 세부 정보를 추가한다.
| 1단계 | 2단계 | 3단계 | 예시 |
|---|---|---|---|
| 산림 | 열대/아열대 | 습윤 저지대 | 아마존 열대우림 원시림 |
| 습지 | 내륙 습지 | 영구 담수 | 호수 가장자리, 갈대밭 |
| 해양 | 연안 | 산호초 | 거초(裾礁), 수심 5-15m |
| 초지 | 온대 | 중습성 초지 | 건초용으로 관리되는 장초 프레리 |
| 인공 | 농업 | 경작지 | 보전 경운을 적용한 옥수수밭 |
다양성 지수 결과 스키마
계산된 생물다양성 지수는 재현성을 보장하기 위해 계산 방법과 입력 데이터에 관한 전체 메타데이터와 함께 저장되어야 한다.
{
"$schema": "https://wia.org/schemas/diversity-index/v1.0",
"calculation_id": "CALC-2025-TH-445",
"dataset_id": "DS-THAMES-2025-Q4",
"calculation_date": "2026-01-05T10:30:00Z",
"spatial_extent": {
"type": "polygon",
"coordinates": [/* GeoJSON 폴리곤 */],
"area_km2": 125.8
},
"temporal_extent": {
"start_date": "2025-10-01",
"end_date": "2025-12-31",
"duration_days": 92
},
"input_data": {
"occurrence_count": 1847,
"unique_species": 67,
"total_individuals": 4523,
"sampling_effort_hours": 240,
"observer_count": 12
},
"indices": {
"species_richness": {
"value": 67,
"rarefied_to_n": 1000,
"rarefied_value": 58.3,
"confidence_interval_95": [54.1, 62.8]
},
"shannon_diversity": {
"value": 3.247,
"confidence_interval_95": [3.102, 3.398],
"calculation_method": "natural_log",
"bootstrap_iterations": 1000
},
"simpson_index": {
"value": 0.0521,
"diversity_1_minus_d": 0.9479,
"inverse_simpson": 19.19,
"confidence_interval_95": [0.0487, 0.0559]
},
"pielou_evenness": {
"value": 0.772,
"interpretation": "moderately_even"
},
"margalef_richness": {
"value": 7.84
}
},
"comparison": {
"previous_period": "2025-Q3",
"richness_change_percent": -5.2,
"shannon_change": -0.154,
"trend": "declining",
"statistical_significance": 0.032
}
}
분류학 참조 스키마
분류학 정보는 권위 있는 출처까지 추적 가능해야 하며, 분류 체계의 갱신에 대응할 수 있도록 버전이 관리되어야 한다.
{
"taxon_id": "WIA-TAX-001234",
"scientific_name": "Panthera tigris tigris",
"rank": "subspecies",
"parent_taxon_id": "WIA-TAX-001200",
"accepted_name": true,
"synonyms": [
"Panthera tigris bengalensis"
],
"common_names": [
{
"name": "Bengal Tiger",
"language": "en"
},
{
"name": "बंगाल टाइगर",
"language": "hi"
}
],
"conservation_status": {
"iucn_category": "EN",
"iucn_version": "2024-1",
"population_trend": "Increasing",
"assessment_date": "2023-06-15"
},
"external_ids": {
"gbif": "7059276",
"ncbi": "74535"
},
"version": "2025-11-01",
"source": "WIA Taxonomic Authority v1.2"
}
검증 규칙과 품질 보증
각 스키마에는 자동으로 점검할 수 있는 검증 규칙이 내장되어 있다.
좌표 검증
- 위도는 -90에서 90 사이
- 경도는 -180에서 180 사이
- 실제로 기니만에 있는 경우가 아니라면 좌표가 (0,0)이 아닐 것
- 좌표가 기재된 국가와 일치할 것(폴리곤 조회 사용)
- 고도가 해당 위치에 대해 타당할 것(DEM 교차 검증)
시간 검증
- 날짜가 미래가 아닐 것
- 날짜가 1600년 이전(과학 이전 시대)이 아닐 것
- 시간 해상도가 정밀도(일/월/연)와 일치할 것
- 계절 지정이 반구 및 날짜와 일치할 것
분류학적 검증
- 학명이 명명 규약을 따를 것
- 분류 계층이 일관될 것(예: 포유류는 동물계(Animalia)에 속함)
- 분류군 ID가 유효한 외부 참조로 해석될 것
생태학적 검증
- 종 출현이 알려진 분포 범위 안에 있을 것(범위 밖 이상치는 플래그 표시)
- 서식지 유형이 해당 종에 대해 타당할 것
- 환경 매개변수가 합리적인 범위 안에 있을 것
- 개체 수가 생물학적으로 비현실적이지 않을 것
데이터 교환 형식
JSON이 정본 형식이지만, 이 표준은 다양한 활용 사례를 위해 여러 직렬화 형식을 지원한다.
| 형식 | 활용 사례 | 장점 | 한계 |
|---|---|---|---|
| JSON | API, 웹 앱 | 사람이 읽을 수 있음, 중첩 구조 | 대규모 데이터셋에서는 장황함 |
| GeoJSON | GIS 통합 | GIS 도구의 기본 지원 | 공간 중심, 메타데이터가 상대적으로 빈약함 |
| CSV | 통계 분석 | 보편적 호환성, 간결함 | 중첩 구조를 표현할 수 없음 |
| Parquet | 빅데이터 분석 | 열 기반, 높은 압축률 | 전용 도구가 필요함 |
| Darwin Core Archive | GBIF 제출 | 표준 준수 | 구조가 복잡함 |
구현 지침
데이터베이스 스키마 설계
PostgreSQL로 구현하는 경우, 유연한 중첩 데이터에는 JSONB 열을 사용하고 쿼리 성능을 위해 필드에 인덱스를 두는 방식을 권장한다.
CREATE TABLE occurrences (
occurrence_id TEXT PRIMARY KEY,
scientific_name TEXT NOT NULL,
location GEOMETRY(Point, 4326) NOT NULL,
observation_date TIMESTAMP NOT NULL,
data JSONB NOT NULL
);
-- 자주 쓰는 쿼리를 위한 인덱스
CREATE INDEX idx_species ON occurrences(scientific_name);
CREATE INDEX idx_location ON occurrences USING GIST(location);
CREATE INDEX idx_date ON occurrences(observation_date);
CREATE INDEX idx_habitat ON occurrences((data->'location'->>'habitat_type'));
레거시 데이터 마이그레이션
WIA 표준은 흔히 쓰이는 레거시 형식을 위한 마이그레이션 도구를 제공한다. 다음은 단순 CSV에서 마이그레이션하는 예이다.
import pandas as pd
import wia_biodiversity as wia
# 레거시 CSV 불러오기
legacy_data = pd.read_csv('old_observations.csv')
# WIA 형식으로 변환
wia_data = wia.convert.from_csv(
legacy_data,
field_mapping={
'Species': 'species.scientific_name',
'Lat': 'location.latitude',
'Lon': 'location.longitude',
'Date': 'temporal.observation_date',
'Count': 'observation.individual_count'
},
defaults={
'observation.basis_of_record': 'human_observation',
'location.datum': 'WGS84'
}
)
# 검증
validation_report = wia.validate(wia_data)
print(f"유효: {validation_report.valid_count}")
print(f"오류: {validation_report.error_count}")
장 요약
핵심 요점
- 포괄적인 스키마가 종 출현, eDNA 시료, 서식지, 다양성 지수, 분류학 정보를 정밀한 필드 정의 및 검증 규칙과 함께 다룬다.
- 3단계 필드 체계(필수/권장/선택)는 다양한 상황에서 완전성과 현실적인 데이터 수집 제약 사이의 균형을 맞춘다.
- 내장 검증은 좌표, 분류, 시간적 일관성, 생태학적 타당성에 대한 자동 점검을 통해 데이터 품질을 보장한다.
- 여러 직렬화 형식(JSON, GeoJSON, CSV, Parquet, Darwin Core)은 의미적 일관성을 유지하면서 서로 다른 활용 사례를 지원한다.
- 마이그레이션 도구와 지침은 레거시 형식으로부터의 변환을 쉽게 하여 도입 장벽을 낮추고 기존 데이터 투자를 보존한다.
복습 문제
- 종 출현 스키마와 eDNA 시료 스키마의 관계를 설명하라. 두 스키마는 서로를 어떻게 보완하는가?
- 이 표준은 왜 모든 필드를 필수 또는 선택으로 하지 않고 필수·권장·선택 필드를 구분하여 정의하는가?
- 검증 규칙 세 가지를 설명하고, 각각이 흔한 데이터 품질 문제를 어떻게 방지하는지 설명하라.
- 서식지 분류 스키마는 표준화와 생태계별 세부 정보 사이의 균형을 어떻게 맞추는가?
- JSON과 CSV 직렬화 형식을 비교하라. 생물다양성 모니터링 프로젝트에서 각각을 언제 선택하겠는가?
- 다양성 지수 결과 스키마는 계산의 재현성을 어떻게 보장하는가? 이를 위해 필수적인 메타데이터는 무엇인가?
다음 장 미리 보기: 제5장은 이러한 표준화된 데이터 형식을 바탕으로 Phase 2: API 인터페이스를 소개한다. RESTful API, GraphQL 쿼리, 계산 서비스가 Phase 1의 데이터 기반을 활용하여 강력한 분석 기능을 제공하는 방식을 배우게 된다.