반응형
서울시 폭염데이터 추출.html
0.68MB
서울시 폭염데이터 추출.ipynb
0.38MB
1. 문제정의
기후변화(위기)로 인한 폭염과 열대야 현상이 심각한 사회문제로 대두되고 있습니다. 이에 서울시의 1911년부터 2020년까지 110년간의 기상데이터를 분석하여 폭염과 열대야의 장기적 추세를 파악하고자 합니다.
2. 데이터분석
폭염 분석 (일 최고기온 33도 이상)
- 110년간 총 1,028일의 폭염 발생
- 최고 폭염 기록: 2018년 8월 1일 (39.6도)
- 연간 폭염일수 최다 기록:
- 1939년: 47일
- 1943년: 43일
- 2018년: 35일
열대야 분석 (일 최저기온 25도 이상)
- 110년간 총 549일의 열대야 발생
- 최고 열대야 기록: 2018년 8월 2일 (30.3도)
- 연간 열대야일수 최다 기록:
- 1994년: 34일
- 2016년: 32일
- 2018년: 28일
# 기본 설정
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.family'] = 'NanumSquare'
plt.rcParams['axes.unicode_minus']=False
# 데이터 수집 및 전처리
df_1911 = pd.read_csv('data/1911-1920 일별 기온.csv') #UTP8로 인코딩한거
df_1921 = pd.read_csv('data/1921-1930 일별 기온.csv', encoding='cp949') #encoding='cp949'로 UTP8로 인코딩 안해도 적용되는거
df_1931 = pd.read_csv('data/1931-1940 일별 기온.csv', encoding='cp949')
df_1941 = pd.read_csv('data/1941-1950 일별 기온.csv', encoding='cp949')
df_1951 = pd.read_csv('data/1951-1960 일별 기온.csv', encoding='cp949')
df_1961 = pd.read_csv('data/1961-1970 일별 기온.csv', encoding='cp949')
df_1971 = pd.read_csv('data/1971-1980 일별 기온.csv', encoding='cp949')
df_1981 = pd.read_csv('data/1981-1990 일별 기온.csv', encoding='cp949')
df_1991 = pd.read_csv('data/1991-2000 일별 기온.csv', encoding='cp949')
df_2001 = pd.read_csv('data/2001-2010 일별 기온.csv', encoding='cp949')
df_2011 = pd.read_csv('data/2011-2020 일별 기온.csv', encoding='cp949')
In [4]:
#데이터프레임 연결
df = pd.concat([df_1911,df_1921,df_1931,df_1941,df_1951,df_1961,df_1971,df_1981,df_1991,df_2001,df_2011],
ignore_index=True)
In [5]:
#데이터타입 변경
df.dtypes
Out[5]:
지점 int64
지점명 object
일시 object
평균기온(°C) float64
최저기온(°C) float64
최고기온(°C) float64
dtype: object
In [6]:
df['일시'] = pd.to_datetime(df['일시'])
In [8]:
df.dtypes
Out[8]:
지점 int64
지점명 object
일시 datetime64[ns]
평균기온(°C) float64
최저기온(°C) float64
최고기온(°C) float64
dtype: object
In [12]:
df['지점명'].nunique()
Out[12]:
102
# 시각화
1. 서울시 폭염/열대야 현황 시각화
In [18]:
#서브셋 만들기
df_seoul = df[df['지점명']=='서울'].copy()
df_seoul
1.1 서울시 폭염데이터 추출
일 최고기온 33도 이상
df_seoul_hotday = df_seoul[df_seoul['최고기온(°C)']>=33].copy()
df_seoul_hotday

1.2 서울시 폭염데이터 시각화
plt.rcParams['figure.figsize']=(16,5)
plt.plot(df_seoul_hotday['일시'], df_seoul_hotday['최고기온(°C)'], 'r.')
plt.xlabel('일시')
plt.ylabel('최고기온(°C)')
plt.title('서울시 폭염일 현황(1911~2020)', size = 20)
plt.show()
1.3 서울시 열대야데이터 추출
일 최저기온 25도 이상
In [36]:
df_seoul_hotnight = df_seoul[df_seoul['최저기온(°C)']>=25].copy()
df_seoul_hotnight

