작성자: admin 작성일시: 2016-05-01 22:19:12 조회수: 6992 다운로드: 324
카테고리: 머신 러닝 태그목록:

데이터 분석의 소개

이번 장에서는 데이터 분석에서 가장 널리 쓰이는 몇 가지 예를 집중적으로 설명하면서 데이터 분석의 의미를 알아본다. 하지만 데이터 분석이라는 말의 의미는 상당히 넓은 만큼 여기에서 설명한 내용이 데이터 분석의 전부는 아니라는 점을 명심해야 한다.

데이터 사이언스란?

데이터 사이언스란 데이터를 수집하고 분석하여 활용하기 위한 모든 기술의 집합을 말하며, 컴퓨터 사이언스, 수학, 통계학, 머신 러닝(machine learning), 영상 및 신호 처리 등 다양한 학문 분야가 만나는 영역이다. 프로그래밍을 포함하는 컴퓨터 사이언스는 실제로 데이터를 다루기 위한 필수 기술이며, 수학과 통계학은 데이터 분석 모형의 기반에 깔린 핵심적인 개념을 구체화하는 언어이다. 머신 러닝은 이러한 분석 결과를 활용하여 지금까지 인간이 해오던 각종 분석과 의사 판단을 대신하고자 하는 노력이다.

이 책은 이러한 각각의 분야에 필요한 지식과 기술을 조금씩 소개하지만, 그중에서도 데이터 분석(data analysis)을 집중적으로 다룬다.

데이터 분석이란

데이터 분석이란 어떤 입력 데이터가 주어졌을 때,

  • 입력 데이터 간의 관계를 파악하거나
  • 파악된 관계를 사용하여 원하는 출력 데이터를 만들어 내는 과정

으로 볼 수 있다.

데이터 분석도 분석 목적에 따라 "예측(prediction)", "클러스터링(clustering)", "모사(approximation)" 등 여러가지 문제가 있다. 여기에서는 가장 널리 사용되는 예측 문제를 살펴본다.

예측

예측(prediction)은 데이터 분석 작업 중 가장 많이 사용되는 유형 중 하나이다. 예측이란 숫자, 문서, 이미지, 음성, 영상 등의 여러 가지 입력 데이터를 주면, 데이터 분석의 결과로 다른 데이터를 출력하는 분석 방법이다.

그림 1-1 : 예측 모형

예를 들어 다음과 같은 작업은 예측이라고 할 수 있다.

  • 부동산의 위치, 주거환경, 건축연도 등을 주면 해당 부동산의 가치를 추정한다.
  • 꽃잎의 길이와 너비 등 식물의 외형적 특징을 주면 해당하는 식물의 종을 알아낸다.
  • 얼굴 사진을 주면 해당하는 사람의 이름을 출력한다.
  • 현재 바둑돌의 위치들을 주면 다음 바둑돌의 위치를 지정한다.

데이터 분석에서 말하는 예측이라는 용어는 시간상으로 미래의 의미는 포함하지 않는다. 시계열 분석에서는 시간상으로 미래의 데이터를 예측하는 경우가 있는데 이 때는 미래예측(forecasting) 이라는 용어를 사용한다.

연습 문제 1

예측 문제로 풀 수 있는 데이터 분석의 예를 3가지 생각해 보자.

입력 데이터와 출력 데이터

예측 문제에서는 데이터의 유형을 입력 데이터(input data)출력 데이터(output data)라는 두 가지 유형의 데이터로 분류할 수 있어야 한다.

입력 데이터는 분석의 기반이 되는 데이터로 보통 알파벳 $X$로 표기한다. 다른 말로 독립변수(independent variable), 특징(feature), 설명변수(explanatory variable) 등의 용어를 쓰기도 한다.

출력 데이터는 추정하거나 예측하고자 하는 목적 데이터를 말한다. 보통 알파벳 $Y$로 표기하며, 다른 말로 종속변수(dependent variable)라고 부른다. 종속변수가 뒤에서 설명할 카테고리값이면 라벨(label) 또는 클래스(class)라고 하기도 한다.

