[데이터분석]2. 데이터 시각화

<1> matplotlib

  • 파이썬에서 2D 형태의 그래프, 이미지 등을 그릴 때 사용하는 것으로, 실제 과학 컴퓨팅 연구 분야나 인공지능 연구 분야에서도 많이 활용
import matplotlib.pyplot as plt
  • pyplot 모듈 사용

1) 기본 그래프 그리기

  1. import matplotlib.pyplot as plt 라이브러리 불러오기
  2. plt.plot([x축 데이터], [y축 데이터]): plot() 함수에 데이터 입력하기
  3. plt.show() : 그래프 보여주기
import matplotlib.pyplot as plt
plt.plot([10,20,30,40])
plt.show()

  • 플롯 함수에 한 개의 리스트 입력했을 때 시행 결과
  • 입력된 리스트 : y축의 값으로 입력됨
  • x축 : 자동으로 0부터 1씩 증가
import matplotlib.pyplot as plt
plt.plot([1,2,3,4], [12, 43, 25, 15])
plt.show()

  • 첫번째 리스트 : x축
  • 두번째 리스트 : y축

2) 그래프 옵션 추가하기

1. 제목 넣기

plt.title('제목에 넣을 문자열')

import matplotlib.pyplot as plt
plt.title('plotting')
plt.plot([10,20,30,40])
plt.show()

2. 범례 넣기

plt.plot([],label='') : 속성의 레이블값으로 문자열
plt.legend() : 레이블 값이 범례로 나옴

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()

plt.legend(loc=5) : 범례의 위치 직접 지정

  • 1 : 오른쪽 상단, 2 : 왼쪽 상단, 3 : 왼쪽 하단, 4 : 오른쪽 하단, 5 : 오른쪽, 6 : 왼쪽 중간, 7 : 오른쪽 중간, 8 : 중앙 하단, 9 : 중앙 상단, 10 : 정중앙, 0 : 그래프에 따라 자동적으로 설정

3. 그래프 색상 바꾸기

plt.plot([],color='') : 생략 시 자동으로 색상 설정

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

  • 기본색은 약자로 표기 가능 : r(red), g(green), b(blue), k(black), y(yellow)

4. 그래프 선 모양 바꾸기

plt.plot([],linestyle='') : 원하는 선 모양 지정 가능

import matplotlib.pyplot as plt
plt.title('linestyle')
plt.plot([10,20,30,40], label='dashed', color='r', linestyle='-')
plt.plot([40,30,20,10], label='dotted', color='g',linestyle=':')
plt.legend()
plt.show()

  • plt.plot([1,2,3,4], 'r-') : 색상과 선모양을 동시에 적어도 됨

5. 마커 모양 바꾸기

  • 마커 : 선 형태가 아닌 점 형태로 그래프 그릴 수 있음
import matplotlib.pyplot as plt
plt.title('linestyle')
plt.plot([10,20,30,40],'r.', label='circle')
plt.plot([40,30,20,10], 'g^', label='triangle')
plt.legend()
plt.show()

  • plt.plot([1,2,3,4], 'r.-') : 색상, 마커모양, 선모양을 동시에 생성 가능

<2> 내 생일 날 기온 변화 그래프로 그려보기

1) 데이터 질문하기

1. 데이터 읽어오기

import csv
f = open('seoul.csv')
data = csv.reader(f)
next(data)
for row in data:
    print(row[-1])
  • header을 제외하고 최고 기온만 프린트

2. 데이터 리스트에 저장

import csv
f = open('seoul.csv')
data = csv.reader(f)
next(data)
result = []
for row in data:
    if row[-1] != '': # 최고 기온이 있는 날만 결과 리스트에 넣음.
        result.append(float(row[-1]))
print(result)

2) 데이터 시각화

import csv
import matplotlib.pyplot as plt

f = open('seoul.csv')
data = csv.reader(f)
next(data)
result = []
for row in data:
    if row[-1] != '':
        result.append(float(row[-1]))
