※ 이 포스팅은 저자 'Kirthi Raman'의 도서 <Mastering Python Data Visualization> 을 공부하며 정리한 글입니다. 



Chapter 08. Advanced Visualization (고급 시각화)


다양한 데이터 구조와 알고리즘을 이해하기 쉽도록 시각화 가능하다. 다음 사이트들에 좋은 예시들이 풍부하게 수록되어 있다.
https://visualgo.net/en
https://www.cs.usfca.edu/~galles/visualization

Computer Simulation (컴퓨터 시뮬레이션)

컴퓨터 시뮬레이션의 모델은 알려지지 않거나 분석이 어려운 시나리오를 이해하고 평가하기 위한 방법으로서, 지난 수십 년 이상 인기를 얻은 학문이다.

또한, 컴퓨터 시뮬레이션은 물리학, 화학, 생물학, 경제학, 공학, 심리학, 사회 과학 등 다양한 분야에서 시스템의 수학적 모델링에 매우 생산적인 방법이다.


컴퓨터 시뮬레이션 모델의 장점

- 연구되고 있는 알고리즘 또는 프로세스에 대한 이해의 향상

- 프로세스 및 알고리즘의 문제 영역을 식별

- 알고리즘 / 모델에 관한 특정 변화에 대한 영향력 평가


컴퓨터 시뮬레이션 모델의 유형

- 이산 모델 : 특정 시간에 발생한 시스템의 변화들

- 연속 모델 : 일정 기간에 걸쳐 연속적으로 변화하는 시스템의 상태

- 혼합 모델 : 이산과 연속 요소를 모두 포함


시뮬레이션을 수행하기 위해, 일반적으로 임의의 확률적 입력 값을 사용한다. 이는 시뮬레이션 모델에 대응하는 실제 데이터를 갖기 어려워서이다.



#. Python's Random Package (파이썬의 랜덤 패키지)

파이썬은 여러 편리한 함수들을 가진 random 이라는 패키지를 제공한다.


- 0.0 ~ 1.0 사이 또는 특정 시작과 끝 값 사이의 임의 랜덤 실수(real numbers) 생성

- 숫자의 특정 범위 사이의 임의 랜덤 정수(integers) 생성

- 숫자 또는 문자 목록에서 임의 랜덤값 생성


import random


print random.random() # between 0.0 and 1.0

print random.uniform(2.54, 12.2) # between 2.54 and 12.2

print random.randint(5,10)  # random integer between 5 and 10


print random.randrange(25)  # random number between 0 and 25


#  random numbers from the range of 5 to 500 with step 5

print random.randrange(5,500,5) 


# three random number from the list 

print random.sample([13,15,29,31,43,46,66,89,90,94], 3) 


# Random choice from a list

random.choice([1, 2, 3, 5, 9])



#. SciPy's Random Functions (SciPy의 랜덤 함수)

알고리즘과 수학적 기술을 가진 NumPy 의 확장 버전이 SciPy 패키지다.


NumPy는 Built-in Pseudo Random 생성기를 제공한다. 숫자들은 Pseudo 랜덤이다.

즉, 하나의 Seed 숫자로부터 결정성을 갖고 생성된다. 따라서 같은 Seed 번호를 사용하면 같은 랜덤 숫자들을 생성할 수 있음을 참고하자.


import numpy as np

np.random.seed(10)


각기 다른 랜덤 시퀀스는 Seed 값을 설정하지 않음으로써 생성할 수 있다.

NumPy는 자동으로 랜덤 Seed를 시간 기준으로 선택한다.


np.random.seed()


구간 [0.0, 1.0] 에서 5개의 랜덤값 배열을 다음과 같이 생성할 수 있다.


np.random.rand(5)


Out[]: array([ 0.54340494,  0.27836939,  0.42451759,  0.84477613,  0.00471886])


rand 함수를 이용해 다음 코드처럼 임의의 2차원 배열을 생성할 수 있다.


np.random.rand(2, 4)


Out[]: 

array([[ 0.12156912,  0.67074908,  0.82585276,  0.13670659],

       [ 0.57509333,  0.89132195,  0.20920212,  0.18532822]])


임의의 랜덤 정수를 생성하기 위해 randint(min, max)를 사용할 수 있다.

min과 max는 임의 랜덤 정수를 선택하기 위한 범위다.


np.random.randint(4, 18)


Out[]: 13


Lambda = 8.0 을 가진 이산 포아송 분포(Discrete Poisson distribution)의 임의 랜덤 값은 다음과 같이 생성할 수 있다.


np.random.poisson(8.0)


Out[]: 3


