일반에 딥러닝으로 알려져 있는 머신러닝 모델의 가장 기본이 바로 신경망(Neural Network) 모델이다. 다른 글에서 신경망 모델로 Sin(X) 그래프를 추적하는 예제를 하나 풀어봤었는데, 기본적으로 아래처럼 네트워크가 100% 꽉 들어차 있는 Fully Connected Neural Network 모델이 기본형이다. (Deep Neural Network, 일반에는 딥러닝으로 알려져 있다.) 여기서 몇 개의 노드(node)가 사라지는 경우, 또 넣었다 뺐다 하는 경우(Dropout 이라고 한다) 등 다양한 경우로 응용을 할 수 있는데, 이렇게 옵션을 추가하는 이유는 신경망 모델의 노드가 늘어나면 늘어날수록 계산 비용(CPU, RAM, 전력, 시간 등)이 기하급수적으로 늘어나기 때문이다. (and over-fitting을 방지하기 위해서이기도 하다.)

딥러닝이라고 알려지게 된 가장 큰 이유는 신경망 모델이 단층적인 모델에서 다층적인 모델로 변화했기 때문이다. 위에서 말한대로 원래 신경망 모델에 계산 비용이 많이 들어가고, 또 다층적인 모델이되면서 계산 비용이 더더욱 많이 들어가기 때문에 예전에는 슈퍼컴퓨터를 이용하지 않으면 일반인이 쉽게 결과물을 접하기 힘들었었다.

위의 예시를 보면 단층 모델(Sinlge layer)이 다층 모델(Multi layer)보다 빨리 결과물을 볼 수 있는 대신 정확도가 떨어질 가능성이 높고, 같은 맥락으로 변수 4개 들어간 들어간 다층 모델보다 2개만 들어간 다층 모델이 계산 비용이 적으면서 정확도를 손해보게 된다. 슈퍼컴퓨터에만 계산을 의존하던 시절에는 많은 변수가 들어간 다층 모델을 고르는데 매우 조심스러웠지만, 최근에 CPU (중앙처리장치)의 멀티코어를 이용하고 심지어는 GPU (그래픽 카드)의 행렬(Matrix) 연산 능력까지 활용할 수 있게 되면서 일반적인 PC 여러대를 뭉치면 괜찮은 성과를 얻을 수 있게 되었다. 알려진 내용에 따르면 구글 딥마인드의 바둑 인공지능 알파고가 이세돌 9단과 경기할 때 1202개의 CPU와 176개의 GPU를 연산에 활용했다고 한다.

정말 일반 PC로 구현할 수 있다면 집에 있는 데스크탑이나 갖고 다니는 노트북으로 구현할 수 있을까? 물론이다.

이런 수요가 많기 때문에 소프트웨어 엔지니어 (이하 “개발자”)들이 많이 쓰는 개발 언어인 Python으로 유명한 패키지(TensorFlow, scikit-learn 등)가 나와있고, 통계학자들이 많이 활용하는 R에도 아래와 같은 패키지들이 자주 쓰인다. 특히 아래 리스트의 마지막에 있는 mxnet은 Amazon이 딥러닝에 적용하는 패키지로 알려져 있고, 컨펌되지 않은 평가에 따르면 구글에서 열심히 홍보하고 있는 TensorFlow보다 성능은 더 뛰어나다고 한다. 둘의 차이점에 대해서 더 궁금하신 분은 여기를 참고하시면 된다.

딥러닝을 R로 구현하는 패키지

R Packages Backend Computing Resources
nnet C/C++ Single thread
neuralnet C/C++ Single thread
DARCH C/C++ Single thread
deepnet R Single thread
H2O JAVA Multi-threads, multi-nodes
mxnet C/C++/CUDA Multi-threads, GPUs, multi-nodes

이 중에서 CPU의 싱글 코어만 쓰는 nnet다른 글에서 Sin(X) 그래프 추적하는데 적용해봤다. (궁금하시면 링크타고가서 확인해보시면 됩니다.)

명령어들 자체의 성능이나 활용법은 약간씩 다른데, 우선 이번 글에서는 Deep Neural Network를 공개된 패키지를 쓰지않고 직접 한번 만들어볼 생각이다.

굳이 이걸 Scratch부터 만들어보는 이유는 딥러닝에 대한 일반의 오해를 종식시키고 싶은 마음에서다. 인공지능이 무슨 알아서 척척척 박사라서 모든 걸 다해낸다고 착각들을 많이하고, 특히 개발자분들이 TensorFlow로 DNN이니 CNN이니 같은 약자만 쓰면서 정작 이 모델들을 설명해라고 하면 “블랙박스(BlackBox)”라는 표현을 쓰는게 안타까워서다. 그리고 이렇게 기본부터 이해를해야 저 위에서 잠깐 언급한대로 어떤 노드(Node)는 없애거나 넣었다 뺐다를 반복하면서 계산비용을 줄이는 아이디어(Dropout)를 쉽게 이해할 수 있을 것 같아서이기도 하다.

 

1. 간략한 용어 설명

  • 입력값(Input Layer): 초기 변수
  • 결과값(Output): 결과값이 0과 1 중 하나로 나올 경우를 Classification, 그 이외의 경우는 Regression 문제로 정의한다. 쓰이는 테크닉들이 다르다.
  • 편차(Bias): 각 Layer에서 처리하지 못하는 오차값
  • 가중치(Weight): 입력값이 뉴런에게 주는 가중치
  • 뉴런(Neuron): 위의 그림에서 초록색 원들을 말한다. (다른 교과서에서는 Perceptron이라고 표현하기도 한다.)
  • Hidden Layer(s): 변수들을 처리하는 가상의 계산 단계. 층위의 숫자가 많을수록 모델의 정확도는 올라가겠지만, 계산 비용이 많이 든다

 

2. 모델이란?

보통 어떤 모델을 만들고 나면 외부에 설명할때는 활용도에 중심을 두고 설명하겠지만, 모델링을 하는 사람들 입장에서 듣고 싶은 주제는,

  1. 어떤 변수들을 입력값으로 넣었고,
  2. Hidden Layer를 어떻게 구성했으며 (M x N),
  3. 시스템의 Loss Function은 무엇이었으며,
  4. Regularization은 어떻게 활용했는지 등

이다.

딥러닝이라고 불리는 모델이 장점이자 단점인 부분은, 모델 그 자체로는 수학적인 뒷받침이 있기보다는 단순히 변수들끼리 모든 조합의 가능성을 다 고려해서 가장 높은 결과값을 찾는 단순한 연산의 반복일 뿐이라서 모델링 그 자체만 놓고보면 복잡성의 깊이는 낮다. (변수들을 넣었다 뺐다 하는 식의 업그레이드 모델은 일단 예외로 한다.) 그렇기 때문에 더더욱 Over-fitting 이슈에서 자유로울 수 없는 모델이기는 하지만, 이 문제는 다른 글에서 논의하기로 하자

뭔가 복잡한 계산이 있을 것 같지만, 실제로는 단순한 행렬 계산으로 값을 구한다. 예를 들면 2×3 행렬과 3×2 행렬을 곱하면 2×2 행렬이 나온다. 고등학교 2학년 수학이다. 실제로 이용되는 수학적 사고의 틀은 이걸로 충분하다.

아래에 간단하게 가중치와 편차(추정식의 Level-높낮이-을 지정하는 값) 행렬을 만들어봤다.

 
weight.i = 0.01*matrix(rnorm(layer.size(i)*layer.size(i+1)),
 			nrow = layer.size(i),
			ncol = layer.size(I+1))
bias.i  = matrix(0, nrow=1, ncol = layer.size(i+1))

보통은 가중치와 편차를 하나의 행렬로 묶는다.

weight  = 0.01*matrix(rnorm((layer.size(i)+1)*layer.size(i+1)),
 			nrow = layer.size(i)+1,
			ncol = layer.size(i+1))

딥러닝이라고 불리는 계산법, 혹은 Deep Neural Network 모델이 결정해야하는 값은 위의 Weight 값이 전부다. Input 데이터를 Weight 값으로 계산해주면 Output 값이 나온다. 그 Output이 누군가가 이 상품을 살지 말지에 대한 확률일수도 있고, 이세돌이 어느 점에 착점할 것이라는 예측값일 수도 있다. 그 모든 값은 바로 위의 Weight 값을 얼마나 잘 짜느냐에 달려있다.

 

3. 계산

자 이제 행렬 계산법을 응용해서 계산을 해 보자.

# 2X2 차원의 입력값 (Input, 혹은 Feature라고 불린다)
input = matrix(1:4, nrow = 2, ncol = 2)

# 2x3 차원의 가중치
weights = matrix(1:6, nrow = 2, ncol =3)
# 1x3 차원의 오차항
bias = matrix(1:3, nrow = 1, ncol = 3)

# 입력값 x 가중치 + 오차항
input %*% weights + bias

# 당연히 차원이 맞지 않아 계산이 안 된다

입력값이 1×2 행렬이었으면 입력값 x 가중치가 1×3 행렬이 되어서 덧셈이 정상적으로 진행되었겠지만, 위의 경우에는 아마 에러값이 튀어나올 것이다. 이럴 때 머신러닝에서 이용하는 해결책은 크게 두 가지다. 첫번 째는 그냥 단순하게 오차항을 두 번 쓰는 것이다. 물론 이렇게하면 메모리를 많이 소모하므로 (Computational cost가 비싸다), Sweep 이라는 함수를 이용한다. 두 방법의 결과는 같다.

 
# 해결책 1: 오차항을 두번 반복해서 2X3을 만듦
s1 = input %*% weights + matrix(rep(bias, each=2), ncol=3) 
 
# 해결책 2: sweep 함수 이용
s2 = sweep(input %*% weights, 2, bias, '+')
 
all.equal(s1, s2)
[1] TRUE

 

4. Prediction 에 적용

아주 간단하게 Prediction에 적용하는 함수를 만들어 보자. 참고로 아래에 쓰인 pmax 함수는 Global Max 값이 아니라 Local Max 값을 찾는데 쓰이는 함수다. Neural Network를 비롯한 모든 머신러닝 함수는 수학식으로 나온 값을 찾는게 아니라 (Closed-form solution이라고 부른다), 시행착오(Trial-and-error)를 거치면서 값을 찾는데, 함수가 한 방향으로 증가, 감소하는게 아니라면 시작점이 어디냐에 따라 다른 값을 찾게 되는 경우가 있다.

말을 바꾸면, 시작점이 어디냐에 따라 결과값이 바뀌는 경우가 생길 수 있는데, Global Max 값을 찾는데 계산비용이 많이 들기 때문에 아래처럼 Local Max 값을 찾는 함수를 쓰는 경우가 많다.

# Prediction
predict.dnn = function(model, data = X.test) {

  # 데이터를 행렬로 변형
  new.data = data.matrix(data)
 
  # sweep을 이용해 hidden layer의 차원을 맞춰줌
  hidden.layer = sweep(new.data %*% model$W1 ,2, model$b1, '+')

  # hidden.layer 값 중 최대치를 골라서 score -예측값-를 찾는데 적용
  hidden.layer = pmax(hidden.layer, 0)
  score = sweep(hidden.layer %*% model$W2, 2, model$b2, '+')
 
  # Loss Function: softmax (cross-entropy 라고도 알려져 있다)
  score.exp = exp(score)
  probs = sweep(score.exp, 1, rowSums(score.exp), '/') 
 
  # 가장 확률이 높은 경우를 고른다
  labels.predicted = max.col(probs)
  return(labels.predicted)
}

 

5. Neural Network를 훈련(Training) 시키는 함수 생성

데이터를 훈련(Training)에 쓰는 방식을 결정하는 함수를 만들어보자. 여기서는 Hidden layer를 몇 개로 할지, Learning rate을 얼마로 잡을지 등등을 지정할 수 있다.

train.dnn = function(x, y, traindata=data, testdata=NULL,
                  # hidden layer과 변수의 갯수를 고름 (아래는 1x6으로 지정)
                  hidden = c(6), 

                  # 최대 반복 수치 지정 (클수록 속도를 희생하고 정확성을 끌어올린다)
                  maxit=2000,

                  # delta loss (반복할 때마다 약간씩 수정하는 값의 크기)
                  abstol=1e-2,

                  # learning rate (학습 속도, 작을수록 느리지만 대신 정확하다)
                  lr = 1e-2,

                  # regularization rate (추가적인 feature를 도입하는 속도, 각 feature간 cross-product, 제곱 등이 쓰인다)
                  reg = 1e-3,

                  # 총 100번의 결과값을 보여준다
                  display = 100,
                  random.seed = 1)
{
  # seed를 지정하면 같은 seed 값에서 같은 결과값을 볼 수 있다
  set.seed(random.seed)
 
  # 훈련 집합의 전체 크기
  N = nrow(traindata)
 
  # 데이터 불러오기
  X = unname(data.matrix(traindata[,x]))
  Y = traindata[,y]
  if(is.factor(Y)) { Y = as.integer(Y) }

  # 행과 열에 각각 인덱스 생성 
  Y.len   = length(unique(Y))
  Y.set   = sort(unique(Y))
  Y.index = cbind(1:N, match(Y, Y.set))
 
  # input 값들
  D = ncol(X)

  # classification이 적용되는 값의 종류 (ex. 0과 1)
  K = length(unique(Y)) # unique(Y) 값이 100개라면 총 100개의 가능성으로 결과값을 보여준다 (사과, 배, 참외 등등등)
  H =  hidden
 
  # 최초 시작점을 정한다 - local max를 찾을 때 최초 시작점을 어떻게 정하느냐가 매우 중요하다. 
  W1 = 0.01*matrix(rnorm(D*H), nrow = D, ncol = H)
  b1 = matrix(0, nrow = 1, ncol = H)
 
  W2 = 0.01*matrix(rnorm(H*K), nrow = H, ncol = K)
  b2 = matrix(0, nrow = 1, ncol = K)
 
  # Training 데이터 전체를 Training에 활용 (N을 그룹으로 쪼개서 bagging을 할 수도 있음)
  batchsize = N
  loss = 100000
 
  # Training 데이터를 NN에 적용
  i = 0
  while(i = maxit && loss > abstol ) {
 
    # iteration index
    i = i +1
 
    # forward 로 계산 (아래에 backward로 계산도 있음)
    # 1은 행, 2는 열
    hidden.layer = sweep(X %*% W1 ,2, b1, '+')

    # neurons : ReLU
    hidden.layer = pmax(hidden.layer, 0)
    score = sweep(hidden.layer %*% W2, 2, b2, '+')
 
    # softmax (Loss function을 지정. Cross entropy라고도 불린다)
    score.exp = exp(score)
    probs = sweep(score.exp, 1, rowSums(score.exp), '/') 
 
    # Loss 값을 찾는다 - 매우 작은 값이 나와야 모델이 제대로 "학습"한 것이다
    corect.logprobs = log(probs[Y.index])
    data.loss  = sum(corect.logprobs)/batchsize
    reg.loss   = 0.5*reg* (sum(W1*W1) + sum(W2*W2))
    loss = data.loss + reg.loss
 
    # 결과값을 보여줌
    if( i %% display == 0) {
        if(!is.null(testdata)) {
            model <- list( D = D,
                           H = H,
                           K = K,
                           # 가중치와 오차
                           W1 = W1, 
                           b1 = b1, 
                           W2 = W2, 
                           b2 = b2)
            labs = predict.dnn(model, testdata[,-y])
            accuracy = mean(as.integer(testdata[,y]) == Y.set[labs])
            cat(i, loss, accuracy, "n")
        } else {
            cat(i, loss, "n")
        }
    }
 
    # backward 로 계산
    dscores = probs
    dscores[Y.index] = dscores[Y.index] -1
    dscores = dscores / batchsize
 
 
    dW2 = t(hidden.layer) %*% dscores 
    db2 = colSums(dscores)
 
    dhidden = dscores %*% t(W2)
    dhidden[hidden.layer == 0] = 0
 
    dW1 = t(X) %*% dhidden
    db1 = colSums(dhidden) 
 
    # update ....
    dW2 = dW2 + reg*W2
    dW1 = dW1  + reg*W1
 
    W1 = W1 - lr * dW1
    b1 = b1 - lr * db1
 
    W2 = W2 - lr * dW2
    b2 = b2 - lr * db2
 
  }
 
  # 최종 결과값

  model = list( D = D,
                 H = H,
                 K = K,
                 # 가중치와 오차
                 W1= W1, 
                 b1= b1, 
                 W2= W2, 
                 b2= b2)
 
  return(model)
}

 

