본문 바로가기

통계의 기초

기본적인 대표값들에 대해 - 평균, 중간값, 최빈값

어떤 데이터 집합의 특성을 하나의 값으로 표현하려할 때 사용하는 값을 대표값이라 합니다. 우리가 일상적으로 사용하는 대표값으로는 평균이 있습니다. 3학년 1반 학생들의 키를 하나의 값으로 대신해서 표현할 때 보통 평균값을 씁니다. "3학년 1반의 학생들은 키가 평균 164cm이고 2반 학생들은 평균 165cm이니, 2반 학생들이 대체로 키가 더 크다고 할 수 있다."와 같은 식이죠. 언뜻 생각하기에 평균은 이렇게 어떤 집합에 대해 사용할 수 있는 가장 멋진 대표값처럼 생각되기 때문에 다른 대표값이 뭐가 필요할까 싶은 생각도 들 수 있습니다. 하지만 데이터의 특성이나 상황에 따라서 다른 대표값이 더 어울리는 경우도 있기 때문에 이들에 대해서 알아보겠습니다.

먼저 가장 익숙한 평균입니다. 평균은 모든 데이터가 같은 값을 가진다고 가정할 때, 각 데이터가 갖는 값을 말합니다. n개의 데이터 x1, x2, x3 ... xn이 있을 때 이들의 평균은 모두 합산한 후 데이터의 수로 나눕니다. 평균은 영어로 흔히 average라고 표현하는데, 수학에서 평균은 mean이라는 용어를 더 많이 사용합니다. 그래서 평균을 나타내는 기호는 영어 소문자 m 이나, 그리스 문자 뮤(\( \mu \))를 사용합니다.

수식으로 표현할 때에는 다음과 같이 쓸 수 있습니다.

$$ \mu = \frac{x_{1} + x_{2} + \cdots + x_{n}}{n} $$

그런데 이렇게 쓰는 것은 종이를 많이 낭비하기 때문에 합을 나타내는 기호 시그마를 사용하여 다음과 같이 줄여서 사용합니다. 시그마는 기호 아래에 변수의 초기값을 정의하고 위에는 그 변수의 최종값을 표시합니다. 변수는 시그마 내에서 1씩 증가하면서 오른쪽에 표시된 수식에서 변수를 바꾸고 각각의 식의 값을 합산한다는 의미입니다.

그래서 평균을 나타내는 위의 식은 \(\frac{1}{n}\)을 앞으로 빼서 x1, x2, x3, .. xn을 x_i로 두고 시그마 기호를 써서 다음과 같이 표시할 수 있습니다.

$$ \mu = \frac{1}{n}\sum\limits_{i=1}^{n} x_{i} $$


파이썬 코드에서 평균은 아주 간단하게 구할 수 있습니다. 숫자값 타입(int, float)의 값으로 이루어진 리스트가 있을 때, 이들의 합을 갯수로 나누면 되기 때문입니다. 단, 비어있는 리스트에 대해서는 0으로 나눌 수 없으니 평균값을 구할 수 없습니다. 아무튼 코드를 사용하면 평균값을 계산하는 방법이 쉽게 눈에 들어옵니다.

from typing import List, TypeVar

Number = TypeVar('Number', int, float)


def mean(xs: List[Number]) -> float:
  if not xs:
    raise ValueError('the list must have at least one element.')
  return sum(xs) / len(xs)

중간값

평균외에도 중요하게 다뤄지는 대표값이 있는데, 바로 중앙값입니다. 중앙값은 중간값이라고도 하고 영어로 median이라고 합니다. 중앙값은 자료를 크기 순서대로 정렬했을 때 한 가운데 있는 값입니다. 저는 중앙값에 대해 처음 배울 때, 이런 생각을 했습니다. "어떤 값이 어어엄청 크거나 반대로 어어어어엄청 작으면 중간값하고 그런 값들은 굉장히 멀리 떨어져버리게 되는데, 그러면 중앙값이 어떻게 집단을 대표하는 값이 될 수 있지?" 이렇게 생각하면 중앙값은 왠지 평균보다 별로 유용하지 않을 것 같습니다. 게다가 구하는 방법도 엄청나게 번거롭습니다. 데이터를 모두 크기순으로 나열해서 그 가운데 값을 찾아야 하기 때문입니다. 아무래도 종이와 연필만으로는 상당히 사람을 귀찮게 만드는 구석이 있습니다.

하지만 중앙값은 사실 그러한 특성이 있는 자료를 다룰 때 더 유용합니다. 평균에 대해서 다시 생각해보겠습니다. 평균은 모든 데이터가 같을 때를 가정합니다. 이 말은 모든 데이터들과의 거리가 중간정도가 되도록 한다는 뜻입니다. 아주 크거나 작은 값이 있다면 이 값은 평균을 자기쪽으로 끌어당깁니다. 이 값이 어어어어어엄청 크다면? 다른 대부분의 값이 평균보다 작거나 큰 쪽까지도 끌고 갈 수 있습니다.

3학년 1반 학생들의 일주일 용돈에 대해서 조사하는데, 용돈의 값이 보통 1~4만원 정도라고 가정합시다. 그런데 어떤 학생이 사우디 석유 재벌집 자식이라 일주일 용돈이 1억원이라면? 평균값은 3백만원대의 값이 나옵니다. 극단적인 가정이 들어가 있긴 하지만 이런 경우에 3학년 1반 학생들의 일주일 용돈은 3백만원정도한다라고 말하는 것은 집단의 특성을 제대로 나타내는 값이 아닙니다.