표준편차(sigma) = 3.0, 평균(mu) = 1.25 를 가진 연속 정규분포(Gaussian distribution)의 임의 랜덤 값은 다음과 같이 생성할 수 있다.


np.random.normal(1.25, 3.0)


Out[]: 0.5128392013916669



#. Simulation Examples (시뮬레이션 예제)

첫 번째 예제는 확률 미분 방정식(SDE)로 주가 변동을 모델링하기 위한 기하학적 브라운 운동(Geometric Brownian Motion)이다.

기하학적 브라운 운동은 지수 브라운 운동(Exponential Brownian Motion)으로도 알려져 있다.


위 수식에서 W_t 는 브라운 운동을, mu는 percent drift, sigma는 percent volatility(변동성) 이다.


다음 코드는 브라운 운동을 시각화한 것이다.


from numpy.random import standard_normal

from numpy import zeros, sqrt

import matplotlib.pyplot as plt


S_init = 20.222

T = 1

tstep = 0.0002

sigma = 0.4

mu = 1

NumSimulation = 6


colors = [ (214,27,31), (148,103,189), (229,109,0), (41,127,214), 

(227,119,194),(44,160,44),(227,119,194), (72,17,121), (196,156,148) ]  


# Scale the RGB values to the [0, 1] range.  

for i in range(len(colors)):  

    r, g, b = colors[i]  

    colors[i] = (r / 255., g / 255., b / 255.)  

    

plt.figure(figsize=(12,12))


Steps = round(T/tstep); #Steps in years

S = zeros([NumSimulation, int(Steps)], dtype=float)

x = range(0, int(Steps), 1)


for j in range(0, NumSimulation, 1):

    S[j,0]= S_init

    for i in x[:-1]:

       S[j,i+1]=S[j,i]+S[j,i]*(mu-0.5*pow(sigma,2))*tstep+ \

          sigma*S[j,i]*sqrt(tstep)*standard_normal()

    plt.plot(x, S[j], linewidth=2., color=colors[j])


plt.title('%d Simulation using %d Steps, \n$\sigma$=%.6f $\mu$=%.6f $S_0$=%.6f '

          % (int(NumSimulation), int(Steps), sigma, mu, S_init), fontsize=18)

plt.xlabel('steps', fontsize=16)

plt.grid(True)

plt.ylabel('stock price', fontsize=16)

plt.ylim(0,90)


plt.show()



추가로, 아래 사이트에서 신경망 시뮬레이션 모델링을 수행할 수 있는 파이썬 패키지를 구할 수 있다.

http://briansimulator.org



Animation (애니메이션)

파이썬에서 matplotlib 을 이용해 애니메이션을 만들 수 있다. 

우선, 애니메이션을 생성하기 위한 기본 코드는 다음과 같다.


import numpy as np 

import matplotlib.pyplot as plt 

from matplotlib import animation  


# Set up the figure, axis, and the plot element to be animated 

fig = plt.figure() 

ax = plt.axes(xlim=(0, 3.2), ylim=(-2.14, 2.14)) 

line, = ax.plot([], [], lw=2)


matplotlib 에서 애니메이션 패키지를 정확히 불러오기 위해 다음과 같이 축을 설정하고, 필요한 도식화 변수(비어있는 선)를 준비한다.


# initialization function: plot the background of each frame

def init():

    line.set_data([], [])

    return line,


다음과 같이 모든 애니메이션을 시작하기 전 기본 프레임을 만든다.


# animation function.  This is called sequentially

def animate(i):

    x = np.linspace(0, 2, 1000)

    xval = 2 * np.pi * (x - 0.01 * i)

    y = np.cos(xval) # Here we are trying to animate cos function

    line.set_data(x, y)

    return line,


여기에 입력인 x 와 y 값이 변하는 것으로 정의된 프레임 번호, 도식화되는 변수들의 집합들을 포함하는 에니메이션 함수를 사용한다.


anim = animation.FuncAnimation(fig, animate, init_func=init,\

            frames=200, interval=20, blit=True)

anim.save('basic_animation.html', fps=30)


실제 애니메이션 개체는 FuncAnimation 을 통해서 만들어지며,

init()와 animate() 함수에게 프레임의 개수인 fps(frames per second)와 시간 간격 파라미터를 통해 전달된다.

blit=True 파라미터는 바뀌는 부분만 다시 그려지면서 표시하는 것을 의미한다.


더 많은 예제들은 다음 블로그에서 확인할 수 있다.

http://jakevdp.github.io/blog/2012/08/18/matplotlib-animation-tutorial/

http://matplotlib.org/examples/animation/


+ Recent posts