plt.plot(result,'r') # 결과를 빨간색그래프로 표현
plt.show()

  • 그래프 크기 조절하기 : figure()의 figsize=(가로, 세로) 이용
    plt.figure(figsize = (10, 2)) #가로 10인치, 세로 2인치

3) 날짜 데이터 추출

s = 'hello python'
print(s.split()) #['hello', 'python'] 출력
  • split() : 공백 기준 문자열 분리
date= '1990-01-01'
print(date.split('-')) #['1990', '01', '01'] 출력
  • 사용자가 직접 분리할 문자열 지정 가능
print(date.split('-')[0]) #1990
print(date.split('-')[1]) #01
print(date.split('-')[2]) #01
import csv
import matplotlib.pyplot as plt

f = open('seoul.csv')
data = csv.reader(f)
next(data)
result = []
for row in data:
    if row[-1] != '':
        if row[0].split('-')[1] == '08': #최고기온이 8월인 경우만
            result.append(float(row[-1]))
plt.plot(result,'hotpink')
plt.show()

import csv
import matplotlib.pyplot as plt

f = open('seoul.csv')
data = csv.reader(f)
next(data)
result = []
for row in data:
    if row[-1] != '':
        if row[0].split('-')[1] == '08' and row[0].split('-')[2] == '14': # 매년 8월 14일의 최고 기온만 출력
            result.append(float(row[-1]))
plt.plot(result,'y')
plt.show()

import csv
import matplotlib.pyplot as plt

f = open('seoul.csv')
data = csv.reader(f)
next(data)
high = []
low = []

for row in data:
    if row[-1] != '' and row[-2] != '':
        if 1983 <= int(row[0].split('-')[0]):
            if row[0].split('-')[1] == '08' and row[0].split('-')[2] == '14':
                high.append(float(row[-1]))
                low.append(float(row[-2]))
plt.plot(high,'r')
plt.plot(low,'g')
plt.show()
  • 1983년 이후 매해 8월 14일의 최고, 최저 기온 출력
import csv
import matplotlib.pyplot as plt

f = open('seoul.csv')
data = csv.reader(f)
next(data)
high = []
low = []

for row in data:
    if row[-1] != '' and row[-2] != '':
        if 1983 <= int(row[0].split('-')[0]):
            if row[0].split('-')[1] == '02' and row[0].split('-')[2] == '14':
                high.append(float(row[-1]))
                low.append(float(row[-2]))
plt.plot(high,'r')
plt.plot(low,'g')
plt.rc('font', family = 'AppleGothic') # 폰트 설정
plt.rcParams['axes.unicode_minus'] = False # 한글의 마이너스가 안깨지도록 설정
plt.title('생일 그래프')
plt.show()

  • 제목 넣기

<3> 기온 데이터 시각화

1. 히스토그램

  • hist() 함수 : 자료 분포상태를 직사각형 모양의 막대로 나타냄. 데이터의 빈도에 따라 높이가 결정됨
import matplotlib.pyplot as plt
plt.hist([1,1,2,3,4,5,6,6,7,8,10])
plt.show()

  • 1, 6에 해당하는 막대의 높이는 2, 9를 제외한 나머지 막대 높이는 1

ex) 주사위 시뮬레이션

  1. 주사위를 굴린다
  2. 나온 결과를 기록한다
  3. 이 과정을 N번 반복
  4. 주사위의 눈이 나온 횟수를 히스토그램으로 나타냄
  • randint(a,b) : a 이상 b 이하 정수 중 하나 숫자를 무작위로 선택
import random
dice = []
for i in range(10):
    dice.append(random.randint(1,6))
print(dice)

import random
import matplotlib.pyplot as plt
dice = []
for i in range(10):
    dice.append(random.randint(1,6))

plt.hist(dice)
plt.show()

  • 랜덤한 숫자 히스토그램으로 표현 : dice 리스트에 저장된 값의 빈도에 따라 막대의 높이가 다름

기온데이터 히스토그램으로 표현

import csv
import matplotlib.pyplot as plt

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

