다운로드
작성자: admin 작성일시: 2018-06-04 22:32:33 조회수: 1885 다운로드: 118
카테고리: 기초 수학 태그목록:

확률적 데이터와 기술통계

확률은 데이터 분석에서 두 가지로 사용된다.

  1. 데이터 자체의 값이 어떤 특성을 가지는지를 표현하기 위한 수단 (빈도주의적 관점)
  2. 데이터로부터 얻은 법칙이나 규칙을 표현하기 위한 수단 (베이지안 관점)

여기에서는 빈도주의적 관점에서 데이터 자체의 값을 확률로 표현하는 방법에 대해 공부한다. 빈도주의적 관점과 베이지안 관점의 차이에 대해서는 나중에 자세하게 설명한다.

확률적 데이터

실험, 측정, 조사 등을 통해 어떤 데이터의 값을 반복적으로 혹은 동시에 병렬적으로 측정할 수 있는 경우를 생각하자. 이렇게 데이터의 값을 알아내었을 때 데이터의 값은 항상 같은 값이 나올 수도 있고 예측불가능하게 달라질 수도 있다. 예를 들어 "사람의 사망시 나이"를 조사하는 경우에 특정한 사망자의 사망시 나이를 조사한다면 누가 어떤 상황에서 조사하더라도 같은 값이 나올 것이다. 하지만 누구인지를 특정하지 않고 "우리나라의 국민의 사망시 나이"라고만 한다면 조사하는 상황에 따라 표본(사람)이 달라지기 때문에 값이 달라질 것이며 정확히 어떤 값이 나올지 예측할 수도 없다.

항상 같은 값이 나오는 데이터를 결정론적 데이터(deterministic data), 예측할 수 없는 값이 나오는 데이터를 확률적 데이터(random data, probabilistic data, stochastic data)라고 한다. 우리가 다루는 대부분의 데이터는 확률적 데이터이다.

데이터가 확률적이 되는 이유는

  • 대상을 특정하지 않고 넓은 범위의 대상을 목표로 하기 때문이거나
  • 여러가지 조건이나 상황에 따라 데이터의 값이 영향을 받기 때문일 수도 있고
  • 측정시에 발생하는 오차 때문일 수도 있다.

하지만 확률적인 데이터라고 하더라도 아무런 예측도 하지 못하는 것은 아니다. 예를 들어 "우리나라 국민의 사망시 나이"라는 데이터의 값은 절대로 음수가 나오지 않을 것이며 150보다 큰 수도 나오지 않을 것이다. 그리고 0살과 150살 사이에서도 많이 나오는 값이 있고 적게 나오는 값이 있을 것이다. 우리가 말하는 데이터에 대한 "지식"이라는 것은 대부분 이런 종류의 것, 즉 정확하게 어떤 하나의 값을 이야기할 수는 없지만 그렇다고 아무런 이야기도 할 수 없는 것도 아닌 것들이다. 이러한 지식을 어떻게 정량적으로 표현할 수 있을까?

분포와 기술통계

확률적 데이터에서 어떠한 값이 자주 나오고 어떠한 값이 드물게 나오는가를 나타내는 특성을 분포(distribution)라고 한다. 흔히 히스토그램(histogram)을 사용하여 표현하고자 하는 것이 분포이다. 분포가 어떤가는 데이터 값을 하나하나 표로 나타낼 수도 있고 히스토그램 등을 통해 시각적으로 표현할 수도 있다. 하지만 더 좋은 방법은 분포의 특징을 나타내는 어떤 숫자를 계산하여 그 숫자로서 분포를 표현하는 것이다. 이러한 값들을 기술통계(descriptive statistics)라고 한다. 대표적인 기술통계는 다음과 같다.

  • 표본평균, 표본중앙값, 표본최빈값
  • 표본분산, 표본표준편차
  • 표본왜도, 표본첨도

표본평균

정상인의 최고혈압(수축기혈압, systolic blood pressure)은 얼마인가라는 질문에 어떻게 답할 것인가?

정상인의 최고혈압은 확률적 데이터이다. 즉, 정상인 사람마다 그리고 측정하는 상황에 따라 다를 수 있다. 하지만 의사에게 같은 질문을 한다면 대부분 "120 mmHg 정도입니다"라고 말할 것이다. 여기에서 120이라는 값은 정상인의 최고혈압을 대표하는 하나의 값이다. 이렇게 확률적인 데이터의 값을 대표하는 몇가지 기술통계가 있는데 그 중 하나가 표본평균이다.

우리가 보통 데이터의 평균(mean, average)라 부르는 값의 정확한 명칭은 표본평균(sample mean, sample average)이다. 표본평균은 데이터 분포의 대략적인 위치를 나타낸다. 표본평균의 기호로는 알파벳 $m$ 또는 데이터를 나타내는 변수 기호 위에 bar를 붙인 $\bar x$ 기호를 사용한다.

