| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- subnet
- Python
- postgres
- ec2
- 파이썬
- 아나콘다
- pycharm
- RDS
- GPT
- 파이팅
- 장고
- 챗봇
- django db with ssh tunnel
- 따라하며 배우는 파이썬과 데이터 과학
- psycopg
- vpc
- AWS
- SSH Tunnel
- settings.py
- vue
- database
- chartjs-chart-financial
- 이터널리턴
- 개발일지
- Django
- 오픈빌더
- 파이참
- Chatbot
- 파이선
- Today
- Total
우아한 개발계발 블로그
따라하며 배우는 파이썬과 데이터 과학 (11) - 차트를 멋지게 그려보자 본문
2021.06.20 - [Study/따라하며 배우는 파이썬과 데이터 과학] - 따라하며 배우는 파이썬과 데이터 과학 (10) - 넘파이로 수치 데이터를 처리해보자
따라하며 배우는 파이썬과 데이터 과학 (10) - 넘파이로 수치 데이터를 처리해보자
2021.06.20 - [Study/따라하며 배우는 파이썬과 데이터 과학] - 따라하며 배우는 파이썬과 데이터 과학 (9) - 텍스트를 처리해보자 따라하며 배우는 파이썬과 데이터 과학 (9) - 텍스트를 처리해보자 2021
w00-ah.tistory.com
넘파이로 데이터를 수치화하고 다뤄봤으니 이를 matplotlib으로 시각화해보자.
11.1 데이터 시각화(data visualization)
데이터 시각화는 점이나 선, 막대 그래프등의 시각적 이미지를 사용하여 데이터를 화면에 표시하는 것으로 데이터 분석에 있어서 빼놓을 수 없는 중요한 기능이다. 효과적인 시각화는 사용자가 분석하고 추론하는 데 도움이 된다. 사람들은 시각적으로 보이는 데이터를 직관적으로 이해할 수 있기 때문이다.
데이터를 시각화하기 위한 많은 도구가 파이썬에 있지만 대표적으로는 matplotlib 라이브러리가 있다. 보통 이 라이브러리는 막대 그래프, 선 그래프, 산포도를 그리는 용도로 쓰인다.
일단 맷플롯립(matplotlib) 이 무엇인지 보자
11.2 선형 그래프 plot()
import matplotlib.pyplot as plt
# 우리나라의 연간 1인당 국민소득을 각각 years, gdp에 저장
years = [1950, 1960, 1970, 1980, 1990, 2000, 2010]
gdp = [67.0, 80.0, 257.0, 1686.0, 6505, 11865.3, 22105.3]
# 선 그래프를 그린다. x축에는 years값, y축에는 gdp 값이 표시된다.
plt.plot(years, gdp, color='green', marker='o', linestyle='solid')
# 제목을 설정한다.
plt.title("GDP per capita") # 1인당 국민소득
# y축에 레이블을 붙인다.
plt.ylabel("dollars")
plt.savefig("gdp_per_capita.png", dpi=600) # png 이미지로 저장 가능
plt.show()

plot() 함수는 선형차트를 그리는 함수로 x축 데이터와 y축 데이터를 인수로 받는다. 또한 선의 색, 마크의 표시방법, 선의 두께 등을 키워드 인자로 줄 수 있다.
plot 함수 뿐만 아니라 matplotllib에 대한 래퍼런스는 [이곳]을 참고하자
Tutorials — Matplotlib 3.4.2 documentation
This page contains more in-depth guides for using Matplotlib. It is broken up into beginner, intermediate, and advanced sections, as well as sections covering specific topics. Provisional These tutorials cover proposed APIs of any complexity. These are her
matplotlib.org
savefig()라는 함수를 통해서 파일의 이름과 해상도를 dpi(dot per inch) 단위로 지정하면 이미지 파일 저장을 할 수 있다.
show() 함수는 화면에 차트를 그리기위해 가장 필수적인 함수이다.
만약 x=y 직선의 대칭으로 그래프를 그리고 싶다면, x 데이터와 y데이터의 위치를 바꾸면 된다.
11.2 막대 그래프 bar()
막대형 차트는 사각형 막대를 이용한 차트로 여러 가지 카테고리의 값을 비교하고자 할 때 유용하다.
plt.bar() 함수로 화면에 막대형 차트를 그릴 수 있다.
from matplotlib import pyplot as plt
# 1인당 국민소득
years = [1950, 1960, 1970, 1980, 1990, 2000, 2010]
gdp = [67.0, 80.0, 257.0, 1686.0, 6505, 11865.3, 22105.3]
plt.bar(range(len(years)), gdp)
plt.title("GDP per capita") # 제목을 설정한다.
plt.ylabel("dollars") # y축에 레이블를 붙인다.
# y축에 틱을 붙인다.
plt.xticks(range(len(years)), years)
plt.show()

