나른한 코딩 생활

[6일차] ABC 부트캠프 데이터 시각화 본문

ABC 부트캠프

[6일차] ABC 부트캠프 데이터 시각화

GerHerMo 2024. 7. 1. 21:25

 

오늘부터는 새로운 강사님과 함께 Python 라이브러리와 데이터 시각화 등을 배울 것이다

간단한 용어를 시작으로 오늘 배운 내용을 사용하여 히스토그램을 만들고 마무리 해보자


기초 용어

 

  • 데이터 시각화 Data Visualization :
    데이터 분석 결과를 쉽게 이해할 수 있도록 시각적 수단(그래프,차트)을 통해 정보를 효과적으로 전달 하는 방법
    CSV 파일 " Comma Separated Values" : 쉼표로 구분 된 일반 텍스트 형식

 

  •  크롤링 : 웹 페이지를 그대로 가져와서 데이터를 추출해 내는 행위

 

  • Colab : 구글에서 제공하는 클라우드 기반의 Jupyter 노트북 환경

지역의 기온 데이터 분석

import csv		#csv library import

# 1) 파일을 연다.
f = open('/content/daejeon.csv', 'r', encoding='euc-kr')

# 2) 파일을 읽는다.
data = csv.reader(f,delimiter=',')
print(data)

# 3) 파일 내용 출력
for row in data:
  print(row)

# 4) 파일 닫기
f.close()

 

CSV : comma seperated values

먼저 csv 와 관련된 메서드를 사용하기 위해서 import csv 를 해야한다.

line 4 : f =open~ 

을 통해 한글 파일 ( encoding = 'ecu-kr' ) 을 인코딩 하는 과정이 필요하다.

해당 과정은 Notepad++ 편집툴을 이용하였을때 우측 하단에 명시된다.

 

파일을 열었으면 이후 파일을 읽는 과정을 수행한다. 

data = csv.reader(f,delimiter=',')
# csv.reader 함수를 통해 csv 파일을 읽는다
# f 는 아까 불러온 scv 파일, delimiter는 ',' 를 기준으로 데이터 해석

 

파일의 작업이 끝나면 마지막 f.close() 함수를 통해 파일을 닫아주는 과정이 필요하다.

 

헤더는 여기서 쉽게 이야기하자만 , 로 나누어진 데이터 타입의 종류를 의미한다

 

기상청 사이트에서 csv파일을 다운로드 할 경우 1 분단 아래에

데이터가 시작되는 첫줄에 헤더가 나와있다.

날짜, 지역, 평균 기온, 최저 기온, 최고 기온 

등과 같이 서술되어 있는 부분을 헤더라고 한다

 

하지만 해당 코드내용을 실행하게 되면 Error 가 발생하게 될 가능성이 크다

기간을 어느정도로 설정했느냐에 따라 다르겠지만 데이터가 비어있는

 ' 결측치 (Missing Value) ' 가 존재할 수 있기 때문이다.

따라서 데이터가 비어있는 결측치를 따로 처리해 줘야 데이터 분석에 문제가 없다. 

해당 과정을 결측치 데이터 처리 라고 한다.

# 날짜와 평균온도를 출력하는 코드
import csv

# 1) csv 파일 설정
f = open('/content/seoul.csv', 'r', encoding='euc-kr')
data = csv.reader(f,delimiter=',')
header = next(data) # next() 한 줄 읽고, 커서 한칸 이동

# 2) 날짜, 평균 기온 출력
for row in data:
  # 2-1) 결측치 데이터 처리 -> 지우거나, 채우거나(명확한 결과를 위해서 극단적인 값으로 초기화)
  if row[2] == '':
    row[2] = -999
  # 날짜와 평균 기온 출력
  print(row[0], float(row[2]))

# 3) 파일 닫기
f.close()

 

다음과 같은 코드를 실행하면 사용한 csv 파일의 날짜와 평균 기온을 차례로 출력하게 된다.

import csv

# 0) 최고 기온이 가장 높았던 날짜와 온도를 저장할 변수 선언
max_date = '' # 최고 기온이 가장 높았던 날짜
max_temp = -999 # 최고 기온이 가장 높았던 온도 -> 극적인 값으로 초기화


# 1) csv 파일 설정 
f = open('/content/Daejeon.csv', 'r', encoding='euc-kr')
data = csv.reader(f,delimiter=',')
header = next(data) # next() 한 줄 읽고, 커서 한칸 이동



