본문 바로가기

코딩

기온데이터를 이용한 파이썬

최근에 기상청의 기온 데이터를 이용한 파이썬 그래프들을 그려보았다. 다양한 그래프들을 그려보면서 많은 파이썬 함수들을 배울 수 있었다. (코드 내용은 전부 <모두의 데이터 분석 with 파이썬 - 송석리, 이현아> 이 책을 실습하면서 가져온 것이다.)

 

참고로 이번에 이용한 기온 데이터는 이렇다:

 

['날짜', '지점', '평균기온', '최저기온', '최고기온'] ['2005-05-01', '108', '21', '17.2', '25.6'] ['2005-05-02', '108', '19.5', '15', '24.7'] ['2005-05-03', '108', '19.2', '11.8', '26.5'] ['2005-05-04', '108', '20.1', '12.6', '27.7'] ['2005-05-05', '108', '19.8', '13.1', '26.7'] ['2005-05-06', '108', '11.6', '8.8', '13.3'] ['2005-05-07', '108', '13.5', '6.3', '19.7'] ['2005-05-08', '108', '13.4', '11.1', '15.6'] ['2005-05-09', '108', '13.3', '9', '17.6'] ['2005-05-10', '108', '14.2', '9', '19.3'].....

 

이런 식으로 2020년 12월까지 서울의 모든 기온 데이터를 불러왔다.

 

먼저 파이썬에서 그래프를 그리기 위해서는 matplotlib라는 모듈을 불러와야 한다. matplotlib는 파이썬에서 데이터를 시각화하는데 쓰이는 것들이 많이 저장되어있는 모듈이다.

import matplotlib.pyplot as plt

matplotlib.pyplot 모듈을 plt로 줄여서 쓸 것이다. matplotlib.pyplot은 매번 입력하기에는 많이 길기 때문이다.

그래프1: 꺾은선 그래프

plot()함수를 사용한다. 괄호 안에 리스트 값을 넣으면 그 값을 꺾은선 그래프로 출력해준다.

 

이는 기본적인 파이썬 꺾은선 그래프다:

import matplotlib.pyplot as plt
plt.title('legend')
plt.plot([10,20,30,40], label = 'asc')
plt.plot([40,30,20,10], label = 'desc')
plt.legend()
plt.show()

title()함수는 그래프의 제목을 입력해준다. legend()함수는 범례를 표시해준다. label은 각 그래프에게 이름을 붙여 구분할 수 있게 해준다.

 

직접 가져온 데이터를 시각화한 꺾은선 그래프는 이렇다: (기온 데이터를 사용하려 했지만 한국과 일본의 최근 코로나 감염자 수 데이터를 사용했다.)

 

import matplotlib.pyplot as plt
plt.title('covid19 positivity')
plt.plot(['12.8', '12.9', '12.10', '12.11', '12.12'], [671, 680, 689, 950, 1030], color = 'b', label = 'korea')
plt.plot(['12.8', '12.9', '12.10', '12.11', '12.12'], [2158, 2837, 2977, 2904, 2962], color = 'r', ls = '--', label = 'japan')
plt.legend()
plt.show()

그래프2: 히스토그램

hist()함수를 사용한다. hist()는 괄호 안의 리스트 값을 파이썬에서 히스토그램 형식으로 시각화한다.

 

이는 기본적인 파이썬 히스토그램이다:

import matplotlib.pyplot as plt
plt.hist([1,1,2,3,4,5,6,6,7,8,10])
plt.show()

범례를 표시하고 싶다면 꺾은선 그래프와 마찬가지로 legend()를 쓰면 된다.

 

이는 기온 데이터를 히스토그램으로 시각화한 것이다.

import csv
import matplotlib.pyplot as plt

f = open('seoul2.csv')
data = csv.reader(f)
for i in range(8):
    next(data)
aug = []
jan = []

for row in data:
    month = row[0].split('-')[1]
    if row[-1] != '':
        if month == '08':
            aug.append(float(row[-1]))
        if month == '01':
            jan.append(float(row[-1]))
                                  
plt.hist(aug, bins = 100, color = 'r', label = 'Aug')
plt.hist(jan, bins = 100, color = 'b', label = 'Jan')
plt.legend()
plt.show()

label과 color를 사용해 두 히스토그램을 제대로 구분한 것을 확인할 수 있다.

 

그래프3: 상자 그림

boxplot()함수를 사용한다. 괄호 안의 리스트를 상자 그림으로 표현한다.

 

상자 그림을 잘 모를 수가 있는데 이 코드와 그림으로 설명하겠다:

import matplotlib.pyplot as plt
import random
result = []
for i in range(13):
    result.append(random.randint(1, 1000))
print(sorted(result))

plt.boxplot(result)
plt.show()

그림에 5개의 가로선이 있다는 것을 알 수 있다. 이는 중앙값과 관련이 있다. 중앙값을 구하는 형식으로 가장 작은 값, 1/4위치에 있는 값, 2/4위치에 있는 값, 3/4위치에 있는 값, 가장 큰 값을 각각 가로선에 표시되어있다.

 

이는 기온 데이터를 상자 그림으로 시각화한 것이다:

import csv
import matplotlib.pyplot as plt

f = open('seoul2.csv')
data = csv.reader(f)
for i in range(8):
    next(data)

d = []
for i in range(31):
    d.append([])
    
for row in data:
    if row[-1] != '':
        if row[0].split('-')[1] == '08':
            d[int(row[0].split('-')[2])-1].append(float(row[-1]))

plt.style.use('ggplot')
plt.figure(figsize = (10, 5), dpi = 300)
plt.boxplot(d, showfliers = False)
plt.show()

style.use를 이용해 그래프의 모양을 바꿨고, figsize, dpi를 이용해 규격 등을 정돈했다. showfliers는 그래프의 표시 범위에서 벗어난 값들을 표시하는 점인데, 이를 False화시켜서 없앴다.

 

지금까지 파이썬을 이용해 다양한 그래프들을 그려보았다. 많은 함수들을 새롭게 배울 수 있었기에 유익한 시간이었던 것 같다.