$$ m = \bar{x} = \dfrac{1}{N}\sum_{i=1}^{N} x_i $$

이 식에서 $N$는 자료의 갯수, $i$는 자료의 순서(index)를 뜻한다.

표본중앙값

표본중앙값(sample median)은 전체 자료를 크기별로 정렬하였을 때 가장 중앙에 위치하게 되는 값을 말한다. 표본 중앙값에도 몇 가지의 정의가 존재하지만 대표적인 정의는 다음과 같다.

전체 표본의 갯수가 $N$인 경우,

  • $N$이 홀수이면: 중앙값은 $(n + 1)/2$번째 표본의 값
  • $N$이 짝수이면: 중앙값은 $n/2$번째 표본의 값과 $n/2 + 1$번째 표본의 값의 평균

예를 들어 99명의 사람의 최고혈압을 측정한 데이터가 가장 낮은 값부터 가장 높은 값까지 순서대로 정렬하였을 때 50번째 사람의 최고혈압이 이 데이터의 샘풀중앙값이 된다. 사람의 수가 100명이라면 50번째 데이터와 51번째 데이터의 평균값을 사용한다.

표본최빈값

표본최빈값(most frequent value, sample mode)은 데이터의 값 중 가장 빈번하게 나오는 값을 말한다. 혈액형, 나이, 남/녀 구분 등 유한한 종류의 값만 있는 데이터에서는 최빈값을 쉽게 구할 수 있지만 혈압, 키, 몸무게 등 연속적인 값을 가지는 데이터에서는 (정밀도가 무한히 높다는 가정하에) 똑같은 값이 나올 확률이 아주 작기 때문에 최빈값을 구하기 어렵고 의미도 없다. 따라서 연속적인 값의 경우에는 일정한 구간 간격으로 나누어 가장 많은 데이터를 가진 구간의 대표값을 그 데이터의 최빈값으로 가정하는 방법을 많이 사용한다. 하지만 이 방법도 구간을 어떻게 나누는가에 따라 달라질 수 있기 때문에 신뢰할 수 있는 방법이 아니다.

파이썬을 사용한 대표값 계산

파이썬에서는 다음과 같은 NumPy 함수를 사용하여 각종 대표값을 계산할 수 있다.

  • mean(): 표본평균 계산
  • median(): 표본중앙값 계산
  • argmax(): 이산데이터의 표본최빈값 계산
  • histogram(): 데이터를 구간으로 나누어 각 구간에 들어가는 데이터갯수 계산.

예를 들어 다음과 같은 21개의 데이터가 있다고 하자.

In [1]:
np.random.seed(0)
x = np.random.normal(size=21)
x
Out:
array([ 1.76405235,  0.40015721,  0.97873798,  2.2408932 ,  1.86755799,
       -0.97727788,  0.95008842, -0.15135721, -0.10321885,  0.4105985 ,
        0.14404357,  1.45427351,  0.76103773,  0.12167502,  0.44386323,
        0.33367433,  1.49407907, -0.20515826,  0.3130677 , -0.85409574,
       -2.55298982])

이 데이터를 -4부터 4까지 0.5간격의 구간을 가진 히스토그램으로 나타내면 다음과 같다.

In [2]:
bins = np.linspace(-4, 4, 17)
sns.distplot(x, rug=True, kde=False, bins=bins)
plt.title("히스토그램으로 나타낸 데이터 분포")
plt.xlabel("x")
plt.show()

표본평균과 표본중앙값은 다음처럼 구한다.

In [3]:
print("표본평균 = {}, 표본중앙값 = {}".format(np.mean(x), np.median(x)))
표본평균 = 0.4206524782418389, 표본중앙값 = 0.4001572083672233

하지만 연속데이터에 대한 최빈값은 의미없는 숫자가 나오므로 구간으로 나누어 최빈구간을 구해야 한다.

In [4]:
m = x[np.argmax(x)]
ns, _ = np.histogram(x, bins=bins)
m_bin = np.argmax(ns)
print("최빈값 = {}, 최빈구간 = {}~{}".format(m, bins[m_bin], bins[m_bin+1]))
최빈값 = 2.240893199201458, 최빈구간 = 0.0~0.5

평균, 중앙값, 최빈값의 차이

