확률변수, 기댓값과 분산
결과마다 수를 정하는 함수인 확률변수의 분포를 같은 값의 결과를 모아 구하고, 가중 평균인 기댓값과 흩어진 정도인 분산을 정확한 분수로 계산합니다. 기댓값의 선형성, 두 변수의 공분산과 합의 분산, 공분산이 0이어도 독립이 아닌 예, 지시변수로 이항분포의 평균과 분산을 구하는 방법을 다룹니다.
동전을 세 번 던진 결과 HHT를 "앞면 2번"으로 바꾸어 적으면, 결과의 모양은 버리고 우리가 관심 있는 수만 남습니다. 이처럼 결과마다 수를 하나씩 정하는 함수를 확률변수(random variable)라고 합니다. 확률변수를 쓰면 "평균적으로 몇 번 앞면이 나오는가", "결과가 평균에서 얼마나 벗어나는가"를 계산할 수 있습니다. 이 글에서는 함수와 일대일·전사의 함수와 독립과 반복 시행의 독립을 바탕으로, 값이 유한 개인 확률변수의 평균과 흩어진 정도를 다룹니다.
같은 값의 결과를 모은다
확률변수 X는 표본공간에서 실수로 가는 함수이고, 는 X의 값이 x가 되는 결과들의 확률을 모두 더한 것입니다. 값마다 이 확률을 적은 것을 X의 분포(distribution)라고 합니다. 공정한 동전을 두 번 던질 때 X를 앞면의 개수라 하면, TT는 0, HT와 TH는 1, HH는 2로 갑니다. 그래서 X의 값은 세 가지이지만 각각 1/3이 아니라, 같은 값으로 가는 결과의 확률을 모아 , , 입니다.
X의 기댓값(expected value)은 값에 그 확률을 곱해 더한 가중 평균 입니다. 위의 X는 입니다. 기댓값은 시행을 아주 많이 반복했을 때 X의 평균이 가까워지는 값을 뜻하며, 한 번 던졌을 때 반드시 그 값이 나온다는 뜻이 아닙니다. 0과 3을 반반의 확률로 내는 변수의 기댓값은 1.5인데, 1.5는 실제로 나올 수 없는 값입니다.
X가 평균에서 얼마나 흩어져 있는지는 편차 를 제곱해 평균한 분산(variance)으로 잽니다. 편차를 그냥 평균하면 양수와 음수가 서로 지워져 언제나 0이 되기 때문에 제곱을 씁니다. 분산의 음이 아닌 제곱근은 표준편차(standard deviation)라고 합니다.
오른쪽 식은 제곱을 전개하고 기댓값의 선형성을 쓰면 나옵니다. 위의 X는 이므로 분산은 입니다. 와 를 같은 것으로 보면 분산이 언제나 0이 되어 버리므로 구별해야 합니다.
from collections import Counter
from fractions import Fraction
from itertools import product
omega = list(product("HT", repeat=2))
dist = Counter()
for w in omega:
dist[w.count("H")] += Fraction(1, len(omega))
mean = sum(x * p for x, p in dist.items())
variance = sum((x - mean) ** 2 * p for x, p in dist.items())
print({x: str(p) for x, p in sorted(dist.items())}, mean, variance){0: '1/4', 1: '1/2', 2: '1/4'} 1 1/2w.count("H")가 결과 w를 앞면의 개수로 바꾸는 확률변수이고, Counter는 같은 값으로 가는 결과의 확률을 더해 분포를 만듭니다. 기댓값과 분산은 분포에서 정의대로 계산했습니다.
기댓값의 선형성
두 확률변수 X와 Y에 대해 언제나 이고, 상수 a, b에 대해 입니다. 결과 ω마다 에 그 결과의 확률을 곱해 더하면, X의 몫과 Y의 몫으로 나누어 더할 수 있기 때문입니다. 이 성질에는 독립이 필요하지 않다는 점이 중요합니다.
분산은 이렇게 간단하지 않습니다. 상수를 더하면 모든 값이 함께 움직여 흩어진 정도가 그대로이고, a배를 하면 편차가 a배, 제곱한 편차가 배가 되므로 입니다. 두 변수의 합의 분산은 두 변수가 어떻게 함께 움직이는지에 따라 달라집니다.
공분산과 합의 분산
두 변수가 함께 움직이는 정도는 두 편차의 곱을 평균한 공분산(covariance)으로 잽니다. , 라 하면 다음과 같습니다.
X가 평균보다 클 때 Y도 평균보다 큰 경향이 있으면 두 편차의 부호가 같아 곱이 양수가 되고, 반대로 움직이면 음수가 됩니다. 합의 분산은 편차의 합을 제곱해 전개하면 다음과 같습니다.
X와 Y가 독립이면 라서 공분산이 0이고, 합의 분산은 각 분산의 합입니다. 세 가지 결합분포로 확인해 보겠습니다. 첫째는 공정한 동전 하나를 던져 앞면이면 1, 뒷면이면 0인 X를 만들고 Y도 같은 결과를 읽은 Y = X입니다. 둘째는 서로 독립인 두 동전을 각각 읽은 X와 Y입니다. 셋째는 X가 −1, 0, 1을 각각 확률 1/3로 갖고 인 경우입니다. 분포는 함께 나오는 값의 쌍 (x, y)와 그 확률의 목록으로 적습니다.
from fractions import Fraction
def expect(dist, f):
return sum(p * f(x, y) for x, y, p in dist)
def summary(dist):
ex = expect(dist, lambda x, y: x)
ey = expect(dist, lambda x, y: y)
var_x = expect(dist, lambda x, y: (x - ex) ** 2)
var_y = expect(dist, lambda x, y: (y - ey) ** 2)
cov = expect(dist, lambda x, y: (x - ex) * (y - ey))
var_sum = expect(dist, lambda x, y: (x + y - ex - ey) ** 2)
return cov, var_sum, var_sum == var_x + var_y + 2 * cov
half, quarter, third = Fraction(1, 2), Fraction(1, 4), Fraction(1, 3)
same_coin = [(0, 0, half), (1, 1, half)]
two_coins = [(x, y, quarter) for x in (0, 1) for y in (0, 1)]
square = [(x, x * x, third) for x in (-1, 0, 1)]
for name, dist in (("같은 동전", same_coin), ("독립 동전", two_coins), ("X와 X²", square)):
print(name, *summary(dist))같은 동전 1/4 1 True
독립 동전 0 1/2 True
X와 X² 0 8/9 Truesummary는 공분산, 합의 분산, 그리고 합의 분산이 위 공식과 같은지를 돌려줍니다. 세 경우 모두 공식이 맞습니다. 같은 동전을 두 번 읽으면 X와 Y가 언제나 함께 움직여 공분산이 1/4이고, X + Y는 0이나 2만 나와 분산이 1입니다. 각 분산 1/4을 더한 1/2보다 큰 값이므로, 분산을 그냥 더하면 틀립니다. 독립인 두 동전은 공분산이 0이라 합의 분산이 1/4 + 1/4 = 1/2입니다.
셋째 경우는 공분산이 0이지만 독립이 아닙니다. 이고 이라 공분산은 0인데, Y는 X로 완전히 정해집니다. 예를 들어 이지만 X = 0이라는 것을 알면 Y = 0이 확실합니다. 독립이면 공분산이 0이지만, 공분산이 0이라고 독립인 것은 아닙니다. 그래도 합의 분산 공식에는 공분산만 들어가므로, 이 경우에도 분산을 더할 수 있어 입니다. 공분산과 상관계수는 probabilitycourse.com의 공분산 설명에서 더 볼 수 있습니다.
지시변수로 읽는 이항분포
사건이 일어나면 1, 일어나지 않으면 0인 확률변수를 지시변수(indicator variable)라고 합니다. 확률 p로 성공하는 시행의 지시변수 I는 이고, 라서 입니다. 성공 확률 p인 독립 시행 n번의 성공 횟수 X는 시행마다의 지시변수 n개의 합이므로, 기댓값의 선형성에 따라 입니다. 시행들이 독립이라 공분산이 모두 0이므로 분산도 더해져 입니다.
본문 처음의 동전 두 번은 n = 2, p = 1/2이라 평균 1, 분산 1/2이고, 분포에서 직접 구한 값과 같습니다. 지시변수를 쓰면 이항확률의 복잡한 합을 계산하지 않고도 평균과 분산을 얻을 수 있습니다. 평균만 필요하다면 시행들이 독립이 아니어도 선형성이 성립하므로 같은 방법을 쓸 수 있습니다.
더 깊이: 평균과 분산만으로 말할 수 있는 것
분포 전체를 몰라도 기댓값과 분산만으로 확률의 상한을 얻을 수 있습니다. 음이 아닌 확률변수 X와 양수 a에 대해 가 성립하며, 이를 마르코프 부등식(Markov's inequality)이라고 합니다. X가 a 이상일 때 1, 아니면 0인 지시변수를 I라 하면 언제나 이므로, 양변의 기댓값을 취해 를 얻습니다.
이 부등식을 음이 아닌 확률변수 에 쓰면 체비쇼프 부등식(Chebyshev's inequality)이 나옵니다. 평균이 , 분산이 인 X와 양수 k에 대해, 는 과 같은 사건이므로 입니다. 분산이 작을수록 값이 평균에서 멀리 벗어날 확률이 작다는 것을 식으로 보여 줍니다.
동전을 100번 던진 앞면의 수는 서로 독립인 지시변수 100개의 합이라 평균 50, 분산 입니다. 체비쇼프 부등식으로 앞면이 40번 이하이거나 60번 이상일 확률은 을 넘지 않습니다. 이 상한은 분포의 모양을 전혀 쓰지 않았기 때문에 실제 확률보다 꽤 크지만, 평균과 분산만 알면 어떤 분포에도 쓸 수 있다는 것이 장점입니다.
정리
- 확률변수는 결과마다 수를 정하는 함수이고, 분포는 같은 값으로 가는 결과의 확률을 모아 값마다 적은 것입니다.
- 기댓값은 확률로 가중한 평균이고, 분산은 편차를 제곱해 평균한 값이며 로도 계산합니다.
- 기댓값은 독립과 상관없이 이고, 입니다.
- 합의 분산은 이며, 독립이면 공분산이 0이지만 공분산이 0이라고 독립인 것은 아닙니다.
- 성공 횟수를 지시변수의 합으로 보면 이항분포의 평균 np와, 독립일 때의 분산 np(1 − p)를 바로 얻습니다.
연습 문제
1. 분포에서 기댓값과 분산
확률변수 Y가 0을 확률 1/2, 2를 확률 1/4, 4를 확률 1/4로 가질 때 기댓값과 분산을 구하세요.
해설 보기
입니다. 이므로 분산은 입니다. 계산을 마친 뒤 확률의 합이 1인지, 분산이 음수가 아닌지 확인하면 실수를 줄일 수 있습니다. 정의대로 편차의 제곱을 평균해도 로 같습니다.
2. 바꾼 변수의 기댓값과 분산
X의 기댓값이 2이고 분산이 3일 때, Z = 2X + 5의 기댓값과 분산은 무엇인가요?
해설 보기
기댓값은 이고, 분산은 입니다. 상수 5는 모든 값을 함께 옮길 뿐 흩어진 정도를 바꾸지 않으므로 분산에 더하지 않습니다. 값을 두 배로 늘리면 편차도 두 배가 되고 제곱한 편차는 네 배가 되므로, 분산에는 2가 아니라 4를 곱합니다. 표준편차는 에서 으로 두 배가 됩니다.
3. 주사위 두 개의 합
공정한 주사위 하나의 눈의 기댓값과 분산을 구하고, 서로 독립인 주사위 두 개의 눈의 합의 기댓값과 분산을 구하세요.
해설 보기
눈의 기댓값은 이고, 이므로 분산은 입니다. 두 눈의 합의 기댓값은 선형성으로 7/2 + 7/2 = 7입니다. 두 주사위가 독립이라 공분산이 0이므로 합의 분산은 35/12 + 35/12 = 35/6입니다. 기댓값을 더하는 데는 독립이 필요 없지만, 분산을 더하는 데는 공분산이 0이라는 조건을 썼습니다.
평균을 계산하기 전에 값마다 확률을 모으고 그 합이 1인지 먼저 확인해 보세요. 허프만 코드와 접두어 없는 표현의 문자당 평균 길이도 문자의 빈도를 확률로 본 코드 길이의 기댓값입니다. 이것으로 이산수학 교재의 본문을 마칩니다. 처음부터 다시 훑어보려면 교재 목차로 돌아가세요.