데이터과학을 위한 수학복습(2)

이번에는 벡터의 내적(inner product)에 관해 알아보자.

원점 O에서  와 같은 벡터 를 만들 때 를 벡터 가 이루는 각이라고 한다.

 

일 때, 벡터 와 벡터 는 수직이라고 하며 기호 로 나타낸다.

벡터의 시작점을 원점으로 할 때 벡터의 끝점의 좌표를 벡터의 성분이라고 하며,

 혹은 로 표시한다. 이 때 벡터 의 크기(길이)는 ,  의 크기는 이다. 이 크기를 벡터의 노름(norm)이라고도 한다.

이 경우 벡터의 내적(혹은 스칼라적)은 다음과 같이 정의된다.

두 벡터의 크기(벡터의 크기는 절대값 기호로 나타냄)의 곱에 사이각의 코사인 값을 곱한 것이다. 기호로는  또는 로 나타낸다. 즉,

벡터의 내적은 아래와 같이 벡터의 성분을 사용하여 나타낼 수 있다.

평면벡터 에 대하여

그리고 내적의 정의에 의하여

두 벡터 사이 각의 코사인 값은 두 벡터의 내적을 두 벡터의 크기의 곱으로 나눈 값이다. 영벡터가 아닌 두 벡터 의 내적이 0이면, 두 벡터는 직교(orthogonal)한다(혹은 수직이다)고 말하고 라고 표시한다.

이 코사인 값은 두 벡터의 상관성을 측정하는 코사인 유사도(cosine similarity)라는 척도에 바로 적용된다. 온라인 서점의 예를 보자.

위 그림에서 사용자 1은 책을 {B,C,B} 순으로 살펴보았고, 사용자 2는 책을 {C,A,B} 순으로 살펴보았을 때, 만약 사용자 3이 들어와서 책 A를 살펴보고 있다면, 그에게 어떤 책을 추천하면 좋을까?

온라인 서점은 사용자들의 클릭 혹은 검색 행태에 관한 데이터를 가지고 책들 사이의 상관성을 파악해 둔다. 그리고 만약 어떤 새로운 사용자가 들어와서 특정한 책을 살표보면 온라인 서점(의 컴퓨터)는 그 책과 상관성이 가장 높은 책(들)을 추천한다. 그 때 코사인 유사도가 사용될 수 있다.

온라인 서점은 사용자들의 검색 데이터를 가지고 품목(책) 대 품목(책) 행렬을  구한다. 그러면 각 책은 행벡터를 갖게 된다. 책 A는  , 책 B는  등의 행벡터를 갖는다. 그러면 책 A와 책 B 사이의 코사인 유사도는 위에서 소개한 사이각의 코사인 값을 구하는 공식으로 계산될 수 있다.

여기서 분자인 의 내적은 (0*1 + 1*0 + 1*2 + 0*0) = 2이다. 분모인 두 벡터의 크기와 크기의 곱은 아래와 같다.

따라서  책 A와 책 B의 코사인 유사도는,

다른 두 책들 사이의 코사인 유사도도 동일한 방법으로 계산할 수 있다. 온라인 서점의 컴퓨터는 책 A와 코사인 유사도가 가장 큰 책을 추천할 것이다.

 

Excel로 하는 미래 예측(4): 시계열 예측

지수평활화법(FORECAST.ETS)는 3차 평활화를 수행한다. 데이터 추동 예측에서 소개한 지수평활화가 1차 평활화라고 한다면 두 차례 더 평활화를 거치는 함수이다. ETS는 Exponential Triple Smoothing의 머리글자이다. 지수평활화(exponential smoothing)가 백색 소음을 잡아주는 평활화라고 한다면 2차 평활화는 추세(trend)를 반영하고, 3차 평활화는 계절성(seasonality)을 반영한다. 수식으로 표현하면 다음과 같다.

1차 지수 평활화는,

는 측정된 시계열 데이터이고, 는 예측된 시계열 데이터(시간 t에서 평활화된 값)이다. 전 시구간에서 예측된 값의 오류를 다음 시구간 값을 예측할 때 일정한 비율()로 반영해 주는 식이다.

2차 지수 평활화는 다음과 같이 표현될 수 있다.

 시점 t에서의 추세(trend)에 대한 최적의 추정치

는 기본 요인(base factor) 혹은 데이터 평활화 요인(data smoothing factor)으로 불리며  이다. 는 추세 평활화 요인(trend smoothing factor)라고 불리며  이다. 를 넘어서 예측하려면 다음 공식을 사용한다.

3차 지수평활화(multiplicative의 경우)는 아래와 같이 계산된다.

: 계절적 조정 요인의 시퀀스(the sequence of seasonal correction factors). 그것은 관찰이 진행 중인 사이클에서 어느 시점 t mod L에서 예측된 추세의 예상된 비율이다.

L: 계절적 변동 주기(cycle)의 길이

는 계절적 변동 평활화 요인(the seasonal change smoothing factor)이며,  를 넘어서 예측하려면 다음 공식을 사용한다.

지수평활법을 이론적으로 이해하기는 다소 어렵지만 엑셀로 실행하는 것은 쉽다. 아래 그림에서처럼 예측값을 넣으려는 셀에 =FORECAST.ETS를 치고, 예측시점(여기서는 A38), 표적변수 데이터(B2:B37), 관찰한 시점들(A2:A37)을 넣어주면 된다.

그 이후 여러 시점들에 대해 예측하려면 그 수식을 복사하면 된다.  값을 구하려면, 셀에 =FORECAST.ETS.STAT(B2:B37,A2:A37,1)을 넣으면 된다.  값은 =FORECAST.ETS.STAT(B2:B37,A2:A37,2)을,  값은 =FORECAST.ETS.STAT(B2:B37,A2:A37,3)을 넣으면 된다. 계절성 주기(L)를 알아내려면 =FORECAST.ETS.SEASONALITY(D2:D51,A2:A51)을 넣으면 된다. 이렇게 계산된 계절성 주기는 6이고, 알파 값은 0.126, 베타는 0.001, 감마도 0.001이다.

이상으로 표적변수의 시계열 데이터만으로 예측하는 시계열 예측(time series forecasting)의 다양한 모형과 함수를 이해하면서 엑셀로 구현해 보았다. 아마도 그 정도만 구현할 수 있으면 현업의 실무적 요구에 잘 대응할 수 있으리라 생각된다.

미래 예측이 어렵다면 그것은 도구의 문제가 아니라 상상력, 혹은 이론과 학습의 부족에서 먼저 그 원인을 찾아야 하지 않을까. 다행한 점은 고등학교 정도의 수학만 잘 구사할 수 있으면 대부분의 문헌과 강의를 이해할 수 있다는 것이다.