1.4 서울시 열대야데이터 시각화
In [90]:
plt.plot(df_seoul_hotnight['일시'], df_seoul_hotnight['최저기온(°C)'], 'k.')
plt.xlabel('일시')
plt.ylabel('최저기온(°C)')
plt.title('서울시 열대야 현황(1911~2020)', size = 20)
plt.show()

2. 최고 폭염,열대야 강조
In [46]:
#폭염 best10
df_seoul_hotestday = df_seoul_hotday.nlargest(10,'최고기온(°C)')
In [56]:
df_seoul_hotestday = df_seoul_hotestday.iloc[[0]]
print(df_seoul_hotestday.iloc[0,2].date())
print(df_seoul_hotestday.iloc[0,5])
2018-08-01
39.6
2.1 폭염이 가장 심했던 날
plt.plot(df_seoul_hotday['일시'], df_seoul_hotday['최고기온(°C)'], 'r.')
plt.xlabel('일시')
plt.ylabel('최고기온(°C)')
plt.title('서울시 폭염일 현황(1911~2020)', size = 20)
#가장 더웠던 날 표시(hotestday)
plt.plot(df_seoul_hotestday.iloc[0,2].date(), df_seoul_hotestday.iloc[0,5], 'r^')
#날짜, 온도표시
plt.text(df_seoul_hotestday.iloc[0,2].date(), df_seoul_hotestday.iloc[0,5]+0.5,
str(df_seoul_hotestday.iloc[0,2].date())+'('+str(df_seoul_hotestday.iloc[0,5])+'도)',
ha='center', size=12)
plt.yticks(range(33,42))
plt.show()

2.2 열대야가 가장 심했던 날
In [75]:
#열대야 best10
df_seoul_hotestnight = df_seoul_hotnight.nlargest(10,'최저기온(°C)')
In [77]:
print(df_seoul_hotestnight.iloc[0,2].date())
print(df_seoul_hotestnight.iloc[0,4])
2018-08-02
30.3
In [94]:
plt.plot(df_seoul_hotnight['일시'], df_seoul_hotnight['최저기온(°C)'], 'k.')
plt.xlabel('일시')
plt.ylabel('최저기온(°C)')
plt.title('서울시 열대야 현황(1911~2020)', size = 20)
#가장 더웠던 밤 표시(hotestnight)
plt.plot(df_seoul_hotestnight.iloc[0,2].date(),df_seoul_hotestnight.iloc[0,4], 'k^')
#날짜, 온도표시
plt.text(df_seoul_hotestnight.iloc[0,2].date(), df_seoul_hotestnight.iloc[0,4]+0.5,
str(df_seoul_hotestnight.iloc[0,2].date())+'('+str(df_seoul_hotestnight.iloc[0,4])+'도)',
ha='center', size=12)
plt.yticks(range(25,33))
plt.show()

3.연도별 폭염,열대야 일수
3.1 연도별 폭염일수
In [168]:
#연도별 폭염일수 연도별로 그룹핑하여 카운트
df_seoul_hotday_count = df_seoul_hotday.groupby(df_seoul_hotday['일시'].dt.year)['일시'].count().to_frame()
df_seoul_hotday_count

In [162]:
#폭염일 없는날을 포함시키기 위해서 1911~2020년의 연도 데이터프레임 생성
df_year = pd.DataFrame(range(1911,2021))
df_year.index = df_year[0]
df_year

In [170]:
#연도 데이터프레임 concat - 근데 df_year가 뒤로가면 왜 1913년이 안나오는거지?
df_seoul_hotday_count = pd.concat([df_year,df_seoul_hotday_count], axis=1)
df_seoul_hotday_count

In [172]:
#불필요한 컬럼 삭제
df_seoul_hotday_count.drop(columns=[0], inplace=True)
In [174]:
df_seoul_hotday_count

In [176]:
#결측치 확인
df_seoul_hotday_count.isnull().sum()
Out[176]:
일시 13
dtype: int64
In [178]:
#null -> 폭염일 없음을 의미 -> null을 0으로 채움.
df_seoul_hotday_count = df_seoul_hotday_count.fillna(0)
In [184]:
#컬럼명 바꾸기
df_seoul_hotday_count.columns=['폭염일수']
In [186]:
#데이터 정수형으로 변환
df_seoul_hotday_count = df_seoul_hotday_count.astype('int64')
In [190]:
df_seoul_hotday_count.nlargest(10,'폭염일수')

