본문 바로가기
데이터분석/일상

미친듯한 요즘 더위, 이상기후일까? 일시적 현상일까?

by 바른 곰 2025. 7. 27.

 

찜질방을 왜 가냐? 밖이 그냥 찜질방인데 ㅋㅋ

 

 

주제 선정 배경

요즘 저는 밤에만 활동하는 야행성 인간이 됐어요. 물론 제 의지는 아닙니다. 더위가 저를 이렇게 만들었죠. 해가 떠 있을때는 나갈 생각이 1도 들지않더라구요. 잠깐 집 앞 편의점만 다녀와도 땀이 아주... 시간이 흐를수록 여기가 동남아시아인지 한국인지 모를정도로 더워지는 것 같네요.

 

뉴스에서도 말이 많아요. 환경오염 때문이다, 지구온난화다. 등등 물론 반대로 지구온난화는 사기극이다 라고 말하는 사람들도 있긴 하죠. 그래서 실제로 우리나라의 온도가 올라간것인지, 아니면 그냥 올해만 이렇게 찌는듯이 더운건지 확인해보고 싶어졌습니다.

 

미친듯한 요즘 더위! 이상기후일까? 일시적 현상일까?
한번 확인해 보자

활용 데이터

  • 2006 ~ 2025년 여름철(6월 ~ 7월) 최고기온, 최저기온 데이터 - 기상청 API
    • 지난 20년간 기온이 어떻게 변화했는 지 확인하기 위해 수집했다.

분석 과정 및 결론

1. 최고기온, 최저기온 데이터 수집

기상청 API에서 과거의 기상 데이터를 제공한다. 나는 여기서 온도 변화를 확인하기 위해 일별 최저기온, 최고기온 데이터를 수집했다. 기간은 2006 ~ 2025년 까지의 데이터이고, 여름철을 비교하기 위해 6월 ~ 7월 데이터만 수집했다. 그렇게 수집한 데이터는 아래와 같다.

 

2. 데이터 전처리

전처리 할게 많지는 않았다. 나중에 연도별과 월별로 그룹화를 진행해서 최저기온, 최고기온을 비교할 것이기 때문에 연도컬럼과 월컬럼을 따로 추가했다.

# 연도, 월 추가

temp_data['연도'] = temp_data['날짜'].dt.year
temp_data['월'] = temp_data['날짜'].dt.month

 

2. 연도별 월별 최고기온 최댓값 확인

연도별 월별 최고기온의 최대값 즉, 그해 그월에 가장 더웠던 날이 몇도였는지 확인해봤다.

 

결과를 보면 가장 더웠던 날의 온도가 증가하고 있는 추세를 확인할 수 있다. 특히 20년 중 올해가 2018년 다음으로 가장 뜨거운 날이 있던 해이고, 가장 더웠던 날의 온도가 작년에 비해 약 4도가량 증가한 것을 확인할 수 있다.

 

 

3. 연도별 월별 평균 최고기온, 최저기온 변화 확인

먼저 최고기온 부터 살펴봤다. 아래는 2006년 부터 2025년까지 6월과 7월의 평균 최고기온 변화를 나타낸 그래프다. X축은 연도, Y축은 온도를 나타낸다.

 

결과를 살펴보면, 전체 20년 중 올해 7월의 평균 최고기온이 가장 높았던 것을 확인할 수 있다. 보통 이 시기에 장마가 시작되는데 올해는 장마가 온다했는데 안오고, 안온다했는데 오고, 심지어 장마가 짧고 하는 등의 이유가 반영된 것 같다. 여기서도 20년간 평균 최고기온이 꾸준히 증가하고 있는 추세를 확인할 수 있었다.

 

다음은 최저기온이다.

 

최저기온 또한 마찬가지로 꾸준히 증가하고 있는 추세다. 특히 올해 7월이 20년 중 가장 높은 평균 최저기온을 기록한 것을 볼 수 있는데 평균 최고기온에 이어서 평균 최저기온까지 높은 올해 7월은 현재의 끔찍한 더위를 데이터로 보여주는 것 같다.

 

4. 연도별 30도 넘는 날 카운팅

마지막으로 연도별로 6월과 7월에 30도가 넘었던 날의 수를 계산해 봤다. 계산 결과는 아래와 그래프와 같고, X축은 연도 Y축은 30도를 넘은 날의 빈도이다.

 

역시나 올해에 30도를 넘는 날이 가장 많았다. 그리고 2000년대에 비해 시간이 갈수록 6월과 7월에 30도를 넘었던 날이 많아지는 모습을 확인할 수 있다.

 

5. 결론

가장 더웠던 날의 온도, 평균 최고 및 최저기온 변화, 30도를 넘었던 날의 수 모두 20년전에 비해 높아지고, 많아지는 것을 확인할 수 있었다. 이를 토대로 미친 것 같은 요즘 더위는 단순히 일시적 현상이 아니라, 이상기후라고 말할 수 있다.

 

미친듯한 요즘 더위는 이상기후 때문이다.

 


쿠키

과거 온도와 현재 온도를 비교해봤다. 2006 ~ 2008년 까지의 6월, 7월 평균 최고기온과, 2023 ~ 2025년 까지의 6월, 7월 평균 최고기온을 계산해 본 결과 각각 27도, 29.3도 였다. 이를 통해서 20년 전에 비해 현재 우리나라의 온도가 2.3도 가량 증가한 것을 확인할 수 있다. 지구온난화는 현실이다.

# 과거 온도와 현재 온도 비교

avg_temp = temp_data.groupby(['연도'])['최고기온'].mean()
past_temp = avg_temp[0: 3].mean()
present_temp = avg_temp[-3: ].mean()

