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



Chapter 04-2. Interactive Plotting (반응형 시각화)


( 이전 포스팅에 이어서 .. )

이 책에서는 주로 matplotlib 이라는 파이썬 패키지로 시각화를 진행하고 있습니다.

워드 클라우드(Word Cloud) 예제

주어진 문장에서 자주 나타나는 단어에 대한 중요성을 보여주는 시각화이다.
다른 말로, 태그 클라우드(Tag Cloud)나 단어 비중의 시각화라 불린다.

워드 클라우드는 소셜 미디어와 마케팅 분야에 유용하게 사용되고 있다.
- 소비자들의 브랜드에 대한 인식 분석
- 어떤 단어들과 테마가 Target 시장에서 경쟁력을 가지는지 확인


#. wordcloud 라이브러리 설치


Mac 기준으로 작성된 책이여서, Windows OS 환경에서의 설치는 다음과 같이 제가 했던 방식으로 진행하시면 될 것 같습니다.


(1). 아나콘다 프롬포트 실행



(2). conda install -c conda-forge wordcloud 입력

중간에 Proceed ([y]/n)? 나오면 y 입력




#. 워드 클라우드 생성


원본 데이터(wordcloudInput_fromFeeds.txt)와 폰트 파일(RemachineScript.ttf) 파일은 책의 예제 다운로드를 통해서 얻으실 수 있습니다.


from wordcloud import WordCloud, STOPWORDS

import matplotlib.pyplot as plt

from os import path


d = path.dirname("__file__")

text = open(path.join(d, 'wordcloudInput_fromFeeds.txt')).read()


wordcloud = WordCloud(

        font_path='remachine_script/RemachineScript.ttf',

        stopwords=STOPWORDS,

        background_color='#222222',

        width=1000,

        height=800).generate(text)


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

plt.imshow(wordcloud)

plt.axis('off')

plt.show()



#. 텍스트 감성 분석

고전적인 방법은 아래의 수식을 활용하는 것이다. 또는 TextBlob 패키지를 이용하는 방법이 있다. 추후에 더 자세하게 다루도록 한다.




주식 차트 시각화 예제

blockspring 라이브러리를 통해 반응형 시각화가 가능하다.

자동으로 생성된 결과물은 HTML 코드와 자바스크립트(D3.js) 포맷으로 되어 있다.


* 위에서 실행한 아나콘다 프롬포트에서 " pip install blockspring " 명령을 입력하시면 블락스프링 패키지를 이용할 수 있습니다.


import blockspring 

import json  


print blockspring.runParsed("stock-price-comparison", 

   { "tickers": "FB, LNKD, TWTR", 

   "start_date": "2014-01-01", "end_date": "2015-01-01" }).params




스포츠 데이터 시각화 예제

이 외에도 다음과 같은 결과물을 파이썬을 통해 얻을 수 있다.





이번 장에서는 간단한 동작 예제만 살폈으며, 추후 좀 더 많은 예제들을 살펴보게 될 것이다.



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



Chapter 04-1. Numerical Computing (수치 연산)


NumPy, SciPy 라이브러리

이들은 파이썬 계산 모듈로서, 함수들이 미리 컴파일 되어있어 빠르게 수행된다.

NumPy는 많은 양의 수치 데이터를 다루기 위한 것이며, SciPy는 응용 수학 부문의 유용한 알고리즘을 제공하는 NumPy의 확장판이다.


#. Interpolation (보간)

- NumPy의 interp() 함수


#. Vectorization 기능

- NumPy와 SciPy에서 vectorize()는 함수를 벡터화하여 효율적인 작업을 가능하게 한다.

- 즉, vectorize()는 스칼라 값을 인수로 받는 함수를 배열도 인수로 사용되도록 하는 기능이다.


#. NumPy 선형 대수

- dot(a,b) : 두 배열의 내적

- linspace(a,b,n) : a부터 b의 범위에서 n개의 수를 생성

- diff(x) : 미분


- linalg.norm(x) : 행렬이나 벡터의 노말

- linalg.cond(x) : 조건 수

- linalg.solve(A, b) : Ax=b의 솔루션

- linalg.inv(A) : 역행렬

- linalg.pinv(A) : 역행렬

- linalg.eig(A) : 제곱의 고유/벡터값

- linalg.eigval(A) : 고유값

- linalg.svd(A) : 단수 값 분해


#. SciPy의 함수

- spio.loadmat : 행렬 로드

