안녕하세요? QGIS와 Python을 이용한 종 분포 모델링(SDM: Species Distribution Modeling)을 시리즈 글로 정리해 보겠습니다. 이번에는 두 번째 실습으로 실습 데이터 전처리를 주된 내용으로 정리해 보겠습니다.
*이 글은 국립공원 비대면 학습동아리 '파크랩(ParkLab)'의 학습용 자료입니다. 스터디에 참여하는 조경학, 컴퓨터공학 등 다양한 전공자분들의 참여를 통해 콘텐츠는 수시로 수정, 보완될 수 있습니다. 유튜브 영상과 프레젠테이션 자료는 아래 링크를 참고하시면 됩니다.
첫 번째 실습 글은 다음 링크를 참조하시면 됩니다.
이전 글에서 소개드린 것처럼, 실습 데이터는 아래의 두 가지 유형입니다.
- JTREE.shp : 조슈아 트리(Joshua tree)
- BIOCLIM/bclim*.asc: 조슈아 트리 연구지역으로 자른 생물 기후 특징
종 발생 데이터 (Species occurrence data)
DATA/JTREE.shp은 조슈아 트리(Joshua tree) 종 발생 위치를 담고 있는 데이터입니다. 조슈아 트리는 북미 남서부 사막에 유카(Yucca, 북아메리카산 상록 떨기나무)의 일종이라고 합니다. QGIS에서 해당 데이터의 속성 테이블을 확인해 보면 CLASS라는 필드가 있는데요, 이 값이 1이면 종이 존재(Presence), 0이면 부재(Absence)인 위치를 나타냅니다.
조슈아 트리 종 발생 데이터와 Google 지도를 함께 올려본 상태입니다.
스타일 조정을 통해 CLASS=1이면 황색, 0이면 백색으로 구분해 봤습니다.
기후 데이터 (Climate data)
이번에는 기후 데이터를 알아보겠습니다. 기후 데이터는 'WorldClim(월드클림)' 데이터를 사용합니다. WorldClim은 생태 모델링과 GIS를 위한 무료 기후 데이터로 Global Climate Data(세계 기후 데이터)를 제공합니다. 공식 홈페이지는 아래와 같습니다.
WorldClim은 30초(~1㎢)부터 10분(~340㎢)까지 다양한 해상도의 변수를 제공합니다. 1970~2000년의 최소, 평균, 최대 기온 및 강수량에 대한 평균 월간 기후 데이터를 보유하고 있습니다. WorldClim 데이터를 연구에 사용 시, 참고문헌은 아래와 같이 포함하시면 됩니다:
Fick, S.E. and R.J. Hijmans, 2017. Worldclim 2: New 1-km spatial resolution climate surfaces for global land areas. International Journal of Climatology.
기후 데이터를 획득하는 과정은 다음과 같습니다. WorldClim에 접속한 후 'Download > Historical climate data'를 선택합니다.
아래와 같이 19개 생물 기후 특징(bioclimatic features)을 다운로드 받을 수 있는데요, 이중 실습 데이터는 2.5 minutes(~4.5㎢) 해상도를 사용하고 있습니다.
데이터를 내려받아 보면 아래와 같이 19개 생물 기후 특징 레이어로 구성되어 있습니다. 파일 포맷은 GeoTIFF입니다.
실습 데이터(DATA/BIOCLIM/bclim*.asc)는 조슈아 트리 연구지역으로 자른 생물 기후 특징으로 ASCII Grid 포맷으로 제공되고 있습니다. 여기서는 실습용으로 제공되는 데이터를 그대로 사용하겠습니다.
참고로, 19개 생물 기후 특징은 아래와 같은 기온과 강수량 데이터로 구성되어 있습니다. *번역된 용어는 조경학 또는 기상학에서 쓰는 방식과 다를 수 있습니다. 혹시 다른 부분은 댓글로 제보해 주시면 감사하겠습니다.
BIO1 = Annual Mean Temperature = 연간 평균 기온
BIO2 = Mean Diurnal Range (Mean of monthly (max temp - min temp)) = 평균 일교차 (월 평균(최고기온-최저기온))
BIO3 = Isothermality (BIO2/BIO7) (×100) = 등온성 (BIO2/BIO7) (×100)
BIO4 = Temperature Seasonality (standard deviation ×100) = 기온 계절성 (표준편차×100)
BIO5 = Max Temperature of Warmest Month = 가장 따뜻한 달의 최고 기온
BIO6 = Min Temperature of Coldest Month = 가장 추운 달의 최저 기온
BIO7 = Temperature Annual Range (BIO5-BIO6) = 연간 기온 범위 (BIO5-BIO6)
BIO8 = Mean Temperature of Wettest Quarter = 가장 습한 분기의 평균 기온
BIO9 = Mean Temperature of Driest Quarter = 가장 건조한 분기의 평균 기온
BIO10 = Mean Temperature of Warmest Quarter = 가장 따뜻한 분기의 평균 기온
BIO11 = Mean Temperature of Coldest Quarter = 가장 추운 분기의 평균 기온
BIO12 = Annual Precipitation = 연간 강수량
BIO13 = Precipitation of Wettest Month = 가장 습한 달의 강수량
BIO14 = Precipitation of Driest Month = 가장 건조한 달의 강수량
BIO15 = Precipitation Seasonality (Coefficient of Variation) = 강수량 계절성 (변동 계수)
BIO16 = Precipitation of Wettest Quarter = 가장 습한 분기의 강수량
BIO17 = Precipitation of Driest Quarter = 가장 건조한 분기의 강수량
BIO18 = Precipitation of Warmest Quarter = 가장 따뜻한 분기의 강수량
BIO19 = Precipitation of Coldest Quarter = 가장 추운 분기의 강수량
자, 이제 QGIS에서 QGIS에서 조슈아 트리(JTREE.shp), 생물 기후 특징(BIOCLIM/bclim*.asc)들을 모두 로드해 보겠습니다.
포인트 샘플링 (Point sampling)
이제 종 발생 위치에서 다수의 기후 데이터 값들을 샘플링해 보겠습니다. 먼저, 19개 bclim* 레이어의 좌표계를 JTREE.shp와 동일한 'EPSG:4326'으로 설정해 줍니다.
Point sampling tool(포인트 샘플링 도구) 플러그인을 설치해 줍니다. 해당 플러그인은 지정된 샘플링 지점에서 다수 레이어의 폴리곤 속성 및 래스터 값을 샘플링할 수 있습니다. 이 플러그인은 폴란드의 보리스 주르지엘(Borys Jurgiel) 님이 개발하셨습니다.
Point Sampling Tool을 실행한 후, 'Layer containing sampling points'는 JREE.shp를 선택해 줍니다. 'Layers with fields/bands to get values from:'에서 JTREE.shp의 CLASS 필드와 19개 bclim*를 선택해 줍니다. 'Output point vector layers:'는 'DATA/JTREE_TRAIN_VEC.csv'로 지정하고 '확인' 버튼을 클릭해 줍니다.
Point sampling Tool 결과가 궁금하신 분은 아래 파일을 체크해 보시기 바랍니다.
자, 이제 주피터 노트북으로 돌아와 다음 코드를 실행해 보겠습니다! 아래 코드는 'DATA/JTREE_TRAIN_VEC*' 조건을 만족하는 파일 이름들을 리스트로 추출하여 재정렬한 후, 반복문을 통해 하나씩 'INPUT/' 폴더로 복사합니다.
# JTREE_TRAIN_VEC.csv를 'INPUT/' 폴더로 이동
for f in sorted(glob.glob('DATA/JTREE_TRAIN_VEC*')):
shutil.copy(f,'INPUT/')
*파이썬 함수에 익숙치 않은 분들을 위해, 이해를 돕기 위한 참고 코드를 추가해 봅니다.
여러 데이터를 정리할 때 파이썬에서는 list(리스트)라는 자료형을 사용합니다. 아래 num은 리스트 자료형으로 5, 4, 2, 3, 1 숫자 모음을 표현합니다. 아래와 같이 for in 반복문을 통해 리스트에서 숫자를 하나씩 반복해가며 출력할 수 있습니다.
num = [5, 4, 2, 3, 1]
for f in num:
print(f)
5
4
2
3
1
sorted 함수는 새로 정렬된 리스트를 만들어 줍니다. 이전 코드의 num 리스트에 sorted 함수만 적용해 주면 아래와 같은 결과값을 얻게 됩니다.
for f in sorted(num):
print(f)
1
2
3
4
5
glob.glob 함수는 제시한 조건에 맞는 파일 이름을 리스트형으로 반환합니다. 이와 같이 위 코드 두 줄은 for in 반복문, sorted 함수, glob.glob 함수, 그리고 쉘 유틸리티 모듈의 shutil.copy(파일을 디렉터리에 복사)까지 다양한 함수들의 쓰임을 확인할 수 있습니다.
glob.glob('DATA/JTREE.*')
['DATA\\JTREE.dbf', 'DATA\\JTREE.prj', 'DATA\\JTREE.shp', 'DATA\\JTREE.shx']
다음으로는 pandas를 호출합니다. pandas는 Python Data Analysis Library(파이썬 데이터 분석 라이브러리)를 뜻하며 공식 홈페이지는 https://pandas.pydata.org/와 같습니다. pandas의 read_csv 함수를 통해 Point sampling tool을 통해 추출한 *.csv 파일을 읽어옵니다. head 함수는 최상위 5개 행만을 반환해 줍니다. 자, 이제 실습 데이터 전처리까지 마무리되었습니다. 다음 실습 글에서는 종 적합성(Species suitability) 매핑을 정리해 보겠습니다!
import pandas as pd
train_vec = pd.read_csv("INPUT/JTREE_TRAIN_VEC.csv")
train_vec.head()