본문 바로가기

programming/내가 만들고 싶어서 만든 것!

Python을 활용한 서울 평균온도 분석하기

반응형

1. 개요

 

 Python으로 데이터를 다루는 것은 작년 말(2019.12월)에 얇은 책 한권으로 학습한 기억이 있다. 당시 책에 있는 내용은 csv형태의 데이터를 Python으로 가공하는 형태의 내용이었는데, 개인적으로 흥미롭게 공부했다. 내가 배우는 언어로 무엇을 할 수 있을지를 경험하기 위해 공부한 분야이기 때문에 그렇게 깊은 학습을 하지는 못하였지만 궁금한 점을 해결할 수준, 미래에 데이터 분석이라는 분야를 만났을 때 구글링을 통해 기억해내고 학습을 이어갈 수 있는 수준을 유지하기 위해 노력했다.

 

 어쩌다 발견한 지구온도상승에 대한 뉴스를 보고 그 뉴스의 댓글창에 열심히 토론을 하고있는 댓글들을 보며 직접 평균 온도를 계산하여 그래프로 확인하면 좋을 것 같다는 생각에 그래프를 그려보았다. 나는 통계를 전문적으로 배운적도 없고 수학을 잘하는 사람이 아니기 때문에, 이 그래프가 신뢰성이 있다고는 생각하지 않지만, 최대한 논리에 오류가 없도록 노력하였다.

 

2. 코드 설계

 

 데이터는 기상청에서 제공하는 데이터를 사용하였다. 정확한 통계를 위해 365일동한 기후의 온도가 기록되어있는 년도만을 사용하였다. 따라서 1908년 부터 2019년도 까지의 평균 온도를 계산하여 그래프로 그려보았다.

 

 코드의 설계는 간단했다. 기상청에서는 하루의 평균온도에 관한 데이터를 제공하였기 때문에, 나는 그 평균 데이터를 더하여 365 혹은 윤년을 생각한 366으로 나누어주면 됐다. 다만, 윤년을 판별하는 코드를 작성하기 보다는 여러가지 상황에 의해 하루의 갯수를 세는 변수를 따로 만들어 그 변수의 값으로 전체 평균온도의 합을 나누어 주었다. 다음은 이런 방식으로 설계한 코드이다.

 

 

import csv
import matplotlib.pyplot as plt
f = open('Seoul_Weather.csv','r',encoding = 'cp949')
data = csv.reader(f)
header = next(data)

result = []

sumValue = 0
countDay = 0

for row in data:
    buff = row[0].split('-')
    if(row[2] != ''):
        countDay += 1
        sumValue += float(row[2])
        
    if buff[1] == '12' and buff[2] == '31' and countDay != 0:
        result.append(sumValue / countDay)
        countDay = 0
        sumValue = 0

plt.plot(result,'r')
plt.show()

 

 위와 같은 코드를 실행하면, 다음과 같은 그래프가 나온다.



 10도에서 12도 사이의 평균 온도가 출력되가 갑자기 비정상적인 온도가 있는 것을 볼 수 있다. 결과가 0은 년도를 찾아 출력을 해보았더니, 1952년도였다. 조사를 해보니 1952년은 한국전쟁이 진행중인 연도여서 정상적으로 데이터를 수집하지 못했다고 한다.

 

 혹시몰라 조금 더 조사를 해보니 1950년도 6월 25일 즉 전쟁이 시작되는 날짜부터 휴전 선언날인 1953년 7월 27일 전까지는 데이터가 듬성듬성 기록되어 있으며, 전쟁이 극에 다다른 1952년에는 365일 내내 데이터 자체가 수집되지 못했다는 것을 알 수 있었다. 슬프게도 1950년도 부터 1953년 까지의 데이터는 분석에 포함할 수 없었다. 따라서 다음과 같은 코드로 변경하여 결함이 없는 데이터만을 분석해 그래프로 출력하였다.

 

import csv
import matplotlib.pyplot as plt
f = open('Seoul_Weather.csv','r',encoding = 'cp949')
data = csv.reader(f)
header = next(data)

result = []

sumValue = 0
countDay = 0

for row in data:
    buff = row[0].split('-')
    if(row[2] != ''):
        countDay += 1
        sumValue += float(row[2])
        
    if buff[1] == '12' and buff[2] == '31':
        if buff[0] != '1953' and buff[0] != '1952' and buff[0] != '1951'and buff[0] != '1950':
            result.append(sumValue / countDay)
        countDay = 0
        sumValue = 0

plt.plot(result,'r')
plt.show()

 

 다음과 같은 코드를 실행하면 아래의 그래프가 나온다.



 약간의 흔들림이 있지만, 전적으로 봤을 떄, 기온이 상승하는 그래프를 볼 수 있다.

 

3. 결어

 

 사실 그래프를 시각적으로 보기 좋게 그린 것은 아니다. x축의 이름 또한 년도가 아닌 리스트의 인덱스 번호이다. 다음은 여름의 길이에 대한 그래프를 그릴 것이다. 꼭 이 블로그에 게시했으면 좋겠다!

반응형