엑셀이 시계열 예측만 도와주는 것이 아니다. 선형회귀와 같은 지도학습모형에 의한 예측도 수행하게 해준다. 추가기능(add-ins)을 이용하면 유용한 미래 예측을 해낼 수 있다. 다음에는 그 가능성을 살펴보겠다.

Excel로 하는 미래 예측(3): 시계열 예측

지난 포스팅에서 시계열 예측 중 데이터 추동 예측을 소개했다. 이번에는 모형 추동 예측을 살펴보자. 표적 변수의 과거 데이터에 의존해서 미래를 예측한다는 점은 데이터 추동 예측의 경우와 동일하지만 모형 추동 예측은 단지 개별적 데이터들의 집합에만 의존하는 것이 아니라 데이터들로 만들어지는 변동의 형태를 미래 예측에 반영하는 방법이다. 예컨대 변동이 선형(linear)이라는 점을 고려할 수도 있고 아니면 변동의 주기성–계절적 부침이라고 한다–이나 상향적 경향–추세라고 한다–을 고려할 수도 있다.

아래 그림들을 보면, (a)의 경우는 주기성이 분명해 보이고 (b)의 경우는 주기성이나 트렌드가 보이지 않는다. (A)의 경우는 주기성을 반영해서 미래를 예측한다면 오류를 줄일 수 있을 것이다.

모형 추동 예측에서 가장 널리 쓰이는 것은 선형회귀 모형이다. 시계열 예측의 선형회귀 모형은 크게 두 가지를 생각할 수 있다. 하나는 시간(시구간)을 예측변수로 갖는 모형–단순회귀모형, 다른 하나는 표적변수의 과거값을 독립변수로 갖는 모형–자기회귀모형이다.

데이터에 계절성(seasonality)이 있으면 단순회귀모형의 적합 결과가 좋지 않다(위 그림 참조).  단순회귀모형의 그런 단점을 개선하는 데는 두 가지 방법이 있다. 하나는 다항회귀(polynomial regression)를 사용하는 방법이다. 시구간의 2차항이나 3차항을 추가하거나 사인, 코사인 함수를 포함한 항을 추가하여 다항회귀모형을 만든다.

다른 하나는 계열 데이터의 각 시구간에 더미변수를 도입하는 방법이다. 만약 12개의 시구간이 있다면 11개의 더미변수를 도입하면 된다(12월은 기준 범주가 되어 더미변수가 생략된다). 시간 변수를 포함해서 모두 12개의 독립변수를 지닌 회귀모형이 되며 각 더미변수는 계절성을 포착한다. (아래 그림 2개 참조)

자기회귀모형(Autoregressive model, AR 모형)은 지연 계열(lag series)에 적용되는 회귀모형이다. 측정된 데이터가 1년씩 미룬 지연(lag) 데이터 혹은 2년 지연 계열, 3년 지연 계열 등과 상당한 정도의 상관관계를 가지는 경우 자기상관관계(autocorrelation)이라고 부르며 예측과정에 활용할 수 있다. 자기상관이 존재할 때 자기회귀모형을 적용하는 것이 하나의 해법이 된다. 자기회귀 모형의 일반식은 다음과 같이 표시될 수 있다.

1차 지연계열 데이터만을 가진 자기회귀모형을 AR(1), 2차 지연계열 데이터를 가진 자기회귀모형은 AR(2) 등으로 표시한다(아래 그림 참조).

지연계열 데이터를 만드는 방법은 간단하다. 아래 그림에서처럼 원 데이터를 복사해서 한 칸(여기서는 1개월)을 아래로 내리거나(Lag_1), 두 칸을 내리거나(Lag_2), 세 칸을 내리면 된다(Lag_3). 아래 사진에서처럼 공통의 데이터(노란색 부분)를 가지고 상관관계를 구하거나 회귀모형을 적합하면 된다.

아래 그림에서 보듯이 Yt와 Lag_1의 자기상관은 0.487451, Yt와 Lag_2의 자기상관은 -0.13216, Yt와 Lag_3의 자기상관은 -0.45576으로, 자기회귀모형의 적합이 필요함을 시사한다. 상관분석과 회귀분석은 모두 엑셀의 데이터-데이터분석 기능을 사용해서 수행하였다. 회귀분석 결과를 보면, 결정계수가 0.7557로 위에서 본 단순회귀모형의 결정계수 0.1798보다 크게 향상되었다.

AR 모형은 정상 시계열 데이터(stationary time series data)인 경우에만 사용 가능하다. 정상 시계열 데이터란 추세(trend)와 계절성(seasonality)이 없고 백색 소음(white noise)만 있는 시계열 데이터이다(아래 그림 참조).

이 조건이 충족되기가 보기만큼 까다롭지는 않다. 약간의 변형만 가하면 비정상 시계열 데이터를 정상 시계열 데이터로 전환할 수 있기 때문이다.

정상성(stationarity)을 확보하는 흔한 방법은 차분(differencing)을 이용하는 것이다. 차분이란 아래 식처럼 금년도 값에서 전년도 값을 뺀 것을 말한다.

만약 그렇게 차분을 해서도 정상성을 확보하지 못하면  아래 식처럼 다시 한번 차분을 할 수 있다(제2차 차분, 차분 차수가 2).

비정상 시계열 데이터의 경우 차분을 사용하지 않고 엑셀이 제공하는 지수평활법 함수를 사용해도 좋다. 2016 엑셀은 예측 함수를 4가지 제공한다. 시구간만을 독립변수로 갖는 단순선형회귀 예측을 계산하는 함수인FORECAST.LINEAR, 지수평활법 예측을 계산하는 함수 FORECAST.ETS, 지수평활법의 95% 신뢰구간을 보여주는 FORECAST.ETS.CONFINT, 계절성의 주기를 보여주는 FORECAST.ETS.SEASONALITY, 세 가지 계수를 보여주는 FORECAST.ETS.STAT를 제공한다.

사용법은 간단하다. 단순선형예측의 경우 예측하려는 셀에 =FORECAST.LINEAR를 치고, 예측하는 날짜(여기서는 A38), 표적변수 데이터(여기서는 B2:B37), 데이터가 있는 날짜(여기서는 A2:A37)를 입력하면 된다. 그리고 그 이후 날짜에 대한 예측을 추가하려면 그 수식을 복사하면 된다. 지수평활법도 마찬가지이다.

FORECAST.ETS는 편리한 함수이나 약간 자세한 설명이 필요함으로 다음 포스팅에서 독립해서 다루겠다.

Excel로 하는 미래 예측(2): 시계열 예측