표본평균, 표본중앙값, 표본최빈값은 모두 확률적 데이터를 대표하는 기술통계이지만 분포의 모양에 따라 다른 특성을 보인다.

  • 분포가 표본평균을 기준으로 대칭이면(symmetric) 표본중앙값은 표본평균과 같다.
  • 분포가 대칭이고 하나의 최고값만을 가지면(uni-modal) 표본최빈값은 표본평균과 같다.
  • 대칭인 분포를 비대칭으로 만드는 데이터가 더해지면 보통 표본평균이 가장 크게 영향을 받고 표본최빈값이 가장 적게 영향을 받는다.

다음 히스토그램은 대칭인 분포를 비대칭으로 만드는 데이터가 더해졌을 때 표본평균, 표본중앙값, 표본최빈값이 어떻게 변하는지를 보인다.

In [5]:
np.random.seed(1)
x = np.random.normal(size=1000)
x = np.hstack([x, 5 * np.ones(50)])
bins = np.linspace(-6, 6, 12 * 4 + 1)
sns.distplot(x, bins=bins)
plt.axvline(np.mean(x), c='k', ls=":", label="표본평균")
plt.axvline(np.median(x), c='k', ls="--", label="표본중앙값")
ns, _ = np.histogram(x, bins=bins)
plt.axvline(bins[np.argmax(ns)], c='k', ls="-", label="표본최빈값")
plt.title("표본평균, 표본중앙값, 표본최빈값의 차이")
plt.xlabel("x")
plt.legend()
plt.show()

분산과 표준편차

앞에서 정상인의 최고혈압 대표값은 120이라고 하였다. 그렇다면 어떤 사람의 최고혈압이 130이 나왔다면 그 사람은 정상이라고 할 수 없는 것일까? 이러한 판단을 하려면 데이터가 얼마나 변동(variation)하고 있는지를 알아야 한다. 이러한 정보를 알려주는 특징값이 표본분산(sample variance) 또는 표본표준편차(sample standard deviation)이다. 평균이나 기댓값이 분포의 위치를 대표하는 것이라면 분산은 분포의 폭(width)을 대표하는 값이다. 표준편차는 분산에 대한 양의 제곱근(square root)값이다.

$$ \text{표준편차} = \sqrt{\text{분산}} $$

표본분산은 다음처럼 구한다. 식에서 $\bar{x}$은 표본평균이다.

$$ s^2 = \dfrac{1}{N}\sum_{i=1}^{N} (x_i-\bar{x})^2 $$

다음 그림에서 볼 수 있듯이 이 식은 자료값과 평균 사이의 거리를 의미한다. 다만 자료값이 평균보다 작을 때는 음수가 나오므로 제곱을 하여 모두 양수로 만들어 준 것이다.

만약 분포가 하나의 대표값 근처에 모여있다면 대부분의 데이터는 "대표값 $\pm$ 표준편차" 범위 안에 있다. 참고로 정상인의 최고혈압의 표준편차는 약 20이다. 따라서 대다수의 최고혈압 데이터는 $12 \pm 20$ 범위 안에 있다고 할 수 있으므로 130이라는 숫자는 비정상이라고 보기 힘들다.

그림 7.2.1 : 표본분산과 표본표준편차

위 식에서 구한 표본분산은 정확하게 말하면 편향오차를 가진 편향 표본분산(biased sample variance)이다. 이와 대조되는 비편향 표본분산(unbiased sample variance)은 다음과 같이 구한다.

$$ s^2_{\text{unbiased}} = \dfrac{1}{N-1}\sum_{i=1}^{N} (x_i-\bar{x})^2 $$

파이썬을 사용한 표본분산 및 표본표준편차의 계산

파이썬에서 표본분산과 표본표준편차를 구할 때는 다음 함수를 사용한다. ddof 인수를 이용하면 비편향 표본분산과 표본표준편차를 구할 수 있다.

In [6]:
sp.random.seed(0)
x = sp.stats.norm(0, 2).rvs(1000)  # 평균=0, 표준편차=2 인 정규분포 데이터 생성
In [7]:
np.var(x), np.std(x) # 편향 표본분산, 표본표준편차
Out:
(3.896937825248617, 1.9740663173380515)
In [8]:
np.var(x, ddof=1), np.std(x, ddof=1)  # 비편향 표본분산, 표본표준편차
Out:
(3.900838663912529, 1.9750540913890255)

표본비대칭도

평균과의 거리의 세제곱을 이용하여 구한 특징값을 표본비대칭도(sample skewness)라고 한다. 표본비대칭도가 0이면 분포가 대칭이다.

$$ \frac{\tfrac{1}{N} \sum_{i=1}^N (x_i-\overline{x})^3}{ \sqrt{\tfrac{1}{N-1} \sum_{i=1}^N (x_i-\overline{x})^2}^{\,3}} $$

그림 7.2.2 : 분포에 따른 표본비대칭도

표본첨도