print(f'20년전에 비해 현재 {present_temp - past_temp}˚c 오름')

마무리

지구온난화가 심각한 사회적 이슈로 떠오른 지 얼마나 오래됐는지 잘 모르겠다. 초등학교 때부터 들었던 것 같은데... 그때는 그냥 막연하게 지구가 뜨거워지고 있구나 생각만했지 체감하지는 못했다. 근데 최근들어 내 최애계절인 가을이 짧아지고, 봄도 짧아지고 여름엔 미친듯이 덥고 겨울엔 미친듯이 춥고를 반복하는 해가 많아짐을 느끼면서 이제야 지구온난화가 몸으로 느껴지기 시작했다.

 

그래서 개인이 지구온난화를 위해 할 수 있는 일이 무엇인지 찾아봤다. 그 중 집에만 있는 백수인 내가 할 수 있는 일을 찾았다. 바로 여름철에는 26 ~ 28도, 겨울철에는 18 ~ 20도 정도로 실내온도를 유지하는 일이다. 지구를 위해 조금 덥거나, 춥더라도 적정 실내온도를 유지하고, 여름에는 찬물샤워, 겨울에는 내복입기 등으로 지구지키기에 동참할 계획이다.


최종코드

# 라이브러리

!pip install koreanize_matplotlib
import koreanize_matplotlib

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

import requests
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
from tqdm import tqdm
import time
# 기상청 API 활용 데이터 수집

url = 'http://apis.data.go.kr/1360000/AsosDalyInfoService/getWthrDataList'
temp_data = pd.DataFrame()

startDt_base = datetime(2025, 6, 1)
endDt_base = datetime(2025, 7, 25)

for i in tqdm(range(20)):
  startDt = startDt_base - relativedelta(years = i)
  endDt = endDt_base - relativedelta(years = i)

  params ={
          'serviceKey' : 'ENTER YOUR API KEY HERE',
          'pageNo' : '1',
          'numOfRows' : '100',
          'dataType' : 'JSON',
          'dataCd' : 'ASOS',
          'dateCd' : 'DAY',
          'startDt' : startDt.strftime('%Y%m%d'),
          'endDt' : endDt.strftime('%Y%m%d'),
          'stnIds' : '108'
          }

  response = requests.get(url, params=params)
  time.sleep(0.5)
  response = response.json()



  날짜_list = []
  최고기온_list = []
  최저기온_list = []

  # 온도 데이터 추출
  for idx in range(len(response['response']['body']['items']['item'])):
    날짜_list.append(response['response']['body']['items']['item'][idx]['tm'])
    최고기온_list.append(response['response']['body']['items']['item'][idx]['maxTa'])
    최저기온_list.append(response['response']['body']['items']['item'][idx]['minTa'])

  df = pd.DataFrame({
      '날짜' : 날짜_list,
      '최고기온' : 최고기온_list,
      '최저기온' : 최저기온_list
  })

  temp_data = pd.concat([temp_data, df])

temp_data['날짜'] = pd.to_datetime(temp_data['날짜'])
temp_data['최고기온'] = temp_data['최고기온'].astype(float)
temp_data['최저기온'] = temp_data['최저기온'].astype(float)
# 연도, 월 추가

temp_data['연도'] = temp_data['날짜'].dt.year
temp_data['월'] = temp_data['날짜'].dt.month
# 연도별 월별 최고기온 최대값 -> 가장 더웠던 날

hotteset_day = temp_data.groupby(['연도', '월'])['최고기온'].max().unstack()

# 시각화
hotteset_day.plot(marker = 'o', title = '연도별 월별 최고기온 변화(6월 ~ 7월)', figsize = (8, 6))
plt.ylabel('온도')
plt.xlabel('연도')
plt.grid()
plt.xticks(hotteset_day.index[:: 2].astype(int))
plt.show()
# 연도별 월별 평균 최고기온

hotteset_day = temp_data.groupby(['연도', '월'])['최고기온'].mean().unstack()
hotteset_day.plot(marker = 'o', title = '연도별 월별 평균 최고기온 변화(6월 ~ 7월)', figsize = (8, 6))
plt.ylabel('온도')
plt.xlabel('연도')
plt.grid()
plt.xticks(hotteset_day.index[::2].astype(int))
plt.show()
# 연도별 월별 평균 최저기온

hotteset_day = temp_data.groupby(['연도', '월'])['최저기온'].mean().unstack()
hotteset_day.plot(marker = 'o', title = '연도별 월별 평균 최저기온 변화(6월 ~ 7월)', figsize = (8, 6))
plt.ylabel('온도')
plt.xlabel('연도')
plt.grid()
plt.xticks(hotteset_day.index[::2].astype(int))
plt.show()
# 연도별 30도 넘는 날

hot_days = temp_data[temp_data['최고기온'] >= 30]
hot_days = hot_days.groupby(['연도']).size()
hot_days = hot_days.fillna(0)


colors = sns.color_palette("coolwarm", len(hot_days))
plt.figure(figsize = (8, 6))
plt.bar(hot_days.index, hot_days.values, color = colors)
plt.title('연도별 30도 넘는 날')
plt.ylabel('빈도 수')
plt.xlabel('연도')
plt.grid()
plt.xticks(hot_days.index[::2].astype(int))
plt.show()
# 과거 온도와 현재 온도 비교

avg_temp = temp_data.groupby(['연도'])['최고기온'].mean()
past_temp = avg_temp[0: 3].mean()
present_temp = avg_temp[-3: ].mean()

print(f'20년전에 비해 현재 {present_temp - past_temp}˚c 오름')