x축을 year의 range로 하여 0~6 으로 설정하고 x의 눈끔 값을 부여해준 이유는 년도를 그대로 x축에 넣게되면 x축의 눈끔이 너무 많아 지기 때문이다. 그렇게 되면 가로축이 작아져서 마대 그래프가 아래처럼 보기 어려워진다.
나도 처음에 코드를 보면서 왜 굳이 이런 귀찮은 짓을 해야하나 싶었지만, 아래 코드를 실행해보고 이렇게 하는것이 데이터 시각화에 더 알맞다고 생각하게 되었다.
from matplotlib import pyplot as plt
# 1인당 국민소득
years = [1950, 1960, 1970, 1980, 1990, 2000, 2010]
gdp = [67.0, 80.0, 257.0, 1686.0, 6505, 11865.3, 22105.3]
# plt.bar(range(len(years)), gdp)
plt.bar(years), gdp)
plt.title("GDP per capita") # 제목을 설정한다.
plt.ylabel("dollars") # y축에 레이블를 붙인다.
# y축에 틱을 붙인다.
# plt.xticks(range(len(years)), years)
plt.show()

11.3 산포도 그래프 scatter()
산포도 플롯(scatter plot)은 개별 데이터 포인트를 그리는 차트이다. 산포도를 그릴 때는 각 데이터 포인트가 연결되지 않는다. 산포도 그래프를 그릴 때는 scatter() 함수를 사용한다.
import matplotlib.pyplot as plt
import numpy as np
xData = np.arange(20, 50)
yData = xData + 2*np.random.randn(30) # xData에 randn() 함수로 잡음을 섞는다.
# 잡음은 정규분포로 만들어 질 것이다.
plt.scatter(xData, yData)
plt.title('Real Age vs Physical Age')
plt.xlabel('Real Age')
plt.ylabel('Physical Age')
plt.savefig("age.png", dpi=600)
plt.show()

이게 데이터가 적어서 산포도 그래프가 하찮게 보일 수가 있는데, 점들의 개수를 늘리고 점의 크기를 키우고, 반투명 효과를 주는 등의 옵션을 scatter() 함수의 인자로 건내주면, 이만하게 시각화가 제대로 이루어지는 차트는 없다.
11.4 파이 차트 pie()
파이 차트(pie chart)는 데이터의 값에 따라서 원형 비율로 나누어져 있는 차트이다. 단순히 영역을 나누기만 한 파이 차트는 각 섹션을 비교하기가 어려울 수도 있다. 그래서 보조적으로 차지하고 있는 영역의 데이터나 비율 등을 표시하기도 한다. 파이 차트는 pie() 함수로 그릴 수 있다.
import matplotlib.pyplot as plt
times = [8, 14, 2]
timelabels = ["Sleep", "Study", "Play"]
# autopct로 백분율을 표시할 때 소수점 2번째 자리까지 표시하게 한다.
# labels 매개 변수에 timelabels 리스트를 전달한다.
plt.pie(times, labels = timelabels, autopct = "%.2f")
plt.show()

파이 그래프를 보기 좋고, 한눈에 데이터를 비교하기 좋게 그리는 팁을 주자면
데이터를 sort 하여 pie()함수에 전달하는 것이 좋다.
원의 3시 방향부터 작은 순서 대로 그려지기 때문에, 오름차순이든 내림차순이든 정렬하여 그래프를 그리면 보기 좋을 것이다.
11.5 히스토그램 hist()
히스토그램(histogram)은 주어진 자료를 몇 개의 구간으로 나누고 각 구간의 도수(frequency)를 조사하여 나타낸 막대 그래프이다. 방금전 예시로든 scatter는 각각의 점들의 분포를 2차원 평면에서 확인한다면, 히스토그램은 분포를 그래프로 나타낸 것이라고 이해하면 좋다.
히트로그램을 만들어주려면 데이터의 값을 동일한 구간으로 나눠야 한다. 데이터가 들어가는 통을 빈(bin)이라고 한다. 히스토그램을 그릴 때는 hist() 함수를 호출하면 된다.
import matplotlib.pyplot as plt
books = [ 1, 6, 2, 3, 1, 2, 0, 2 ]
# 6개의 빈을 이용하여 books 안에 저장된 자료의 히스토그램 그리기
plt.hist(books, bins = 6)
plt.xlabel("books")
plt.ylabel("frequency")
plt.show()