- spio.savemat : 행렬 저장

- scio.imread : 이미지 로드

- scipy.polyid : 다항식을 정의하여 여러 편리한 계산이 가능하도록 도움.

* 등 많은 것이 이미 SciPy에 구현되어 있으므로, 파이썬으로 계산 프로그램을 개발할 때 의도한 기능 관련하여 먼저 개발 문서를 확인해보자.


- scipy.cluster : 벡터 양자화, K-means 등 클러스터링

- scipy.fftpack : 고속 푸리에 변환

- scipy.integrate : trapezoidal(사다리꼴), Simpson's, Romberg 등의 방법으로 적분 수행.

quad, dblquad, tplquad 함수로 객체에 싱글, 더블, 트리플 통합 수행 가능.

- scipy.interpolate : 분리된 수치 데이터와 선형 또는 spline interpolation(보간) 개체 함수와 클래스

- scipy.linalg : NumPy의 linalg 패키지를 위한 wrapper. 모든 NumPy 함수들은 scipy.linalg의 일부임.

- scipy.optimize : Neider-Mead Simplex, Powell, 결합 그라데이션 BFGS, 최소 제곱, 제약 최적화, 시뮬레이션 annealing, Newton's Method, 이분법, Broyden Anderson, Linear Search 등을 통한 최대값과 최소값 등을 찾는 기능.

- scipy.sparse : Sparse matrices 관련

- scipy.special : 타원, 베셀, 감마, 베타 초기화, 포물선, 실린더, Mathieu 및 회전 타원체 파도와 같은 계산 물리 위한 특수 함수



MKL 함수

인텔이 개발한 벡터와 행렬에 대한 고성능 처리를 지원하는 함수이다.

FFT 함수와 벡터 통계 함수도 포함되어있다.

인텔 프로세서(CPU)에서 효율적으로 동작하도록 최적화 되어있다.

아나콘다 사용자들은 아나콘다 가속 패키지 일부의 애드온으로 이용 가능하다.




파이썬의 성능 이슈

종종 파이썬의 성능 이슈로 인해 C 언어로 프로그램을 다시 작성하거나, 컴파일된 C 함수들을 호출하는 일이 있다.

Cython처럼 더 쉽게 최적화를 하기 위한 목적의 많은 프로젝트들이 있으나, 기존 파이썬 코드를 효율적으로(빠르게) 만드는 것이 좋다.


#. Numbapro

- 파이썬 코드를 CUDA 가능 CPUs나 멀티코어 CPU, 또는 GPU에서 수행하도록 만드는 Continuum Analytics의 파이썬 컴파일러이다.

- 런타임에 just-in-time(JIT) 컴파일 된다.

- 상업 라이센스임에 유의


#. Scipy.weave

- C 코드를 중간에 삽입, NumPy 배열을 C 층으로 자연스럽게 이동시켜주는 모듈. 효율적인 메크로를 가지고 있다.


#. 멀티코어 활용


#. 프로세스 Pool 활용

- Pool은 멀티프로세싱의 패키지에 또 다른 클래스이다.

- Pool 안에 생성도니 프로세스 수를 정의할 수 있으며 각 프로세스에게 전달될 파라미터를 가지고 있는 반복 객체를 보낼 수 있다.


#. Disco 등 분산 계산 패키지 활용

- MapReduce 패러다임 기반 가벼운 오픈소스 프레임워크

- 이 외 Hadoop Streaming, mrjob, dumbo, hadoopy, pydoop 등이 있다.



분할(Slicing)

배열은 리스트나 튜플로 분할될 수 있다.

[ : , : , ... : ] 와 같은 문법을 사용한다.


#. :and:    ==    0:n:0

#. m: , m:n:    ==    m:n:1

#. :n:    ==    0:n:1

#. ::d:    ==    0:n:d


#. 예시


>>> x = numpy.array([5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20])


>>> x[:2] # 0 ~ 2 까지

array([5, 6])


>>> x[::2] # 0 ~ n 까지 2 스탭

array([5, 7, 9, 11, 13, 15, 17, 19])



#. 행렬의 분할


>>> a = numpy.array([ [4,5,6], [7,8,9], [1,2,3] ])

>>> a

array([[4, 5, 6],

       [7, 8, 9],

       [1, 2, 3]])


>>> a.flat[:]

array([4, 5, 6, 7, 8, 9, 1, 2, 3])



색인(Indexing)