입력 데이터와 출력 데이터를 정확히 파악하는 것은 예측 문제를 구체화하는 첫 번째 단계이다. 특히 예측 성능은 이러한 입출력 데이터의 숫자와 종류에 크게 의존하기 때문에 정확히 어떠한 값을 가지는 입력을 몇 개 사용하겠다는 문제 정의가 예측 문제를 해결하는 데 가장 중요한 부분이 될 수도 있다.

연습 문제 2

연습 문제 1에서 생각한 3가지 예측 문제의 입력과 출력을 보다 정확하게 정의해 보자. 중요한 점은 다음과 같다.

  1. "~등", "같은 것"이란 용어를 사용하지 않고 정확히 입출력 데이터의 개수를 정해야 한다.
  2. 입력이나 출력 데이터값의 숫자 예를 제시하면 더욱 좋다. 예를 들어, 부동산 가격을 예측하기 위해 면적을 입력 데이터로 사용하기로 했다면, "40 제곱미터" 혹은 "80 제곱미터"와 같이 실제로 어떤 숫자를 입력데이터로 사용할지 예를 든다.

규칙기반 방법과 학습기반 방법

그럼 이런 예측 문제를 풀려면 어떤 방법을 써야 할까? 예측을 하기 위한 방법론으로는 규칙기반(rule-based) 방법과 학습기반(traing-based) 또는 데이터기반(data-based) 방법이라는 두 가지 방법이 사용된다.

규칙기반 방법은 어떤 입력이 들어오면 어떤 출력이 나오는지를 결정하는 규칙이나 알고리즘을 사람이 미리 만들어 놓는 방법이다. 학습기반 방법 또는 데이터기반 방법은 이러한 규칙을 사람이 만드는 것이 아니라, 대량의 데이터를 컴퓨터에 보여줌으로써 스스로 규칙을 만들게 하는 방법이다. 여기에서는 규칙기반 방법은 다루지 않으며 학습기반 방법만을 다루도록 한다.

예를 들어 개를 찍은 사진을 입력하면 "개"라고 출력하고, 고양이를 찍은 사진을 입력하면 "고양이"라고 출력하는 예측 시스템을 만든다고 가정해 보자.

규칙기반 방법을 사용하면 사진에서 눈 모양을 찾아내는 알고리즘을 넣고 눈동자가 세로 방향으로 길면 고양이이고, 아니면 개라고 출력하는 규칙을 넣을 수 있다. 이렇게 사람이 세부적인 규칙을 알려주는 방법이 규칙기반 방법이다. 또한 번역의 예를 들면, 특정한 영어 단어가 어떤 의미로 번역되는지를 어떤 품사를 가지는지를 알려주는 사전(dictionary)도 규칙 집합으로 볼 수 있고, 이러한 규칙을 조합하여 영어 문장을 한국어 문장으로 번역할 수 있다.

이와 대조적으로 학습기반 방법은 이러한 규칙을 알려주지 않는 대신 많은 데이터를 주고 스스로 규칙을 찾도록 한다. 앞서 말한 고양이와 개의 구분 문제에서는 개와 고양이를 찍은 사진을 주고 스스로 적합한 규칙을 찾도록 하며, 영어를 한국어로 번역하는 문제에서는 수많은 영어 문장과 이에 대응하는 한국어 문장을 주고 스스로 번역 방법을 찾도록 한다.

연습 문제 3

연습 문제 1과 2에서 생각한 3가지 예측 문제에 대해 규칙기반의 해결 방법을 생각해보자. 정확한 답이 아니어도 괜찮다.

지도학습

학습기반 예측 방법론을 사용하려면 학습용 데이터 집합(training data set)을 사람이 만들어 주어야 한다. 학습용 데이터 집합은 입력값과 목푯값(정답)을 쌍으로 가지는 샘플 데이터의 집합이다. 이는 학습시키고자 하는 예측 시스템이 최종적으로 동작하기를 바라는 모습을 표현한 데이터 집합이라고 볼 수 있다.

예를 들어 개를 찍은 사진을 입력하면 "개"라고 출력하고, 고양이를 찍은 사진을 입력하면 "고양이"라고 출력하는 예측 시스템을 만들고 싶다면 개를 찍은 사진과 고양이를 찍은 사진 10장을 준비해서 다음과 같이 학습용 데이터 집합을 만들어야 한다.