평균과의 거리의 네제곱을 이용하여 구한 특징값을 표본첨도(kurtosis)라고 한다. 표본첨도는 데이터가 중앙에 몰려있는 정도를 정밀하게 비교하기 위해 쓰인다.

$$ \frac{\tfrac{1}{N} \sum_{i=1}^N (x_i - \overline{x})^4}{\left(\tfrac{1}{N} \sum_{i=1}^N (x_i - \overline{x})^2\right)^2} - 3 $$

표본모멘트

분산, 비대칭도, 첨도를 구하기 위해 제곱, 세제곱, 네제곱을 하는 것처럼 $k$제곱을 이용하여 구한 모멘트를 $k$차 표본모멘트(sample moment)라고 한다.

$$ \frac{1}{N}\sum_{i = 1}^{N} x^k_i $$

2차 표본모멘트 이상은 평균을 뺀 값을 사용할 수도 있다.

$$ \frac{1}{N}\sum_{i = 1}^{N} (x_i - \bar{x})^k $$

따라서 평균은 1차 모멘트, 분산은 2차 모멘트, 비대칭도와 첨도는 3차 모멘트와 4차 모멘트에서 유도된 값이다.

확률적 데이터의 비교

현실 세계에서 어떤 고정된 모집합 또는 물리적 대상으로부터 데이터를 수집하는 경우를 생각하자. 이러한 데이터는 측정시마다 달라질 수 있는 확률적 데이터이다. 예를 들어 두 사람의 연구원이 동일한 엔진으로 10번씩 자동차 엔진의 오염물질 배출량을 아주 높은 정밀도로 측정하였다고 가정하자. 모든 조건을 동일하게 하도록 노력을 한다고 하더라도 항상 미세하게나마 다른 값이 나올 것이다. 즉 두 개의 데이터집합에 포함된 각각 10개의 숫자, 통틀어 20개의 숫자 중에서 같은 숫자는 없을 것이다. 그렇지만 두 개의 다른 데이터 집합이 의미하는 본질적인 정보는 같은 엔진에서 같아야 한다. 데이터 집합에서 본질적인 정보란 무엇인가? 바로 데이터의 분포이다. 데이터 하나하나의 값이 다르더라도 두 데이터 집합의 분포가 같다면 같은 정보를 내포하고 있다고 보아야 한다.

두 가지의 확률적 데이터의 분포를 비교할 때는 기술통계값을 사용하여 비교한다. 만약 무한대까지의 모든 차수의 분포 표본모멘트 값이 완전히 같다면 두 데이터 집합은 완전히 동일한 정보를 가지고 있다. 하지만 현실적으로는 보통 평균, 분산, 비대칭도, 첨도까지의 4차 표본모멘트의 값이 비슷하면 같은 확률적 데이터로 본다.

기술통계값의 분포

표본평균과 같은 기술통계값은 표본집합이 달라지면 같이 달라지며 어떤 값이 나올지 예측할 수 없으므로 기술통계값 자체도 확률적 데이터이다. 데이터 분석에서는 데이터 자체의 분포 뿐 아니라 이 분포를 설명하는 기술통계값의 분포도 중요하다.

연습 문제 7.2.1

  1. NumPy를 사용하여 100개의 숫자를 무작위로 생성한 후 히스토그램을 그리고 표본평균을 구한다.
  2. 1번과 같이 100개의 숫자 생성 및 표본평균 계산을 50번 반복하여 50개의 표본평균을 구한다.
  3. 2번에서 구한 50개의 표본평균의 히스토그램을 그리고 1번에서 구한 히스토그램과 겹쳐서 그린다.

질문/덧글

질문 skyj*** 2018년 7월 21일 8:37 오전

"두 확률적 데이터의 비교"에서 질문이 있습니다.
"평균, 분산, 왜도, 첨도까지의 1~4차 모멘트가 같으면 같은 확률적 데이터로 보는 것이 일반적이다." 라고 하셨는데요.
"같다"에 대해 명확하게 이해가 안되는 부분이 있습니다. 제가 이해하기론 소수점자리수 까지 같아야 한다라는 것을 의미한 것은 아닌것 같아서요.
같다는 것을 보이려면 샘플 t-test나 signed rank test 같은 걸로 확률적으로 유의미한 차이가 없다는 것을 보이면 되려나요?
감사합니다.

답변: 질문 관리자 2018년 7월 21일 8:45 오전

signed rank test는 두 paired set이 같은 분포에서 나왔다는 것을 보이는 non-parametric test이고 본문에서 이야기하고자 하는 것은 그런 방법을 쓰지 않고 단순히 mean-equality test, variance-equality test 등을 사용하여 일정 차수 이상의 모멘트값만 같으면 관행적으로(practically) 같은 분포에서 나온 것으로 본다는 의미입니다.