Data Analysis/Environment

[Environmental Data Analysis] 2000년 ~ 2020년 국내 시도별 기온 변화 트렌드 분석 with Python

동장군님 2021. 6. 10. 16:46

 

이번 포스팅에서 다룰 주제는 바로 기온이다. 2000년부터 20년간 대한민국 시도별 평균 기온이 어떻게 변해왔는지 한번 알아보도록 하겠다. 데이터는 아래 국가통계포털 링크에서 확인할 수 있다.

 

https://kosis.kr/statHtml/statHtml.do?orgId=101&tblId=DT_1YL9801&vw_cd=MT_GTITLE01&list_id=111&seqNo=&lang_mode=ko&language=kor&obj_var_id=&itm_id=&conn_path=MT_GTITLE01 

 

KOSIS

 

kosis.kr

 

1. 2000년 ~ 2020년 시도별 기온 변화 트렌드

우선 간단하게 Plotly를 사용해서 시도별 기온 트렌드를 시각화해보도록 하겠다.

그래프 상으로는 뚜렷하게 나타나고 있지는 않지만 확실히 거의 모든 지역에서 평균 기온이 증가한 부분을 확인할 수 있다. 

 

import pandas as pd
import plotly.express as px

df=pd.read_csv('D:/Download/기온.csv',encoding='euc-kr')
df.columns=['Region','Year','Avg.Temp']

si_do={'강원도':'Gangwon-do','경기도':'Gyeonggi-do', '경상남도':'Gyeongsangnam-do','경상북도':'Gyeongsangbuk-do',
       '광주광역시':'Gwangju','대구광역시':'Daegu','대전광역시':'Daejeon','부산광역시':'Busan',
       '서울특별시':'Seoul','세종특별자치시':'Sejongsi','울산광역시':'Ulsan','인천광역시':'Incheon',
       '전라남도':'Jeollanam-do','전라북도':'Jeollabuk-do','제주특별자치도':'Jeju-do','충청남도':'Chungcheongnam-do',
       '충청북도':'Chungcheongbuk-do','전국(평균)':'Average'}
df['eng_region']=df['Region'].apply(lambda x: si_do[x])

fig = px.line(df, x="Year", y="Avg.Temp", color='eng_region')
fig.show()

 

2. 시도별 기온 증가폭

위 그래프로는 명확하게 얼마나 많이 상승한 지 확인할 수 없어서, 2000년 대비 2020년 기온이 얼마나 올랐는지 그래프로 다시 만들어봤다.

 

대한민국 전체 평균 2000년 대비 2020년에 기온이 약 5.6% 증가한 것으로 나타났다. 기온이 가장 많이 증가한 지역으로는 대전, 충청남도, 강원도, 전라북도, 충청북도로 확인할 수 있으며 대구, 울산, 부산의 경우 상승폭이 평균 대비 절반 수준에 미치지 못할 정도로 낮다.

 

import plotly.graph_objects as go

df_2000=df[df['Year']==2000]
df_2020=df[df['Year']==2020]

df_2000.set_index('Region',inplace=True)
df_2020.set_index('Region',inplace=True)

tb=pd.concat([df_2000,df_2020],axis=1)
tb.columns=['Year','2000_temp','eng_region','Year2','2020_temp','eng_region2']

tb=tb.drop(['Year2','eng_region2'],axis=1)
tb['temp_increase']=((tb['2020_temp']/tb['2000_temp'])-1)*100

tb=tb.sort_values(by='temp_increase',ascending=False)
colors = ['lightslategray',] * len(tb)
colors[tb['eng_region'].values.tolist().index('Average')] = 'crimson'

fig = go.Figure(data=[go.Bar(
    x=tb['eng_region'],
    y=tb['temp_increase'],
    marker_color=colors,
    text=tb['temp_increase']
)])
fig.update_traces(texttemplate='%{text:.2f}%',textposition='outside',)

fig.update_layout(title_text='Temperature Increase %')
fig.show()
fig.to_json()

기온이 1℃만 올라도 사망 위험률이 5% 정도 증가한다고 한다. 태풍/홍수와 같은 자연 재해 뿐만 아니라 기온 상승에 따른 식중독, 폭염, 전염병 등 질환이 늘어나기 때문이다. 우리 생명과도 직결되는 부분이기 때문에 기온은 환경문제에 있어 가장 중요한 부분이 아닐 수 없다.

 

 

 

마지막으로 대한민국 시도, 연도별 평균 기온을 아래와 같이 애니메이션으로 만들어봤다. 해당 부분은 파이썬 스터디용으로 만들어 본 것이니 참고만 하길 바란다.

 

import folium
from folium import plugins
from selenium import webdriver
import time
import imageio
from PIL import Image
import os
from pathlib import Path

for i in range(2000, 2021):
    geo_json='https://raw.githubusercontent.com/southkorea/southkorea-maps/master/kostat/2013/json/skorea_provinces_geo_simple.json'
    
    df_=df[df['Year']==i]
    m=folium.Map(
        location=[36.97884521132491, 127.86224884213675],
        tiles='Stamen Terrain',
        zoom_start=6.1
    )
    folium.Choropleth(
        geo_data=geo_json,
        name='choropleth',
        data=df_,
        columns=['eng_region','Avg.Temp'],
        key_on='feature.properties.name_eng',
        fill_color='YlOrRd',
        fill_opacity=0.7,
        line_opacity=0.2
    ).add_to(m)
    
    title_html = '''
                 <h3 align="left" style="font-size:22px"><b>{}</b></h3>
                 '''.format('Year: ' + str(i))
    m.get_root().html.add_child(folium.Element(title_html))
    
    m.save('C:/Users/IGAWorks_Wade/avg_temp_' + str(i) + '.html')
    

for i in range(2000,2021):
    fn='avg_temp_' + str(i) + '.html'

    browser = webdriver.Chrome()
    browser.get(f'C:/Users/IGAWorks_Wade/{fn}')

    #Give the map tiles some time to load
    time.sleep(5)
    browser.save_screenshot('avg_temp_' + str(i) + '.png')
    browser.quit()
    
for i in range(2000,2021):
    image = Image.open('avg_temp_' + str(i) + '.png')
    box = (0, 0, 800, 800)
    cropped_image = image.crop(box)
    cropped_image.save('kore_avg_temp_' + str(i) + '.png')
    
image_path = Path()

images = list(image_path.glob('*.png'))
image_list = []
for file_name in images:
    print(file_name)
    image_list.append(imageio.imread(file_name))
    os.remove(file_name)
    
imageio.mimwrite('GifMap.gif', image_list, fps=2)