for row in data:
    if row[-1] != '':
        result.append(float(row[-1]))

plt.hist(result, bins=100, color='r')
plt.show()

  • 구간을 100개로 나눠 히스토그램으로 표현
import csv
import matplotlib.pyplot as plt

f = open('seoul.csv')
data = csv.reader(f)
next(data)
aug = []

for row in data:
    if row[-1] != '' and row[0].split('-')[1] == '08':
        aug.append(float(row[-1]))

plt.hist(aug, bins=100, color='r')
plt.show()

  • 8월의 데이터만 히스토그램으로 표현
import csv
import matplotlib.pyplot as plt

f = open('seoul.csv')
data = csv.reader(f)
next(data)
aug = []
jan = []

for row in data:
    m = row[0].split('-')[1]
    if row[-1] != '' :
        if m == '08':
            aug.append(float(row[-1]))
        if m == '01':
            jan.append(float(row[-1]))

plt.hist(aug, bins=100, color='r')
plt.hist(jan, bins=100, color='b')
plt.show()

  • 1월, 8월 최고 기온값을 히스토그램으로 나타냄

2. 상자그림으로 나타내기

  • boxplot() : 자료에서 얻어낸 최댓값, 최솟값, 상위 ¼, 2/4(중앙), 3/4에 위치한 값을 보여주는 그래프
import random
import matplotlib.pyplot as plt
import numpy as np
r = []
for i in range(100):
    r.append(random.randint(1,1000))

plt.boxplot(r)
plt.show()

result = np.array(r)
print("¼: "+str(np.percentile(result,25)))
print("2/4: "+str(np.percentile(result,50)))
print("¾: "+str(np.percentile(result,75)))

기온데이터 박스플롯으로 표현

import csv
import matplotlib.pyplot as plt

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

for row in data:
    if row[-1] != '':
        result.append(float(row[-1]))

plt.boxplot(result)
plt.show()

import csv
import matplotlib.pyplot as plt

f = open('seoul.csv')
data = csv.reader(f)
next(data)
aug = []
jan = []

for row in data:
    m = row[0].split('-')[1]
    if row[-1] != '' :
        if m == '08':
            aug.append(float(row[-1]))
        if m == '01':
            jan.append(float(row[-1]))

plt.boxplot(aug)
plt.boxplot(jan)
plt.show()

  • 동그라미 : 이상치(ideal) - 다른 수치에 비해 너무 크거나 작은값
plt.boxplot([jan, aug])

  • 최고 기온 데이터를 월별로 구분하기
  1. 데이터를 월별로 분류해 저장
  2. 월별 데이터를 상자 그림으로 그림
import csv
import matplotlib.pyplot as plt

f = open('seoul.csv')
data = csv.reader(f)
next(data)
month = [[],[],[],[],[],[],[],[],[],[],[],[]]

for row in data:
    if row[-1] != '':
        month[int(row[0].split('-')[1])-1].append(float(row[-1])) #month 인덱스는 0부터 시작하므로 -1해줌

plt.boxplot(month)
plt.show()

  • 빈 리스트 12개 만듦
  • 월별 데이터를 정수로 변환한 0~11까지의 인덱스 값에 월별 데이터 저장

8월 일별 기온 데이터 상자 그림으로 표현

import csv
import matplotlib.pyplot as plt

f = open('seoul.csv')
data = csv.reader(f)
next(data)
day = []
for i in range(31):
    day.append([])

for row in data:
    if row[-1] != '':
        if row[0].split('-')[1] == '08':
            day[int(row[0].split('-')[2])-1].append(float(row[-1]))
plt.style.use('ggplot')
plt.figure(figsize=(10,5), dpi=300)
plt.boxplot(day, showfliers=False)
plt.show()

  • plt.style.use('ggplot') : 그래프 스타일 지정 > 그래프 배경이 회색 격자무늬로 변경됨. 2/4값을 표현하는 선의 색상도 변경되었음
  • showfliers=False : 이상치 값 표현 안되게 함.

좋은 웹페이지 즐겨찾기