11.6 다중 히스토그램
다중 히스토그램이란 하나의 차트 위에 여러 개의 히스토그램을 겹치게 그리는 것이다.
import numpy as np
import matplotlib.pyplot as plt
n_bins = 10
x = np.random.randn(1000)
y = np.random.randn(1000)
plt.hist(x, n_bins, histtype='bar', color='red')
plt.hist(y, n_bins, histtype='bar', color='blue', alpha=0.3)
plt.show()

여기서 알 수 있듯, 하나의 그래프 위에 여러 그래프를 투명도를 조절하여 겹쳐그려서 다양한 데이터를 한눈에 비교할 수있다.
11.7 상자 차트 boxplot()
상자 차트(box chart)는 데이터의 최대, 최소, 중간값과 사분위 수 등을 효율적으로 가시화할 수 있는 방법이다. 데이터의 범위를 표시하는 선을 수염이라 불르고 상자-수염(box-and-whisker) 차트라고도 한다.
boxplot() 함수로를 호출하여 그릴 수 있다.
import numpy as np
import matplotlib.pyplot as plt
random_data = np.random.randn(100)
plt.boxplot(random_data)
plt.show()

상자는 중앙값(median)을 중심으로 상위 25%와 하위 25%의 값이 모여 있는 구간을 표시한다. 그리고 붉은 선은 중앙값이다. 상자 밖으로 상하로 직선이 그어져 있고, 이를 위와 아래에서 막는 선이 있는데 이것을 위스커(whisker) 혹은 수염이라고 한다. 그런데 이 범위 밖에 데이터가 존재하는 경우도 있다. 이것은 이상치(outlier)라고 한다. 상자의 상단에서 하단의 값을 뺀 값을 사분범위 혹은 IQR(Inter-Quartile Range)이라고 한다. 데이터가 상자의 상단에서 위로 IQR의 1.5배 이상 위로 올라가면 이상치로 간주한다. 반대로 1.5배 낮은 값 또한 이상치로 분류한다. 즉, 위스커는 이러한 이상치를 제외하고 남은 데이터의 최댓값과 최솟값을 표시하는 것이다.
11.8 다중 상자 차트
import numpy as np
import matplotlib.pyplot as plt
data1 = [1, 2, 3, 4, 5]
data2 = [2, 3, 4, 5, 6]
plt.boxplot([ data1, data2 ] )
plt.show()
plt.boxplot(np.array([ data1, data2 ]) )
plt.show()


리스트로 상자 차트를 그리게 되면 리스트는 리스트 별로 처리하기 때문에 왼쪽과 같은 차트를 얻게되고,
넘파이 배열로 전달하여 그리게되면 오른쪽 차트와 같이 열 단위로 끊어서 차트를 얻게된다.
11.9 다중 그래프 subplot()
한 화면에 여러 그래프를 나눠서 그리려면 pyplot에 있는 subplots() 함수를 사용한다 plt.subplots(2, 2)는 전체 화면을 2x2로 나눈다는 의미가 된다. subplots()의 반환값 중 하나인 ax에는 나누어진 차트들이 들어 있다. ax[0, 0]이라고 하면 2x2 격자에서 첫 번째를 의미한다. 각 격자를 인덱싱하여 각 격자마다 다른 그래프를 그리느 것도 가능하다.
import matplotlib.pyplot as plt
# 개스가 2 x 2개, 크기가 (5, 5) 인치
fig, ax = plt.subplots(2, 2, figsize=(5, 5))
ax[0, 0].plot(range(10), 'r')
ax[1, 0].plot(range(10), 'b')
ax[0, 1].plot(range(10), 'g')
ax[1, 1].plot(range(10), 'k')
plt.show()

'Study > 따라하며 배우는 파이썬과 데이터 과학' 카테고리의 다른 글
| 따라하며 배우는 파이썬과 데이터 과학 (13) – 시각 정보를 다루어보자 (0) | 2021.06.20 |
|---|---|
| 따라하며 배우는 파이썬과 데이터 과학 (12) – 판다스로 데이터를 분석해보자 (0) | 2021.06.20 |
| 따라하며 배우는 파이썬과 데이터 과학 (10) - 넘파이로 수치 데이터를 처리해보자 (0) | 2021.06.20 |
| 따라하며 배우는 파이썬과 데이터 과학 (9) - 텍스트를 처리해보자 (0) | 2021.06.20 |
| 따라하며 배우는 파이썬과 데이터 과학 (8) - 연관된 데이터를 딕셔너리로 짝을 짓자 (0) | 2021.06.20 |