사우디 석유 재벌집 자식의 경우처럼 다른 데이터들과는 크게 동떨어진 값을 극단값(outlier)이라 합니다. 이렇게 극단값이 있는 데이터를 대표하는데에는 평균보다는 중앙값이 더 적절합니다. 그리고 저런 극단적인 데이터는 상상 속에만 있는 것이 아니라 실제로도 존재합니다. 국민들의 소득에 대한 데이터가 그렇습니다. 한 달에 100만원 벌기도 빠듯하고 힘든 사람들도 많은 반면에 한달에 수십~수백억을 버는 사람들도 있기 때문입니다. 따라서 국민 소득을 대표하여 말할 때에는 평균이 아닌 중앙값을 사용합니다. 뉴스에서 볼 수 있는 '중위소득'이라고 부르는 값이 바로 소득 데이터의 중앙값입니다.

중앙값이 중요한 의미를 갖는 경우도 살펴보았으니, 중앙값을 어떻게 구하는지 보겠습니다. 아까도 말했듯이 매우 귀찮습니다. 다음의 과정을 거칩니다.

  1. 데이터를 크기 순으로 정렬합니다.
  2. 데이터의 개수가 홀수이면 가장 중앙에 있는 값을 찾습니다. 데이터의 개수가 N일 때 (N - 1) / 2 번째 값입니다.
  3. 데이터의 개수가 짝수이면 가장 중앙에는 값이 없습니다. 이 때는 중간에 있는 두 값의 평균을 구합니다. N / 2번째 값과 N / 2 + 1 번째 값의 평균입니다.

손으로 구하려면 귀찮지만 컴퓨터의 도움을 받으면 쉽게 구할 수 있습니다.

T = TypeVar('T')

def mean(xs: List[T]) -> T:
  ys = sorted(xs)
  n = len(ys)
  if n % 2 > 0:
    return ys[n // 2]
  return sum(ys[n//2-1:n//2+1])/2

3학년 1반 학생들(30명)의 용돈이 다음과 같다고 할 때 중간값을 구해보겠습니다.

4, 4, 4, 4, 1, 1, 4, 4, 1, 2, 5,
100000000, 2, 5, 4, 2, 3, 4, 4, 1,
5, 4, 4, 2, 3, 1, 4, 2, 2, 1

이 값을 크기순으로 나열하면 다음과 같습니다.

1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 100000000

이 자료에서 15번째, 16번째 값은 모두 4입니다. 따라서 중앙값은 4가 됩니다.

만약 사우디 재벌집 자식이 용돈을 올라서 2억원, 3억원 4억원이 된다고 하더라도 다른 친구들의 용돈이 그대로라면 중앙값은 변하지 않습니다.


최빈값

이번에는 최빈값에 대해서 살펴보겠습니다. 최빈값은 가장 많이 나타나는 값을 말합니다. 예를 들어 위의 용돈 문제에서 최빈값은 4만원입니다. 12명이나 4만원을 받고 있네요. 최빈값은 각 값이 데이터에서 등장하는 빈도수를 조사하여 그 빈도수가 가장 큰 값이 됩니다. 그런데 우리는 어떤 집단의 특성을 알고자 할 때 통계를 적용하려 하는데, 그 특성이라는 것이 키나 체중, 용돈, 시험성적과 같이 숫자값이라는 법은 없습니다. 예를 들면 혈액형이나 신고 있는 신발의 브랜드일 수도 있고 좋아하는 색일 수도 있습니다. 이런 정보들은 숫자값은 아니지만 그 자체로도 분명 어떤 '정보'임에는 의심할 여지가 없습니다. 최빈값은 평균이나 중앙값과 달리 수량(quantitative)이 아닌 값에 대해서도 적용할 수 있다는 특성이 있습니다. 이를테면 등교길에 학생들이 입고 있는 점퍼 브랜드를 조사하여 이 중 최빈값을 찾으면 해당 학교 학생들이 선호하는 브랜드의 대표값을 알게 되는 셈입니다.

최빈값을 구하는 방법 역시 조금 번거롭습니다. 표를 만들어서 각 데이터의 개수를 세는 것입니다. 물론 이렇게 번거로운 일은 컴퓨터를 동원하면 쉽습니다.

def mode(xs: List[T]) -> T:
  d = dict()
  for x in xs:
    d[x] = d.get(x, 0) + 1
  return max(d.items(), key=lambda x:x[1], reverse=True)[0]

지금까지 가장 널리 쓰이는 대표값인 평균과 중앙값, 최빈값에 대해서 알아보았습니다. 어떤 집단의 특성은 이러한 대표값외에도 다른 통계량을 통해서도 설명할 수 있습니다. 대표값이 어떤 중심에 있는 값이라면 각각의 데이터가 얼마만큼 서로 떨어져있는지도 집단의 특성을 나타내는 중요한 지표일 수 있습니다. 다음 시간에는 데이터가 서로 떨어져있는 정도를 나타내는 산포도에 대해서 살펴보도록 하겠습니다.


  • 대표값: representative value
  • 평균 : mean, average
  • 중간값 : median
  • 최빈값 : mode