6. 데이터로 테스트 해보기

흔히들 쓰는 R의 기본 데이터인 iris 데이터로 모델 테스트를 진행해보자.

 
# 0. 데이터 불러오기
summary(iris)
plot(iris)
 
# 1. Test 셋과 Training 셋으로 데이터 분리
samp = c(sample(1:50,25), sample(51:100,25), sample(101:150,25))
 
# 2. 모델 훈련 시키기
ir.model = train.dnn(x=1:4, y=5, traindata = iris[samp,], testdata = iris[-samp,], hidden=6, maxit=2000, display=50)
 
# 3. 예측값 계산
labels.dnn = predict.dnn(ir.model, iris[-samp, -5])
 
# 4. 결과 확인
table(iris[-samp,5], labels.dnn)
# labels.dnn
# 1 2 3
#setosa 25 0 0
#versicolor 0 24 1
#virginica 0 0 25
 
# 정확성 확인
mean(as.integer(iris[-samp, 5]) == labels.dnn)
# 0.98

위의 그래프에서 확인할 수 있듯이, 훈련이 반복될수록 loss값은 작아지고, 정확도는 높아진다. 약 1000번의 훈련이 반복되고 나면 정확성이 거의 100%에 수렴하는 것을 확인할 수 있다.

 

7. R에서 가장 많이 쓰이는 Neural Network 패키지 중 하나인 nnet와 결과값 비교

 
library(nnet)
ird = data.frame(rbind(iris3[,,1], iris3[,,2], iris3[,,3]),
			species = factor(c(rep("s",50), rep("c",50), rep("v",50))))
ir.nn2 = nnet(species ~ ., data = ird, subset = samp, size = 6, rang = 0.1, decay = 1e-2, maxit = 2000)
 
labels.nnet = predict(ir.nn2, ird[-samp,], type="class")
table(ird$species[-samp], labels.nnet)
# labels.nnet
# c s v
#c 22 0 3
#s 0 25 0
#v 3 0 22
 
# accuracy
mean(ird$species[-samp] == labels.nnet)
# 0.96

필자가 직접 만든 Neural Network 계산식과 널리 쓰이고 있는 R 머신러닝 패키지 nnet의 결과값이 96%정도 일치하는 것으로 나왔다. 100%가 나왔으면 같은 방식으로 계산하는구나라고 생각하겠지만, 약간 차이가 나는 것을 보니 nnet 패키지에 뭔가 다른 계산법이 숨겨져 있는 것 같다.

 

8. 나가며

위의 계산이 대단히 복잡해보이거나 어렵다고 생각할수도 있지만, 사실은 고등학교 수학시간에 배운 행렬 계산의 반복에 불과하다. 쫄지말자.

얼마전에 친구 하나가 왜 그래픽 카드가 그렇게 불티나게 팔리는지, 그래픽 카드가 왜 머신러닝의 핵심인지 묻더라. 그래픽 카드는 계산을 빨리하는 도구가 아니라, 3차원 그래픽을 위해서 행렬을 계산하는 보조 계산 장치라고 생각하면 된다. 근데 i5니 i7이니 불리는 CPU보다 계산속도는 늦어도 메모리는 엄청나게 커서 3차원의 행렬 계산을 한꺼번에 잘 처리해준다. 위에서 봤듯이, 딥러닝의 핵심은 행렬 계산을, 그것도 엄청나게 큰 데이터에서 한꺼번에 처리하는 능력이다. 그래서 그래픽 카드가, 특히 성능 좋은 그래픽 카드가 갑자기 불티나게 팔려나가는 것이다.

(물론 비트코인을 비롯한 가상화폐 채굴 때문이기도 한데, 가상 화폐 채굴에 쓰이는 모듈도 대규모 데이터를 행렬로 계산하는 능력이 중요해서 그렇다.)

 

데이터 사이언티스트가 되려면 얼마나 많은 준비를 해야 할까? 당연하겠지만 필자의 8주 강의 하나를 듣는다고 완벽하게 준비되는 것은 절대로 아니다.

우연히 구글링을 하다가 본 글에서 눈에 확 들어오는 문구가 여기에 딱 맞는것 같아서 소개하고 싶다.

어느 국비지원 IT학원 6개월 과정을 듣고 난 다음에 극소수만 취업한다, 대부분은 중간에 나가 떨어지고, 일부 취업하는 사람들도 엄청나게 악조건으로 채용된다… 는 글이었는데,

“취업하고 다들 버티시느냐? 자기 스킬이 딸린데 회사에서 어떻게해서든 가르침을 받아서 뻐길려는 분은 아쉽게도 회사는 학교가 아니기 때문에 일에 필요한거 외엔 가르쳐주지 않습니다. 기본적인 업무에 필요한 스킬레벨 이상을 가지고 있어야한다는거죠.”

격공한다. 정말 격공.

(국비지원 찾다가 시간만 날린다)

노 베이스인 상태로 공짜강의만 듣던 사람들

필자가 귀국 전에 잠깐 자리만 차지했던 실리콘 밸리의 모 스타트업에도 딱 그런 분이 하나 있었고, 그리고 한국와서도 직장에서 비슷한 사람을 하나 만났다. 둘 다 Data Analyst 경력 몇 년으로 본인이 Data Scientist는 하고 싶은데, 정작 할 수 있는 능력이 안 되니까 필자의 결과물들을 어떻게든 활용하려고 노력하는게 너무 눈에 보였다.

여기저기서 공짜 Youtube 강의를 열심히 듣던 그 분들이 필자에게 자주 R 코드로 이것저것 묻던 기억이 생생하다. 그 중 하나는 심지어 필자에게 이렇게 이야기하더라. “Part of the reason that I hired you is because you are an expert on R. We encourage you to share your knowledge with the team.” 이었다.

글쎄요… R을 돌릴 줄 아는게 중요한게 아니라, 무엇을, 어떻게 R로 돌릴지 아는게 더 중요한데요….

체계적으로 교육을 받지 않은 사람이 그렇게 주먹구구식으로 필자의 프로젝트 결과물만 보고 Data Science를 배우기는 매우 힘들다. 준비 안 된 사람들이 못 따라오는 걸 어떻게 하냐고…

이 분들이 어느 정도 수준이었냐면, 한 명은 두 변수의 상관관계를 볼 수 있는게 Correlation이라는건 알고 Excel로 그 함수를 써서 계산을 할 수는 있는데, 정작 그 계산 공식을 보고 “We can do this kind of cool analysis. Look how complicated the function is.”라던 사람이었다. 아니 이런 기초 공식을 모르다니? 그거 통계학 개론에서 배우는 내용 아니냐? 심지어 나한테 보여준 공식은 틀렸더라. 자유도(Degrees of freedom)가 2개 빠져야 되는데 (각 변수당 평균값을 1개씩 쓰니까, 총 2개가 빠져야지.) “-1″만 되어 있는 공식을 써놓고 그렇게 좋아하더라. 딱했다. “Cool analysis” 많이 해라.

다른 한 분은 일반 정규 분포와 Log 정규 분포의 그래프 모양이 다르다는것도 이해를 못하고 (각각 종 모양, 그리고 한쪽으로 쏠린 종 모양이다.), 어떤 값에 Log를 취해서 그래프를 그리는게 변화율의 차이를 보기위한 간편한 방법이라는 것 자체를 이해를 시키다 포기할 정도였다. Log를 취한 값을 미분하면, 복잡한 공식으로 탄력성을 구하지 않아도 쉽게 탄력성을 알 수가 있고, 10에서 1,000,000,000까지 자리수가 급격하게 변하는 숫자들은 Log로 보면 1에서 9까지 숫자가 변하니까 성장 속도를 보고 이해하기에 훨씬 간편하다. 이런 개념 자체를 설명을 다 해줘야하는 사람들이었다. 설명을 해 줘도 모르더라.