미래 예측에는 다양한 유형이 있을 것이다. 우선 미래를 하나의 가능성으로 바라보는 경우 — 예측(forecasting)과, 미래를 여러 가지의 가능성으로 바라보는 경우 — 시나리오 플래닝(scenario planning)이라는 유형으로 나눌 수 있을 것이다. (미래 예측에 관한 본 블로그의 다른 글을 참조할 것) 그리고 예측은 단기 예측장기 예측으로 나눌 수 있을 것이며, 예측 변수(predictors)가 몇 개냐에 따라서 나눌 수도 있다. 예측되는 표적 변수(target)의 과거 데이터만을 가지고 하는 시계열 예측(time sceries forecasting)과, 하나 이상의 예측 변수를 사용하는 지도학습 모형 예측(supervised learning model forecasting)으로 나눌 수도 있을 것이다. 그 밖에도 선형예측(linear forecasting)비선형 예측(non-linear forecasting), 시뮬레이션(simulation)실데이터 예측(real data based forecasting)으로 나눌 수도 있을 것이다.

이번 포스팅에서는 엑셀을 가지고 표적 변수의 과거 데이터만으로 수행하는 시계열 예측을 시도해 보자. 시계열 예측은 특정한 변수의 값이 과거의 시간의 흐름에 따라 어떻게 변화했는지를 알고 있다는 가정 아래 그 변수가 미래에 가질 값을 예측하는 데 관심을 둔다. 때문에 시간적 요소가 중요하다. 예컨대 주가나 날씨가자주 그러한 방법으로 예측된다.

시계열 예측에는 데이터 추동 예측(data-driven forecasting)과 모형 추동 예측(model-driven forecasting)이 있다. 데이터 추동 예측은 예측 변수와 표적 변수 사이의 구분이 없는 시계열 분석 방법이다. 예측변수는 동시에 표적 변수이다. 데이터 추동 예측에는 평균화(averaging) 또는 평활화(smoothing) 같은 기법이 사용된다. 모형 추동 예측은 독립변수와 종속변수를 포함한다. 그런데 독립변수가 시간(time). 가장 간단한 방법은 다음과 같은 형식을 지닌 선형회귀모형이다.


위의 식에서 y(t)는 시간 t에서의 표적변수의 값이다. 학습용 데이터가 주어지면 미래의 y 값을 예측하기 위해서 계수 a와 b를 추정한다.

먼저 데이터 추동 예측부터 알아보자. 엑셀로 구현하기 전에 개념적인 설명이 필요하다.

기본 개념: 시계열 예측에서는 시구간(time period)이라는 개념이 중심이다. 시구간은 문제에 따라 초, 일, 주, 월, 분기, 년 따위의 단위를 갖는다. 그리고 시구간에 대응하는 데이터 계열(time series)인 이 있고, 또한 시계(horizon)에 대한 예측(forecast)으로 라고 표기하며, n 이후 h번째 시구간에 대한 예측을 의미한다. 보통 h=1인데 그것은 마지막 데이터 포인트 직후의 시구간을 말한다. 그러나 h는 1보다 클 수 있다. 끝으로 주어진 시간 t에 대하여 예측 오류(forecast error)  가 있다.

(1) 단순 예측(naive forecast): 계열의 다음 시구간에 대한 예측 즉, 은 계열에서 마지막 데이터 포인트 와 같다고 추정된다. 식으로 표시하면,

(2) 단순 평균: 다음 시구간의 데이터 포인트를 계열의 모든 데이터 포인트의 평균으로 계산한다.

1월부터 12월까지 월간 데이터가 있다면, 다음 해 1월(n+1)의 값을 예측하기 위하여, 간단하게 1월(n=1)부터 12월(n=12)까지의 값을 평균한다.

(3) 단순이동평균(simple moving average, SMA): 단순 평균은 한 시점에서 측정치들의 평균을 가리키나 시간이 들어간 측정치들의 평균에는 이동평균을 사용한다. 시간이 흐름에 따라 측정치가 어떻게 변화되었는지를 알고 싶기 때문이다. 동일한 시구간을 잡아서 각 기간에서의 측정값들의 평균을 구한다. 이것을 단순이동평균이라고 부른다. 2일 이동평균, 5일 이동평균, 10일 이동평균, 50일 이동평균 등등. 시구간이 짧아지면 원 데이터와의 차이가 없어진다. 

만약 5일 이동평균을 계산한다면, 첫 4일은 이동평균이 없고, 5일째 되는 날 측정값의 첫 이동평균을 갖는다. 그 다음부터는 하루씩 더해진 날짜들에 해당되는 측정값들의 이동평균을 갖게 된다. 만약 25일 동안의 5일 이동평균을 구하면, 20개의 이동평균을 갖게 될 것이다.

(4) 가중이동평균(Weighted Moving Average, WMA): SMA에는 항상 현재의 측정값과의 차이가 존재한다. 이 차이를 줄이는 대안이 WMA이다. 어떤 경우에는 가장 최근의 값이 이전의 값들보다 더 큰 영향을 미친다. 대부분의 지수적 증가가 이러한 효과 때문에 발생한다. 다음 구간의 예측은 다음과 같은 모형으로 계산할 수 있다.

위 식에서 이며, 일반적으로 이다. 

(5) 지수이동평균(Exponential Moving Average, EMA): EMA는 WMA의 한 유형이다. EMA에서는 가중승수(weighting multiplier)를 사용한다.  가중승수는 로 구할 수 있다. n은 시구간의 크기이다. 만약 2일 이동평균이라면 가중승수는 2/3(2+1)이다. 시구간이 길어지면 가중승수가 작아진다.

EMA는 다음 공식으로 구할 수 있다.

  • EMA={(금일 종가 – 어제의 EMA)*가중승수}+어제의 EMA

이 식을 곰곰히 살펴보면, 어제 범한 예측오류(금일 종가 빼기 어제의 EMA)에 가중 승수를 곱하고, 그것을 어제의 예측값(EMA)에 더해 오늘에 대한 예측(EMA)로 사용한다는 의미이다.

  • 최초 EMA = 첫 계산 기간의 SMA

(6) 지수 평활화(exponential smoothing): 평활화(smoothing)의 정신은, 어떤 변수의 매일 매일의 변동에는 신호와 소음이 함께 포함되어 있기 때문에 트렌드를 발견하기 위해서는 소음을 제거함이 바람직하다는 것이다. 그런 의미에서 앞에서 서술한 이동평균들도 평활화 기법이다. 그런데 지수 평활화는 아예 평활화를 이름으로 달고 있다.

 지수평활화는 다음 시구간의 값을 예측하기 위해 이전 시구간의 예측값을 사용한다. 그런데 이전 시구간 예측에서 예측오류가 났으면 그 오류를 다음 시구간 예측에 일정 정도 반영해 주는 방법이다. 만약 예측이 지나쳤으면 이번 예측에 일정한 값을 감해서 다음 번 예측에 투입하고, 예측이 낮았으면 이번 예측에 일정한 값을 더해서 다음 번 예측에 투입한다.

 

