데이터 과학을 공부하면서 "데이터 시각화 data visualization" 는 빼놓을 수 없다.
데이터 시각화는 점이나 선, 막대 그래프 등의 시각적 이미지를 사용하여 데이터를 화면에 표시한다.
효과적인 시각화는 사용자가 데이터를 분석하고 추론하는 데 도움이 된다.
사람들은 시각적으로 보이는 데이터를 직관적으로 이해할 수 있기 때문이다.
데이터를 시각화하기 위한 많은 도구가 파이썬에 있지만
우리는 matplotlib 라이브러리를 사용해서 공부해보고자 한다.
matplotlib 라이브러리는 가장 널리 사용되는 시각화 도구이다.
간단한 막대 그래프, 선 그래프, 산포도를 그리는 용도로 제격이다.
이번 장에서는 matplotlib 을 이용하여 다양한 종류의 차트를 만들어보자.
우선 그래프 하나를 소개하겠다.
이 그래프는 우리나라의 연간 1인당 국민소득을 보여주는 그래프이다.
이제 코드를 보며 하나씩 알아보자.
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()
코드는 다음과 같다.
우선 matplotlib 패키지에는 pyplot 이라는 서브 패키지가 있고, 이것을 이용하여 차트를 그릴 수 있다.
pyplot 모듈을 불러와서 plt 라는 별칭으로 사용하겠다.
차트를 그리려면 데이터가 필요하다.
우리는 간단한 예제를 살펴볼 것이므로 몇 개의 값을 리스트에 저장하고
이 값으로 차트를 생성했다.
우리가 그리고자 하는 것은 연도별 GDP 의 변화이다.
연도는 years 리스트에 담고, x 축 데이터로 사용한다.
GDP 값은 gdp 라는 이름의 리스트에 담고, 이 값은 y 축 데이터로 사용한다.
이제 이 데이터를 이용하여 선형 차트를 만들려면 plt 의 plot() 함수를 호출하면 된다.
plot() 은 x축 데이터와 y축 데이터를 인수로 받는다.
또한 선의 색, 마크의 표시방법, 선의 두께 등을 키워드 인자로 줄 수 있다.
차트의 제목 레이블을 title() 이라는 함수를 통해서 설정한다.
제목은 차트의 최상단에 표시된다.
ylabel() 함수를 통해 y축 레이블을 넣어주며,
savefig() 함수를 통해서 파일의 이름과 해상도를 dpi 단위로 지정하면 이미지 파일 저장도 가능하다.
show() 함수는 화면에 차트를 표시한다.
이 함수는 화면에 차트를 그리기 위해서 필수적인 함수이다.
matplotlib 을 이용해서 이런 식으로 차트를 그릴 수 있다.
또한 수학 함수도 쉽게 그려볼 수 있다.
y = 2x 그래프를 그려보자.
첫 번째 리스트 x 에 -10 에서 10 사이의 수를 담고,
두 번째 리스트의 원소를 이용하여 y 값을 만들어보자.
결과 화면은 다음과 같이 나오도록 해보자.
GDP 그래프를 그렸던 코드를 생각해본다면 만들 수 있다.
다음 코드를 보며 다시 살펴보자.
import matplotlib.pyplot as plt
x = [x for x in range(-10, 10)]
y = [2*t for t in x] # 2*x를 원소로 가지는 y 함수
plt.plot(x, y, marker='o') # 선 그래프에 동그라미 표식을 출력
plt.axis([-20, 20, -20, 20]) # 그림을 그릴 영역을 지정함
plt.show()
x 에는 반복문을 이용하여 -10 에서 10 사이의 수를 담았다.
y 에는 2 * x 에 해당하는 값들을 담았다.
그리고 plot() 함수를 이용해 선형 차트를 만든다.
axis() 함수는 차트를 그릴 영역을 설정한다.
그리고 show() 함수로 그래프를 출력하면 위와 같이 나오는 것을 확인할 수 있다.
처음 matplotlib 을 이용해 차트를 그려보면 참 신기하다.
꼭 따라서 해보길 권장한다.
이번엔 하나의 차트에 여러 개의 데이터를 그려보자.
예를 들어서 리스트 x를 다음과 같이 선언하고, 이를 리스트 x, y, z 와 함께 그려보자.
여기에 차트를 설명하는 범례 (legend) 를 추가하면 다음과 같다.
import matplotlib.pyplot as plt
x = [x for x in range(20)] # 0에서 20까지의 정수를 생성
y = [x**2 for x in range(20)] # 0에서 20까지의 정수 x에 대해 x 제곱값을 생성
z = [x**3 for x in range(20)] # 0에서 20까지의 정수 x에 대해 x 세제곱값을 생성
plt.plot(x, x, label='linear') # 각 선에 대한 레이블
plt.plot(x, y, label='quadratic')
plt.plot(x, z, label='qubic')
plt.xlabel('x label') # x 축의 레이블
plt.ylabel('y label') # y 축의 레이블
plt.title("My Plot")
plt.legend() # 디폴트 위치에 범례를 표시한다
plt.show()
이를 차트로 확인하면 다음과 같다.
이번에는 삼각함수의 기본인 sin 그래프를 그려보자.
사인값은 math 모듈의 sin() 함수로 계산할 수 있다.
결과 화면은 다음과 같이 나와야 한다.
해답 코드를 확인해보자.
import math
import matplotlib.pyplot as plt
x = []
y = []
for angle in range(360):
x.append(angle)
y.append(math.sin(math.radians(angle)))
plt.plot(x, y)
plt.title("SINE WAVE")
plt.show()
각을 degree 로 표현하면 0도에서 360도까지이다.
그런데 math 모듈의 sin() 함수와 cos() 함수는 radian 을 사용한다.
도로 표현된 각 angle 을 radian 으로 바꾸는 방법은 다음과 같다.
math.radians(angle)
0도에서 360도까지 1도씩 증가시켜 각도를 생성하려면 다음과 같이 하면 된다.
for angle in range(360) :
이번엔 막대형 차트를 그려보자.
각 막대의 높이는 데이터의 값에 해당한다.
막대형 차트는 여러 가지 카테고리의 값을 비교하고자 할 때 유용하다.
plt.bar() 함수를 호출하여 화면에 막대형 차트를 그릴 수 있다.
하나의 예제로 앞의 1인당 국민소득을 막대 그래프로 그려보자.
결과화면은 다음과 같이 나오게 한다.
이제 코드를 보자.
막대형 차트를 그리는 동작은 아래와 같은 코드를 사용한다.
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()
range() 함수를 이용해 0부터 6까지의 정수 범위를 만든다.
이 범위가 막대형 차트의 가로축 범위가 된다.
그리고 0부터 6까지의 정수가 아니라 연도가 눈금마다 부여된 것을 확인할 수 있는데,
이것은 xtick() 함수를 사용하여 가로축 범위의 눈금마다 부여할 눈금값을 지정한 결과이다.
이번에는 개별 데이터 포인트를 그리는 산포도 플롯 차트를 이용해보자.
산포도를 그릴 때는 각 데이터 포인트가 연결되지 않고, 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()
np.random.randn() 함수는 넘파이에서 정규분포 난수를 생성하는 함수이다.
인자로 30을 넣으면, 정규 분포에서 난수 30개를 생성한다.
이 난수들의 평균은 0이고 표준편차는 1이 되는 표준정규분포가 되도록 한다.
이 차트들 외에도 파이 차트, 히스토그램, 상자 차트 등등 다양한 차트들이 존재한다.
matplotlib 을 이용해 다양한 차트들을 그려보며 시각화하는 연습을 해보자.
이번 장에서는 데이터를 시각화하는 법을 공부했다.
프로그래밍 공부를 진행하면서 프롬프트 창에서가 아닌 시각적으로 결과가 보이는 화면을 볼 기회가
많지 않았는데, 모듈을 이용하여 메소드 호출만으로 데이터를 시각화 할 수 있는 점이 인상깊었다.
더 나아가 다양한 데이터를 분석해보자 :)
출처 : 따라하며 배우는 파이썬과 데이터 과학 - 천인국, 박동규, 강영민