프로젝트 개요

최근 몇 년간 ‘전례없는’, ‘역대급’ 추위와 더위가 빈번하게 발생하고 있다는 보도를 많이 접하였다. 이러한 이상기후가 얼마나 빈번하게 발생하는지와 기후 변화를 테이터 분석을 통해 확인하고자 했다. 이 프로젝트에서는 공공데이터포털의 기상청 제공 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년)

img img

전국 연평균 강수량 변화 추이(50년)

img

2022년 전국 월평균 온도 변화 추이

“빨라진 벚꽃 개화 시기”, “역대 가장 더웠던 2022년 봄” 등 2022년의 봄이 유난히 더웠다고 보도되었다. 2022년 전국 월평균 온도 변화 표를 확인해보면 실제로 3~4월은 매우 더웠으며, 51년중 5위 안에 드는 더위였던 것을 확인할 수 있다. img

img

2022년 전국 월평균 강수량 변화 추이

“2022년 한국 중부 집중호우”, “여름 가뭄” 등 집중호우와 가뭄에 대한 보도가 쏟아졌었다. 2022년 전국 월평균 강수량 변화 표를 확인해보면 가뭄으로 속앓이를 했던 5월 전체 중 51위로, 가장 비가 오지 않았다. 또, 2022년 전체적으로 강우량 200mm를 넘는 달이 없었으나, 집중호우가 발생했던 8월 평균 280mm를 기록하였다. img img

2023년 전국 월평균 온도 변화 추이

2023년은 평균 온도 1위를 기록한, 가장 더운 해였다.

img img 7e474135”>

2023년 전국 월평균 강수량 변화 추이

2023년 여름은 7월 한달간 기록적인 폭우를 겪었다. img img

해를 거듭할수록 기온과 강수량이 증가하는 추세임을 확인할 수 있었다. 이 분석을 통해 대한민국의 기후변화가 얼마나 빠르게 진행되고 있는지, 그리고 어떤 시점에 이상 기후가 빈번하게 발생하는지에 대한 통찰을 얻을 수 있었다.

GitHub 저장소

https://github.com/jungjae0/weather_analysis