(1)식을 아래와 같이 바꾸어 쓸 수 있다. 그러면 다음 시구간 값()이 전년도의 예측값()에, 전년도의 예측오류()에 가중치()를 곱한 값을 더한 결과라는 점이 분명해진다.   

지수평활화를 이용해서 월간 예측을 한다면, 2월의 예측값을 구하기 위하여 1월의 실제값뿐 아니라 1월에 대한 예측값을 사용한다.  위의 식에서 가중치  는 일반적으로 0과 1 사이의 값을 갖는다. 가 0에 가까우면 다음 시구간의 예측값은 이전 예측값과 유사하고, 가 1에 가까우면 다음 시구간의 예측값은 이전 실제값과 유사해 진다. 가 1이라면 위에서 소개한 단순예측이 된다. 에 대한 일반적인 값은 경험적으로 0.2부터 0.4 사이의 값이다.

엑셀을 사용해서 데이터 추동 예측 다섯 가지 방법(단순 평균 제외)을 하나의 사례에 적용해 보자. 아래 엑셀 자료는 어느 기업이 13개월 동안 달성한 월별 매출액(단위 백만원)이다. 

단순예측은 금월 매출액을 다음 달 예상 매출액으로 잡는다. 12월의 실제 매출액 720억4천5백만원(B3)이 1월의 예상 매출액(C4)가 되었으며, 1월의 실제 매출액(B4)은 2월의 예상 매출액(C5)가 되었다. 이하 마찬가지이다.

