※ 이 포스팅은 저자 '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



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



Chapter 02. Data Analysis and Visualization (데이터 분석과 시각화)


Storytelling 방식의 데이터 시각화


#. 데이터를 이용해 즐거운 이야기를 만들자

- 올바른 방법으로 표현된 데이터는 이해하고 기억하기 쉽기 때문이다

- 좋은 시각화를 만들기 위해 첫 번째로 해야 할 가장 중요한 일은 '최종 목표'를 명확히 설정하는 것이다.


#. 시각화는 독자의 입장에서

- 단지 저자(데이터를 시각화하는 주체)의 입장에서 데이터를 시각화하면, 그 의의가 저자에 의해 결정되어 단순 정보 전달에 그칠 수 있다.

- 그러나 독자 중심으로 생각하면, 독자와 저자는 상호 교류하며 서로가 데이터를 유연하게 고르고, 분석하고, 시각화된 데이터를 이해할 수 있게 된다.


#. 매력적인 스토리텔러가 되어야

- Storyteller들은 대화에 있어 독자에 대한 이해가 중요하다는 것을 명확히 알고 있다.

- 데이터의 스토리라인 또한 청중에 따라서 표현과 전달 방식이 달라야 한다.


#. 올바른 시각화 방법을 선정하자

- 비교와 순위

** 특히, 비교는 분석 타겟의 특성을 더 강조할 수 있을 뿐 아니라, 그것을 주장할 수 있는 근거를 만들어주기 때문에 중요하다고 생각합니다.

- 상호 연관성

: 산점도(산포도), 상관관계, 히트맵

- 분포

: 히스토그램, 박스플랏(상자 그래프), 상자 수염 그래프(Box and Whisker plot)

* 분포는 특히 이상점을 찾는데 유용하게 사용될 수 있습니다.

- 지역적 특성이나 정보

: 지도 위에 도형의 크기와 색을 활용

- 부분에서 전체의 관계

: 파이 차트(원 그래프), 그룹 막대 그래프, 누적 열 차트

- 시간 경과에 따른 경향

: 막대 그래프, 시계열 그래프, 추세선



반응형(interactive) 시각화


#. 반응형 시각화의 장단점

- 많은 양의 정보를 하나의 플랫폼을 통해 전달 가능하다

- 그러나 모든 시각화 가능성에 대해 확인해봐야 하므로 사용자에게 많은 시간을 요구하게 된다.


#. 이벤트 리스너

- 사용자의 요구(query, needs)는 프로그래밍적으로 이벤트 리스너를 통해 실시간으로 처리(catch)해야 한다.

- 반응형 시각화에서는, 주로 마우스의 움직임이나 클릭 등을 인식하는데 사용한다.


#. 몇 가지 원칙

- 사용자의 행동이 시스템에 반영됐다는 것을 명확히 인식시켜줘야 함 (ex: 강조 표시, 밑줄, 색 변화, 굵게, 기울임 등)

- 피드백은 평균 1초 내에 구현되도록 해야 답답함을 느끼지 않을 것이다.

- 만약 알고리즘 특성 때문에 결과를 표시하기까지 시간이 필요할 경우, loading과 같은 처리 중 표시를 해야 이탈을 방지할 수 있다.



데이터 시각화는 예술이자 과학이며, 수학적인 문제를 푸는 일


#. 데이터 시각화의 목적을 수시로 상기하자

- 시각화는 사용자, 독자, 청자에게 시각적인 방법으로 정보를 명확하고 효과적으로 전달하고 소통하는 것

- 효과적인 시각화 결과물은 데이터와 증거들에 대해 분석하고 추론할 수 있게 돕는다.

- 또한 복잡한 데이터를 쉽게 접근 가능토록 하고, 이해시키며, 사용할 수 있게 돕는다.

- 비교와 특이점을 이해하는 것과 같은 특정한 분석이 중요할 수 있고, 이를 그림으로 표현할 수 있다면 더욱 좋다.


#. 효과적인 방법을 사용하자

- 수학적 문제를 푸는 것 처럼, 분석 목표를 달성하는 데에는 유일한 한 가지 방법만이 있는 것은 아니다.