#. 수치 색인
- 정수 데이터를 가진 리스트로 Indexing 할 수 있다.

>>> a = 10 * numpy.arange(5.0)

>>> a

array([0., 10., 20., 30., 40.])


>>> a[1] # 값을 반환

10.0

>>> a[[1]] # 배열을 반환

array([10.])


>>> sel = numpy.array([3,1,4,2,3,3])

>>> a[sel] # 위치를 반복하여 배열로 반환할 수 있다

array([ 30.,  10.,  40.,  20.,  30.,  30.])


>>> sel = numpy.array([[4,1], [3,2]])

>>> sel # 2차원에서도 가능

array([[4, 1],

       [3, 2]])

>>> a[sel]

array([[ 40.,  10.],

       [ 30.,  20.]])



#. 논리 색인

- 전등 스위치와 같이, 참이거나 거짓인 조건을 활용할 수 있다.


>>> x = numpy.arange(-4, 5)

>>> x

array([-4, -3, -2, -1,  0,  1,  2,  3,  4])


>>> x < 0

array([ True,  True,  True,  True, False, False, False, False, False], dtype=bool)


>>> x[x>0]

array([1, 2, 3, 4])


>>> x[abs(x) >= 2]

array([-4, -3, -2,  2,  3,  4])


>>> x = numpy.reshape(numpy.arange(-8, 8), (4, 4)) # 2차원 예시

>>> x

array([[-8, -7, -6, -5],

       [-4, -3, -2, -1],

       [ 0,  1,  2,  3],

       [ 4,  5,  6,  7]])


>>> x[x<0]

array([-8, -7, -6, -5, -4, -3, -2, -1])


>>> from math import isnan # 여러 방식의 논리 색인


>>> list1 = [[3, 4, float('NaN')],

                 [5, 9, 8],

           [3, 3, 2],

                 [9, -1, float('NaN')]]


>>> [elem for elem in list1

if not any([isnan(element) for element in elem])]

[[5, 9, 8], [3, 3, 2]]


>>> list2 = [3,4,5,6]


>>> [list2[index] for index, elem in enumerate(list1)

     if not any([isnan(element) for element in elem])]

[4, 5]



파이썬의 다양한 데이터 구조

파이썬은 스택, 리스트, 집합(Set), 시퀀스, 튜플, 리스트, 힙, 배열, 사전(Dictionary), 디큐(Dequeue) 등의 데이터 구조를 가진다.

참고로, 튜플은 불변성으로 리스트보다 더 효율적인 메모리 효율을 갖는다.



#. 스택(Stack)

- list() 함수는 스택으로서 사용되기 유용하다.

- 새로 들오온 요소는 뒤로 추가되고, 가장 먼저 들어온 것이 먼저 나가는(선입선출) 실행 원칙을 가진 추상 데이터 유형이다.


- append()로 아이템을 추가한다.

- pop()으로 아이템을 추출한다.

- remove(item-value)로 아이템을 제거한다.



#. 튜플(Tuple)

- 불변하는 오브젝트의 시퀀스이다. 따라서 오브젝트를 바꿀 수도, 제거할 수도 없다. 하지만 튜플 자체(오브젝트 전체)를 지우는 것은 가능하다.

- 다원화된 데이터 구조를 갖는다.

- 리스트가 같은 요소들의 시퀀스인 반면, 튜플은 요소들이 서로 다른 의미를 가진다.

- 리스트는 시퀀스를 갖고, 튜플은 구조를 갖는다.

- 튜플의 예는 한 주의 요일, 강의의 과목 이름, 등급 척도 등이다.


- del tuble-name 으로 튜플을 지운다.

- cmp(tup1, tup2) : 튜플의 요소를 비교

- len(tuple) : 전체 길이

- max(tuple) : 요소들의 최댓값

- min(tuple) : 요소들의 최솟값

- tuple(lista) : 리스트를 튜플로 변환


- 참고로, 파이썬은 max() 함수에 문자열의 리스트를 입력하면 가장 긴 문자열을 return한다. (min() 함수도 마찬가지)


#. 셋(Set)

- 리스트와 유사하나, 순서가 없는 집합이다. 리스트는 위치나 색인에 의해 순서화된다.

- 중복을 허용하지 않는다. (중복이 없다)


#. 사전(Dictionary)

- 키와 값의 쌍으로 구성된, 순서가 없는 데이터 값들의 집합