D열에 있는 3월 이동평균(SMA(3))은 12월, 1월, 2월의 실제 매출액을 평균하는 값(=AVERAGE(B3:B5))으로 63,304.33(D6)이다. 4월 SMA(3)(D7)은 (=AVERAGE(B4:B6))이고, 5월 SMA(3)(D8)은 (=AVERAGE(B5:B7)이며, 이하 동일한 방식으로 계산된다.

E열의 3월 가중이동평균(WMA)을 구하는 데는 세 개의 가중치가 필요하다. 시구간의 첫월에 대한 가중치는 0.2, 둘째월에 대한 가중치는 0.3, 셋째월에 대한 가중치는 0.5이다. 현재에 가까워질수록 더 큰 가중치를 주고 있다. 3월 WMA(3)(E6)은 (=B5*$E$19+B4*$E$18+B3*$E$17)로 계산된다. 4월 WMA(3)(E7)은 (=B6*$E$19+B5*$E$18+B4*$E$17)로 구할 수 있다. 이하 동일한 방식으로 계산된다.

F열의 3월 지수이동평균(EMA)을 구하려면 먼저 가중승수를 구해야 한다. 시구간이 3이므로 가중승수는 2/(3+1)=0.5이다. 첫번째 EMA(3) 값(F6)은 3월의 SMA(3) 값과 동일하다. 두번째 EMA(3) 값(F7)은 (=0.5*(B7-F6)+F6)로 구해진다. 실제값에서 예측값을 뺀 예측오류에 가중승수 0.5를 곱하고 그것을 예측값에 더하면 된다. 세번째 EMA(3) 값(F8)은 (=0.5*(B8-F7)+F7)로 구하면 된다. 이하 동일한 방식으로 계산된다. 

G열의 지수평활화(exponential smoothing)를 구하려면 가중치 Alpha가 필요하다. 여기서는 임의로 Alpha=0.3이라고 하자. 첫번째 지수평활화의 1월 예측값(G7)은 12월의 실제 매출액을 가져온다. 2월 예측값(G5)은 ( =$G$17*B4+(1-$G$17)*G4)로 구해진다. 3월 예측값(G9)은 (=$G$17*B5+(1-$G$17)*G5)로 구할 수 있다. 이하 동일한 방식으로 구해진다.

이 서로 다른 예측 평활화들을 어떻게 평가할까? 한 가지 방법은 오류를 비교하고 가장 작은 오류를 낸 기법이 이 데이터에 가장 잘 맞는 방법으로 간주될 수 있을 것이다.

통계학의 분산분석이나 회귀분석에서 오류를 실제값과 예측값의 차이(즉, 오차)의 제곱(보다 정확히는 오차 제곱의 평균)을 이용하여 모형 검정값을 측정한다. 마찬가지로 시계열 예측에서도 오류의 크기를 예측오류의 제곱의 평균(Mean Squared Errors, MSE)로 측정할 수 있다. 위 다섯가지 예측 평활화의 MSE가 아래와 같다.

MSE의 크기가 SMA(3)가 가장 크고(95,175,919), EMA(3)가 가장 작음(23,599,945.7)을 알 수 있다. 즉, 이 사례에서는 EMA(3)가 가장 정확한 예측값을 내고 있다는 것이다. 흥미 있는 사실은 금년도 실제 매출액으로 내년도 매출액을 예상하는 단순예측의 성능도 그다지 나쁘지 않다는 점이다.

Excel로 하는 미래 예측(1): 가상분석(What-If Analysis)

미래 시나리오(scenarios) 자체가 ‘이론(theory)’ 없이 데이터만으로 고안될 수는 없다. 예컨대 내년도 경기 전망 시나리오는 경제 이론에 기반해서 만들어지고 남북한 관계 시나리오는 정치 이론에 기반해서 만들어 진다. 아직까지 어떤 컴퓨터 소프트웨어도 그러한 시나리오를 개발하지 못한다. 언젠가 도메인 이론, 시나리오 개발 방법론, 그리고 데이터를 충분히 입력해주면 AI가 그러한 시나리오를 개발해 낼 수 있겠지만 아직 시나리오 개발은 인간의 영역이다.

하지만 일단 시나리오가 주어지면 그것에 기반한 예측은 엑셀로 구현된다. 엑셀 상단 메뉴 중 ‘데이터’ 하위 메뉴에 가상분석(what-if analysis)을 이용하면 된다.

어떤 서점이 있다고 하자. 그 서점에 A라는 책 100권이 들어왔다. 그 책은 모두 정가에 팔릴 수도 있고 일부가 세일 가격에 팔릴 수도 있다. 그에 따라 기대 수익이 달라질 것이다. 만약 60%가 정가에 팔리고 그 때 권당 수익이 3천원이며, 나머지 40%가 세일 가격에 팔리고 그 때 권당 수익이 1천원이라면 A를 판매한 총수익은 22만원일 것이다. 그런데 정가에 판매되는 비율을 70%, 80%, 90%, 100%로 올리면 총수익이 어떻게 달라질까? 이러한 다양한 시나리오를 엑셀을 가지고 보여줄 수 있다.

먼저 기본 정보와 계산식을 가지고 데이터 시트를 작성한다(아래 그림 참조). 그림에서 C6 셀에는 =B3*C3을 넣고, C7 셀에는 =B3*(1-C3)를 넣는다. 총수익이 표시되는 D9에는 =(C6*D6)+(C7*D7)을 넣는다. 그런 다음 상단 메뉴에서 데이터-가상분석-시나리오 관리자를 연다.

위 창이 열리면 오른편 상단의 추가 단추를 눌러서 시나리오를 정의한다. 먼저 60%가 정가로 팔리는 시나리오를 “60% 정가”로 이름 붙이자. 변경 셀은 $C$3를 넣는다. 고정주소로 표기하자. 그리고 확인 단추를 누르면 변경 셀에 해당하는 값을 입력하라는 메시지가 뜬다. 0.6을 넣고 확인. 그러면 아래 그림처럼 60% 정가라는 시나리오가 정의되어 있을 것이다.

동일한 방식으로 70% 정가, 80% 정가, 90% 정가, 100% 정가 시나리오를 추가한다. 그러면 아래처럼 다섯가지 다른 시나리오가 정의될 것이다.

위 창에서 표시를 누르면 선택된 시나리오에 따라 계산 총수익이 표시된다. 예컨대 70% 정가를 선택하고 표시를 누르면 원래의 데이터 시트가 아래처럼 변할 것이다. 70%가 정가에 팔리면 총수익이 24만원이 된다.

이 시나리오들에 의해 예상되는 총수익을 한꺼번에 보여줄 수 있는 기능이 ‘요약’이다. 시나리오 관리자 창에 있는 요약 버튼을 누르고 시나리오 요약 창이 뜨면 보고서 종류를 선택하고 결과 셀에 $D$9을 넣는다. 그러면 아래 그림처럼 새 시트에 요약 보고서가 뜰 것이다. 정말 사용이 쉽다.

내친 김에 가상분석에 있는 ‘목표값 찾기’도 사용해 보자. 그 기능은 여러가지로 사용될 수 있지만 여기서는 위 사례에서 수익 28만원이 나려면 몇 %를 정가에 팔아야 하는가 하는 문제에 답을 찾아보자. 목표값 찾기를 클릭하여 나타난 창에 아래 그림과 같이 해당 값을 넣는다.

그러면 원 데이터 시트에서 C3 셀이 90%로 바뀔 것이다. 정가로 90%를 팔아야 28만원이 남는다는 말이다.

가상분석에서 다른 하나의 기능은 ‘데이터 표’이다. 이는 엑셀에게 계산식을 알려주고 입력값을 변경하면 결과값이 어떻게 달라지는 지를 보여달라는 명령이다. 예컨대 가격이 100원인 품목를 판매한다고 하자. 다양한 판매 개수에 따른 매출액을 제시할 수 있다. 5개를 팔면 500원이 나오는 계산식 =B1*B2을 E2에 넣는다. 그런 다음 계산을 원하는 품목 B의 개수를 D 열에 나열한다. 이제 D2부터 E6까지를 모두 선택한다. 메뉴에서 데이터-데이터표를 연다. 그리고 아래 그림처럼 B 품목의 개수가 있는 셀인 $B$1을 열에 넣는다. 그러면 원 데이터 시트의 E3부터 E6에 각 개수에 따른 판매액이 표시된다.

이상으로 엑셀의 가상분석(What-If Analysis)의 세 가지 기능을 살펴보았다. 이는 간단하지만 현업에 유용한 기능으로 생각된다. 이제 엑셀에 있는 좀 더 심각한 미래 예측 기능에 대해 알아보자.

Excel, 흔한, 그러나 편하고 강력한 데이터 분석 tool

세 해째 통계와 데이터과학 수업에 마이크로소프트 엑셀을 사용하면서 여러가지로 느끼는 게 많다. 아쉬운 점이 없지 않지만 이렇게 좋은 도구가 또 있을까 싶다. 어차피 업무에서 엑셀을 사용하니 소프트웨어를 구입해야 하는 비용 부담도 없고, 배우기 쉬울 뿐 아니라 업무에 필요한 기능을 대부분 갖추고 있다. 대규모 데이터를 다루는데 불편하고 종종 찾는 기능이 없어 당황하곤 하지만 말이다(비주얼 베이직 프로그래밍을 할 수 있다면 그런 경우가 훨 적을 것이다). 뭐 값비싼 다른 통계 전문 패키지를 사용한다고 해서 그런 불편이 없는 것도 아니니 그것이 꼭 엑셀만의 문제라고 할 수는 없다. 파이썬이나 R로 스스로 프로그래밍을 하지 않은 다음에야 피할 수 없는 문제이리라.

그렇게 놓고 보면 엑셀을 배우는데 들이는 투자는 가성비가 아주 높다. 그래서 데이터 분석에 엑셀을 어떻게 사용할 수 있는 지를 조금 소개해 볼까 한다.

먼저 미래 예측에 대한 기능을 보자. 미래 예측이라면 거창한 것 같지만 사실 현업에서는 알게 모르게 늘 하는 일이다. 다음 달(혹은 다음 분기나 내년도 좋다) 매출이 얼마나 될까? 투자액에 따라 성과가 얼마나 달라질까? 다음 주 A기업의 주가는? 향후 6개월 간 A기업의 주가는 어떻게 변할까? 뭐 그런 의문에 대해 답하는 일이 미래 예측에 다름 아니다.

놀랍게도 그 정도의 예측은 엑셀 가지고 훌륭히 해낼 수 있다. 내 수업에서 다룬 시나리오 예측, 선형회귀 모형 예측, 시계열 예측을 소개한다.

세상에 관한 몇 가지 진실(1): 일과 잉여

매월 급여 명세서를 읽을 때마다 나는 화를 누르기 쉽지 않다. 정부가 가져가는 세금 때문이다.

오해하지 말라. 세금이 많아서가 아니다. 내 몸에 빨대를 꽂고 있는 잉여들, 세금 도둑들 때문이다.

세상에 관한 가장 중요한 진실은 “쓸데없는 일은 ‘일’이 아니라 ‘잉여’다” 라는 명제이다. 적어도 정부 부문에 관한 한 “쓸데없는 일”는 형용모순이다. 쓸데없는 일은 일이 아니다.

정부에 관해서 ‘쓸모’에 대한 판단 기준은 딱 두 가지이다. 하나는 국민 혹은 주민의 입장에서 도움이 되는가, 둘째는 그 일을 직접 수행하는가이다. 이 두가지 기준을 충족하지 않으면 잉여이다.  실내에서 하는가 실외에서 하는가, 기획인가 집행인가 따위와는 근본적으로 관련이 없다.

(일과 잉여의 구분에 대한 예시)

1. 환경미화

일: 동네 쓰레기통에 버려진 쓰레기의 수거 행위

잉여:  쓰레기를 치우라고 지시하는 행위, 쓰레기 수거를 민간 업체에게 용역을 주고 관리하는 행위

2. 재난 예방

일: 태풍이 몰아 닥칠 때, 취약 지역, 취약 가구를 방문하여 피해가 일어날 요인을 줄이는 작업

잉여: 면사무소 안에서 확성기를 통해서 피해 방지에 유념하라고 방송하는 행위

3. 사회복지

일: 취약 가구를 방문하여 노약자를 살피고 도와주는 행위

잉여: 사회복지정보시스템을 개발하기 위해 외부 업체에 용역을 주는 행위

4. 교육

일: 학생을 지도하는 행위

잉여: 교사나 학교 운영을 감독하는 행위

5. 범죄 예방

일: 동네와 마을 순찰을 도는 행위

잉여: 마을 CCTV 설치와 관리 업무를 외부업체에게 용역 주는 행위

6. 정책 수립과 예산

일: 정책을 기획하고 예산을 수립하는 행위

잉여: 정책 기획과 예산 수립을 용역화 하는 행위

몇 가지 사례를 보았다. 어떤 공무원의 업무가 일인가 잉여인가를 판단하는 업무는 잉여이다. 그것은 머슴(공무원)의 역할이 아니라 주인(국민 혹은 주민)의 역할에 해당된다.

우리나라 정부는 수백년 묵은 잘못된 공무원 제도 때문에 발생하는 잉여가 너무 많다. 왕정과 독재정은 오래 전에 종식되었지만 그 시대에 형성된 관료 제도와 문화가 온존되어 왔다. 더구나 안정성 중심의 관료체제는 21세기 급속히 변화하는 세상과 너무 맞지 않다.

지금과 같은 신분보장=정년보장이라는 등식이 성립되는 직업공무원제도 아래에서는 세상이 빨리 변할수록 정부 내에 잉여의 비중이 급격히 증가한다. 신분보장=정년보장이 신분보장=임기보장이라는 원칙으로 바뀌어야 한다. 약간의 예외를 둘 수는 있겠지만 공무원제도의 기본틀이 임기제 혹은 계약제로 바뀌어야 한다는 말이다.

그렇지 않으면 우리 정부는 ‘용역’ 국가로 전락해 버릴 것이다. 현재도 정부의 일 중 상당 부분이 용역화된다. 공무원은 용역 관리자이고 외부 업체가 실제 일을 수행하는 방식이다.

용역을 법으로 금지해야 한다.  대신에 그 정책이 꼭 필요하다면 그 정책을 잘 수행할 수 있는 사람들을 공무원으로 채용해야 한다. 아예 해당 정책을 수행하는 부서 전체를 모듈식으로 꾸릴 수도 있을 것이다.

그것은 현재의 관료 체제에서는 불가능한 대안이다. 하지만 법적으로 한 가지만 손질하면 가능하다. 정년보장이라는 제도를 없애고 모든 공무원을 임기제 혹은 계약제로 바꾸는 것이다. 만약 전문성이 필요해서 장기 계약이 필요한 경우라면 그런 자리는 보수를 낮게 책정하고, 반대로 계약 기간이 짧은 자리는 보수를 더 많이 주어서 보상에 균형을 맞춰야 할 것이다. 지금처럼 이긴자가 다 가져가는 방식으로는 정부의 잉여를 줄일 길도, 효율적인 정부를 실현할 길도 없다.

인간의 지식은 쉽게 업그레이드되지 않는다. 반드시 많은 노력을 들여서 학습을 해야 새로운 지식을 얻을 수 있다. 그러나 빠르게 변하는 세상에서는 그런 업그레이드에 한계가 있다.  인간은 언젠가 여러가지 이유로 적응 불능 상태에 빠지게 된다. Fortran과 DOS를 배워서 컴퓨터를 시작한 기술자에게 AI 개발 업무를 맡긴다고 상상해 보라. 그냥 그것은 불가능하다.

정부 내에서 그 불가능을 가능으로 만드는 요술 방망이가 바로 ‘용역’이다.  용역 관리자는 얼마든 변신이 가능하다. 심지어 자신이 용역을 내주는 업무를 제대로 이해하지 못해도–실제로 그런 경우가 흔하다–용역을 관리할 수 있다. 업무 수준이 엉터리일 것이 불을 보듯하고 벤더(vender)들의 손바닥에서 놀아날 가능성이 매우 높지만 말이다.

용역 관리를 감독하는 사람은 없다. 왜냐면 감독자들도 그 업무를 이해하지 못하기는 마찬가지이기 때문이다. 거기에 거대한 용역 비즈니스가 발생한 공간이 존재한다.  그 공간에서 잉여로 가득찬 용역 정부가 탄생하는 것이다.

일하는 공무원은 많아도 무방하다. 비용은 좀 많이 들지만 국민, 주민이 편해진다.

그러나 잉여는 과감히 제거되어야 한다. 아마도 그러면 정부 예산의 3분의 1정도, 잘하면 절반 정도는 절약 가능할 것이다.  그것은 이 나라에서 천년 래의 사회혁명이 될 것이다.

우리 나라에는 두 종류의 사회계급이 존재한다. 공무원과 일반인이다.  헌법에는 이 나라의 주인이 국민으로 되어 있지만, 현실에서 이 나라의 주인은 공무원이다. 머슴이 주인 자리를 차리하고 있는 것이다! 엄청난 모순이다. 그들은 제 위치에 돌려보내고 국민이 주인 자리를 차지하는 것이 21세기의 진정한 혁명이다. (2018-08-25)

지능이라는 이름의 게임(18): 집단지능과 블록체인(10)

관련 이미지

블록체인은 분산원장(distributed ledger)이다. 즉, 블록체인이라는 원장을 구성원 모두에게 공유토록 하는 시스템이다.

그런데, 블록 체인의 거래가 크게 증가하고 참여자가 아주 많아지면 블록과 블록체인에 담긴 데이터의 양–대부분 거래 기록(transaction list)이겠지만–이 폭발적으로 증가할 것이다. 그러면 데이터의 유효성이나 무결성 검증에 있어 효율성 확보가 심각한 문제로 대두될 수 있다.

더구나 구성원들의 블록체인 참여는 인터넷에 연결된 단말기를 통해서 이루어지는데 단말기의 성능이 제각각일 것이다. 어떤 참여자들은 스마트폰 앱을 사용하기도 할 것이다. 거래 원장의 공유라는 원칙을, 그런 참여자들까지 포함해서 블록체인 참여자 모두가 과연 어떻게 따르게 할 수 있을까?

그러한 문제를 해결하는 요소 기술이 머클 루트(Merkle root)–루트 해시(root hash)라고도 부름–이다. 머클 루트는 해싱을 이용하여 누적된 거래 기록을 최대한 가볍게, 그러면서도 신뢰를 창출하는 원래 기능을 유지하게 해주는 데이터 축소 방법이다. 아래 그림은 모의 블록체인이고, 각 블록의 헤더(block header)는 머클 루트를 가지고 있다.

관련 이미지

머클 루트는 다음과 같은 방식으로 생성된다. 아래 그림을 가지고 설명한다.

나무–이 나무를 Merkle tree라고 부른다–의 가장 바닥에 있는 각 거래(Transaction A, B, C, D)는 해싱되어 Hash A, B, C, D가 된다. 그런 다음 그 해시들은 두 개씩 짝을 지어 다시 해싱된다. Hash A와 B는 Hash AB로 해싱되고, Hash C와 D는 Hash CD로 해싱된다. 그리고 그 두 해시는 다시 결합, 해싱되어 머클 루트(Merkle Root/Root Hash)를 형성하게 된다. 머클 루트에는 나무의 바닥에 있는 거래 기록 자체는 포함되지 않고 해시들만 포함되어 있다. 이렇게 사다리 타기 하듯이 연쇄적으로 해싱하면 아무리 많은 데이터라도 매우 가벼운 머클 루트로 변환될 수 있다.

이 머클 루트가 블록 헤더(header)에 포함되어 있으면 블록 바디(body)에 있는 거래 기록을 빼고 블록 헤더만 포함시켜 해싱을 해도 데이터의 무결성과 유효성이 충분히 검증될 수 있다. 그리고 블록 헤더에 담긴 머클 루트는, 그 블록에 포함된 거래 기록들의 머클 루트를 계산해서 비교해 보면, 그것의 유효성을 확인할 수 있다.

머클 루트는, 많은 거래 기록을 효율적으로 해싱하는 기술이며 다수의 참여자들이 많은 거래 기록을 손쉽게 공유할 수 있게 해주는 기술이기도 하다. 머클 루트는 블록체인에서 해시함수가 참으로 중요한 요소 기술임을 다시 한번 확인시켜 준다.

이상으로 블록체인이라는 집단지능을 구현하는 요소 기술들을 살펴보았다. 아마도 블록체인에 대해 낯설었던 독자들도 이제 그 기술과 조금은 친숙해 지지 않았을까 생각된다.  다음에는 블록체인의 다양한 구현체–아직은 주로 암호화폐들이지만–와 그것이 지닌 사회적 잠재성에 관해 성찰해 보기로 하자. (윤영민, 2015-05-14)

지능이라는 이름의 게임(17): 집단지능과 블록체인(9)

앞 포스팅에서는 블록의 구성과 채굴에 관해 살펴보았다. 이번에는 그러한 블록들로 구성된 블록체인(blockchain), 그리고 블록체인이 노드(참여자)들에 의해 공유되는 분산 블록체인(distributed blockchain)에 대해 알아보자.

다시 MIT의 블록체인 사이트의 신세를 진다. 위의 그림을 클릭하면 모의 블록들로 이루어진 블록체인이 보일 것이다. 블록체인 아래 부분의 슬라이딩 바를 움직이면 5개의 블록을 볼 수 있다. 앞 포스팅의 블록과 달리 이 블록들에는 Data 칸 아래에 Prev.(Previous)라는 칸이 있다. 1번 블록은 Prev.가 전부 0으로 채워져 있다. 당연히 그것은 이전 블록의 해시가 없다는 의미이다. 그리고 첫번째 블록의 해시는 두번째 블록의 Prev.와 정확히 동일한 해시이다. 마찬가지로 두번째 블록의 해시는 세번째 블록의 Prev.에 들어와 있고, 세번째 블록의 해시는 네번째 블록의 Prev.에, 네번째 블록의 해시는 다섯번째 블록의 Prev.에 들어와 있다.

여기서 중요한 점은 각 블록의 해시는 Prev.의 해시를 포함해서 생성된 것이라는 사실이다. 그것이 블록체인(blockchain)에서 체인(chain)의 실질적 의미라고 할 수 있다. 블록들은 단순히 병열적으로 나열되어 있는 것이 아니라 해시 생성을 통해서 수학적으로 연결되어 있는 것이다.

바로 그점 때문에 어떤 블록의 데이터가 변하면 곧 바로 그 사실을 탐지할 수 있으며, 특정한 블록을 변조하려는 자는 그 블럭 뿐 아니라 그 블럭과 해시로 묶여 있는 블록들을 모두 채굴해야만 한다.

한번 두번째 블록에 hi 라고 써보라. 1번을 제외한 모든 블록이 핑크색으로 바뀔 것이다. 그 블록들이 모두 다시 채굴되어야 함을 나타내는 신호이다.

블록체인이 블록의 변조를 방지하는 장치는 그것 뿐만이 아니다. 블록체인이 참여자들 모두에 의해 공유되어 있다는 점은 더욱 강력한 변조 방지 장치이다. 아래 그림을 클릭하면 분산 블록체인(distributed blockchain) 페이지가 열릴 것이다. 그것은 참여자(peer라고 되어 있다)가 3명인 가상적 블록체인 시스템이다.

참여자 A, B, C의 블록에 있는 논스와 해시를 보면 모두 동일함을 확인할 수 있을 것이다. 블록체인의 분산원장에 문제가 없는 상태이다. 그런데 만약 그들 중 누군가의 블록과 블록체인에 변조가 발생하면 다른 참여자의 블록 및 블록체인과 이질성이 발생한다. 한번 Peer B의 두번째 Data 칸에 hi 라고 치고 핑그색으로 변한 블록들을 모두 채굴해 보라. 그리고 그 블록들의 논스와 해시를 Peer A와 C의 해당 블록의 논스와 해시를 비교해 보자. 비록 Peer A의 블록들의 채굴에 성공하였지만 그렇게 해서 얻은 논스와 해시가 다른 참여자들이 가진 블록들의 논스와 해시와 달라져 버렸다는 사실을 발견할 수 있을 것이다. 이렇게 해서 블록체인의 일부인 블록의 변조가 쉽게 탐지된다. 만약 블록체인을 위조하려면 적어도 블럭체인 시스템의 참여자들의 51%가 가지고 있는 블록체인을 모두 채굴해야 한다. 그것도 10분 안에 끝내야 한다.

그런 조건에서 블록체인의 변조나 위조가 성공하는 것은 불가능하지는 않겠지만 현실적으로 가능성이 희박할 것이다. 어떤 블록체인 전문가는, 전세계에서 가장 강력한 컴퓨팅 파워를 지닌 슈퍼컴퓨터를 다섯 대 정도 동원해야 블록체인의 위변조가 가능할 것이라고 말한다.

블록체인과 분산원장은 블록체인 시스템의 참여자들이 기술적으로 신뢰를 확보하는 강력한 수단이다. 그리고 그것의 능력은 참여자 수가 많을수록 더욱 강력해진다. 블록체인과 분산원장은 집단지능으로서의 블록체인이 지닌 집단성을  구현하는 장치인 것이다. (윤영민, 2018-05-14)

지능이라는 이름의 게임(16): 집단지능과 블록체인(8)

blockchain mining에 대한 이미지 검색결과

블록체인에서 신뢰가 창출되는 가장 중요한 과정은 채굴(mining)이다. 비트코인의 경우 채굴은 세 단계로 이루어져 있다.

1) 채굴자들(miners)은 검증이 필요한 블록(거래 내역이 기록된 원장)에 대해 주어진 조건에 맞는 해시값을 경쟁적으로 찾기 시작한다. 비트코인의 경우 10분마다 새로운 블럭이 생성되기 때문에 10분 이내에 채굴해야 한다. 해시값을 찾는데 성공[그것은 논스(nonce)라는 숫자로 인정된다]한 채굴자는 즉시 모든 노드(참여자)들에게 그 결과를 알린다.