3.2 연도별 열대야일수
In [206]:
df_seoul_hotnight_count = df_seoul_hotnight.groupby(df_seoul_hotnight['일시'].dt.year)['일시'].count().to_frame()
df_seoul_hotnight_count

# concat
df_seoul_hotnight_count = pd.concat([df_year,df_seoul_hotnight_count], axis=1)
df_seoul_hotnight_count.drop(columns=[0], inplace=True)
#컬럼명 변경
df_seoul_hotnight_count.columns=['열대야일수']
df_seoul_hotnight_count = df_seoul_hotnight_count.fillna(0)
#데이터 정수형으로 변환
df_seoul_hotnight_count = df_seoul_hotnight_count.astype('int64')
# 연도별 열대야일수 best10
df_seoul_hotnight_count.nlargest(10,'열대야일수')

4.연도별 폭염,열대야 일수 시각화
In [252]:
df_seoul_hotday_count.head(3)

df_seoul_hotnight_count.head(3)

#서브플롯 만들기
fig, ax = plt.subplots(1,2,sharex=True,sharey=True)
#연도별 폭염일수, 열대야일수 시각화
ax[0].plot(df_seoul_hotday_count.index, df_seoul_hotday_count['폭염일수'], 'r.-')
ax[1].plot(df_seoul_hotnight_count.index, df_seoul_hotnight_count['열대야일수'], 'k.-')
#xlabel
ax[0].set_xlabel('연도')
ax[1].set_xlabel('연도')
#ylabel
ax[0].set_ylabel('폭염일수')
ax[1].set_ylabel('열대야일수')
#xicks, yticks 범위 지정, 틱공유
ax[0].set_xticks(range(1910,2021,10))
ax[0].set_yticks(range(0,50,5))
#title
ax[0].set_title('서울시 연도별 폭염 일수')
ax[1].set_title('서울시 연도별 열대야 일수')
fig.tight_layout()
plt.show()

4.1 다중막대그래프로 비교
fig, ax = plt.subplots()
In [303]:
fig, ax = plt.subplots()
ax.bar(df_seoul_hotday_count.index, df_seoul_hotday_count['폭염일수'], width=-0.4, align='edge',
color='r', label='폭염일수')
ax.bar(df_seoul_hotnight_count.index, df_seoul_hotnight_count['열대야일수'], width=-0.4, align='edge',
color='k', label='열대야일수')
ax.legend()
ax.set_title('서울시 연도별 폭염일수, 열대야일수', size=20)
ax.set_ylabel('연도')
ax.set_ylabel('일수')
ax.set_xticks(range(1910,2021,10))
ax.set_yticks(range(0,50,5))
plt.show()

3. 결과정리
1) 극한기온 현상의 증가
- 2010년대 들어 폭염과 열대야의 빈도가 급격히 증가
- 역대 최고기온과 최저기온 모두 2018년에 기록
2) 시대별 특징
- 1940-50년대: 폭염 다발
- 1990-2010년대: 열대야 현상 급증
- 2018년: 폭염과 열대야 모두 심각
4. 마무리 의견
서울의 110년 기상데이터 분석 결과, 최근 들어 폭염과 열대야가 더욱 심각해지는 추세를 보입니다. 특히 2018년은 최고기온과 최저기온 모두 기록을 갱신했으며, 이는 기후변화의 영향이 실제로 나타나고 있음을 시사합니다. 향후 도시계획과 에너지 정책 수립 시 이러한 기후변화 추세를 고려한 대책 마련이 필요할 것으로 보입니다.
반응형
'데이터 분석' 카테고리의 다른 글
서울시 기온변화_데이터 분석 및 시각화 (1) | 2024.12.27 |
---|---|
데이터 분석 이미지 자료들 (1) | 2024.12.26 |
인구 변화 데이터 분석 및 시각화 (2) | 2024.12.22 |
아파트 실거래가 분석 및 시각화 (2) | 2024.12.19 |
데이터 분석 메모 (3) | 2024.12.19 |