이런 훈련을 교육과정에서 받지 않았다는 증거다. (솔찍말 Log 사례는 필자도 석사 학위 중에 배웠다.) 그냥 회사와서 숫자 뽑아서 그래프 그리는 일만 했으니까 이 정도의 이해도에 딱 멈춘거라고 생각한다. 예전에 Data Analyst라는 타이틀에 진입장벽이 얼마나 낮았는지 쉽게 알 수 있는 대목이다. 그 실력으로 Science까지 욕심을 내신다니… (아마 필자가 공부 더 안하고 학부 수준의 지식만 갖춘 채 직장 생활을 계속했다면 비슷한 상황이었으리라.

Youtube에서 공짜 강의 몇 개 들어서 머신러닝 관련된 용어 몇 개 주워담을 수 있다고 “분석 능력”이 길러지고 “수학”을 제대로 데이터 사이언스에 이용할 수 있는 수준으로 올라가기란 거의 불가능하다. 기초가 안 닦여 있는데 피상적인 지식 몇 줄을 더 알게된다고 어떻게 제대로 된 내공을 쌓을 수 있겠는가?

업무에 필요한 스킬셋을 안 가지고 있으면 회사에서 뻐기면서 어설프게 공부할 생각을 버려라. 잘 가르쳐주는 후임에게 당신의 자리를 내 줄 생각이 있는게 아니라면.

그 후임도 안다. 당신이 그 스킬셋을 배워서 후임의 배를 불려주는게 아니라, 당신의 배를 불리려고 한다는 것을.

 

데이터 사이언티스트가 배워야하는 스킬셋 (feat. CNN)

학교 밖에 있는 분들, 심지어는 데이터 사이언스 석사를 가 있는 사람들도 마찬가지다. 박사 학위 중에 연구실에 쳐박혀서 몇 년동안 지도교수님께 까여가며 공부하는게 아닌 다음에야, 어차피 깊이 있게 수학, 통계학, 컴퓨터 사이언스를 공부할 수는 없다. 회사에서 쓸 수 있는 지식, 특히 실용적으로 쓸 수 있는 코드와 그 코드를 돌아가게하는 기본적인 배경지식을 갖추는데서 타협해야 한다.

문제는 그 타협의 정도다.

CNN을 안다는 사람들의 허상

온라인에 돌아다니는 수많은 Youtube 동영상 강의들을 보면, 일단 제대로 된 예제가 없다. Convolutional Neural Network (CNN)으로 패턴인식한다는 동영상 강의를 보면, 평소에 으레히 봐왔던 사진인식, 숫자 인식, 알파벳 인식 수준에 그친다. CNN을 쓴다는 사람들한테 이게 무슨 함수인지 아냐고 물어보면 대답할 줄 아는 사람들 거의 없다. 인터넷에서 무료 동영상 강의와 교과서 수준의 예제로 “야매”로 배운 사람들이 대부분일테니까.

수학적으로 봤을 때, CNN은 두 개의 함수를 결합하는데 쓰는 여러가지 방식 중에 하나다. 비교대상으로 쓰이는 함수 결합 중에 Cross-correlation이라는 것도 있다. Cross-correlation은 두 개 함수를 그대로 병렬 결합하면서 상관관계를 보는 것이고, CNN은 하나의 함수를 뒤집어서 결합하는 것이다. 왜 뒤집어서 결합하냐고? 같은 걸 두 번 반복해서 보는 것보다 반대방향에서 보는 이미지를 겹치는게 사물을 인식하는데 더 도움이 되니까.

그럴듯하게 이야기하지만 사실 Cross-correlation의 대칭함수가 CNN이다. 말을 바꾸면, 둘이 똑같다. 다만 CNN이 머신러닝한다는 사람들에게 많이 알려져있다보니 CNN이라고 해야만 사진 인식에 도움이 되는 내용이고, 이게 인공지능이라고 대중이 호도되고 있는 것이다. CNN 쓴다는 사람들중에 이런 원리와 바닥에 깔린 수학을 이해하는 사람이 얼마나 될까? 왜 그걸 이해하는게 중요하냐고? 그냥 눈 앞에 있는 사진만 인식하면 되는거 아님?

실제로 CNN을 쓰는 사람들은 사진 한 두장 인식하는데서 끝나는게 아니다. 일전에 베이지안 관련 글에서도 살짝 언급했듯이, 자율주행에 CNN을 적용하려면 불확실성(Uncertainty)을 처리할 수 있어야하는데, 여태까지는 조건식으로 어떤 특정 조건이 아니면 배제한다는 식의 접근을 했었다(Hundreds of “IF”s). 그러다가 베이지안을 결합하면 되겠다는 아이디어로 발전하면서 CNN의 함수 결합 중에 함수 식에 불확실성 파라미터를 하나(or many) 더 추가하는 방식으로 진행이 된다. 이걸할려면 당연히 Cross-correlation에서 쓰이는 두 함수의 결합부터 이해해야된다.

이걸 어디서 배웠냐고? Cross-correlation은 공부하면서 배운내용이고, 불확실성 처리하는 부분은 베이지안 CNN을 하는 분들 논문에서 읽었다. 논문 어렵더라. 이해하느라 고생 많이 했다. 그런데 온라인 강의에 이런 내용이 나올까? 절대로 그럴리 없다. 이런걸 이해하는 사람이 강의를 하는 경우도 드물다. 그리고 이런 내용을 모르면서 CNN 안다고 회사 취업할 수 있을까? 글쎄다. 필자가 고용주면 그런 사람 안 뽑는다. 사진 한 두장 인식시킬려고 월급주는거 아니지 않나?

그렇다고 당장 수학 공부를 새로 할 수는 없고, 어떻게 해야되냐고? 바닥에 깔린 수학을 알고 있고, 직관적으로 설명할 수 있는 선생님을 만나야 최소한 뭘 알고, 뭘 몰라서, 어디까지 구현하고 어디까지는 내가 구현할 수 있는 영역 밖이라는 이해를 할 수 있지 않을까?

 

공짜 동영상 강의의 허상

고가(?)의 유료 강의를 개설하는 입장에서 너무 영업 마인드로 폭언을 쏟아붓고 있는 것 같아 좀 찜찜하기는 하지만, Youtube에 돌아다니는 공짜 동영상 강의는 다 공짜인 이유가 있다. 그거 듣고 나면 베이지안 CNN 논문 이해할 수 있을까? 아마 식 몇 개는 이해할 수 있을지 모르겠다. 그러나 베이지안 CNN 프로젝트 하는 팀에 레쥬메를 들이밀고 취업 면접을 볼 실력으로 성장할 수는 없다.

영어권에 돌아다니는 유료 동영상 강의들을 보면, 특히 살아남은 유료 강의들을 보면 하나같이 굵직굵직한 프로젝트들을 넣어놓고, 그 프로젝트를 직접 할 수 있는 정도의 퀄리티로 강의를 구성한다. 저런거 하나해보고, 채점도 받아보고, 틀린 부분에 대해서 지적도 받고, 새로 다른 방법론으로 만들어보고 등등의 과정을 거치지 않고는 쳇바퀴 도는 수준에 머물 수 밖에 없다.

잘 훈련을 받고 취업에 성공해도 “자기 스킬이 딸린데 어떻게해서든 회사에서 가르침을 받아 뻐길려는…”이 나올판국이다.

시간 들여서 강좌듣고 공부해서 스킬셋을 배울려면, 제대로 된 공부를 해야된다. 괜히 학교가 있고, 좋은 강사가 있는게 아니다.

 

바둑 공부 하던 이야기

필자가 바둑으로 1급이다. 초등학교 5학년 때 단을 딸려고 시험 준비를 하다가 공부로 방향을 틀었다. 그 시절 학원 원장 선생님께서 매번 하시던 말씀이, 또래 친구들하고만 둘려고 하지말고, 기원에 찾아오시는 고수분들께 몇 점 깔고 접바둑도 두고, 대마가 잡히는 쓰라린 경험도 하고, 다 잘 둔 바둑 마지막 끝내기 몇 번에 역전패 당하는 황당함도 자주 겪어보라고 그러셨다. 계룡산에 친구 둘이 10년동안 맞바둑만 두겠다고 들어가서 훈련하면, 나와서 고수들 만나면 바로 패한다고, 다양한 종류의 고수들을 만나봐야한단다.

꼭 필자의 데이터 사이언스 강의 들으라고 하는 이야기는 아니다. 다만 무료 강의들의 수준이 다들 고만고만한데, 그런 강의만 계속 소비되고 있는 현실이 안타까워서 하는 이야기다. 좀 퀄리티 있는 강의가 나오고, 그 강의들 여러개가 경쟁적으로 소비되고, 그래서 시장의 전반적인 수준이 올라갔으면 좋겠다. 그래야 필자도 자극을 받아서 더 좋은 강의를 준비할 것 아니겠나.

 

 

빅데이터, 보험, 금융업

실리콘 밸리에서 면접 보던 시절에 Fitbit 데이터로 의학 관련 업무를 할려고 하는 스타트업을 본 적이 있다. Fitbit으로 맥박을 추적하면 한 개인의 건강과 생활 습관에 대해서 많은 정보를 얻을 수 있는데, 그걸 제약업체에 넘겨주기 위한 자료 처리를 하는 스타트업이었다. 필자가 워낙 의학 관련 지식이 없어서 솔직히 모르겠다고 대답하고는 더 이상 면접을 못 봤는데, 아쉬우면서도 한편으로는 꼭 그걸 제약업체만 쓸려고 할까는 의문이 들었다.

얼마전에 보니 John Hancock이라는 보험회사가 Fitbit을 사용하는 고객에게는 보험 프리미엄을 할인해주겠다고 광고를 냈더라. 정보경제학 이론에 따르면, 유전적으로 질병이 없는 사람과 있는 사람을 놓고 볼 때, 질병이 없는 사람이 보험을 가입하려는 의지가 낮고, 질병이 걸릴 것 같아 불안한 사람일수록 더 쉽게 보험을 가입하게 된다고 한다. 그래서 생명보험 가입하려면 우리나라 보험사들도 건강 진단 내역 확인을 요구하는 경우가 많다. 이제 거기서 한발자국 더 나가서, 보험회사들이 평소 행동 양태에 대한 엄청난 정보가 담긴 Fitbit 데이터까지 이용하겠다고 나선 것이다.

이런 예시를 보면 빅데이터가 앞으로 금융업을 여러가지로 바꿀 기회의 광산이라는 생각이 든다. 몇 가지 예상 가능한 것들, 혹은 이미 다른 나라들에서 진행되고 있는 것들을 좀 정리해보자.

 

1. 위험 관리 (Risk Assessment)

서두에 언급한 Fitbit같은 웨어러블 기기를 이용하면 인간의 다양한 행동 데이터를 효과적으로 추적할 수 있다. 필자가 스마트폰에 깔린 운동 추적앱으로 하루에 몇 걸음을 걸었는지, 조깅은 몇 키로를 뛰었는지, 그 데이터를 장기간 모으면 얼마나 주기적으로 운동을 하고 있는지 모두 파악할 수가 있다. 더군다나 손목에 차고 맥박을 계속 추적하는 기기를 쓰면, 언제 맥박이 올라가는지, 하루에 몇 번이나 올라가는지, 그 시간대가 보통 움직이는 시간대인 출근시간, 식사시간인지, 다른 시간대라면 혹시 사무실에서 업무가 맥박을 높이는 일은 아닌지 등을 추적할 수 있다. 그런 정보가 있으면, 생명보험 회사 입장에서는 보험 프리미엄을 정하기가 정말로 쉬워진다.

뿐만 아니라, 운전 실력을 쉽게 파악할 수 있고, 평소에 운전 습관도 쉽게 파악할 수 있다. 더군다나 GPS기능으로 자주가는 장소를 파악하고 나면, 그 지역이 우범지대인지, 보안이 잘 되어 있는 곳인지를 알 수가 있다. 자동차 보험회사에서 이런 정보를 다 갖고 있으면, 당연히 운전 실력이 미숙하고, 운전 습관도 거칠고, 우범지대에 자주 가는 사람에게 보험 프리미엄을 높게 매길 것이다. 지금까지의 자동차 보험료 산정 방식을 보면, 나이가 어린지, 자동차 차종이 뭔지, 결혼은 했는지 등이었다. 물론 이런 개인 정보를 바탕으로 만든 모델이 충분히 훌륭한 예측을 할 수 있겠지만, 웨어러블 기기를 통해서 얻는 데이터로 찾아낼 수 있는 개인 행동 데이터에서 얻을 수 있는 정보에 비하면 새발의 피가 아닐까?

실제 적용할 때는 웨어러블 기기를 자주 벗는 사람들이 생겨서 별로 좋은 데이터를 못 얻을 것 같기는 하다. (실제로 필자가 면접봤던 회사에서 가장 고민하는 문제도 그거였다. What to do with “Missing data”?)

 

 

2. 부정행위 탐지 (Fraud Detection)

갑자기 신용카드 회사에서 “방금 푸에르토리코에서 결제하신 내역 있으십니까?” 같은 연락을 받은 적이 있는가? 필자는 오밤중에 그런 연락을 받고, 지금 집에서 잘 자고 있는데 무슨 소리냐고 그랬더니 카드가 해킹된 것 같다고 바로 새 카드를 배송할테니 지금 갖고 있는건 오늘부터 쓰지말라고 하더라.

서울에 있는 사람이 지구 반대편에 있는 나라에서 뜬금없이 카드 결제를 할 가능성이 매우 낮으니 이런식으로 부정행위를 탐지하는 알고리즘을 만든 것 같은데, 이제 빅데이터 시대가 되면 이런 프로세스가 근본적으로 바뀌게 된다. 신용카드, 스마트폰 최근 사용내역과 GPS 데이터를 결합하면, 어젯밤까지 서울에서 결제를 했던 사람이 지구 반대편에서 그 다음날 새벽에 그것도 온라인 판매 상품이 아닌 상품을 결제하고 있다면? 새벽에 필자에게 전화해서 단잠을 깨울 필요도 없다. 그냥 결제 거절을 해 놓으면 된다.

보험사들은 어떨까? 사소한 차 사고에도 새로 싹 수리를 하는 사람들에게 울며 겨자먹기로 높은 가격의 보상을 해줘야했지만, 이제 그런 꼼수는 안 통하게 된다. 그런 뒷거래를 도와줄 수 있는 수리 센터 직원과 보험 가입자의 관계는 서로 모르는 사람일까? 아는 사람일 확률이 매우 높다. 그럼 당연히 SNS로 서로 연결되어 있을 것이고, 그 무렵에 개인적인 통화를 했을 것이고, 최소한 장기간 알고 지낸 기록을 찾을 수 있다. SQL 쿼리 몇 번이면.

무서워지시는가?

 

3. 마케팅 (Marketing)

보험사들이 가장 원하는게 뭘까? 신규 고객, 특히 장기간 보험료를 납입하는 고객이 찾아오도록 만드는 것이다. 그럼 제일 좋은 방법은? 그 고객이 원하는 상품을 최저가로 (그렇지만 이윤을 크게 손해보지 않으면서) 내미는 것이다. 마케팅에서 그런 말이 있다. Right person, Right time, Right product. 최적의 상품을 최적의 시간대에 딱 맞는 사람에게 들고 가는 것이다.

어떻게? 이 분 뭐하시는 분이고, 무슨 고민 있으실 분인지 매일의 데이터가 차곡차곡 쌓이는데 안 나올까? 새로 집을 사셨다. 그럼 집 보험을 들고 가면 된다. 새로 비싼 차를 살려고 여기저기 딜러들에게 전화문의도 넣고, 시승도 하고 있다. 어차피 그런 고가 상품은 단번에 구매를 안 하고 시간을 두고 고민을 할테니, 그 고민하는 기간에 자동차 보험을, 그것도 살려고 하는 차종에 딱 맞는 옵션을 넣어서 찾아간다.

 

4. 인공지능과 빅데이터의 만남

IBM이 내놓은 “왓슨”이라는 인공지능이 챗봇으로 강력한 성능을 보인다는 뉴스를 본 게 엊그제 같은데, 그 기술을 응용해서 보험 사정에 필요한 대부분의 작업을 할 수 인공지능이 나왔다는 기사가 떴다. 펀드 매니저들이 하는 일들을 대신해준다는 로보 어드바이저는 이미 상품으로 나와서 출시까지 된 상태다.

이거 전부 예전에 했던 자동화 시스템의 일부 아니냐는 분들이 있는데, 여태까지의 상품들은 새로운 지식을 배우는 “머신러닝”이 아니라 단순히 Hundreds of “IF”s 명령어를 쓰는 “짝퉁”이었다면, 빅데이터가 더 쌓이면서 정말로 인간이 해야된다고 했던 작업들이 “머신”이 빠른 속도로 배우고 있다.

뿐만 아니다. 필자가 직장 찾으려고 처음에 뉴욕에 있는 헤지펀드들 면접을 갔더니, 파생상품의 가치 계산하는데 쓰는 수학인 Stochastic calculus는 트렌드가 지났고, 이제 머신러닝 얼마나 아는지가 제일 궁금하다고 그랬다. 월마트 주가가 오르고 내리는 걸 예측하는데, 예전에는 월마트의 과거 주가만 사용했지만, 이제는 월마트 주차장에 차가 몇 대 들어오는지를 인공위성 사진을 읽어서 계산한단다. 한 대의 차가 평균적으로 얼마만큼의 금액을 쓰는지 나와있으면, 차량이 얼마나 많이 들어오는지가 월마트의 매출액과 직접적으로 연결된다고 생각하는 것이다. 말을 바꾸면, 머신러닝으로 빅데이터를 만들어내고, 그걸 다시 머신러닝에 적용시켜 주가를 예측하는 시스템이다.

 

끝으로

오늘 이 글의 제목은 “충격”이지만, 2-3년 후에 같은 글을 쓰게되면 “AI가 바꾼 우리 삶의 ‘현실’”이 될 것이고, 다시 2-3년이 더 지나면 “그땐 그랬지”가 될 지도 모른다.

 

밥 먹고 사는 타이틀을 데이터 사이언티스트로 달고 난 이래 줄곧 온라인 유저 데이터를 보고 살아온 탓에 “중독”증상이 좀 있는 것 같다. 처음 이 웹페이지를 만들고 난 다음에 제일 먼저 했던 일이 예쁘게 꾸미는 테마 구하는게 아니라, 데이터 추적하는 구글 애널리틱스 (Google Analytics)를 설치하고, 필자의 IP 주소를 블랙리스트 시켜서 숫자 합산에 포함되지 않도록 하는 일이었다. (필자는 이 페이지에 하루종일 접속해있으니 클린 데이터를 모으는데 방해가 된다ㅋ)

모르시는 분께 간략하게 설명을 드리면, 구글이 웹사이트 방문자들을 추적해서 그 페이지에 몇 명이나 왔고, 몇 페이지나 봤으며, 어디서 왔다가, 얼마나 있었는지, 처음 온 사람인지, 전에 왔던 사람인지 등등을 한 눈에 볼 수 있는 “공짜” 서비스를 제공하고 있다.

사용자마다 다르겠지만, 이게 필자에게 큰 도움이 되는 부분이 몇 가지 있는데, 간단하게만 정리해보자.

 

1. 어느 글이 흥하는지 알 수 있다

블로그로 “돈 안 들이고” 마케팅 할 수 있다는 글들 보면 하루에 한 개씩 꾸준히 좋은 글을 양산해내야지 검색 엔진 (구X, 네X버, 다X 등등)이 잡아내준다고 한다. 별 의미 없는 이야기고, 실제로는 좋은 글 하나에 유입량이 폭증하면 쉽게 노출 효과를 볼 수 있다는 걸 잘 알지만, 그래도 블로그 홍보를 위해서 할 수 있는 모든 걸 다해야겠다는 일념으로 하루에 하나 이상의 “매우 허접한” 글을 쓰고 있는 중이다.

주제를 R 코딩 위주로 잡으면 노출량이 많을까? 아니면 좀 더 일반 대중에게 다가갈 수 있는 코딩 없는 글이 더 좋을까? 일단 몇 개 써보니까 R 코딩 들어가면 Bounce rate (바로 튕겨나가는 비율)이 엄청 높아지더라. 그래서 맘을 바꾸고 코딩 없는 글을 좀 써봤는데, Bounce rate은 내려가는 대신, 찾아오는 사람들 숫자는 또 줄어들었다.

그렇게 글 하나하나마다 매일매일 몇 명이 읽었고, 평균 몇 초를 소비했고, 또 몇 명이 바로 빠져나갔는지에 대한 상세한 추적이 가능하다.

위의 스샷을 보면 수요일, 토요일 강의에 대한 선호도를 바로 파악할 수 있다. 수요일이 4.5%의 페이지 뷰, 토요일은 2.4%에 불과하다. 그리고 현재 올라와 있는 블로그 글 20개 중 “5가지 XX해라“, “5가지 XX하지마라” 같은 류의 글이 제일 많이 읽히고, 인공지능의 미래에 대한 글이 그 뒤를 따르고 있음을 알 수 있다. 필자가 정성 들여 쓴 K-means visualization (K개 중심점으로 데이터를 그룹화하는 방법), 신경망 모델 (딥러닝의 기본 모델)에 대한 R 코드를 넣은 글은 상위 20위권 밖에 있다. 코드가 예쁘게 들어가라고 워드프레스 유료 플러그인도 구매하고, 코드도 직접 몇 번이나 돌려보면서 더 쉽고 간단하게 설명할 방법은 없을까 고민한 글은 인기도가 하위권이다. 글을 잘 쓰는게 더 도움이 된다는 뜻이다.

이런 피드백(Feedback)을 보고나면, 글을 어떻게 써야될지에 대한 온갖 복잡한 생각들이 오간다.

필자가 글을 쓰는 걸 좋아하기는 하지만, 그래도 이 블로그는 R 코드를 설명해주는 글이 더 많아야할 블로그이지 않나? 고민이 많다.

 

2. 어떤 마케팅 채널이 더 흥하는지 알 수 있다.

이 블로그는 광고 달아서 돈 버는 사업 모델이 아니라, 어쨌건 방문자들이 강의를 듣도록 유도해서 강의에서 돈을 버는 사업 모델로 시작했다. 다른 블로그들처럼 검색 엔진이 날 발견해주기를 바라는 마음으로 글만 쓰고 있을 수가 없어서, 유명 광고 채널 몇 군데에 계정을 틀고 광고를 띄워봤다.

온라인 광고 시장에 맛 좀 봤다고 단가를 얼마정도를 제시해야 상위 노출이 되는지 감이 있으니까, 교육 회사들이 큰 돈을 지르는 걸 알고 그에 맞춰서 세게 질렀는데,

위에 보시다시피 우리나라 최대 검색엔진에서 키워드 광고에 3번째로 노출되어 있다. 참고로 키워드 광고는 특정 단어를 입력했을 때, 그 단어를 검색한 사람이 찾을 법한 내용 중 (1개 클릭당) 광고비를 많이 쓰는 광고를 상위권에 노출시키는 모델이다. “데이터 사이언스”라는 키워드에 필자의 광고가 노출되도록 XXXXXXX원의 클릭당 광고비를 책정했다. (7개의 X에는 앞에도 뒤에도 0이 섞여 있을 수 있다ㅋ)

아뭏튼, 얼마나 세게 질렀는데, 3위 노출이라니… 2개 회사나 필자보다 큰 돈을 질렀다는 뜻이다. 이 사람들 도대체 얼마를 지른거야…

강의를 처음 시작할 때, 필자가 벤치마킹을 했던 고가 정책의 경쟁사보다도 더 높은 위치에 키워드 광고를 배치시켰는데, 필자보다 훨씬 더 높은 광고금을 쏟아 붓고 있는 회사들이 있다는 이야기는 생각보다 이 시장의 경쟁이 치열하다는 뜻이다. 10주 3시간짜리 강의에 170만원씩되는 고가 정책을 하는 회사가 있길래, 경쟁이 없어서 지대(Rent)를 세게 받고 있나보다 생각했더만, 막상 발을 담궈보니 필자의 판단이 짧았다는 걸 알게 된 사건이었다.

근데 광고로 유입되는 숫자가 그렇게 많을까?

아래 스샷은 구글 애널리틱스에서 유입분석을 한 화면인데, 3번 Referral이 광고 유입을 이야기하는 것이다. 참고로 1번은 직접 검색한 사람이어서 눌러보면 어떤 키워드로 찾아왔는지를 보여주고 (예, 데이터 사이언스, 머신러닝, 빅데이터 등등), 2번은 직접 유입이라고해서, 어떤 페이지를 보고 갔는지만 보여준다. 4번은 소셜 네트워크를 통해서 유입된 경우로, 페XX북, 인X타X램 등등을 생각하면 된다. 아래에 보니 소셜 네트워크를 통해서 들어온 경우에 Bounce rate도 제일 높고, 반대로 머문 시간도 제일 길다. 진짜 관심 많은 사람과, 별로 관심없는 사람들, 두 그룹이 모두 소셜 네트워크로 유입되고 있다는 뜻이다. 별로 관심없는 사람들을 어떻게 분리해낼 수 있을까…..

자 그러면 3번 Referral을 눌러보면 어떤 화면이 나올까?

구글, 페이스북이 상위권에 있고, N사 유입은 전체의 3%도 안 된다. 심지어 일반 IT관련 커뮤니티에서 유입된 숫자보다 더 적다.

아마 데이터 사이언스라는 주제 자체가 N사 검색하는 유저에게는 흔하지 않은 주제일수도 있겠다 싶다.

아뭏튼, 광고비를 얼마나 많이 질렀는데…씁쓸하다. 앞으로 계속 광고비 태워야할까?

아래를 보라.

심지어 결제하는 사람들 구성까지도 N사 유입이 최저다. 이대로만 간다면 G사에 광고비의 절반 이상을 태워야될 것 같다.

 

3. 실시간 모니터링

오늘 글을 쓰기로 맘 먹은 이유가 바로 이 부분을 언급하고 싶어서였다.

주말이고 새벽이라 방문자 숫자가 거의 없는데 1명만 딱 https://pabii.co에 들어와 있더라. 그 때 Real-Time Report를 보면 아래의 화면이 뜬다.

서울에 살고 있는 유저고, 데스크탑으로 접속을 했다. 그리고 Top Referrals에 보면 어느 채널을 통해서 들어왔는지 알 수 있고, 가장 결정적으로 Top Active Pages에서 어느 페이지를 확인하고 있는지를 알 수 있다. 그런데 토요일 수업 페이지를 보고 있네?

이 유저는 결국 결제를 안 하고 페이지를 떠났다. 왜? 가격이 너무 비싸서? 다른 경쟁사에서 제공하는 수업이 더 좋아서? 필자가 별로 좋은 강사가 아닌 것 같아서? 아니면 그냥 실수로 눌러서 읽어봤다가 관심이 없어져서? 이유는 모른다.

어차피 필자야 학원 운영자도 아니고, 그냥 재능 기부라는 마음 가짐으로 블로그와 강의를 운영하고 있으니 크게 신경을 안 쓰지만, 아마 직접 학원을 운영하시는 분들이나 쇼핑몰 같은 사업을 하시는 분들이면 저런 시점에 떠나는 유저들을 붙잡고 물어보고 싶을 것이다. 뭐가 맘에 안 드세요?

불행히도 구글 애널리틱스는 추적 서비스만 제공할 뿐, 고객과 대화를 이어주지는 않는다.

 

4. 유저 행동론

찾아왔던 유저가 다른 페이지로 떠나고 나면, 한번 들어왔던 로그가 남아서 계속해서 추적을 할 수 있다. 그들에게 계속 상품을 배너나 텍스트 광고로 노출시키는 걸 리타게팅 광고라고 하는데, 쇼핑몰 같은데야 상품 종류가 다양하고 고객들이 원하는 내용이 약간씩 다를 수 있으니 머신러닝을 이용해 최적화된 상품을 보여줘야겠지만, 필자의 웹페이지같은 단순 상품은 머신러닝이 들어갈 것도 없이 그냥 여러번 노출시키기 말고는 딱히 방법이 없다.

그럼 리타게팅을 하는게 좋을지 말지 어떻게 알 수 있을까?

구글 애널리틱스를 통해서 전체 방문자 중 약 20% 정도가 필자의 웹페이지를 주기적으로 방문한다는 것을 알아냈다. 이들이 만들어내는 페이지 뷰(Page View)가 절반을 훨씬 넘는다. 이 중에서 강의 계획서 페이지를 본 사람들에게만 노출시키는 전략을 취해보면 어떨까? 강의 계획서 페이지를 본 사람들 중 비일회성 방문자가 몇 번째 재방문 이후에 강의 신청을 하고, 또 재방문을 하지 않게 되는지 비율을 보면, 지속적인 노출이 효과가 있을지 없을지에 대한 판단을 내릴 수 있다.

언젠가는 이정도로 웹사이트가 잘 돌아가는 날이 오겠지….

재방문자가 꾸준히 유입되면서 매출액이 낮은 경우와, 재방문자가 거의 없으면서 매출액이 안 나오는 경우를 비교해보자. 언뜻보면 후자쪽인 경우에 리타게팅 광고를 해야되는 것 아니냐고 생각할 수 있겠지만, 필자의 결론은 반대다. 재방문자가 거의 없다는 이야기는 상품의 매력이 떨어져서 매출액이 안 나오는 경우일 가능성이 높고, 반대로 구매 결정이 늦어진다는 건 고려해야할 변수가 많고, 고민을 많이 했다는 뜻이다. (이 때 대부분의 경우 가장 큰 변수는 “가격”이다.) 재방문자가 거의 없는 경우면 리타게팅 광고를 할게 아니라, 상품 경쟁력에 대한 고민을 해봐야 한다.

쇼 윈도우에 진열된 옷을 길거리에서 보고 지나가기만 며칠 째 반복하는 사람을 생각해보자. 그 며칠동안 계속 고민을 하고 있었는지, 아니면 그냥 가던 길에 걸려있어서 본 건지 어느 쪽인지 구별하는 문제는 그렇게 간단하지 않다. 이 때 일종의 “눈썰미”가 있는 매장 직원이라면, 그 잠재 고객이 고개를 슬쩍 돌려서 그 옷을 보고 갔는지, 잠시라도 시간을 내서 쇼 윈도우 앞에서 그 옷을 봤었는지를 보고 관심사의 정도를 파악할 수 있을 것이다.

구글 애널리틱스는 그런 정보를 제공해준다. 내 쇼핑몰 페이지에 누가 얼마나 오랫동안 있었는지, 또 얼마나 자주 찾아왔는지 등등, 오프라인에서 눈으로 볼 수 있는 관심의 정도를 온라인에서도 추적할 수 있도록 필요한 정보를 제공해 주는 것이다.

물론 구슬이 서말이라도 꿰어야 보배인 것 처럼, 그렇게 DB에 찍어놓은 데이터를 볼 줄 알아야 GA가 진정한 가치를 얻는 거겠지만…

데이터 사이언스 석사 프로그램에 관심있다면서 어떤 내용을 배우는지, 어떻게 준비해야되는지, 그리고 졸업하고나면 어떻게 진로가 잡히는지 물어보는 분들이 참 많다.

필자는 데이터 사이언스 석사 프로그램에서 공부한 적이 없고, 학위 중에 데이터 사이언스도 없어서 정확한 답변을 해 줄 수 없겠지만, 그래도 일단 알고 있는 내용들을 많은 분들과 공유하는 게 좋을성 싶어 짧게 정리해본다. 다른 의견이 있으신 분들은 아래에 댓글을 달아주시면 좋겠다. (필자의 개인적인 백그라운드는 여기의 맨 마지막 질답)

 

1. 학위 과정 전반 – 수업, 생활 등등

데이터 사이언스라는 필드가 생긴지 얼마되지 않았기 때문에, Coursework은 기존 필드 출신들 눈에는 “뒤죽박죽”처럼 보인다. 학교마다 약간 차이는 있지만 전반적으로 보면 기본적인 Computer Science, Statistics, Math가 들어가 있고, 그위에 Data Visualization, Data Analysis 처럼 실제 데이터로 작업하는 경영학 스타일 수업이 추가되어 있다.

이렇게 여러 전공의 수업들을 뭉쳐놓다보니 3학기동안 큰 수업 12개 정도를 들을 시간동안 저걸 다 커버하기에는 턱없이 부족하다. 거기다 1학년이 끝나고 2학년 올라가기 전에 여름 학기 동안 인턴도 해야되니 아마 1학년 1학기 11월부터 2학기가 막 시작할 1월말~2월초까지 학교 공부와 인턴 면접을 병행하기에 참 빠듯한 시간이 계속될 것이다.

우리가 알고 있는 좋은 학교들, MIT, CMU, UC Berkeley, Columbia, NYU 같은 학교들에 이미 비슷한 프로그램들이 있으니 각 학교의 프로그램 페이지를 참조해보면 더 잘 알 수 있겠지만, 좀 더 상세하게 정리되어 있는 Johns Hopkins의 데이터 사이언스 석사 프로그램을 살펴보고 간단하게 수업이 어떻게 돌아갈지 정리해보자.

미리 들어야 되는 수업들

  • Intro to Python
  • Intro to Java
  • Data Structures
  • Discrete Mathematics
  • General Applied Mathematics
  • Multivariable and Complex Analysis
  • Intro to Ordinary and Partial Differential Equations

Python이랑 Java 프로그래밍은 “도구”니까 반드시 들어야할 것 같고, 4번째부터 7번째까지에 있는 수학(?) 수업은 아마 공업수학 정도의 내용을 가르치는 것 같다. 3번째의 Data Structures 수업에서는 빅데이터가 뭔지에 대한 개론, 3V + Value (Volume, Velocity, Variety, Value 같은 빅데이터의 속성…) 같은 내용을 가르치고, 어떤 종류의 프로그램을 써서 빅데이터를 관리한다는 이야기, Hadoop을 어떻게 쓰고, Map Reduce가 뭐고 등등에 대한 기본적인 개념을 가르쳐주는 수업이 될 것이다.

또 들어야 되는 수업들 (Foundation courses)

  • Foundations of Algorithms
  • Statistical Methods and Data Analysis

딱보면 공대 2학년과 통계학과 2학년이 듣는 수업이라는 걸 알 수 있다. 석사 2학년 말고 학부 2학년. 그래서 이런 걸 미리 다 공부하고 간 학생들은 쉽게 Waiver를 받고 좀 더 윗레벨 수업을 쉽게 들을 수 있을 것이다.

필수 수업 (Required Courses)

  • Principles of Database Systems
  • Data Science
  • Data Visualization
  • Introduction to Optimization
  • Statistical Models and Regression
  • Computational Statistics

데이터 베이스 시스템에 대한 수업에서 저 위에 잠깐 언급한 MapReduce가 어떻게 돌아가는지, 서버 관리는 어떻게 되는지 등에 대한 수업을 들을 것이고, 이게 Data Engineer 커리어를 밟으려는 분께는 필수적인 지식이 될 것이다. 두번째 수업에서 머신러닝을 어떻게 데이터에 적용하는지를 배우고, Data Visualization에서는 Tableau같은 유료 프로그램이나 R의 ggplot같은 함수를 써서 그래프를 그리는데, 3차원 이상의 데이터를 어떻게 시각화하는지에 대한 공부를 한다. Intro to Optimization은 수학적으로 연속함수가 최소/최대 값을 갖기 위해서는 2차 미분이 그 구역에서 음수/양수여야 한다는 조건을 놓고 Gradient descent가 언제 작동하지 않는지, 이럴 때 파라미터 수정은 어떻게 되는지 같은 지식을 배운다.

뒤에 두 개 수업에서는 머신러닝에 들어가는 통계학 기초지식과 회귀분석을 배우고, 통계 계산하는 모델들 (ANOVA 같은거)을 어떻게 쓰는지를 다루게 될 것이다.

선택 수업들

그리고 나면 자기의 커리어 목표에 따라서 Data Engineer가 목표인 사람들은 Database 관리에 관련된 수업을 더 듣고, 통계와 머신러닝이 더 궁금한 사람들은 그 쪽 수업을 더 찾아듣고, 데이터 분석을 비지니스에 적용하는게 궁금한 사람들은 Data Mining이나 Simulation, 심지어 게임이론 같은 경제학 수업을 들을 수 있도록 커리큘럼이 갖춰져 있다.

수업에 대한 개인적인 생각

구글링을 해보면 Data Science 수업들이 수준이 낮다, 너무 쉽다, 배워봐야 도움 안 된다 등등의 말이 많은데, Johns Hopkins 대학의 수강 목록을 보면 나쁘지 않다는 생각이 든다. 학생들 수준이 어느정도 받쳐줘야 가르치는 교수들도 수업 수준을 높게 유지하고, 본인도 배워가면서 강의 노트를 열심히 잘 만들텐데, 그런 개인적인 차이를 감안해도, 수업들 참 잘 짜놨다 싶다. 학부에서 수학, 통계, 공학쪽 전공한 친구들, 문과로 오면 경제학 공부한 친구들이라면 (대신 경제학에 선형대수, 미분방정식, 회귀분석 정도는 들은 사람들) 충분히 따라갈 수 있을 것이다. 그리고 배워서 나온 지식을 잘 쓸 수만 있으면 직장가서 일 잘한다는 소리 들을 것 같다.

 

2. 졸업 후 진로

미국사회의 전체적인 분위기를 보면 석사학위는 학부수준보다 좀 높은 수준의 지식을 배워서 직장 업무에 활용하기 위해서 만들어진 프로그램이다. (박사학위를 위한 예비 프로그램이 아니다. 한국 학생들이 “학벌 세탁”과 “제대로 다시” 배우기 위해서 가기는 하겠지만)

미쿡 대부분의 석사 프로그램들이 졸업 후 취업률과 연봉을 항상 강조하는 것도 같은 이유다. 그런 “직장용”의 가장 끝판왕인 프로그램이 MBA인 것 같다.

외국인 학생이 다른 전공으로는 직장 비자 (Working Permit)을 받기가 참 힘들지만, 미국에서는 STEM 전공이라고해서 수학, 과학, 공학 쪽 전공들은 비자를 길게 연장할 수 있는 옵션이 있다. 당장 1년짜리 비자밖에 안 나오는 문과 출신보다 길게 쓸 수 있는 가능성이 높기 때문에 미국 기업들도 좋아라 한다. 거기다 3년 비자가 나오는 H1B를 받고, 영주권을 신청해서 미국 에 눌러앉으려는 경우도 많이 본다. 왜 이렇게 STEM에게 많은 혜택을 주냐고? 사실 미쿡애들은 STEM 전공 잘 안 한다. 수학이 어렵거든.

그래서 외국인에 대한 차별을 상대적으로 덜 받고, 좋은 학교 데이터 사이언스 석사 졸업하면 미국 탑 IT회사에 충분히 도전해 볼 수 있는 스펙이 된다. 최초에 전화 인터뷰로 영어 잘하는지 보고, 그 다음에 온라인으로 기본적인 코딩 테스트 1차례를 한 다음에, 면접장에 가면 학교에서 무슨 프로젝트를 해 봤냐고 물을 것이고, Whiteboard에다가 즉석에서 간단한 코딩 해 보라고 문제를 던진다.

인터뷰 질문소스는 인터넷에 참 많은데, Github에 정리된 내용을 참고하면 되겠다. (언제 이 부분에 대해서 자세하게 한번 정리해봐야겠다.)

연봉 레벨은 실리콘 밸리에 있는 미국 탑 IT회사들은 12~3만불에 회사 지분 (아주 조금)을 얹어주고, 그 일대에 있는 스타트업들은 회사 지분을 더 얹어준다. (그래야 올테니까) 한국에서야 구글, 페이스북 같은 회사 가는게 제일 좋다고 생각하지만, 의외로 실리콘 밸리 가보면 스타트업에 갈려고 하는 사람들이 많다. 특히 10년후에 에어비앤비나 우버가 될 것 같은 “로켓”들 찾으려는 사람들의 인구 밀도는 상상을 초월한다.

그 이외 지역에 있는 직장에서 데이터 사이언티스트 포지션을 찾으면 아마 7-8만불 언저리의 연봉으로 시작할 것이다. (뉴욕 일대는 약간 다를 수 있다.)

 

주의할 점

물론 석사 학위 하나 따고 엄청나게 중요한 일을 바로 시작할 수는 없다. (석사하고 나면 세상의 모든 것을 알게 된 것처럼 까부는데 -내가 그랬지 ㅠㅠ-, 사실 별로 배운거 없다는걸 곧 깨닫게 되더라. ) 그래서 이것저것 다 따지고 직장 찾기는 힘들겠지만, 그래도 Data Analyst 포지션이면서 Data Scientist라고 타이틀만 달고 있는 직장은 구분해서 찾아가기를 충고한다. 본인이 Data Analyst의 일에 불만이 없다면 모르겠지만, SQL로 데이터 뽑아서 Tableau로 그래프 잘 그리는 일만 하는 직군은 Business Intelligence라는 예전 업무의 연장 선상에 있고, 시장에서 별로 대우가 좋질 못하다.

본인이 공대 출신이고 Database 관리 쪽에 매우 흥미가 있다면 괜히 다른 수학 수업 들으면서 머리 아프게 고생하지말고 자기 관심사를 파는 것도 괜찮다. 큰 기업들에서는 당연히 Data Engineer에 대한 수요가 많고, 또 스타트업의 초기 단계에 뽑는 Data Scientist는 실제로는 Data Engineer인 경우가 많다. 저 위에 잠깐 언급한 MapReduce 파이프라인을 만드는 일은 일반적인 Data Scientist는 관심도 없고, 할려고 하지도 않는다. 근데 그게 없이 데이터가 어떻게 쌓이고 관리될까? 미래에 잘 나갈 스타트업의 초창기에 Data Engineer가 필수적일 때 많은 지분을 받고 들어가서 “잘 먹고 잘 사는” 경우도 은근히 보이더라.

 

3. 뒷 이야기들

DS 석사 시작했다가 그만뒀다는 분의 글이 한동안 LinkedIn에서 유명세를 탔던 적이 있다. 왜 그만뒀냐니 너무 쉬워서 그만뒀다는데, 이 분이 들었다는 수업들이 첫학기에 나오는 수업들 이어서 그랬던거지, 졸업할 무렵에 들었어야할 수업들은 그렇게 만만치는 않았을 것이다. 같은 분이 쓴 글 중에 SQL 제대로 배워라고 엄청나게 강조하는 부분이 있던데, 필자의 Data Scientist 경험을 놓고봐도 120% 공감할만한 내용이다. 본인이 Data Scientist이건, Data Engineer나 Data Analyst 그 어느쪽 직업을 담당하건 상관없이 데이터 베이스에서 데이터를 못 뽑고 어떻게 데이터로 작업을 진행하겠나? 그리고 공대생들은 다들 공감하겠지만 SQL은 코딩 언어 축에도 안 끼워줄만큼 쉬운 언어다. 겁먹을거 없다. 언제 이걸로 공개 강좌나 몇 번 열어볼까 싶다. SQL 가르쳐주고 돈 받는건 정말 너무한다 싶더라.

한국인, 기혼, 30대 중반, 여자, 그리고 문과 출신인 분이 데이터 사이언스 석사를 가서 글을 몇 번 올리신 적이 있다. (필자가 전에 다녔던 리타게팅 광고 회사의 한국 오피스에서 신규 광고주 세일즈를 담당하셨던 분이라서 얼굴은 한번 뵌 적 있다.) 브런치에 공개된 글을 여기, 여기, 여기에서 확인해보시면 된다. 가서 무지 고생하고 계신 것 같더라ㅋㅋ 학교 수업 따라갈려고 Coursera에서 듣는 수업들 리스트가 올라와있던데, 대부분이 통계학과 1,2학년 때 배우는 내용들이다. 데이터 사이언스 석사가고 싶으면 꼭 통계학 공부 좀 해 놓자.

알고 지내는 동생 하나는 한국서 공대서 학부랑 석사한 다음에 데이터 사이언스 석사 유학을 갔다. 거기서 언어처리 알고리즘을 돌리는 프로젝트 한 걸 페이스북에도 곧잘 올리곤 하더니 미국서 직장 잡고 지금은 잘나가는 실리콘 밸리 회사 중 하나에 Data Scientist로 가 있다. 박사 재학 시절 필자의 Office Hour에 자주 찾아왔던 인도인 석사생 하나는 Financial Engineering이 재미없다고 실리콘 밸리 쪽 직장 알아본다더니 어느 날 Data Scientist 자리 잡았다고, R 코딩 숙제 도와준 덕분에 쉽게 면접봤다고 고맙다는 메일도 보냈더라.

 

 

그런데,

학위 없이도 데이터 사이언티스트 될 수 있다. 꼭 학위 있어야되는거 아니다. 생긴지 얼마되지도 않은 필드에, 필요한 지식도 “짬뽕”인 마당인데, 특별히 학위를 받지 않으면 이쪽 직장 못 찾는거 아니니까 “쫄 꺼 없다”. 한국에서 잘 모르는 회사들이나 개발자 출신이나 컴퓨터 공학과 출신들 위주로 뽑지, 제대로 뽑고있는 실리콘 밸리를 가보면 Quantitative 전공 출신이면 누구나 좋은 후보라고 생각한다. 그들 눈에는 어차피 선형대수-회귀분석으로 이어지는 수리통계학 지식과, 데이터를 학위 논문 쓰는 수준으로 다뤄본 경험이 훨씬 더 중요하기 때문이다. 필자 역시도 면접내내 받은 질문이 PCA, SVM 등에 들어가는 수학이었고, 데이터 모델링에 대한 여러가지 경험*들을 굉장히 꼼꼼하게 테스트하는 느낌을 받았었다. 실제로 일터에 나가보면 그런 경험들이 그대로 다 업무에 반영이 되더라.

(*거시경제학에서 썼던 Calibration, Financial engineering 수업에서 했던 simulation, 심지어는 석사시절 Panel data 공부하면서 썼던 RE, FE 테스트랑 Instrumental variable 골라내는 작업들을 얼마나 robust하게 진행했는지 매우매우 꼼꼼하게 물어봤던 기억이 난다.)

데이터 사이언스 석사 프로그램에 관심있을만한 내용들을 쭉 정리해봤는데, 혹시 더 궁금한 점 있으면 따로 메일로 연락주시라. 아는 만큼 대답해드리거나, 이 글 후속편으로 답을 드리겠다.

 

후속편 링크: https://blog.pabii.co/data-science-masters-what-to-prepare/

빅데이터, 데이터 사이언스, 데이터 사이언티스트

런던 시내 한 가운데에 있는 대학에서 공부하는 대학원생이 아침에 연구실에 “출근”할 때 갖고 나타나는 것은?

어젯밤에 본 교과서? Problem Set? 논문? 땡!땡!땡! 우리가 아침에 갖고 왔던 것은 2리터짜리 물병도시락이었다.

런던 물가가 비싸니까, 가난한 대학원생들이 돈을 아끼려고 도시락을 챙기는건 이해가 될 수도 있겠는데, 물은 왜 갖고 왔을까? 2리터면 2키로나 되는데, 그 무거운 걸 왜 갖고 오지? 그냥 학교 앞에서 사먹으면 안 되나?

런던 시내 한 가운데의 물 2리터 가격이 (당시에) 0.53파운드 정도였는데, 시 외곽으로 나가면 0.42파운드 정도였다. 그 0.11 파운드 아낄려고 그랬냐고 하실까봐 낯부끄러워서 이런 예시를 안 들려고 했는데, 이게 런던에 갔을 때 필자가 처음 썼던 레포트의 주제고, 빅데이터가 무엇인지에 대한 좋은 예시인 것같아 부끄러움을 무릅쓰고 옛날 이야기로 시작해본다.

경제학에서 Searching cost (서치 비용, 조사 비용)이라고 불리는 비용인데, 시내에는 관광객이 많으니까 0.11파운드 아낄려고 고생할 시간적인 여유가 없어서 대부분은 “물 값 비싸네~”라고 불평만하고 물을 사먹게 된다. 런던에서 장기간 거주하고 있는 사람들은, 특히 필자처럼 0.11파운드에 수요 탄력성이 크게 움직이는 경우라면, 그 작은 차이를 경험적으로 파악하고 좀 귀찮더라도 더 싼 가격의 물을 사먹으려고 노력한다.

만약에 런던 시내에 있는 모든 상점의 물 값을 다 알 수 있는 빅데이터 베이스에 쉽게 접근할 수 있었다면 어떻게 됐을까? 요즘 지도 앱들을 네비게이션으로 쓰다보면 지나가는 주유소의 기름값을 다 알려주고 인터넷 검색 한번에 최저가 전자제품을 다 찾아주던데, 이런 정보가 있으면 소비자들이 Searching cost를 훨씬 덜 지불하고도 (사실상 0이다. 앱만 깔아서 검색하면 되니까) 낮은 가격의 상품을 찾을 수 있다.

초창기 빅데이터 상품이 뜰 수 있었던 이유다.

 

미국에서 빅데이터가 뜬 이유 vs 한국에서는 못 뜬 이유

저런 단순한 가격 비교를 하는게 빅데이터 분석이냐고? 그렇지는 않다.

하나 더 예시를 들어보자. 미국에 Target이라는 대형 마트 체인이 있다. Target의 데이터 분석팀은 10대 여자아이가 매번 향기있는 로션을 쓰다가, 어느날 갑자기 향기없는 로션을 사는 걸 보고, 임신 3개월쯤 원래 취향이 바뀐다는 데이터와 접목시켜서 그 여자아이가 임신했다는 사실을 알아챘다. 이 사건을 보고 생각들은 다 제각각이겠지만, Target의 세일즈 팀은 그 10대 여자애한테 임신 테스터기 광고, 그리고 임신한 여성이 좋아할만한 당류 상품을 지속적으로 보여주기 시작했다. (이런거보면 자본주의는 참 무섭다.)

한국에서는 왜 저런식의 개인화된 마케팅을 못 했을까? 빅데이터 갖고 있다면서? 필자의 짧은 식견을 미뤄볼 때, 아마 저런 데이터는 없었을 것이다.

내부 데이터 고객 데이터 고객 특성
미국 잘 정리되어 있음 입수하기 어려움 별의 별놈 다 있음
한국 그게 뭐임? 주민등록번호 원큐 해결 그놈이 그놈임

한국 기업들은 개인정보를 이용하는데 참 둔감하다. 아마 개인 정보 자체만 놓고보면 정보의 양은 어마어마하게 많을 것이다. 주민등록번호 하나만 받으면, 생일, 나이, 성별, 출생지를 한방에 알 수가 있으니까. 그리고 이 번호가 잘못 생성되었으면 가짜이니까 가입을 안 시켜주고, 결국은 1인 1 ID가 자동으로 해결된다. 보통 마케팅 회사들이 연령과 성별로 사람을 나눠서 마케팅을 하는 걸 생각해보라. (네X버가 최근에 신문기사 하단에 어느 연령대와 성별대가 그 기사를 많이 읽었는지 보여주는 이유도 다 같은 이유다.)

 

(연합뉴스 발췌)

실제로 더 많은 종류의 데이터를 쓰면 Target처럼 훨씬 더 Targeting 된 광고를 해서 매출액을 더 끌어올릴 수 있을텐데, 왜 안 할까? 정말로 다른 데이터를 더 안 갖고 있어서?

 

한국 유저들의 현실

머신러닝으로 유저가 관심있어 할만한 상품을 골라서 보여준다는 리타게팅 광고 회사를 다니면서 배운 한 가지가 있다. 한국 유저들 대부분은 매우 “동질적(Homogenous)”이다. 노X페이스 점퍼가 유행했던 걸 생각해보라. 우리나라 사람들은 여러 사람이 하고 있으면 휩쓸려서 따라가는 경우가 흔하다. 박사 재학시절 여름철에 한국에 놀러온 연구실 친구랑 필자의 모교에 가던 길에, 스쿨 버스 타겠다고 주~욱 늘어선 학생들의 행렬을 보고 그 친구가 그러더라. “They all look identical.”

이 사람들에게 굳이 최적화된 상품을 보여줘야겠다고 열심히 노력해야 할 인센티브만 놓고 볼 때, 한국같은 동질적인 사회보다 미국 같은 이질적인 사회에서 그 인센티브가 훨씬 더 높다.

한국의 어느 온라인 쇼핑몰 관계자가 그러더라. 그냥 비싸니까 안 사고, 싸니까 사는 유저들한테는 리타게팅 광고를 써야할 이유가 없다. 그 말 맞다. 우리나라에는 기능 100가지를 놓고 커스터마이징(customizing)을 매우 꼼꼼하게하는 유저들이 거의 없으니까.

 

한국 기업들의 현실

빅데이터가 한참 뜨기 시작하자 우리나라 대기업들이 고가의 장비를 사들이기 시작했다. 복잡한 데이터 관리 플랫폼을 구축하자, 이제 데이터 분석한다는 팀을 하나 만들고 뭔가 해서 제출해봐라고 압박을 넣어봤다. 여태까지 데이터로 못 찾았지만, 이제 데이터 관리 플랫폼에 몇 십억을 들였으니 뭔가 나올 것이 아니냐는 큰 기대를 갖고 프로젝트를 시작하는데…

결과가 안 좋으면 실적 압박이 들어오고, 결국 데이터 사이언스라는거, 빅데이터라는거 다 허상이다는 편견만 남게되는 것이다.

필자가 운이 좋아서 우리나라 대형 IT회사의 관계자 분들을 만날 기회가 많이 있었는데, 모두들 빅데이터라는 단어 자체에 매우 회의적이었다.

  • 데이터는 결국 주관적인 해석이 들어간다,
  • 분석해서 도입할 내용이 없더라,
  • 빅데이터 분석이랑 그냥 데이터 분석이 다른 게 도대체 뭐냐

는 반응을 참 많이들 보여주셨는데, 필자가 할 수 있는 대답은 한 가지다. “용량만 많은 데이터는 빅데이터 아닌데요?”

 

한국 시장이 나아가야 할 길

빅데이터 분석으로 기업들이 재미를 못 보고 있는 가장 큰 이유는 무엇일까?

  • 분석 능력이 부족해서?
  • 데이터가 엉망이어서?

둘 다 맞을 수도 있고, 아닐 수도 있다. 그러나 필자가 하나 확실하게 아는 것은 “빅데이터 분석”이 무슨 요술봉은 아니라는 사실이다. 데이터 사이언스는 새로운 걸 찾아내는게 아니라, 있는데 못 보고 있던 것을 찾아내는 작업이다. 우선 데이터 사이언티스트에 대한 기대치를 좀 낮춰야 된다. (머신러닝, 딥러닝, 알파고 같은 단어들만 듣고 기계가 인간을 정복하는 미래가 당장 내일 올 것처럼 이야기하시는 분들, 그런 “강”인공지능의 시대는 아직 멀었다. 그리고 데이터 사이언티스트는 신 아니고 인간이다)

기대치를 좀 낮춘 다음에는 당연히 우리의 “내공”을 끌어올려야 한다. 그런데 그 내공을 끌어올리는게 분석 능력을 높이는게 아니라, 무슨 데이터가 필요한지 이해하는 부분에서 시작해야한다.

 

무슨 데이터가 필요할까

구매 데이터 수백만건을 갖고 데이터를 분석해달라고 할 때, 특정 열(Column)이 하나씩 더 추가될 때마다 할 수 있는 작업은 기하급수적으로 늘어난다. 예를 들어 성별, 연령, 거주지 데이터와 함께 구매 상점, 구매 시간, 구매 가격만 있는 데이터를 보다가, 구매 상품 내용이 추가되면 그전에는 한번 장보러 갈 때 구입 금액만 알 수 있다가 무슨 상품을 사는지 구체적으로 이해할 수 있게 된다.

추가로 상품 구매 주기를 파악할 수 있도록 장기간 데이터를 쌓고, 재구매인지 여부를 체크하고나면 특정 상품에 대해서 충성고객인지 아닌지 파악하기 쉽다. 여기에 상품 별로 할인받은 내역이 들어가 있으면 어떻게 될까? 할인에 얼마나 민감한 고객인지, 어떤 상품에 더 민감한지에 대해서 파악하고 그에 맞춰서 쿠폰을 뿌릴지 말지를 결정할 수 있다.

한 발자국 더 나가서, 만약에 그 고객이 광고에 노출되고 구매했는지, 그냥 매장에 방문했다가 구매했는지를 파악하고 나면, 광고의 성과도 파악할 수 있고, 특정 광고와 쿠폰 조합의 효율을 따져 어떤 광고와 쿠폰을 엮어야되는지도 파악할 수 있다.

모두 데이터만 있으면 가능한 일이다. 우리나라 기업들이 안 갖고 있거나, 갖고 있어도 어떻게 정리해야되는지 몰라서 어딘가에서 잠자고 있는 그 데이터가. 깨어나라 데이터.

데이터 사이언스, 데이터 과학자, 인공지능, Prophet

데이터 사이언티스트가 부족하고, 좋은 사람을 찾기도 힘들어서 (그리고 비싸서), 아예 인공지능으로 대체해보려는 움직임이 많이 있다. 가장 많이 발달한 영역은 시계열 (Time-Series) 데이터를 넣으면 향후 예측치를 보여주는 시뮬레이션 모델인데, 정확성이 꽤나 높게 나와서 이제 다른 영역의 데이터 사이언스도 인공지능으로 대체될지도 모른다는 “설레발”들이 입에 오르내리고 있다.

최근에 모 데이터 사이언스 학회에 가보니 2025년까지 인공지능이 데이터 사이언스 관련 기능들을 (거의) 완전히 대체할 수 있을거란다. 지금도 이미 Word Cloud 만들기 같은 매우 단순한 작업들은 무료로 해주는 서비스들이 널려있고, 위에 말한대로 고급 통계학자들만 할 수 있을 줄 알았던 시계열 예측도 저렴한 가격에 제공해주는 서비스들이 나타나기 시작했다. 심지어 페이스북이 올초에 Prophet이라는 사실상 무료 서비스를 내 놨다. Github페이지에 R과 Python으로 코드도 다 공개했고 (Prophet 패키지 알고리즘은 공개 안 했더라), 필요한 그래프도 온라인에서 바로 확인할 수 있다.

 

그럼 정말 데이터 사이언스는 인공지능으로 대체될까?

 

아래는 KDnuggets에서 데이터 사이언티스트들을 대상으로 한 설문조사 내용이다.

많은 숫자가 설문에 참여한 것은 아니지만, 그래도 과반수의 참여자들이 10년 이내에 가장 고난이도 데이터 사이언스 업무마저도 자동화될 것이라고 예상하고 있다. 밥그릇 챙기는 소리를 떠나서 냉정하게 시장 트렌드만 놓고보면, 데이터 사이언스 업무 중 일상적인 작업들은 자동화 업무로 빠르게 전환이 될 것이라는 점에 이의를 달고 싶지 않다. 필자가 전 직장에서 했던 업무 중 하나도 간단한 시뮬레이션을 통해서 향후 온라인 광고 예산을 추정하는 시뮬레이션 모델을 만드는 것이었는데, 이미 다양한 곳에서 유사한 업무가 진행되고 있다.

 

그럼 대체되는건가?

사실 여기서 가장 중요한 질문은 “Most expert-level”의 수준이 어느정도인가에 달려있다.

필자가 시계열 데이터 시뮬레이션 모델을 만들면서 했던 작업들을 한번 돌이켜보자. 먼저 데이터를 트렌드 (Trend) 부분, 주기 (Cycle) 부분, 그리고 오차 (Error) 부분으로 쪼갠다. 특히 주기 (Cycle) 부분을 쪼갤 때는 ARIMA 모델의 (x,y,z) 숫자 조합이 어떻게 되는지 몇 가지 테스트를 해 봐야된다. 트렌드도 직선으로 뽑아낼 수 있다면 참 좋겠지만, 때로는 곡선이 더 정확할 수도 있다.

그 다음, 각각의 데이터 셋들을 놓고 머신러닝 모델을 훈련을 시킨다. 무조건 딥러닝을 써야되는거 아니냐고 착각하는 분들이 참 많을텐데, 가장 간단한 Logit으로만 훈련시켜도 충분히 좋은 결과가 나오는 경우도 많다. 모델 훈련에서 가장 중요한 부분은 “1. 데이터가 얼마나 많냐, 2. 얼마나 전처리가 잘 되었냐” 에 달려있다. 그리고 가능성 높은 모델들 몇 개를 뽑아서 그 중 어느 모델이 더 좋은지 테스트를 해 보는 과정도 거친다.

생각해보니 참 간단하다. 이 과정 전체를 수학적으로 다 이해할려면 꽤나 긴 수업을 들어야겠지만, 정작 주어진 모델을 활용해서 시계열 데이터에 적용하는 일은 그다지 어려울 것 같지가 않다.

그래서인지 이미 수십개의 자동화 프로그램들이 돌아다니고 있다. 위에서 언급한 페이스북의 Prophet과 더불어 알려진 프로그램 몇 개를 정리해본다. (광고해주는거 아니니 오해마시라.)

인간 최고수를 이기는 바둑 게임도 나왔고, 변호사, 의사같은 유명 전문직들이 인공지능으로 빠르게 대체되고 있는 마당에 굳이 데이터 사이언티스트가 인공지능으로 대체되지 말아야 할 이유가 하나도 없다.

 

인공지능에 대한 착각

그럼 변호사, 의사를 대체하는 인공지능은 누가 만들까? 공돌이들이 만드는 걸까?

진짜로 저런 상품을 (모든) 공돌이들이 어느 날 뚝딱 만들어 낼 수 있을 것이라고 생각하는 사람은 없을 것이다.

기계가 어떻게 돌아갈지에 대한 작동 원리를 만드는 사람은 결국 그 분야 전문가일 수 밖에 없다. 세금 계산을 자동으로 해 주는 로보텍스 모델은 개발을 배운 회계사가 만든게 아니라면 두 직군의 협조가 있어야 나올 수 있다. 마찬가지로 변호사, 의사도 같은 방식의 협조가 있어야 대체할 수 있는 로봇과 그 로봇을 돌릴 수 있는 인공지능이 나온다.

인공지능이 무슨 아이큐 160의 천재를 만들어내서 그 천재가 모든 업무를 순식간에 배우고, 스스로 창의성을 갖춘 형태로 진화할 것이라는 일반의 생각들 때문에 오해들이 참 많은 것 같다. 지금 우리 인류가 갖고 있는 인공지능은 패턴을 학습하고, 그 패턴과 유사한 내용을 매칭시키는 기술 이상도 이하도 아니다. 이걸 “약(Weak) 인공지능”이라고 표현하더라. 누군가가 “강(Strong) 인공지능”을 갖고 있다면 정말 보고 싶다. 실제로 어떻게 돌아가는지.

같은 맥락에서 데이터 사이언스 업무를 대체할 인공지능을 만드는 사람도 여전히 데이터 사이언티스트일 것이다. 한 10년쯤 지나서 데이터 사이언티스트 간 경쟁이 더 치열해지면, 데이터 사이언티스트에게 필요한 능력이 지금처럼 통계학과 머신러닝 모델을 활용하는 수준을 넘어서서, 그 모델들을 자동화시킬 수 있는 능력을 갖춰야할지도 모르겠다. (사실 이런거 벌써 다들 하고 있는거 같기는한데…)

 

데이터 사이언스의 미래

데이터 사이언스가 더 발전하면서 데이터 사이언티스트가 줄어들 것이다. 자동화가 되어서 Not-so-expert-level인 데이터 사이언티스트가 없어져서? 아니다. 지금 시장이 혼란하다보니 여러사람들이 자기가 데이터 사이언티스트라고 주장하지만, 정작 하는 일은 Data Analyst거나 Data Engineer인 경우가 많다. 그들이 당장은 Data Scientist라는 타이틀을 달고 있겠지만, 시간이 지나고 업무 레벨이 고도화되면 시장도 학습을 하게 될 것이다. 물론 Data Scientist라는 타이틀을 단 사람들에게 요구되는 스킬셋의 수준도 고도화될 것이다.

데이터 사이언스 석사하고 있는 후배가 가끔 보내오는 Problem Set을 보면, 과연 이 정도로 10년후에 살아남을 수 있을까 싶다. 항상 공부 더 해라고 충고해준다. (필자 자신에게도 마찬가지 충고를 매일하고 있다.)

 

데이터 사이언스, 데이터 과학자, 그리고 Citizen Data Scientist

요즘 데이터 사이언스 동네에서 돌아다니는 키워드 중 하나가 바로 “Citizen” Data Scientist다. 쉽게 이야기하면, 특별히 학위와 경력을 쌓지 않아도 누구나 데이터 사이언스를 할 수 있도록 하자는 움직임이다. 워낙에 데이터 사이언스가 Buzzword가 되어있다보니 이런 표현이 나온 것 같은데, 이 표현의 정확성을 좀 더 살리면 “Citizen” Big Data Analyst로 바꾸고 싶다. 그리고 우리가 특별히 노력하지 않아도 벌써 트렌드가 움직이는 중이다.

당장 구글 트렌드를 보라. 브렉시트와 트럼프 대통령의 당선 결과를 거의 유일하게 맞춘 것으로 알려진 오픈 데이터 소스라는 타이틀을 달고 지난 몇 년사이 트래픽이 폭증했다. 한국서 누군가가 화제의 중심에 서 있는지 아닌지를 확인하는 방법이 네이버같은 포털에서 순간 검색 키워드 상위 랭킹에 오르는 것이었는데, 구글은 아예 유저가 몇 달치 검색 트래픽을 모두 볼 수 있도록 서비스를 열어줬다. 덕분에 지난 5월의 장미대선 기간 내내 구글 트렌드에서 어느 정당 후보 이름이 더 많이 언급되었더라는 말이 언론에 등장하기 시작했고, 또 어떤 유저들은 연관 검색어가 부정적인 용어니까 단순히 검색 노출이 많았다는 걸로 한 후보의 지지율이 급상승했다고 주장하기는 어렵다는 주장까지 펴더라.

빅데이터 분석은, 그 숫자만 보고 판단을 내리는 수준이라면 고도의 통계학, 머신러닝 지식 없이 누구나 충분히 할 수 있는 작업이다. 지난 대선 기간 동안 구글 트렌드는 일반 대중이 그정도 능력은 충분히 있다는 사실을 여실히 보여줬다.

그렇다고 이제 Citizen Data Scientist가 많이 늘어났다고 주장할 수 있을까?

한국에서 정말로 (빅)데이터 분석이 대중화되기 위해서 넘어야하는 난관은 크게 세 가지로 꼽을 수 있다.

 

1. 빅데이터를 더 쉽게 구할 수 있어야 한다.

학창시절부터 아주 가깝게 알고 지내는 어느 정당의 마케팅 팀 매니저와 최근에 빅데이터를 주제로 이야기를 나눈 적이 있다. 일하다보면 무슨 데이터를 어떻게 찾아와서 어떻게 분석한다는 회사들이 참 많이 찾아온단다. 그런데 자기가 정작 원하는 데이터는 네이버 검색 기록 전체를 매 초 단위로 보는건데, 그런 데이터가 없이 나오는 모든 분석은 별로 필요가 없단다.

들으면서 머릿속에 딱 떠오른 장면은, 중앙은행장이 이자율 정책에 대해서 언급할 때 100분의 1초 단위로 시장 이자율 그래프가 큰 폭으로 움직이는 모습이었다.

(약 4분쯤부터 spread가 폭증하는걸 눈으로 볼 수 있다. 그 날 돈 잃은 사람 많았을 것이다 ㅋㅋ )

금융시장에는 그런 데이터를 구할 수 있는 경우가 많다. 거래가 활발한 상품들 (on-the-run treasury bonds, index fund 등등)은 정부 정책이 살짝만 바뀌어도 시장에 영향을 줄 수 있기 때문에 굉장히 민감하게 가격이 움직이고, 그걸 보고 정책 결정에 대한 시장의 반응을 이해할 수 있는 여지가 많다.

정치인 입장에서 자신이 언급하는 단어 하나하나가 유권자들의 지지율에 영향을 미치는 장면을 볼 수 있다면 얼마나 좋을까?

위의 Youtube 링크는 NetFlix의 미국 정치 드라마 House of Cards에서 대통령의 Data Scientist가 Sentiment Analysis를 하는 부분이다. 후보 토론회에서 특정 단어를 더 언급하면 언급할 수록 지지율이 내려가거나 올라가는 분석을 해서, 후보 토론회가 끝나고 여론 조사 결과가 나오기도 전에 벌써 토론회가 얼마나 성공적이었는지 여부를 분석하는 자료를 제공한다. (키야~ 나도 저런 거 할 수 있는 데이터 있으면 좋겠다.)

한국에서는 몇 개의 정치 성향 강한 온라인 커뮤니티를 잡고, 실시간으로 어떤 식의 댓글이 많이 올라오는지를 보고 유사한 분석을 할 수 있을 것 같다. (한번 해 볼까?)

아마 모 정당의 마케팅 팀 매니저가 원하는 수준의 데이터는 다음 대선쯤엔 한국에서도 구할 수 있을지 모르겠다.

 

2. 빅데이터 분석 툴에 접근이 쉬워야 한다

저 위에 잠깐 언급한 것처럼, 아직까지 빅데이터 분석이라는게 간단한 그래프 몇 개로 트렌드를 보는 수준에 국한되어 있다. 전문적인 통계학 교육을 받은 사람들이면, 또 빅데이터를 어떻게 활용할 수 있는지에 대해서 교육을 받은 사람들이면 좀 더 고급 분석을 내놓을 수 있을 것이다. 지난 글에 필자가 소개했던 시계열 데이터 분석이나 Sankey 그래프는 수 많은 예시 중 일부에 불과하다. 정치인이 Sentiment Analysis를 하기 위해서는 단순히 특정 단어에 유권자들이 어떻게 반응하더라는 1대 1 함수가 아니라, 어떤 조합과 어떤 억양일 때, 특정 단어가 영향을 끼칠 수 있다는 1대 n의 함수를 찾아야한다. 이런 빅데이터 분석을 Network를 보여주는 그래프로 나타낼 수도 있다.빅데이터 시각화(Visualization)에 대한 관심이 높아지면서 유료 툴을 쓰는 회사들도 늘어났고, 구글이 아예 오픈 소스로 데이터 시각화하는 툴을 내 놓기도 했다.

필자도 조만간 저 오픈 소스와 기본적인 통계+머신러닝 모델을 이용한 데이터 분석 도구를 일반에 공개할까 생각 중이다. 아마 필자와 유사한 생각을 하고 있는 데이터 사이언티스트들의 숫자가 늘어나면 늘어날수록 빅데이터 분석 툴의 대중화가 빠르게 이루어질 수 있을 것이다.

 

3. 발언자가 아니라, 빅데이터 그 자체가 권위를 가져야 한다.

필자가 런던에 유학가서 겪었던 사건 중에 아직도 생생하게 기억나는 사건이 하나 있다. 거시 경제학 수업 시간에 노동 시장의 Matching 모델을 설명하시던 교수님이 그 날 수업이 끝나기 10분전에 노벨경제학상 수상자로 결정되었다는 뉴스가 떴고, 학생들이 웅성웅성거리며 수업이 좀 붕뜬 상태로 진행되고 있었다. 그 역사의 한 장면 같은 순간에 교수님이 미국 노동 시장에서 Blue Color Labor를 강화하겠다는 정책은 제대로 돌아가지 않을 것이다는 언급을 했는데, 미국인 학생 하나가 “Even if it is highly skilled labor force?”라고 되물으니 교수님이 잠깐 생각을 하시더니 자신이 틀렸다는 사실을 인정하셨다. 오늘 수업이 끝나면 모델을 좀 수정해야겠다고 그러시는데, 5분 후에 자기가 그 모델로 노벨상 받을 사람이 모델을 수정해야겠다고 그러니 얼마나 겸손한가는 생각에 학생들 모두가 고개를 숙였던 기억이 난다.

한국에서 빅데이터 분석이 대중화되기를 바라는 마음의 이면에는, 위의 일화 같은 “탈권위”가 좀 진행되었으면 하는 바램이 있다. 노벨상 수상자가 자신의 모델을 바탕으로 어떤 정책의 유효성에 대해서 언급하는 순간에, 노벨상을 받았건 말건 동의할 수 없는 분석에는 이의를 제기하는 모습, 그리고 권위자가 자신의 실수를 빠르게 인정하고 물러서는 모습을 보여줄 수 있는 경우를 한국에서 얼마나 볼 수 있을까?

일전에 필자가 데이터 분석에 관한 이야기를 하면서 중심극한정리 (Central Limit Theorem)를 잘못 적용한 예시를 든 적이 있었다. 지적을 받자마자 실수를 수정해줘서 고맙다고 그랬는데, 나중에 가깝게 지내는 친구는 “그럴 땐, 그렇게 쉽게 인정하지말고, 어떻게 말을 주워담을 수 있을지 고민해야 된다.”고 충고를 하더라. 그 친구 참 좋아하고 존경하는데, 그 충고만은 받아들이고 싶지 않았다.

빅데이터 시대가 오고, 그 빅데이터를 누구나 쉽게 분석할 수 있는 시대가 오면, 단순히 “의견”만 있고 “데이터”가 없는 많은 “전문가”들이 얼굴이 벌겋게 되는 일이 많이 생길 것이다. “우기기”를 시전하다가 나중에 팩트 폭격에 “탈탈 털리는” 일도 많이 생길 것이다. 언젠가 필자에게 “Citizen” Big Data Analyst의 시대가 온 것 같냐고 물으면, 전문가들이 “탈탈 털리는” 일이 많아지는 날이 바로 그 날이라고 대답하고 싶다.

 

데이터 사이언스, 빅데이터, Bad data, 분석의 실패

2012년 미국 대선에서 50개 주의 승패를 모두 맞춘 걸로 유명해진 Nate Silver가 FiveThirtyEight (이하 538)이라는 데이터 블로그를 2008년부터 운영하고 있다. 말이 블로그지 사실 왠만한 신문사 출신 기자들 다 모여있고, 글의 깊이도 상당하다. 글의 대부분은 상당한 내공이 담긴 데이터 분석, 통계 모델링이 들어가 있고, 가끔 보면 어디서 저런 데이터를 찾았을까 싶을 정도로 커버리지 영역도 넓다. 다루는 주제도 다양하다. 그리고 필자의 여가 시간 대부분을 뺏어가는 웹사이트이기도 하다.

538을 홍보하려는 글은 아니고, 538에서 Nate Silver가 아주 오래전에 쓴 글 중에 “What the Fox Knows”라는 글에서 필자가 배운 점이 많아서, Nate Silver의 글을 한국적인 맥락에서 다시 정리해볼까 한다.

 

데이터 블로깅을 시작한 이유 – 언론계의 데이터 이해도

언론계에 진입하는 신입사원들의 시험 점수를 보면 읽기, 쓰기에서는 높은 점수를 받았는데, 수학에서는 매우 낮은 점수를 받은 경우가 많(다고 한)다. 필자의 학창시절 경험을 봐도, 보통 언어와 수학에서 동시에 뛰어난 경우는 매우 드물고, 고시를 치는 경우가 아닌 이상 둘 모두에서 출중한 대부분의 친구들은 숫자를 다루는 쪽 커리어를 택하는 경우가 많았다. 연봉도 그 쪽이 더 높았다는 점도 무시 못하겠다. 좀 더 심하게 놀랄만한 예시를 들면, 경제학 공부하는 사람들 사이에서 수학+통계학적인 모델링으로 논문 못 쓰는 사람들을 “Sociologist”라고 “폄하”하는 분위기도 있다. 수학이라는 언어를 자유자재로 구사할 수 있는 곳은 또 다른 진입장벽을 갖춘, 그래서 아무나 못 들어오는 영역이라는 사고방식이 만연하고 있기 때문일 것이다.

이런 인력 풀의 쏠림 현상 때문에 저널에서 찾은 글 중에 제대로 된 데이터 분석이 들어간 경우는 매우매우 드물다. 필자의 모 외국계 뱅킹 초년병 시절 중에, 외부에서 온 미완성 기사에 필요한 숫자들을 찾아서 끼워 넣어주는 작업을 해준 적이 있었다. 무슨 숫자를 찾아줘야 되는지 문맥이 이해가 안 가는 경우도 있어서 한참 고생했던 이야기를 나중에 친구들과 공유한 적이 있었는데, 통계청과 한국은행 같은 국책기관에서는 그런 업무만 전담하는 부서도 있을 정도란다. 우리나라 언론사들이 그런 숫자를 찾는 작업을 얼마나 사소한 일로 치부하고 있는지, 최소한 데이터를 찾는다는 작업에 대한 전문성이 얼마나 결여 되어 있는지를 단적으로 보여주는 증거가 아닐까 싶다.

최근에 통계청에서 언론지 상의 통계 해석 오류와 왜곡을 바로잡기 위해서 통계 바로쓰기 공모전도 개최한 걸 보면 우리나라 곳곳에서 그런 문제에 대한 공통된 인식을 갖고 있다는 걸 느낄 수가 있다.

 

 

데이터 블로깅이란 – Quantitative vs. Qualitative

데이터로 블로깅을 한다는게 단순히 글 대신 숫자로 블로깅을 한다는 뜻이 아니다. 글에 그래프를 많이 넣겠다는 뜻도 아니다. 정확하게는 Quantitative한 분석을 글로 옮기겠다는 뜻이다.

여기서 먼저 짚고 넘어가고 싶은 부분은, 필자는 Quantitative(계량적) 분석이 무조건 옳다고 생각하지도 않고, Quantitative 분석을 안 하는 (혹은 못하는) 쪽이 실력이 부족하다고 생각하지도 않는다. 아래는 Nate Silver의 도식화다. 좌우는 계량적 vs. 질적 분석의 잣대고, 상하로는 엄격한&경험적 vs. 스토리 기반&일시적인 분석의 잣대다. 여기서 2사분면 (좌상)에 있는 분석이 반드시 맞는 것은 아니다. 때로는 4사분면(우하)에 있는 분석이 우리의 삶에 꼭 필요한 내용일 수도 있다. 거의 모든 사람이 횡단보도 신호를 안 지키고 있는데 새벽 3시에도 신호를 꼬박꼬박 지키는 사람을 찾았던 “냉장고가 간다”는 프로를 떠올려보라. (거의) 모든 사람이 신호를 안 지킨다는 팩트 기반의 지식에 단 하나의 반박 스토리로 그 프로그램은 대성공을 거뒀고, 우리의 일상 생활에서 질서의식도 근본적으로 바뀔 수 있었다.

문제는 질적 분석의 틀을 벗어나지 않고 있는 사람들에게 계량적인 분석을 제시했을 때 나타나는 거부반응이다. MoneyBall로 유명한 통계학 야구가 처음 시작됐을 때, 언론과 야구 관계자들 대다수가 야구를 숫자로 해석하겠다는 건 매우 바보같은 행동이라고 폭언을 쏟아부었다. 정말로 그럴까? 실제로 승리 기여도 (WAR, Wins Above Replacement)를 계산하는 식만 놓고 보면 한 타자가 1루까지 뛸 때 얼마나 열심히 달리는지, 투수가 타자, 주자와 얼마나 미묘한 신경전을 벌이는 지에 대한 정보 없이 단순히 수식에 맞춰서 계산만 하는 것 같다.

그러나 언제나 그렇듯이 모든 숫자는 서로 연결되어 있다. 1루까지 더 열심히 달리는 타자는 내야안타나 실책으로 출루할 가능성이 조금 더 높을 것이고, 덕분에 득점도 많이하고, 결국에는 팀 승리에 많이 기여하게 된다. (그리고 열정있는 플레이에 반해서 그 선수 등번호의 야구 셔츠가 한 장이라도 더 팔릴 것이다.) 투수의 타자, 주자 다루는 기술은 누상에 주자가 있을 때 피안타율이 얼마인지, 도루 허용률은 얼마나 높은지 등등의 숫자로 반영이 되고, 그 숫자들은 결국 그 투수의 방어율로 나타나게 된다. 그만큼 숫자는 무섭다.

(원 글에서는 아이스 하키 예시가 나오지만 한국인에게 친근한 야구로 예시 교체함)

Quantitative 분석이 필요한 가장 큰 이유는, 데이터가 없다는 핑계로 Qualitative 분석만으로 모든 문제를 풀려고하는 사람들이 많기 때문이다. 야구가 그랬고, 다른 스포츠도 아직 그런 곳이 있고, 사실 세상 만사가 다 그렇다. 단적인 예로, 경영진이 직원들을 해고하기 가장 좋을 때는 복잡한 숫자가 없을 때다. “당신네 팀이 매출액이 적으니까 팀을 해체하겠습니다.”라고 이야기 할 때, “우리 팀이 다른 팀의 업무에 큰 도움을 주었습니다”라고 반박하는 것과, 다른 팀 매출액이 실제로 우리 팀의 매출액에 잡힐 수 있는 Cross-channel 알고리즘이 있는 경우를 놓고 비교해보라.

 

데이터에는 이미 의도가 담겨 있다 – Data does not have a virgin birth –

그렇다고 데이터를 절대적으로 신뢰해야할까?

숫자는, 숫자만큼은 가치 중립적이라고 생각한다. 아니 그렇게 착각한다. 사실 데이터는 그 데이터를 만들고 정리하는 사람의 주관적인 의도에서 벗어나기 쉽지 않음에도 불구하고 말이다.

우리가 일상에서 만나는 데이터는, 특히 데이터 분석은 밑바닥에 깔려있는 모델이 무엇인지에 따라서 얼마든지 다른 결론과 연결될 수 있다. Nate Silver는 이런 데이터 분석 과정을 크게 4단계로 정리했는데, 아래의 도표에 나오는대로 데이터 수집 (Collection), 데이터 정리 (Organization), 데이터 설명 (Explanation), 일반화 (Generalization)가 그것이다.

 

위의 4단계 모두에서 데이터는 가치 편향적이 될 위험에 노출되어 있다.

  1. 데이터 수집 프로세스에서 이미 추출 오차 (Selection bias)가 발생한다. 마음에 들지 않는 데이터는 배제하고, 마음에 쏙 드는 데이터만 더 샘플 안에 집어넣으면 어떻게 될까?
  2. 정리할 때도 마찬가지다. 전달하고자하는 메세지에 따라서 1,2,3,4로 정리해야할수도, 혹은 2,1,4,3으로 정리해야할 수도 있다.
  3. 데이터 설명은 어떤 모델을 깔고 있느냐에 따라 완전히 다른 방식의 설명을 이끌어 낼 수 있다.
  4. 일반화는 무서운 작업이다. 10개중에 7개가 맞았다고해서 A는 B이다고 결론내면 C와 D의 사례들은 죽어버린다. 경우에 따라서는 C와 D가 훨씬 더 중요한 경우도 많다.

당장 미국에서 인종별로 살인 사건에 휘말리는 경우를 따져보자.

이 질문이 나오는 순간부터 흑인들은 반감을 가질 것이다. 그 조사가 흑인이 잠재적 범죄자라는 결론을 낼 것이라는 일반의 상식을 테스트하는 것으로 보이기 때문이다. 그런 우려를 갖고 있는 흑인에게 데이터를 모으라고 하면 어떻게 될까? 어쩌면 수집, 정리과정에서 흑인은 본인이 살인을 저지른 경우만 포함시키고, 다른 인종은 살인사건에 연루된 모든 사례를 포함하는 “의도적” 실수를 할 수도 있다. 그 데이터로 설명을 해야하는 시점에, 단순 총합 숫자를 보여주면서 흑인 인구 비율이 매우 낮은 곳을 집중하면 흑인이 잠재적 범죄자가 아니라고 주장하는데 매우 설득력있는 정보처럼 보일 수 있다.

만약에 이 조사의 원래 의도가 거주 지역과 살인 사건 비율간의 상관관계를 보는 중에 인종이 얼마나 영향을 미치는지 변수로 넣을지 말지를 결정하는 대형 조사의 일부였다면 어떤 결론이 나올까? 인종이 아무런 관련이 없는 것처럼 나올 것이다. 사실 우리 모두는 인종(정확하게는 출생 환경이겠지만)이 살인 사건과 높은 연관 관계가 있음을 잘 알고 있다. 우리의 상식과 반대되는 조사 결과가 나오면, 이 연구는 정치적인 가치만 갖는 어용 분석 밖에 안 된다.

 

“Bad” 데이터의 악영향 – Not a defeat of “Big” data, but a failure of “Bad” data

사실 관계를 꼼꼼하게 잘 파헤치는 것이 언론의 핵심적인 역할이라면, 데이터 수집, 정리 부분에서 언론이 큰 역할을 할 수 있다. 그러나 그 데이터가 가치 편향적이었다는 사실을 밝혀낼 수 있는 센스가 없는 사람이 여과없이 데이터를 대중에게 공개하면 어떻게 될까?

2016년 11월, 도널드 J. 트럼프 대통령이 당선되고 난 다음에 Nate Silver도 틀렸다는 기사가 떴다. 아마 그 무렵에 제대로 트럼프 대통령의 당선을 맞출 수 있는 알짜 데이터를 가진 사람은 없었거나, 있었더라도 극소수에 불과했을 것이다. Nate도 신이 아닌 이상, 그렇게 왜곡된 데이터를 갖고 합리적인 분석과 예측을 할 수는 없었을 것이라고 변명 아닌 변명을 했다.

데이터에 오류가 있으면, 사실 무슨 종류의 분석을 해도 결과값이 제대로 나올 수가 없다. (Garbage In, Garbage Out, GIGO라고 부른다.) 위의 카툰처럼 엉망인 데이터를 더하고, 빼고, 곱하고, 나누고, 아니 다른 더 어떤 복잡한 계산을 한다고해도, 왜 엉망인지 원인을 알아서 그 문제를 해결할 수 없다면 그 데이터는 Garbage가 된다.

필자가 만났던 분들 중에 일부는 머신러닝으로 빅데이터가 갖고 있는 오류를 해결할 수 있지 않냐고 하는데, 데이터 자체에 오류가 있고, 그 오류가 어떻게 나타났는지도 모르고, 정상적인 데이터 셋이 어떻게 될지 머신에게 가르쳐줄 수 없다면 머신러닝의 어떤 알고리즘을 갖고와도 해결책은 없다.

1930년대 미국 대선에서 240만명에게 받은 여론조사 결과가 2000명의 잘 뽑은 샘플에서 얻은 여론조사보다 예측력이 낮았다는 지난 글에서 말했듯이, 데이터의 크기는 “Bad” 데이터와 철저하게 분리된 문제이다. 빅데이터 시대가 왔다고 주장을 하는 이 시점에 우리가 다시 던져야하는 질문은 내가 가진 빅데이터가 혹시 빅 “Bad” 데이터가 아닌지에 대한 확신이다.

 

분석의 깊이 – Vividness vs. Scalability –

Nate Silver의 가장 큰 고민은 데이터 분석을 어려워하는 대중들에게 2사분면(계량적, 엄밀한, 경험적 분석)의 내용들을 어떻게 전달할 수 있을까라고 한다. (그래야 블로그를 많이 읽고, 자기도 유명해질테니까)

데이터의 크기에 관계없이 어떤 메세지를 전달할 때 필자가 갖고 있는 고민도 같다. 그리고 대부분의 경우, 필자의 해석은 잘 전달이 안 된다. 왜 필자는 실패할 수 밖에 없을까? (그리고 왜 Nate Silver는 성공했을까?)

Nate Silver는 분석의 명료성 (Vividness)과 확장성(Scalability) 사이의 적절한 타협점을 찾아야한단다.

데이터를 직접 보고, 모델을 만들고, 그 모델을 검증하는 사람이 분석의 완벽함을 찾기 위해 골몰하다보면, 타인에게 전달할 때 같은 이해도를 얻어내기 굉장히 어렵다. 우리가 데이터 분석이라고 이야기를 할 때, 필연적으로 그래프를 떠올리는 것도 같은 이유다.

Nate Silver가 저 글을 쓰던 2014년보다 지금은 훨씬 더 좋은 그래픽 툴들이 나와있다. 잘 쓰기만하면 얼마든지 쉽게 상대방에게 자신의 데이터 분석을 전달할 수 있(을지도 모른)다. 데이터 사이언티스트가 갖춰야할 5가지 스킬셋 중 4번째로 언급했던 것처럼, 데이터 시각화 툴에 대한 지식은 빅데이터를 보여줄 수 있는 필수지식이 되어버렸다.

예전엔 말/글 vs 숫자의 충돌을 막는 수단으로 그래프를 활용했지만, 빅데이터가 도입되면서 분석의 내공이 깊어졌고, 툴이 복잡해지면서 말/글 vs 숫자/그래프 의 프레임으로 흐름이 넘어가고 있다. 조만간 Data Scientist 중 누군가는 아래와 같은 작업을 하고 있을지 모르겠다.

 

빅데이터 시대에 주는 함의

뱅킹시절 M&A건을 들고 인수측이나 매각측 관계자들을 만나면 몇 십, 몇 백장의 분석 자료를 갖고가도 대화의 종류는 항상 같았다. “책은 이따보시고”로 시작되는 그 대화들. 어린 시절에는 며칠밤을 새서 자료를 만든 필자를 바보로 만든다는 생각에 답답한 감정도 있었지만, 인간이 어떤 의사 결정을 내리는 마지막 순간은 결국 “감”으로 결정된다는 걸 체득하고 난 다음부터는 그런 생각을 버렸다. 더더군다나 필자가 그 당시에 가져간 “분석”이라는 것이 겨우 그래프 몇 개 그리는 수준이었을 따름에야.

그 시절 필자의 가슴 깊숙한 곳에 있던 좌절감의 근원은 Quantitative 분석없이 “감”으로만 결정을 내리는 상황이 아니라, 더 깊은 분석을 할 수 없는 지식의 한계와 데이터의 한계였다고 보는 편이 옳을 것 같다.

그리고 세상이 참 많이 바뀌었다. 4차 산업혁명이라는 단어가 매일같이 언론지상을 오르내린다. 빅데이터와 머신러닝을 결합한 인공지능 상품이 세계 곳곳에서 소비자의 주머니를 향해 경쟁하고 있다. 데이터가 세상을 지배하는 시대가 올지도 모른다는 우스갯소리가 더 이상 농담처럼 들리지도 않는다. 빅데이터 분석 훈련이 잘 된 전문가들이 시장에 투입되면서 다음세대 초짜 뱅커들은 10년전 필자보다 훨씬 더 깊은 분석을 할 수 있지 않을까? “책은 이따보시고”가 구시대의 유물같은 대화가 되었으면 좋겠다.

 

데이터 사이언스는 죽었단다. (Data Science is Dead.)

자칭 데이터 사이언티스트 입장에서 읽기는 좀 불편하지만 공감할 수 밖에 없는 글을 하나 읽었다.

과학의 테두리 안에 들어가는 학문은 어떤 특성을 가지는가? 조건을 지정해서 실험을 하고 그 결과값을 바탕으로 가설을 검증하고, 새로운 가설을 찾는 과정이다. 데이터 사이언스 안에는 A/B Testing이 있지 않냐고 주장할 수도 있을텐데, 이미 데이터를 만드는 사람이 결정한 일을 그냥 해석만 하는 작업이지 실제로 데이터를 만들어내는 작업은 아니란다. A/B Test를 설정하는 역할까지 다 한다면? 그래도 모든 조건을 다 통제하는 실험실의 셋팅이 아니기 때문에 “Soft” Science란다. 대부분의 사회과학이 그렇지 않냐고 화끈하게 깎아내리네.

더 눈에 들어오는 부분은 전공 이름에 Science가 들어가 있으면 그건 과학이 아니기 때문에 그렇게 붙어있는 거란다. 대표적으로 Computer Science 전공을 들면서, 과학이 아닌 기술이 대학 전공인 것처럼 되어 있고, 노동 시장에서 수요는 많단다.

아래 스샷을 보면 참 Scientist 타이틀이 큰 풍자거리다ㅋ

데이터 사이언스는 죽은게 맞다

솔직히 다 맞는 말이라는 생각이 들어서 별로 반박하고 싶은 마음이 안 든다.

학창시절부터 CS 친구들이 자기네 공부가 제일 힘들다고 할 때마다 너네는 그냥 코딩하는거 아니냐고 드립질쳤던 기억이 생생하고, 데이터 사이언스 직장들 중에 거의 대부분은 SQL로 데이터를 뽑아서 Excel로 그리는 작업을 반복하는 경우가 많다. 사실 Data Analyst가 해야될 일을 좀 멋있게 보이고 싶어서 Data Scientist라는 타이틀로 이름만 바꾸는 편이 뽑는 쪽에서도, 뽑히는 쪽에서도 즐거울테니까, 그들에게는 윈-윈 게임이다.

필자가 실리콘 밸리에서 잡서칭을 할 때 제일 경계했던 부분도 바로 이 부분이었다. 대부분의 직장들이 타이틀은 Data Scientist이지만 정작 업무는 Data Analyst이거나 혹은 Data Engineer쪽 일이었다. 잡 타이틀에 Business Analyst라고 쓰면 너무 구식으로 느껴지고, 그래도 우리는 큰 용량의 데이터를 SQL로 뽑아서 쓰는 업무가 있으니 Data Scientist라고 주장할 수 있다고 생각하는 듯 했다. Engineering쪽 업무들도 Data Warehousing이나 Systems Analyst 같은 타이틀을 달면 뭔가 너무 개발자스러운 단어인 것 같아서 안 쓴다는 이야기도 들었다.

데이터 사이언스는 죽었다가 다시 태어났다

실리콘 밸리에서 필자가 Data Scientist 업무를 찾아다닐 때, 꼭 물어봤던 질문이 있다. “혹시 너네 팀에 경제학 박사 출신 있어?”

필자와 배경 지식이 유사할 것 같아서 이런 질문을 했기도 하지만, 이 질문의 본래 의도는 “너네 팀, 데이터로 모델링하고 계량 테스트하는 팀이야?”라는 뜻이었다.

데이터 사이언스는 죽었다고 일갈한 Miko Matsumura의 표현대로, 데이터 사이언스는 “Hard” Science가 아니라 “Soft” Science다. 실험실에서 조건을 강하게 컨트롤 한 상태에서 얻은 데이터로 작업을 하는 일이 아니라, 경제학 박사들처럼 현실 데이터를 나름대로의 모델로 분석하는 일을 해야한다. 굳이 차이가 있다면 경제학 박사가 다루는 데이터는 용량이 크고 작고의 차이만 있겠지만, 데이터 사이언티스트가 다루는 데이터는 유저의 행동 패턴을 초 단위로 추적하는, 이른바 “행동 데이터”라는 부분인 것 같다.

다루는 (빅)데이터가 다른 것만큼이나 다루는 통계학 모델도 달라서, 경제학자에게 수리통계학의 회귀분석이 핵심적인 기술이었다면, 데이터 사이언티스트에게 가장 핵심적인 통계학 기술은 머신러닝이 되었다.

지극히 필자의 주관적인 생각일지도 모르나, 진짜 데이터 사이언티스트는 수리통계학 훈련이 잘 된 경제학자가 SQL로 빅데이터를 뽑을 줄 알면서, 가설을 바탕으로 통계학 모델을 만들고, 그 모델을 테스트할 수 있는 머신러닝 (+다른 통계학 지식)을 할 줄 아는 사람이어야한다. 이렇게 말해놓고보니 보통의 경제학자는 그런 훈련을 안 받으니, 참 이런 사람 찾기 힘들겠다는 생각도 든다.

데이터 사이언스를 재정의하자

요즘 실리콘 밸리에서는 잘못 알려진 데이터 사이언스에 대한 비판과 새롭게 정의하자는 움직임이 일고 있다. (진작에 이랬어야했다.) 가장 눈에 띄는 정의는 HR회사인 Hired Brains에서 나온 내용인데 아래와 같다,

  • Type 1 – 알고리즘과 분석방법을 연구하고, 새롭게 만들어내는 전문가로 논문을 발표할 수 있는 사람
  • Type 2 – 수리통계 모델링 및 모형 개발 전문가로 Quantitative한 방법을 이해하고 모형을 설계, 시험 및 실전 배치할 수 있는 사람

Type 2의 예시로 나온 직업이 머신러닝과 통계 모형을 이용해서 패턴 감지 알고리즘을 개발하고, 빅데이터에서 유의미한 정보를 찾아내, 개발한 알고리즘으로 예측업무를 수행하는 사람이었고, 금융 사기나 고위험 담보 대출에 이런 모델을 적용시키는 내용이 주 업무였다. Type 1의 대부분은 아마 학계에 있을 가능성이 높다.

직장을 찾는데 타이틀은 Data Scientist이면서 정작 위의 업무가 Job Description에 없다면, 그건 아마도 Data Analyst이거나 Data Engineer일 것이다.

 

데이터 사이언스 아직 안 죽었다. 죽은 사람더러 데이터 사이언티스트라고 하지 말자.