# 2) 날짜, 최고 기온 찾기
for row in data:
  # 2-1) 결측치 데이터 처리 -> 지우거나, 채우거나(명확한 결과를 위해서 극단적인 값으로 초기화)
  if row[-1] == '':
    row[-1] = -999

  # 2-2) 최고 기온 형변환
  row [-1] = float(row[-1])

  # 2-3) 저장된 최고 기온과 현재 최고 기온을 비교해서 더 높은 최고 기온과 날짜를 저장
  if max_temp < row[-1]:
    max_date = row[0]
    max_temp = row[-1]


# 3) 파일 닫기
f.close()

# 4) 결과 출력
print("기상 관측 이래, 대전의 최고 기온이 가장 높았던 날은,", max_date, '온도는', max_temp, '였습니다.')
# 기상 관측 이래, 대전의 최고 기온이 가장 높았던 날은, 2018-08-15 온도는 39.4 였습니다.

 


 

matplotlib 을 통한 그래프 그리기 

 

matplotlib?

- 파이썬으로 데이터를 시각화할때 가장 많이 사용하는 라이브러리

import matplotlib.pyplot  # 똑같이 import 문을 사용해야 함
import matplotlib.pyplot as plt
# plt 라는 별칭으로 사용함

 

matplotlib을 사용해 기본적인 그래프 몇가지를 그려보자

import matplotlib.pyplot as plt

plt.title('plotting') # 타이틀 속성 추가

# 1 개 이상의 차트를 같이 그릴 경우 label 속성 추가
plt.plot([1,2,3,4],[10,20,30,40],color='skyblue', marker= '^',linestyle = '--',label='asc')
plt.plot([1,2,3,4],[40,30,20,10],'m', marker='.',label='desc')
plt.plot([1,2,3,4],[25,25,25,25], 'g.', label = 'simple_dot') # 'red' , '^' , '--'=> '' lisnestyle 지우기

# 범례 속성 추가
plt.legend()  # label 값이 없으면 작동 X 
plt.show()

위 코드를 실행시 나오는 출력

 

color  = '색깔' 을 통해 지정된 색깔을 사용 가능하며 축약해서 사용도 가능하다

ex) 'r' 은 color = 'red' 와 같다

 

marker 는 지점 혹은 데이터 값을 표기할 모양을 지정하는 것이며 '^', '.' 등 을 사용한 모습이다.

 

linestyle 은 선을 실선, 점선 등으로  변경할 수 있으며,

'--' 를 통해 점선, ' ' (공백) 을 통해 선을 없애는 것도 가능하다.

plt.plot([1,2,3,4],[25,25,25,25], 'g^--', label = 'simple_dot')

다음 줄과 같이 'g^--' 를 통해 특정 그래프에서 축약해서 사용할 수 있으며

의미는 coloer = 'green' , marker = '^', linestyle = '--' 와 같다

 


plot.title 값에 한국어를 사용하고 싶지만, colab 에서는 기본적으로

한국어를 지원하지 않기 때문에 이러한 오류를 먼저 해결하자

 

pip install koreanize-matplotlib

 

해당 라이브러리를 설치해 matplotlib의 한국어 버전을 다운로드 한다

import koreanize_matplotlib # import를 통해 한국어를 사용가능

 


히스토그램

히스토그램 : 도수분포표를 시각화한 그래프 

import koreanize_matplotlib
import csv
import matplotlib.pyplot as plt

f = open('/content/seoul.csv', 'r', encoding='euc-kr')
data = csv.reader(f,delimiter=',')
header = next(data)

result = [] # 결과값을 저장할 빈 list 생성

# 결측치를 제외한 데이터만 시각화
for row in data:
  if row[-1] != '':
    result.append(float(row[-1]))

plt.title('서울 최고 기온 시각화')
plt.plot(result,'r')
plt.show()

f.close()

191001~20190101 까지의 서울 최고 기온 플롯

 

해당 그래프로는 데이터가 난잡하고 알아보기 힘들다

다음과 같은 그래프를 분포도에 따라 (여러 조건을 붙혀) 나타내는 것을

히스토그램 이라고 한다.

 

# ...

plt.title('서울 최고 기온 시각화')
plt.hist(result,bins=100,color='r') 
# plot-> hist 형태로 변경
plt.show()

f.close()

 

위 코드에서 다음과 같은 형태로 히스토그램 그래프를 그리기 위해 메서드를 쓰게되면

 