2) 다른 노드(참여자)들은 그 결과의 유효성을 확인하고 문제가 없다고 판단되면 그 블록을 블록체인에 추가한다. 그리고 검증이 끝난 블록에 대해 추가로 검증 결과가 날아오더라도 무시한다. 전체 참여자들의 51% 이상이 그렇게 하면 합의(consensus)가 성립된 것으로 간주된다.

3) 채굴의 성공이 인정된[그것이 작업증명(Proof of Work, PoW)이다] 채굴자는 수고에 대한 인센티브를 받는다. 그리고  채굴자들은 새로운 블록에 대한 검증 경쟁에 들어간다.

블록체인의 합의 알고리즘에는 작업증명(PoW) 외에도 PoS(Proof of Stake), Delegated Proof of Stake(DPoW), Practical Byzantine Fault Tolerance(PBFT) 등이 있으나 소개를 생략한다(이 알고리즘들에 대한 간략한 비교 설명은 Consensus in Blockchain Systems. In Sort. 라는 블로그 포스팅을 참조하시오).

은행 거래에서는 거래내역이 기록된 장부(원장)가 생명이다.  각 고객이 저금한 액수, 인출한 액수, 이체 내력, 잔고, 대출 현황 등이 정확히 기재되어야 한다. 거기에 조금이라도 착오가 있으면 사고이다. 은행에서는 은행원들이 원장을 기재하고 관리하는 업무를 수행한다.

