이상기후 분석: 공공데이터포털 API를 활용한 ASOS 데이터 분석
프로젝트 개요
최근 몇 년간 ‘전례없는’, ‘역대급’ 추위와 더위가 빈번하게 발생하고 있다는 보도를 많이 접하였다. 이러한 이상기후가 얼마나 빈번하게 발생하는지와 기후 변화를 테이터 분석을 통해 확인하고자 했다. 이 프로젝트에서는 공공데이터포털의 기상청 제공 ASOS 데이터를 활용하여 기후 변화와 이상기후 빈도를 파악했다.
데이터 수집 및 전처리
공공데이터포털 API
기상청에서는 종관기상관측 장비로 관측한 일 기상자료를 조회하는 서비스를 제공하고 있다. 이 서비스를 활용하여 1980년도부터 2023년까지의 관측지점의 일 기상자료를 수집하였다. 관측 지점 번호와, 시작일, 종료일 값을 지정하여 요청하면 평균 상대습도, 평균 온도, 총 강우량 등의 데이터를 얻을 수 있다.
import json
import requests
import pandas as pd
from urllib.parse import quote_plus, urlencode
url = 'http://apis.data.go.kr/1360000/AsosDalyInfoService/getWthrDataList'
servicekey = 'API_KEY'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64)'
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132'
'Safari/537.36'}
params = f'?{quote_plus("ServiceKey")}={servicekey}&' + urlencode({
quote_plus("pageNo"): "1",
quote_plus("numOfRows"): "720",
quote_plus("dataType"): "JSON",
quote_plus("dataCd"): "ASOS",
quote_plus("dateCd"): "DAY",
quote_plus("startDt"): start_date,
quote_plus("endDt"): end_date,
quote_plus("stnIds"): station_id
})
result = requests.get(url + params, headers=headers)
js = json.loads(result.content)
df = pd.DataFrame(js['response']['body']['items']['item'])
데이터 전처리
먼저, ASOS 데이터에서 tm(날짜) 열을 활용하여 연도, 월, 일을 나타내는 year, month, day 열을 생성했다. 이를 통해 연도별, 월별로 데이터를 그룹화하여 분석할 수 있도록 하였다.
import pandas as pd
# tm 열을 datetime 형식으로 변환
df['tm'] = pd.to_datetime(df['tm'])
# year, month, day 열 생성
df['year'] = df['tm'].dt.year
df['month'] = df['tm'].dt.month
df['day'] = df['tm'].dt.day
데이터 분석
groupby
를 사용하여 연도별, 월별로 그룹화하고, 각 그룹에 대해 평균값(mean), 합계(sum), 순위(rank)를 계산했다.
이를 통해 특정 기간 동안의 기상 변화를 파악하고, 가장 더웠던/추웠던 해 등을 파악하였다.
tavg_month.loc[-1] = ['평균', tavgyear, tavg30]
tavg_month['편차(°C)'] = tavg_month[f'{year}년 기온(°C)'] - tavg_month['평년기온(°C)']
tavg_month_rank = df_whole.groupby(['month', 'year'])['avgTa'].mean().reset_index()
tavg_month_rank['순위'] = tavg_month_rank.groupby('month')['avgTa'].rank(ascending=False, method='min')
tavg_month_rank = tavg_month_rank[tavg_month_rank['year'] == year][['month', '순위']]
tavg_rank = df_whole.groupby('year')['avgTa'].mean().rank(ascending=False, method='min').reset_index()
tavg_rank = tavg_rank[tavg_rank['year'] == year]
tavg_rank.columns = ['month', '순위']
tavg_rank['month'] = '평균'
tavg_rank = pd.concat([tavg_rank, tavg_month_rank])
tavg_result = pd.merge(tavg_month, tavg_rank, on='month', how='inner')
tavg_result = tavg_result.set_index('month')
tavg_result['순위'] = tavg_result['순위']
시각화
분석된 데이터를 시각화하여, 기후 변화와 이상기후 발생 빈도를 한눈에 볼 수 있도록 했다.
전국 연평균 기온 변화 추이(50년)
전국 연평균 강수량 변화 추이(50년)
2022년 전국 월평균 온도 변화 추이
“빨라진 벚꽃 개화 시기”, “역대 가장 더웠던 2022년 봄” 등 2022년의 봄이 유난히 더웠다고 보도되었다. 2022년 전국 월평균 온도 변화 표를 확인해보면 실제로 3~4월은 매우 더웠으며, 51년중 5위 안에 드는 더위였던 것을 확인할 수 있다.
2022년 전국 월평균 강수량 변화 추이
“2022년 한국 중부 집중호우”, “여름 가뭄” 등 집중호우와 가뭄에 대한 보도가 쏟아졌었다. 2022년 전국 월평균 강수량 변화 표를 확인해보면 가뭄으로 속앓이를 했던 5월 전체 중 51위로, 가장 비가 오지 않았다. 또, 2022년 전체적으로 강우량 200mm를 넘는 달이 없었으나, 집중호우가 발생했던 8월 평균 280mm를 기록하였다.
2023년 전국 월평균 온도 변화 추이
2023년은 평균 온도 1위를 기록한, 가장 더운 해였다.
7e474135”>
2023년 전국 월평균 강수량 변화 추이
2023년 여름은 7월 한달간 기록적인 폭우를 겪었다.
해를 거듭할수록 기온과 강수량이 증가하는 추세임을 확인할 수 있었다. 이 분석을 통해 대한민국의 기후변화가 얼마나 빠르게 진행되고 있는지, 그리고 어떤 시점에 이상 기후가 빈번하게 발생하는지에 대한 통찰을 얻을 수 있었다.