- 색인으로서 키를 기반으로 값에 접근할 수 있는 장점이 있다.

- 디폴트 사전(Default Dictionary)은 키와 값의 쌍이 삽입된 순서를 유지하지 않는다. OrderedDict() 함수로 생성된 빈 사전은 순서를 유지한다.


>>> # 예제 1 : 아프리카의 10대 GDP

>>> gdp_dict = {

        'South Africa': 285.4,

        'Egypt': 188.4,

        'Nigeria': 173,

        'Algeria': 140.6,

        'Morocco': 91.4,

        'Angola': 75.5,

        'Libya': 62.3,

        'Tunisia': 39.6,

        'Kenya': 29.4,

        'Ethiopia': 28.5,

        'Ghana': 26.2,

        'cameron': 22.2

        }


>>> gdp_dict['Angola']

75.5



( .. 다음 포스팅에 계속 .. )



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



Chapter 03. Getting Started with the Python IDE (파이썬 IDE로 시작하기)


이 책에 따르면, 이미 파이썬 2.7 버전대에서 작성된 여러 라이브러리들이 3.x 버전대와 호환이 잘 되지 않는다고 하니 2.7 버전대를 사용하기로 합니다.


또한, 이 책으로 공부를 하시는 분들이라면 아나콘다(Anaconda)를 설치하시는 것이 편리할 것입니다.

나중에 설치 과정을 정리해보겠습니다.



파이썬의 강점


방대하고, 유용한 라이브러리들을 쉽게 설치하여 적용할 수 있다는 것이 파이썬의 가장 큰 강점이다.

GUI를 만들 수 있고, DB와 연결할 수 있으며, 랜덤 수를 생성하여 시뮬레이션을 시행할 수 있고, 수학적 연산에서의 높은 정밀도를 가진다.

2D, 3D 그래픽 시각화, 머신 러닝과 통계적 알고리즘 등을 수행할 수 있는 고성능의 패키지들도 배포되고 있다.



아나콘다 (Anaconda)


Continuum Analytics가 개발한 아나콘다는 데이터 분석과 시각화를 위해 가장 많이 사용되는 IDE 중 하나로 잘 알려져 있다.

* IDE란, 통합개발환경(Integrated Development Environment)으로서 편리하게 어플리케이션을 개발할 수 있도록 여러 기능들을 모아둔 것입니다.


아나콘다는 개발자가 필요한 파이썬 라이브러리를 쉽게 설치하고 업데이트 할 수 있도록 돕는다.
빅 데이터의 관리, 분석 그리고 비즈니스 인텔리전스를 위한 시각화, 과학적 분석, 엔지니어링, 머신 러닝 등 강력한 파이썬 패키지들의 집합이다.

아나콘다는 IPython과 Spyder 등의 IDE를 포함한다.
* 개인적으로 저처럼 기존에 R을 사용하셨던 통계 전공자분들에게 Spyder를 추천합니다. RStudio와 환경이 비슷한 것 같아 큰 이질감이 없습니다.


추천하는 파이썬 시각화 패키지들


#. matplotlib

- 가장 많이 사용되는 파이썬 시각화 라이브러리

- NumPy, SciPy와 연결되어 있음

- 과학 분야 파이썬 커뮤니티에서 주로 사용되고 있다


#. Plotly

- 시각화와 분석을 함께 할 수 있도록 브라우저에서 작동하는 플랫폼

- 반응적으로 그래프 작업을 할 수 있고, 스타일을 입힐 수 있다.

- matplotlib 기반으로 작성된 시각화 코드를 Plotly 버전으로 쉽게 고칠 수 있다


#. Veusz

- 파이썬과 PyQt로 만어졌으며 GPL-scientific 시각화 라이브러리


#. Mayavi

- 3차원 시각화 패키지


#. NetworkX

- 복잡한 네트워크를 생성하며 가공하고 그 구조와 역학, 기능 연구에 사용


#. pygooglechart

- 구글 시각화 API와 연동할 수 있게 돕는 라이브러리



반응형(interactive) 시각화 패키지들


#. Bokeh

- 아웃 포커스된 이미지의 일부분 혹은 블러링을 묘사하는 일본어에서 유래

- 예시 : http://nbviewer.jupyter.org/gist/fonnesbeck/ad091b81bffda28fd657


#. VisPy

- OpenGL 활용, 고성능 반응형 시각화 라이브러리

- 예시 : http://vispy.org/gallery.html



+ Recent posts