블록체인에서는 채굴자가 바로 은행원이 하는 역할을 대신한다. 그러나 두 가지 점에서 채굴자는 은행원과 다르다.

하나는, 은행에서는 은행원이 소정의 절차를 거쳐서 채용되고 기장에 있어 배타적 권한을 행사하지만, 블록체인(public blockchain의 경우)에서는 채굴 장비(컴퓨터 설비)만 갖출 수 있으면 누구나 채굴자(miner)가 될 수 있다.

bitcoin mining에 대한 이미지 검색결과

다른 하나는, 은행원은 은행 업무를 수행하면 월급을 받는 것으로 끝나지만 블록체인의 채굴자는 블록(원장)을 검증하면 소정량의 암호화폐를 인센티브로 지급받는다. 비트코인(Bitcoin)의 경우 현재 비트코인 12.5개를 받는다. 그런데 그러한 인센티브 지급은 곧 암호화폐의 발행이기도 하다. 채굴에서 난이도는 비트코인의 발행량을 조정하는 역할을 한다. 비트코인이 너무 많이 발행되면 인플레이션이 발생할 것이다.

국가에서는 중앙은행이 정책적인 결정에 따라 화폐를 발행하지만 암호화폐 시스템에서는 채굴행위를 통해서 암호화폐가 발행된다. 결국 채굴자가 암호화폐 발행자인 셈이다. 채굴이라는 메타포(metaphor)가 사용된 이유도 아마 그 때문일 것이다. 광산에서 금을 채굴하듯이 암호화폐를 채굴(곧 발행)한다는 것이다.