- 표는 데이터의 날 것을 보여주지만, 다양한 형태의 도표와 차트는 변수들 간의 관계와 패턴 등을 잘 표현할 수 있다.




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



Chapter 01. A Conceptual Framework for Data Visualization (데이터 시각화의 개념)


데이터를 분석하는 이유는 흔히 말하는 '인사이트'를 얻기 위함이라 볼 수 있겠습니다.


그러나, 인사이트는 쉽게 발견하기가 어렵습니다.

특히 주어진 데이터를 멋져보이고 아름다운(?) 모형을 사용한다고 해서 바로 얻어지는 것이 아닙니다.


저는 분석을 하기 전에, 반드시 데이터에 대한 이해가 필요하다고 생각합니다. (분석 목표에 대한 명확한 정의가 내려졌을 때)

데이터가 어떤지 살펴봐야 이상치나 특이점, 결측의 여부를 식별하고, 적절한 전처리 방법을 선택하여 무결성을 확보할 수 있습니다.

또한, 다른 다른 관측값(row)이나 변수(column)간의 일관된 비교나 분석 가능성을 확보하기 위한 스케일링, 표준화 등이 필요할 수 있습니다.

모형이 특정한 분포를 가정(정규분포 등)한다면, 적절한 변수변환이 필요할 수 있습니다.

분석 목적에 따라 수치형 데이터를 범주화 하는 등의 작업이 필요할 수도 있습니다.


등등등..

이러한 관점에서, '데이터 시각화'는 꼭 필요한 과정이 될 것입니다.

이 밖에도 꼭 모형을 사용하지 않더라도, 시각화를 통해서 변수간의 상관관계나 특이점 등을 찾아 통찰을 발견할 수 있을 것입니다.



이 책 Chapter 1에서 '데이터', '정보', '지식', '통찰'의 개념을 나눠서, 그것도 첫 장에 서술한 이유도 같은 맥락이지 않을까 싶습니다.

책에 따르면 이렇습니다.



#. 데이터

- 디지털의 형태를 가진 단순한 객관적 사실들의 나열

- 따라서 그 자체로 의미를 가지지 못하고, 의사결정에 그대로 사용될 수 없다


#. 정보

- 문제를 해결하기 위한 목적으로 가공/처리된 데이터

- 데이터 간 관계나 연관성을 문맥이나 배경을 바탕으로 부여한 것

- 단순한 질문에 대한 답을 데이터로부터 얻은 결과물


#. 지식

- 인간이 정보를 종합하여 이들을 이해하고 조직화 할 때 드러나며, 의사결정에 사용

- 데이터, 정보 뿐 아니라 경험을 통해 축적된 기술 등을 의미


#. 데이터 분석과 통찰

- 혁신적인 결과를 가져다 주는 '유레카'의 순간

- 비즈니스 가치를 이끌며, 의사결정을 개선하고, 고객을 더 잘 이해하게 되는 일

- 해결책을 발견하고 해결하기 위해 무엇이 필요한지에 대해 깨닫게 도움



그렇다면, 좋은 시각화란 무엇인가?

저자는 이렇게 말합니다.


" 좋은 시각화는 박물관의 전시품 같이 단지 보기 좋은 통계적 그림이 아니며, 우리로 하여금 파고 들게 하고 데이터의 변화를 좀 더 발견하게 한다 "

" 좋은 시각화는 데이터를 탐색하는 것을 돕고, 가치와 깊은 통찰을 제공하고, 효율적이고 시각적으로 매력적이며, 확장/축소 가능하며, 이해하기 쉽다 "



결국 데이터에서 인사이트를 얻기 위해, 시각화 작업은 꼭 필요한 프로세스입니다.

효과적인 시각화를 위해서는 분석에 대한 명확한 목표를 설정하고, 그 과정에서 데이터 전처리가 수행됩니다.

또한 결과를 보는 사람, 즉 청중에 대한 배려가 필요합니다. 시각화의 주제에 대한 배경지식과 시각화 도구에 대한 이해수준 등이 고려되어야 할 것입니다.