표 1-1 학습용 데이터 예
학습용 데이터 입력 데이터 출력 데이터
1 개를 찍은 사진 1
2 개를 찍은 사진 2
3 개를 찍은 사진 3
4 고양이를 찍은 사진 1 고양이
5 개를 찍은 사진 4
6 고양이를 찍은 사진 2 고양이
7 고양이를 찍은 사진 3 고양이
8 개를 찍은 사진 5

각각의 사진에 "개" 혹은 "고양이"라는 출력 데이터(목표)값을 붙이는 작업은 당연히 사람이 수동으로 해야 한다. 그래서 이러한 방법을 지도학습(supervised learning) 방법이라고 한다.

비유를 들자면 학습용 데이터 집합이란 정답이 표시된 수백 개의 문제를 모아놓은 문제집과 같고, 지도학습이란 이 문제집을 컴퓨터에 주고 학습시키는 것과 같다. 컴퓨터는 이 수백 개의 문제를 나름의 풀이방법으로 스스로 풀어본 다음, 정답을 이용하여 얼마나 맞았는지를 채점한다. 그런 다음 풀이방법을 스스로 조금씩 바꾸어 보면서 풀이와 채점을 반복한다. 이 과정을 반복하는 것이 지도학습이다.

학습용 데이터 집합에 붙어있는 출력 데이터, 즉 정답을 목푯값(target)이라고 한다. 지도학습의 목표는 주어진 목푯값과 최대한 비슷한 값을 출력하는 예측 방법을 찾아내는 것이다.

그림 1-2 : 지도학습의 원리

이러한 학습용 데이터 집합을 스스로 얻을 수 있는 기능까지 갖춘 강화학습(reinforcement learning) 방법이라는 것도 있다. 강화학습은 주로 바둑 등의 게임을 해결하거나 로봇의 제어 방법 등을 찾는데 많이 사용된다. 여기에서는 강화학습 방법은 다루지 않는다.

연습 문제 4

지금까지 생각한 3가지 예측 문제에 대해 학습용 데이터 집합을 만들어본다. 학습용 데이터 집합의 크기는 최소한 각 문제에 대해 10개 이상 만들어보자.

예측 문제의 수학적 표현

예측 모형은 입력 데이터 $X$를 받아서 출력 데이터 $Y$를 만든다는 점에서 수학의 함수(function)와 유사하다. 따라서 함수의 개념을 사용하여 예측 작업을 수학적으로 설명하면 다음과 같다.

예측 문제의 최종 목표는 $X$와 $Y$의 관계 함수 $f$를 구하는 것이다.

$$Y = f(X)$$

하지만 현실적으로는 정확한 $f$를 구할 수 없으므로 $f$와 가장 유사한, 재현 가능한 함수 $\hat{f}$을 구한다.

$$Y \approx \hat{f}(X)$$

이러한 함수 $\hat{f}$를 가지고 있다면 새로운 입력 $X$가 주어졌을 때 $Y$의 예측값 $\hat{Y} = \hat{f}(X)$를 구할 수 있다.

수학적으로 $\hat{f}$를 구하는 방법 중 하나는 다음 식처럼 $P(Y | X)$는 $X$에 대한 $Y$의 조건부 확률(conditional probability)을 사용하는 것이다. 이러한 방법을 '확률론적 예측'이라고 한다.

$$ \hat{f}(X) = \arg\max_{Y} P(Y | X) $$

갑자기 어려운 수식이 나왔는데 여기에서 당장 위의 수식을 이해하지 못해도 괜찮다. 7장까지의 수학적 이론을 이해하고 나면 위 수식의 의미를 알 수 있을 것이다. 다만 나중에도 이 수식의 의미를 이해하지 못한다면 머신 러닝이나 데이터 분석을 위한 소프트웨어나 라이브러리를 사용하는 것도 어렵기 때문에 최종적으로는 반드시 위 수식을 이해할 수 있는 수준까지 공부해야 한다.

전처리와 인코딩

