오도원입니다.

건강과 행복을 위하여

PNU DSC/파이썬 데이터 분석

02-2. 데이터 시각화 기초 2

오도원공육사 2020. 5. 5. 17:25
반응형

내 생일의 기온 변화를 그래프로 그리기

1. 데이터에 질문하기

태어난 날부터 지금까지 매년 생일의 최고 기온을 그래프로 그린다면 어떤 모양일까?

 

1) 데이터 읽어오기

먼저 부산의 기온 데이터를 읽어와서 한 줄씩 출력해보겠다.

import csv
f = open('pusan.csv')
data = csv.reader(f)

for row in data:
	print(row)

 

이번에는 헤더부분을 next()로 제외한 후, 최고기온 데이터만 출력해보겠다.

f = open('pusan.csv')
data = csv.reader(f)
header = next(data)

for row in data:
	print(row[-1])

 

2) 데이터 리스트에 저장하기

최고 기온 데이터를 날짜 순으로 저장할 result 리스틀 생성한다.

f = open('pusan.csv')
data = csv.reader(f)
header = next(data)
result = [] # 최고 기온 데이터를 저장할 result 리스트

for row in data:
	if row[-1] != '': # 최고기온 값이 존재한다면
    	result.append(float(row[-1])) # 최고기온을 result에 저장

print(result)

 

len() 함수로 몇 개인지도 알 수 있다.

print(len(result))

 

2. 데이터 시각화하기

f = open('pusan.csv')
data = csv.reader(f)
header = next(data)
result = []

for row in data:
    if row[-1] != '':
        result.append(float(row[-1]))
        
plt.plot(result, 'r') # 최고기온이 저장된 result리스트를 plot()에 입력
plt.show() # 그래프로 출력
f.close()

4만개가 넘는 데이터를 모두 꺾은선으로 표현했더니 그래프가 무엇을 의미하는지 파악하기 어렵다. 특정한 날의 데이터만 뽑아서 그래프로 그려보겠다.

 

3. 날짜 데이터 추출하기

파이썬 문자열 함수 중 split()은 사용자가 설정하는 특정 문자를 기준으로 문자열을 분리한다.

s = 'hello python'
print(s.split()) 

split()에 사용자가 특정 문자를 입력하지 않으면 default로 공백문자를 기준으로 문자열을 분리한다. 

 

'1997-06-22' 문자열을 '-'을 기준으로 분리해보자.

date = '1997-06-22'
print(date.split('-'))
print(date.split('-')[0])
print(date.split('-')[1])
print(date.split('-')[2])

분리된 문자열은 리스트로 반환되기 때문에 인덱싱 기능을 쓸 수 있고, 날짜의 연, 월, 일을 추출할 수 있다.

 

그렇다면, split()함수를 이용하여 8월의 최고 기온 데이터만 추출하여 그래프로 그려보자.

for row in data:
	if row[-1] != '': # 최고기온 값이 존재한다면
    	if row[0].split('-')[1] == '08':  #8월에 해당하는 값이라면
        	result.append(float(row[-1])) # result 리스트에 최고기온 추가
plt.plot(result, 'hotpink') # result리스트에 저장된 값을 hotpink 색으로 그리기
plt.show() # 그래프 출력

 

이번에는 매년 돌아오는 생일을 기준으로 그려보겠다. 다음 코드는 매년 6월 22일의 최고기온 데이터를 추출하여 그린것이다.

for row in data:
    if row[-1] != '': 
        if row[0].split('-')[1] == '06' and row[0].split('-')[2] == '22': 
            result.append(float(row[-1]))

 

이번에는 1997년 이후 데이터만 추출하여 6월 22일 때의 최고기온과 최저기온을 함께 나타내보겠다.

f = open('pusan.csv')
data = csv.reader(f)
header = next(data)
high = [] # 최고 기온 값을 저장할 high 리스트
low = [] # 최저 기온 값을 저장할 low 리스트

for row in data:
	if row[-1] != '' and row[-2] != '': # 최고 기온과 최저 기온이 존재할 경우
    	if int(row[0].split('-')[0]) >= '1997': # 1997년 이후 데이터만
        	if row[0].split('-')[1] == '06' and row[0].split('-')[2] == '22': # 6월 22일 데이터일 경우
            	high.append(float(row[-1])) # 최고 기온은 high 리스트에 저장
                low.append(float(row[-2])) # 최저 기온은 low 리스트에 저장
                
plt.plot(high, 'hotpink') # high 리스트를 hotpink 색으로 그리기
plt.plot(low, 'skyblue') # low 리스트를 skyblue 색으로 그리기
plt.show() # 그래프 출력

 

폰트 지정하기

plt.rc('font', family='Malgun Gothic')
plt.title('내 생일의 기온 변화 그래프')

 

마이너스(-) 기호 깨짐 방지

plt.rcParams['axes.unicode_minus'] = False

 

내 생일의 기온 변화를 그래프로 그리기

import csv
import matplotlib.pyplot as plt

f = open('pusan.csv')
data = csv.reader(f)
header = next(data)
high = [] # 최고기온 값을 저장할 리스트
low = [] # 최저기온 값을 저장할 리스트
 
for row in data: 
    if row[-1] != '' and row[-2] != '': # 최고 기온 값과 최저 기온 값이 존재한다면
        date = row[0].split('-') # 날짜를 '-'를 기준으로 구분하여 저장
        if 1997 <= int(date[0]): # 1997년 이후 데이터라면
            if date[1] == '06' and date[2] == '22': # 6월 22일 데이터라면
                high.append(float(row[-1])) # 최고기온을 high에 저장
                low.append(float(row[-2])) # 최저기온을 low에 저장

plt.rc('font', family='Malgun Gothic') # 맑은 고딕을 기본 글꼴로 설정
plt.rcParams['axes.unicode_minus'] = False # 마이너스 기호 깨짐 방지
plt.title('내 생일의 기온 변화 그래프') # 제목 설정
plt.plot(high, 'hotpink', label='high') # high 리스트에 저장된 값을 hotpink색으로 그리고 레이블 표시
plt.plot(low, 'skyblue', label='low') # low 리스트에 저장된 값을 skyblue색으로 그리고 레이블 표시
plt.legend() # 범례 표시
plt.show() # 그래프 나타내기
f.close()

반응형