다음 장에서는 조금 더 구체적으로 데이터 시각화에 어떠한 좋은 방법들이 있는지 공부하게 될 것 같습니다. :)





저자 Kirthi Raman의 <Mastering Python Data Visualization> 이라는 책을 공부하면서 조금씩 정리해보려고 합니다.

책 정보 : https://www.packtpub.com/big-data-and-business-intelligence/mastering-python-data-visualization


사실 ISL을 먼저 공부하려고 했으나.. 파이썬을 공부할 필요가 생겼네요.


잘못된 부분의 지적이나 질문 등 언제나 환영합니다. 함께 공부해요. :)


-----


번역서도 출판되어 있습니다.

<파이썬 데이터 시각화 마스터> : http://acornpub.co.kr/book/mastering-python-visualization



서울 치킨집 폐업 예측 프로그램 (ver 0.10)

http://analytics.hyeongeun.com/chicken_place/

Ubuntu + R + Shiny


계속 공부로 진행하는 프로젝트입니다. 아직은 재미로만! 봐주세요 ^^

추후 만든 과정을 정리할 생각입니다..




01. 가상서버 호스팅(VPS) 및 우분투(Ubuntu) 서버 준비

- 서비스 신청과 기본적인 보안 설정, 한글 등 -


이 글은 '데이터 분석 결과를 웹에 반응형으로 시각화하기 (Ubuntu Server + R + Shiny)' 의 연속 포스트입니다.

데이터 분석 결과를 웹에 반응형으로 시각화하는 과정을 정리하고 있습니다.




서버가 필요한 이유

포스팅의 최종 목표인 R과 Shiny로 반응형 시각화 결과를 웹에 올려 사람들과 공유하려면,

홈페이지를 구동하기 위한 웹호스팅 서비스가 아닌 '직접 프로그램(ex : 데몬)을 돌릴 수 있는 서버'가 필요합니다.


이런 서버 관련 서비스 중 VPS를 선택한 이유는 뭐니뭐니해도 '저렴'하고 '간편'하기 때문입니다.

고가의 장비를 구하는 비용이나 회선료를 여러 사람과 나눠 부담한다고 생각하시면 편할 것 같습니다.

기본적인 유지보수와 기술지원도 업체에서 해주니 상당히 편리합니다.



가상서버 호스팅(VPS)이란

가상서버 호스팅(Virtual Private Server Hosting, VPS)이란 이미 구축된 서버로부터 자원을 할당받아 사용하는 서비스입니다.

다시 말해, 서버에 필요한 물리적인 장비를 구매하거나 임대하지 않고도 독립적으로 서버를 관리하고 운영할 수 있는 상품입니다.


그림으로 쉽게 설명하자면 좌측(Physical World)과 같이 일반적인 서버 시스템은 하나의 물리적 서버에 하나의 OS와 App을 서비스하지만, (1:1)

VPS를 사용하면 우측(Virtual World)과 같이 하나의 물리적 서버에 여러 OS와 App이 자원을 나누되 독립적으로 운영하기에 경제적입니다. (n:1)