앞에서 숫자, 문서, 이미지, 음성, 영상 등의 여러 가지 데이터를 처리하는 것을 예시로 들었지만, 안타깝게도 현재 기술상 컴퓨터가 직접 처리할 수 있는 데이터는 사실 숫자(number)밖에 없다. 그렇다면 문서나 이미지와 같은 데이터는 어떻게 처리하는 것일까? 데이터 분석에서는 전처리(preprocessing) 또는 인코딩(encoding)이라는 과정을 통해 문서나 이미지와 같은 현실의 데이터를 컴퓨터가 처리할 수 있는 숫자 데이터로 바꾸어야 한다. 따라서 실제 예측 모형은 사실 다음과 같은 형태가 된다.

그림 1-3 : 전처리/인코딩이 포함된 예측 모형

전처리는 단순히 비정형 데이터를 숫자로 바꾸는 것만 의미하는 것이 아니다. 전체 입력 정보 중 실제로 출력 데이터의 결정에 영향을 미칠만한 핵심 정보를 선택하거나 복수의 입력 데이터를 조합하여 새로운 입력 데이터를 만드는 것도 전처리의 중요한 역할이다. 전처리 과정은 최종 예측 성능에 커다란 영향을 끼친다.

연습 문제 5

지금까지 생각한 예측 문제의 입력 데이터 중 전처리 혹은 인코딩이 필요한 것이 어떤 것인지 확인하고 어떻게 숫자로 바꿀 수 있을지 그 방법을 생각해 보자.

인코딩의 예: 이미지 데이터

실제로 이미지 데이터는 어떻게 숫자로 바뀌는지를 살펴보자. 다음 데이터는 "MNIST handwritten digit image"라는 샘플 데이터 중 하나이다. 이 데이터는 손글씨를 영상으로 나타낸 것으로 다음 그림은 숫자 0을 손으로 쓴 후 카메라로 찍어 8x8의 저해상도 이미지로 저장한 것이다.

여기에 나오는 모든 코드는 https://hub.docker.com/r/datascienceschool/rpython/ 에서 제공하는 도커 컨테이너 상에서 바로 실행할 수 있다. 자세한 내용은 2 장에서 다루도록 한다.

리스트: MNIST handwritten digit 데이터중 첫번째 이미지 출력
In:
from sklearn.datasets import load_digits

digits = load_digits()
plt.imshow(digits.images[0], interpolation='nearest', cmap=plt.cm.bone_r)
plt.grid(False)

이 영상은 실제로는 다음과 같은 8x8 행렬에 이미지의 명도를 나타내는 숫자로 저장된다. 0은 백색이고 15가 가장 진한 색을 뜻한다.

In:
digits.images[0]
Out:
array([[  0.,   0.,   5.,  13.,   9.,   1.,   0.,   0.],
       [  0.,   0.,  13.,  15.,  10.,  15.,   5.,   0.],
       [  0.,   3.,  15.,   2.,   0.,  11.,   8.,   0.],
       [  0.,   4.,  12.,   0.,   0.,   8.,   8.,   0.],
       [  0.,   5.,   8.,   0.,   0.,   9.,   8.,   0.],
       [  0.,   4.,  11.,   0.,   1.,  12.,   7.,   0.],
       [  0.,   2.,  14.,   5.,  10.,  12.,   0.,   0.],
       [  0.,   0.,   6.,  13.,  10.,   0.,   0.,   0.]])

그리고 이 데이터는 실제로는 다음과 같은 64-길이의 숫자 벡터로 바뀌어 예측 모형에 입력된다.

In:
digits.images[0].flatten()
Out:
array([  0.,   0.,   5.,  13.,   9.,   1.,   0.,   0.,   0.,   0.,  13.,
        15.,  10.,  15.,   5.,   0.,   0.,   3.,  15.,   2.,   0.,  11.,
         8.,   0.,   0.,   4.,  12.,   0.,   0.,   8.,   8.,   0.,   0.,
         5.,   8.,   0.,   0.,   9.,   8.,   0.,   0.,   4.,  11.,   0.,
         1.,  12.,   7.,   0.,   0.,   2.,  14.,   5.,  10.,  12.,   0.,
         0.,   0.,   0.,   6.,  13.,  10.,   0.,   0.,   0.])