이해를 돕기 위해 모의 블록을 가지고 시뮬레이션을 하면서 채굴 과정을 살펴보자. 아래 그림을 클릭하면 MIT의 블록체인 사이트로 이동하고 블록이 나타날 것이다.

그 블록에는  다섯 가지 요소가 있다. 맨 위에 Block이라고 해서 블록의 번호가 쓰여있고, 그 다음 줄에는 Nonce라는 칸에 72608이라는 숫자가 쓰여 있다. 그 다음은 Data 칸인데 비어 있다. 그리고 그 아래에 Hash 칸이 있고 복잡한 숫자와 문자의 배열이 적혀 있다. 그런데 그 숫자를 보면 앞의 네 자리가 모두 0이다. 그 0들은 채굴의 조건(혹은 난이도)을 나타낸다. 그 조건을 충족하는 해시를 발생하는 논스(Nonce)를 찾는 것이 채굴이다. 모의 실험이기 때문에 0이 네 자리 뿐이지 실제로 비트코인에서는 앞 18자리가 0이다. 논스를 찾아내기가 훨씬 어려운 것이다. Hash 칸 아래에는 Mine이라는 네모 단추가 있다.

Data 칸에 윤영민 $20 이라고 적어 보라. 배경의 연초록색이 핑크빛으로 바뀌고, Hash가 0이 없는 다른 값으로 바뀔 것이다. 논스와 해시가 불일치한 상태가 되었다. 이제 논스의 숫자를 1부터 차례로 넣으면서 해시의 변화를 살펴보라. 아마도 12를 넣으면 해시의 첫 자리가 0이 되었을 것이다. 그렇게 앞 자리 네 개가 0이 되는 논스를 찾아야 한다. 필자는 해보지 않았지만 그런 방식으로는 하루가 걸릴 지도 모른다. 그것은 사람이 할 일이 못된다. Mine 단추를 눌러서 컴퓨터가 그 과정을 수행하게 하자. 아마도 1초 정도면 논스가 15607로 되고, 해시는 0000으로 시작되는 값이 되며, 박스의 배경색은 다시 연초록색으로 돌아갔을 것이다. 블록에 대한 채굴이 끝난 것이다.

블록체인은 참여자들 개개인의 신뢰성을 따지지 않는다. 참여자들이 선한 사람이든 투자자든, 아니면 사기꾼이든 조폭이든 괘념치 않는다. 그들이 설령 속임수를 쓰고 나쁜 짓을 하려고 해도 채굴과 같은 기술적인 방법으로 그들의 ‘도전’을 압도해서 시스템에 대한 신뢰를 창출하고 유지할 뿐이다. (윤영민, 2018-05-14)