(이미지 출처 : 한국데이터통신, http://www.startit.co.kr/service/imagine.jsp)


단점도 존재합니다. VPS는 소수의 물리적인 서버를 여러 사람이 나눠쓰다 보니 불안정할 수 있습니다.

하지만 서버호스팅이나 코로케이션은 비용면에서 학습 목적으로 적합하지 않을 수 있습니다.


참고로 VPS와 비슷한 서비스가 요즘 대세(?)인 '클라우드'입니다.
클라우드는 가상서버와 달리 필요에 따라 자원 할당량(CPU/메모리/저장공간 등)을 유연하게 확장하거나 축소할 수 있다는 차이가 있습니다.



VPS 서비스 업체의 선택

가상서버 호스팅 서비스를 제공하는 다양한 회사들이 있고, 아래 링크처럼 일목요연하게 정리된 자료가 있습니다. (Lael님 블로그)

KOREA VPS 가상서버호스팅 목록 - https://laelbe.s3.amazonaws.com/blog/44/index.html 

필요에 따라 서비스 사양을 선택하시면 될 것 같습니다.


추후 필요하면 직접 홈 서버를 구축해서 포스팅할 생각입니다.



우분투 서버 준비

VPS 서비스를 신청하실 때, OS를 선택하게 됩니다.

보통 CentOS나 Ubuntu(우분투) 등의 선택지가 있습니다.

Shiny 패키지 정보들을 찾아보니, Ubuntu와 함께 기술된 Reference가 많아 우분투를 선택하였습니다.


#. VPS 서버 Root 접속

우선, Root란 윈도우 운영체제에서 관리자라고 보시면 됩니다. (가장 최상위 권한을 가지고 있는 계정)

서버에 아무런 세팅이 되어있지 않기 때문에, 우선 Root로 서버에 접속하셔야 됩니다.

뒤에서 다루겠지만, 나중에 보안을 위해 Root로의 로그인을 차단할 것입니다. (Brute-force Attack, 비밀번호 무작위 대입 공격에 대비)


서비스를 결제하시고, 세팅이 끝나면 해당 업체 사이트를 참고하시거나 고객센터를 통해 안내받아 'SSH'에 접속하시면 됩니다.

제가 사용하는 서비스 기준으로 접속 방법을 정리할까 했지만, 업체마다 서비스 방식이 다를 수 있음을 유의 바랍니다.


보통 우분투를 포함한 리눅스 서버는 'SSH' 프로토콜을 통해 접속해 운영, 관리합니다.

SSH는 무료 소프트웨어인 'Putty' 를 통해 접속할 수 있습니다.

일반적으로 윈도우 32bit 실행 파일을 사용하시면 됩니다 : https://the.earth.li/~sgtatham/putty/latest/w32/putty.exe

다른 버전은 공식 사이트(http://www.putty.org)에서 받아 사용하시면 됩니다.



Putty를 실행하시고, 'Host Name' 에는 업체로부터 발급받은 서버의 IP 주소를 적으시고, 'Port' 는 SSH 접속에 사용될 값을 적으시면 됩니다.



위와 같은 화면이 나오면 '예' 버튼을 누르시면 됩니다.



login as: 


라고 떴을 때 'root'라고 입력하시면, 아래처럼 연속으로 비밀번호 입력하라고 나옵니다.


login as: root

root@[서버 아이피]'s password: [비밀번호]


비밀번호를 입력하시고 [Enter] 키를 누르시면 위 캡처 화면처럼 접속이 됩니다.

참고로, 아무리 키보드를 두드려도 화면에 ***** 같은 글자나 반응이 안 나타납니다. (처음에 당황..)


#. 우분투 버전 확인

작성일('17.03.22) 기준 16.04가 최신의 'Long Term Support version (LTS)' 버전입니다.

안정적이면서 가장 최근에 배포된 버전이므로, 앞으로의 작업은 'Ubuntu Server 16.04'에서 이뤄질 것입니다.


여기서 하나 짚고 넘어가야 할 부분이 있습니다.


대부분의 리눅스 관련 자료들은 명령어를 입력할 부분에 '#'이나 '$'를 붙입니다.

이를 통해 독자는 '아, 명령어 입력 부분이구나!' 라고 인식하게 됩니다.


'#'은 Root 권한일 때를 의미하며, '$'은 일반 사용자인 상태를 의미합니다.


[아이디]@[서버명]:~

편의상 이 부분을 생략하고 바로 '#'이나 '$'를 적는 것이 보통입니다.


그리고, 저의 모든 포스팅에서는 진한 보라색을 직접 사용자가 입력해야 하는 부분의 표식으로 사용하겠습니다.



우선 설치된 우분투 OS의 버전을 다음 명령어로 확인해봅니다.


# lsb_release -a


No LSB modules are available.

Distributor ID: Ubuntu

Description:    Ubuntu 16.04.2 LTS

Release:         16.04

Codename:     xenial


만약 Release가 16.04 미만이면, 이 포스팅처럼 진행하다 문제가 발생할 수도 있습니다.

아래 링크를 참고해서 업데이트를 먼저 진행하시길 권장해드립니다. (do-release-upgrade 명령어로 간편하게 가능한 것 같습니다)


https://www.digitalocean.com/community/tutorials/how-to-upgrade-to-ubuntu-16-04-lts

https://help.ubuntu.com/lts/serverguide/installing-upgrading.html


아마 대다수의 VPS 업체가 최신버전의 우분투(OS)를 설치해줄 겁니다.



#. 작업용 계정 생성과 기본 보안 설정

Root는 모든 권한을 가지고 있는 계정이기 때문에 이를 직접 이용하는 건 매우 위험합니다.

보안 측면에서 큰 구멍을 하나 열어둔 것이나 마찬가지고, 관리상으로도 치명적인 실수가 발생할 수 있기 때문입니다.


가령 리눅스 시스템에서는 'rm'이 삭제 명령인데, 실수로 Root가 'rm -rf /' 라는 명령어를 내리면 최고관리자의 명령이기 때문에 군소리 없이 시스템의 모든 파일과 디렉터리를 삭제하는.. 대참사가 벌어질 수도 있습니다....

(비슷한 사례로 토이 스토리 2가 'rm *' 명령어로 전부 날아갈 뻔했다가 백업본이 있어서 겨우 살렸다는... https://youtu.be/8dhp_20j0Ys ..백업의 중요성..)


먼저, 다음과 같이 계정 생성 명령어인 'adduser'를 이용해 아이디를 만듭니다.


# adduser [사용할 아이디]


-- 생략 --


새 UNIX 암호 입력: [사용할 비밀번호]

새 UNIX 암호 재입력: [사용할 비밀번호]

passwd: password updated successfully

Changing the user information for [입력된 아이디]

Enter the new value, or press ENTER for the default

Full Name []: [엔터키 입력]

Room Number []: [엔터키 입력]

Work Phone []: [엔터키 입력]

Home Phone []: [엔터키 입력]

Other []: [엔터키 입력]

정보가 올바릅니까? [Y/n] [엔터키 입력]


가능한 비밀번호는 복잡한 것이 좋겠습니다. 영문자, 숫자, 특수문자를 포함해서 말이죠.

나머지는 필수 입력 사항이 아니므로 무시하고 엔터키를 입력했습니다.


다음으로, 방금 만든 계정이 관리자로서 작업을 수행할 수 있도록 권한을 부여해줍니다. (일반 계정은 기본적으로 관리자 권한이 없습니다.)


# usermod -aG sudo [생성한 아이디]


Putty와 같은 SSH 접속 프로그램을 하나 더 켜서 서버에 재접속합니다.

이번엔 Root가 아닌 방금 생성한 계정으로 접속합니다. (만약 접속되지 않는다면 기존에 root로 접속했던 창에서 다시 작업합니다.)


그 다음, 외부에서 Root로 바로 접근을 시도하지 못하도록 하는 등의 보안 설정을 진행합니다.


$ sudo vim /etc/ssh/sshd_config 

[sudo] password for [아이디]: [비밀번호 입력]


'sudo' 명령은 Root 권한으로 이어지는 명령을 수행하라는 뜻입니다. 이런 방식으로 관리자 권한을 부여한 계정에서 서버를 관리할 수 있습니다.

'vim' 명령은 윈도우의 메모장과 같은 프로그램으로 이어지는 경로의 파일을 수정하겠다는 의미입니다.


위 명령을 수행하면 편집 창이 나타납니다. 키보드의 [Insert] 키를 눌러 수정 모드로 변경합니다. (그래야 편집이 됩니다)

그 다음, 아래에 해당하는 부분을 찾아 값을 변경합니다. 다른 문구들은 손대지 않습니다.


# 로그인을 기다리는 시간(초). 로그인 시도 중 설정한 시간이 지나면 자동으로 접속이 종료된다.

LoginGraceTime 10


# SSH를 통한 Root 접속 가능 여부 설정. 특별한 사유가 아니면 no로 설정하고 변경하지 않는다.

PermitRootLogin no


# SSH 접근을 허용할 계정 목록. 기재된 아이디 외에는 차단된다.

AllowUsers [생성한 아이디]


'#' 은 R 언어와 마찬가지로 주석의 기능을 합니다.

저의 경우 3가지 중 상위 두 옵션은 이미 적혀있어 뒤에 옵션만 수정했고, 마지막은 아예 없어서 새로 타이핑했습니다.


편집을 마친 후, ①키보드 [Esc] 키를 누른 다음 ②[:] 키를 누르고 (Shift + ;) ③[w] 키를 누른 후 ④[Enter] 키를 누르면 저장됩니다.

그다음, ①키보드 [Esc] 키를 누른 다음 ②[:] 키를 누르고 (Shift + ;) ③[q] 키를 누른 후 ④[Enter] 키를 누르면 편집기를 종료합니다.


다음 명령어를 입력해 SSH 서버를 재시작합니다.


$ sudo service ssh restart


다시, SSH 접속 프로그램을 하나 더 켜서 root 아이디로 접속을 시도해봅니다. 불가능해야 정상입니다.

그다음, 하나 더 켜서 생성한 아이디로 접속을 시도합니다. 가능해야 정상입니다. 만약 불가능하다면 맨 처음에 root로 접속한 창에서 다시 작업합니다.


이제 방화벽을 활성화해 서버의 보안을 강화합니다.


$ sudo ufw app list


사용 가능한 프로그램:

  Apache

  Apache Full

  Apache Secure

  OpenSSH


제가 사용하는 업체의 경우 Apache와 OpenSSH가 등록 가능한 규칙으로 설정돼 있네요.

우선 가장 기본적으로 서버 관리에 필요한 SSH를 허용합시다.


$ sudo ufw allow OpenSSH


그 다음으로 SSH 접속에 무작위 대입 공격(Brute-force Attack) 방어 규칙을 다음과 같이 적용합니다.


$ sudo ufw limit ssh


이제 방화벽 설정을 마쳤으니, 다음과 같이 방화벽을 활성화함으로써 허용된 서비스 외에는 차단해 보안을 강화합니다.


$ sudo ufw enable


방화벽이 제대로 동작하는지 확인합니다.


$ sudo ufw status


상태: 활성



목적                         동작          출발

--                         --          --

22                         LIMIT       Anywhere                      

22 (v6)                    LIMIT       Anywhere (v6)


SSH는 기본적으로 22번 포트를 사용합니다. 위 결과와 같이 나온다면 제대로 설정이 된 것입니다.



#. 우분투 한글 Locale 설치하기

향후에 R에서 한글 지원이 잘 되도록 우분투에 한글 Locale 을 설치하겠습니다.

먼저, 내 서버의 Locale이 어떤지 확인해 봅시다.


locale


LANG=en_US.UTF-8

LANGUAGE=en_US.UTF-8

LC_CTYPE="en_US.UTF-8"

LC_NUMERIC="en_US.UTF-8"

LC_TIME="en_US.UTF-8"

LC_COLLATE="en_US.UTF-8"

LC_MONETARY="en_US.UTF-8"

LC_MESSAGES="en_US.UTF-8"

LC_PAPER="en_US.UTF-8"

LC_NAME="en_US.UTF-8"

LC_ADDRESS="en_US.UTF-8"

LC_TELEPHONE="en_US.UTF-8"

LC_MEASUREMENT="en_US.UTF-8"

LC_IDENTIFICATION="en_US.UTF-8"

LC_ALL=en_US.UTF-8


위처럼 영문이 기본적으로 설치, 설정되어 있음을 알 수 있습니다.

아래와 같이 한글 패키지를 설치합니다.


$ sudo apt-get install language-pack-ko


-- 생략 --

Do you want to continue? [Y/n] [Y 입력 후 Enter]


그 다음, 한글 Locale을 생성합니다.


$ sudo locale-gen ko_KR.UTF-8


Generating locales (this might take a while)...

  ko_KR.UTF-8... done

Generation complete.




마치며

기본적인 우분투 서버 세팅을 마쳤습니다.
이제 전 세계의 모든 사람이 인터넷으로 내 서버에 접근할 수 있게 된 것입니다. (아직 아무것도 없지만)

다음 과정은 여기에 R 서버를 설치해보겠습니다.

사실, SSH 접속에 Public Key Authentication을 사용하고 비밀번호를 통한 접근을 차단하는 추가적인 보안 강화 방안도 있습니다.
아래 참고 문헌 가장 첫 번째 링크를 참고하시면 설정하실 수 있습니다.


포스팅 내용에 오류가 있거나, 궁금한 사항 등이 있으시면 코멘트 주세요.

읽어주셔서 감사합니다.



참고 문헌

https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04

https://help.ubuntu.com/community/CheckingYourUbuntuVersion

https://namu.wiki/w/rm%20-rf%20/#s-4

데이터 분석 결과를 웹에 반응형으로 시각화하기

- Ubuntu Server와 R, Shiny 패키지 -


포스팅을 시작하며

데이터 분석 결과를 웹에 반응형으로 시각화하는 과정을 정리해보려 합니다.


통계학을 전공하면(학교 커리큘럼마다 조금씩 다를 수 있으나) 일반적으로 교과서에 있는 예제 데이터에서 시작해 공공데이터, 오픈 데이터, 직접 수집한 데이터, 분석 공모전이나 대회의 데이터까지 다양한 분석 프로젝트를 수행하게 됩니다.

그런데 그렇게 고생한 프로젝트를 리포트로 제출하거나, 발표 PT가 끝나면 말 그대로 끝나버리는.. 아쉬움이 항상 있었습니다.


'우리끼리 고생했다, 잘했다, 이거는 이렇게 해보면 좋았을 것 같다'로 머물지 말고,

분석 결과를 외부와 공유하고 피드백을 주고받을 수는 없을까?


여러 가지로 알아보니 R과 Shiny 패키지를 이용해 웹에 반응형으로 시각화하면 재밌을 것 같았습니다.

아래 예제처럼 말이죠. (매우 어려울 것 같지만..)



https://shiny.rstudio.com/gallery/superzip-example.html


저와 같이 통계학 전공자거나 데이터 분석에 관심이 있다면, 이런 멋진 일을 한 번쯤은 상상해보셨을 겁니다.


이를 위해서는 사람들이 외부에서 물리적으로 접근 가능한 '서버'를 구축해야 합니다.

그리고 분석 결과를 RStudio의 Shiny 패키지로 시각화할 줄 알아야겠지요.


서버나 웹 프로그래밍 등은 전공분야가 아니라서 '도전적인' 일이 될 것 같습니다.





서울 치킨집 폐업 예측모형 (ver. 1.02) 

Prediction of the Closure of Chicken Places in Seoul


Interactive Visualization : http://analytics.hyeongeun.com/chicken_place



[ Changes ]


#. ver 1.02

 - 38th slide was added.

 - Today, I am building interactive visualization of this project.

   You can predict your candidates of starting chicken place via my website on trial.

   http://analytics.hyeongeun.com/chicken_place


#. ver 1.01

 - Title in 1st slide was edited.

 - ANN's accuracy was edited in slide 33 and 35 since the accuracy chart had been wrong. (it was the result of previous analysis)

 - The final model of negative condition was changed to ANN.


-----


흥미로 진행하던 연구를 데이터마이닝 수업 과제로 제출하면서 정리했습니다. 

영어를 잘하지 못해 설명을 제대로 못 넣었습니다. ㅜㅜ (국제어 수업..)

부족하지만, 발표 PT를 공유합니다. 


데이터를 수집, 정제하고 가공하는데 많은 공을 들였습니다. 

덕분에 마감이 다가와(..) 깊은 고민과 분석을 못 한 채 제출해서 아쉽습니다. 


현재도 계속 공부하면서 분석을 업그레이드하고 있습니다.



An Introduction to Statistical Learning (ISL)을 공부하면서 조금씩 정리해보려고 합니다.

책은 http://www-bcf.usc.edu/~gareth/ISL/ 에서 받아보실 수 있습니다.


사실 학부 수업 때 배운 교재라, 순서를 무시하고 개인적으로 필요한 부분을 먼저 올릴 계획입니다.


잘못된 부분의 지적이나 질문 등 언제나 환영합니다. 함께 공부해요. :)




작성 중 : ISL Chapter 6 - Linear Model Selection and Regularization (선형 모형 선택과 축소)

+ Recent posts