result 값에 대한 hist 작성 : result (사용자가 설정한 변수)

데이터 값의 촘촘한 정도( x값 ) : bins 

히스토그램 그래프의 색상 : color 

 

와 같은 이름들로 설정할 수 있다. 

그럼 다음과 같은 히스토그램을 출력함을 알 수 있다.

191001~20190101 까지의 서울 최고 기온 히스토그램

 

오늘 배운 내용들을 토대로 다음을 만족하는 히스토그램을 출력하는

히스토그램을 출력해보자

 

먼저 조건은 다음과 같다

  1. 사용자에게 조사할 달(1~12)을 입력받는다
  2. 입력받은 달의 평균, 최고, 최저 기온 분포를 한번에 그리기
  3. 최저 = 파랑 , 평균 = 초록 , 최고 = 빨강 의 색깔로 히스토그램 만들기

먼저 히스토그램을 만드는 과정을 그대로 따라간다

import koreanize_matplotlib
import csv
import matplotlib.pyplot as plt

f = open('/content/seoul.csv', 'r', encoding='euc-kr')
data = csv.reader(f,delimiter=',')
header = next(data)

 

처음 3개의 라이브러리를 import 해준 뒤 csv 파일을 연다

input_mon = int(input('원하는 달을 입력하세요'))
print(input_mon, ": 원하는 달")

max = [] # '최고 기온' 데이터를 저장하는 빈 리스트
avg = [] # '평균 기온' 데이터를 저장하는 빈 리스트
min = [] # '최저 기온' 데이터를 저장하는 빈 리스트

 

다음으로는 input 함수로 받은 숫자문자열을 (ex, '12') int() 를 사용해 int형으로 변환

이후에 list 형 변수 max, avg, min 을 비어있는 형태로 선언해준다

# max, min, avg 에 해당하는 값을 삽입
for row in data:
  if row[-1] != '':
    # 선택된 데이터만 답기
    if int(row[0].split('-')[1]) == input_mon:
      max.append(float(row[-1]))
      min.append(float(row[-2]))
      avg.append(float(row[-3]))

 

헤더 이후의 데이터(리스트)를 한줄씩 불러오며

결측치가 없고, 입력한 달과 일치하는 리스트의 데이터를 위에서 선언한 리스트 변수에 append 한다.

plt.title('서울의 '+ str(input_mon)+'월 최고, 최저, 평균 기온 시각화')
plt.hist(max,bins=100,color='r',label=str(input_mon)+'월 최고 기온')

 

for 문이 끝난 이후에는 title의 이름을 설정한 후

max, min, avg 를 각각의 히스토그램으로( plt.hist ) 만든다.

이후 후처리를 하고 난 뒤 출력하면 히스토그램이 성공적으로 출력된다.

 

완성된 코드는 아래와 같은 형태를 가진다.

import koreanize_matplotlib
import csv
import matplotlib.pyplot as plt

f = open('/content/seoul.csv', 'r', encoding='euc-kr')
data = csv.reader(f,delimiter=',')
header = next(data)

input_mon = int(input('원하는 달을 입력하세요'))
print(input_mon, ": 원하는 달")

max = []
avg = []
min = []

# max, min, avg 에 해당하는 값을 삽입
for row in data:
  if row[-1] != '':
    # 선택된 데이터만 답기
    if int(row[0].split('-')[1]) == input_mon:
      max.append(float(row[-1]))
      min.append(float(row[-2]))
      avg.append(float(row[-3]))

plt.title('서울의 '+ str(input_mon)+'월 최고, 최저, 평균 기온 시각화')
plt.hist(max,bins=100,color='r',label=str(input_mon)+'월 최고 기온')
plt.hist(avg,bins=100,color='g',label=str(input_mon)+'월 평균 기온')
plt.hist(min,bins=100,color='b',label=str(input_mon)+'월 최저 기온')

plt.legend()
plt.show()

f.close()

최고 -> 평균 -> 최저 순으로 히스토그램이 그려짐


이렇게 간단한 종류의 그래프를 그려보았다.

내일은 pandas 라이브러리를 사용하여 조금 더 다양한 종류의 그래프를 그려보는 시간을 가져보겠다.

 

아래는 오늘 먹은 점심 떡볶이이다

돈이 없는 요즘 분식은 생명줄이다...

김말이 맛감자 ^o^b

김말이&맛감자(왼쪽) / 떡볶이(오른쪽)