다양한 연구 현장에서 연구자들은 GPS 모듈을 활용해 동물의 행동을 추적합니다. GPS 데이터를 분석하면 특정 동물이 계절에 따라 어떤 지역을 오가는지, 언제 어디로 이동했는지 등을 정밀하게 파악할 수 있습니다.
이번 글에서는 바로 그런 유형의 데이터셋을 사용해 조류가 여러 지역으로 어떻게 이동하는지 확인해 보겠습니다. 사용할 데이터셋에는 GPS 모듈이 기록한 위치 정보가 담겨 있으며, 전체 데이터는 CSV 형식으로 제공됩니다. 파일에는 새 ID(bird_id), 날짜와 시간(date_time), 위도(latitude), 경도(longitude), 속도(speed) 필드가 포함되어 있습니다.
필요한 라이브러리 설치
이 작업을 수행하려면 Python 코드에서 사용할 몇 가지 모듈이 필요합니다. 여기서는 matplotlib, pandas, cartopy 세 가지 모듈을 사용합니다. Anaconda 환경이라면 아래 명령어로 손쉽게 설치할 수 있으며, 설치 과정에서 필요한 다른 의존성 모듈들도 함께 설치됩니다.
conda install -c conda-forge matplotlib conda install -c anaconda pandas conda install -c scitools/label/archive cartopy
위도·경도 값으로 이동 경로 그리기
먼저 위도(latitude)와 경도(longitude) 값을 이용해 새들의 위치를 그래프로 표현해 보겠습니다. 데이터셋에는 두 마리의 새가 포함되어 있으므로, 서로 다른 색상을 적용하면 각 개체의 추적 위치를 한눈에 구분해 볼 수 있습니다.
예제 코드
import pandas as pd
from matplotlib import pyplot as plt
df = pd.read_csv('bird_tracking.csv')
cr = df.groupby('bird_id').groups
cr_groups = df.groupby('bird_id')
group_list = []
for group in cr:
group_list.append(group)
plt.figure(figsize=(7, 7))
# 첫 번째 그룹(두루미) 데이터부터 그래프 생성
for group in group_list:
x, y = cr_groups.get_group(group).longitude, cr_groups.get_group(group).latitude
plt.plot(x, y, marker='o', markersize=2)
plt.show()실행 결과

단순한 좌표 플롯만으로도 두 마리의 새가 서로 다른 경로로 이동했다는 사실을 확인할 수 있습니다.
실제 지도 위에 추적 결과 표시하기
이제 추적 결과를 실제 지리적 지도 위에 겹쳐 그려 보겠습니다. 이렇게 하면 새들이 실제로 어떤 항공 경로를 따라 이동했는지 훨씬 직관적으로 파악할 수 있습니다. 지도 투영(projection)과 해안선, 국경 등의 지리 정보를 추가하기 위해 cartopy 모듈을 활용합니다.
예제 코드
import pandas as pd
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib.pyplot as plt
df = pd.read_csv("bird_tracking.csv")
bird_id = pd.unique(df.bird_id)
# 지도 위에 데이터를 표시하기 위한 투영 설정
projection = ccrs.Mercator()
plt.figure(figsize=(7, 7))
axes = plt.axes(projection=projection)
axes.set_extent((-30.0, 25.0, 10.0, 50.0))
axes.add_feature(cfeature.LAND)
axes.add_feature(cfeature.OCEAN)
axes.add_feature(cfeature.COASTLINE)
axes.add_feature(cfeature.BORDERS, linestyle=':')
for id in bird_id:
index = df['bird_id'] == id
x = df.longitude[index]
y = df.latitude[index]
axes.plot(x, y, '.', transform=ccrs.Geodetic(), label=id)
plt.legend(loc="lower left")
plt.show()실행 결과

결과를 보면 육지, 해양, 해안선, 국경선이 함께 표시된 메르카토르(Mercator) 투영 지도 위에 개체별 이동 궤적이 점으로 나타납니다. 범례(legend)를 통해 어떤 경로가 어느 개체의 것인지도 쉽게 구분할 수 있습니다.
마무리
이처럼 pandas로 GPS 로그 데이터를 손쉽게 불러오고, matplotlib과 cartopy를 조합하면 별도의 GIS 전문 도구 없이도 동물의 이동 경로를 지도 위에 시각화할 수 있습니다. 같은 방식을 응용하면 이동 거리 계산, 속도 분석, 계절별 이동 패턴 비교 등 더 깊이 있는 조류 생태 분석으로 확장할 수 있습니다.