콘텐츠로 이동

스튜던트 t 분포

개요

\(\sigma\)를 아는 경우는 사실상 없다. 앞 절의 \(Z\) 통계량은 분모에 모표준편차 \(\sigma\)를 쓰는데, 모평균 \(\mu\)를 모르는 사람이 모표준편차는 알고 있다는 설정은 교과서 밖에서 찾기 어렵다. 실제로 손에 쥐고 있는 것은 자료뿐이고, 자료에서 계산할 수 있는 것은 표본표준편차 \(S\)다.

그러니 \(\sigma\) 자리에 \(S\)를 넣는 수밖에 없다. 문제는 그렇게 만든 값이 더 이상 \(N(0,1)\)을 따르지 않는다는 것이다. \(\sigma\)는 고정된 수였지만 \(S\)는 표본마다 달라지는 확률변수다. 분자만 흔들리던 비에서 이제는 분모까지 함께 흔들리고, 그만큼 값이 더 멀리까지 튄다. 분포의 꼬리가 두꺼워지는 것이다.

스튜던트 \(t\) 분포는 그 두꺼워진 정도를 정확히 매긴 것이다. 이 절에서 \(t\)가 맡는 역할은 한 문장으로 요약된다. \(\sigma\)를 모른다는 현실을 받아들이는 대가가 얼마인지를 알려 주는 것이며, 5.4절의 표본평균 \(\bar X\)가 그 짝이다.

분포 자체는 4.2절에서 이미 다루었다. 그곳에서 \(t_d\)는 독립인 \(Z \sim N(0,1)\)과 \(V \sim \chi^2_d\)에 대해 \(T = Z/\sqrt{V/d}\)의 분포로 정의되었고, 밀도와 적률과 정규분포로의 수렴이 차례로 유도되었다. 이 절은 반대 방향에서 온다. 정의에서 출발해 쓸 곳을 찾는 것이 아니라, 자료를 앞에 놓고 어쩔 수 없이 \(S\)를 쓰게 되는 자리에서 출발해 그 분포가 \(t\)일 수밖에 없음에 이른다. 같은 분포에 이르지만 도착 경로가 다르고, 이 절이 따로 있어야 하는 이유가 그 경로에 있다.

자유도는 분모에 대해 아는 양이다

\(t_d\)의 \(d\)를 자유도라 부른다. 표본평균에 관한 추론에서는 \(d = n - 1\)인데, 표본분산을 계산할 때 편차 \(n\)개 가운데 자유롭게 움직일 수 있는 것이 \(n-1\)개이기 때문이다. 다시 말해 자유도는 \(\sigma\)를 추정하는 데 쓰인 독립적인 정보의 개수다. 자유도가 무엇을 세는 수인지를 이렇게 말할 수 있는 것은 표본이 있기 때문이며, 그래서 이 이야기는 4.2절이 아니라 여기에 속한다.

그러므로 자유도가 작다는 것은 분모에 대해 아는 바가 적다는 뜻이고, 그만큼 분포의 꼬리가 정규분포보다 두꺼워진다. 반대로 자유도가 커지면 \(S\)가 \(\sigma\)에 거의 붙어 버려 분모가 흔들릴 여지가 남지 않는다.

\(t_d\)의 분산이 \(d/(d-2)\)라는 4.2절의 결과에도 같은 이야기가 새겨져 있다. 분산이 1이 아니라 1보다 크고 \(d \to \infty\)에서야 1로 내려오는데, 그 남는 몫 \(d/(d-2) - 1 = 2/(d-2)\)가 바로 \(\sigma\)를 모른 채 추정하느라 치른 값이다. 자유도 3이면 이 몫이 2나 되고 자유도 30이면 0.07로 줄어든다. 표본을 키우는 일이 곧 이 대가를 깎는 일이다.

두꺼운 꼬리는 눈에 잘 띄지 않는다

꼬리가 두껍다고 했지만 두 밀도곡선을 나란히 그려 놓으면 차이가 거의 보이지 않는다. 밀도가 큰 가운데 부분이 눈을 끌어서다. 아래 그림은 왼쪽에 전체를, 오른쪽에 오른쪽 꼬리만 확대해서 보여 준다. 검정에서 판단이 갈리는 곳은 언제나 후자다.

보기 1. t 분포의 두꺼운 꼬리. \(t_{10}\)의 밀도와 \(N(0,1)\)의 밀도를 \([-4, 4]\)에서 겹쳐 그리고, 오른쪽 꼬리만 확대한 칸을 나란히 둔다.

(1) 두 밀도의 비 \(f_{t_d}(x)/\varphi(x)\)가 \(|x|\)에 따라 어떻게 움직이는지 유도하고, 두 곡선이 모두 몇 번 만나는지 답하시오.

(2) \(d = 10\)에서 만나는 자리를 수치로 구하고, 그림의 두 칸이 각각 그 자리의 어느 쪽을 보여 주는지 말하시오.

풀이

(1) 해석적으로. 비의 로그를 잡는다. \(t_d\)의 밀도가 \(f_{t_d}(x) = C_d\,(1 + x^2/d)^{-(d+1)/2}\)이므로

\[ R(x) = \log\frac{f_{t_d}(x)}{\varphi(x)} = \log\!\left(\sqrt{2\pi}\,C_d\right) - \frac{d+1}{2}\log\!\left(1 + \frac{x^2}{d}\right) + \frac{x^2}{2} \]

이다. \(R\)은 \(x^2\)만 통해 \(x\)에 의존하므로 \(u = x^2\)로 바꿔 미분한다.

\[ \frac{dR}{du} = -\frac{d+1}{2}\cdot\frac{1/d}{1 + u/d} + \frac12 = \frac12\left(1 - \frac{d+1}{d+u}\right) = \frac{u-1}{2(d+u)} \]

분모가 양수이므로 부호는 \(u - 1\)이 정한다. 비는 \(u < 1\)에서 줄고 \(u > 1\)에서 늘며, 최소가 정확히 \(|x| = 1\)에서 잡힌다. 자유도가 어떤 값이어도 그 자리는 \(1\)이다.

출발점은 \(1\)보다 작다. \(u = 0\)에서

\[ \frac{f_{t_d}(0)}{\varphi(0)} = \frac{\sqrt2\,\Gamma\!\left(\frac{d+1}{2}\right)}{\sqrt d\,\Gamma\!\left(\frac d2\right)} = \frac{E\!\left[\sqrt{\chi^2_d}\right]}{\sqrt d} < \frac{\sqrt{E[\chi^2_d]}}{\sqrt d} = 1 \]

인데, 가운데 등식은 다음 절 연습문제 10에 나오는 \(E[\sqrt{\chi^2_d}] = \sqrt2\,\Gamma((d+1)/2)/\Gamma(d/2)\)이고, 부등식은 \(\sqrt{\cdot}\)이 오목하다는 옌센 부등식이다. \(t_d\)의 봉우리가 정규분포보다 낮은 몫이 곧 그 절의 편향상수 \(c_4\)이며, 같은 옌센 부등식이 두 자리에서 일하고 있는 셈이다.

끝점은 \(1\)보다 크다. \(x \to \infty\)에서 \(t\)의 꼬리는 \(|x|^{-(d+1)}\)로 다항식처럼 줄고 정규는 \(e^{-x^2/2}\)로 줄므로 \(R(u) \to +\infty\)다.

그러므로 \(R\)은 음수에서 출발해 \(u = 1\)까지 더 내려갔다가 돌아서 \(+\infty\)로 간다. 영점은 \(u > 1\)에 정확히 하나뿐이다. 그 자리를 \(x^* > 1\)이라 하면 \(x > 0\)에서 교차가 한 번이고, 두 밀도가 모두 대칭이므로

\[ \text{교차 횟수} = 2 \]

다. 대칭인 두 밀도가 \(0\)에서 다르면 교차 횟수는 짝수여야 한다는 것과도 맞는다.

여기서 미리 못박아 둘 것이 있다. "꼬리가 두껍다"는 말은 "어디서나 높다"는 뜻이 아니다. \(|x| < x^*\)에서는 \(t_d\)가 정규보다 오히려 낮다. 밀도의 총합이 양쪽 다 1이니 어딘가가 높으면 어딘가는 낮아야 하고, 그 낮은 구간이 바로 눈에 잘 띄는 가운데다.

(2) 수치적으로.

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats

fig, (ax_full, ax_tail) = plt.subplots(1, 2, figsize=(12, 3))
x = np.linspace(-4, 4, 200)

# 왼쪽: 전체 모습. 두 곡선이 거의 겹쳐 보인다.
ax_full.plot(x, stats.norm().pdf(x), label='Normal')
ax_full.plot(x, stats.t(df=10).pdf(x), label='t(10)')
ax_full.set_title('Full PDF')
ax_full.legend()

# 오른쪽: 꼬리만 확대. x[-50:] 은 x 배열의 마지막 50개, 즉 오른쪽 끝이다.
# 전체 그림에서는 밀도가 너무 작아 안 보이던 차이가 여기서 드러난다.
# **꼬리는 언제나 확대해서 봐야 한다.** 검정에서 문제가 되는 곳이 바로 꼬리다.
ax_tail.plot(x[-50:], stats.norm().pdf(x[-50:]), label='Normal')
ax_tail.plot(x[-50:], stats.t(df=10).pdf(x[-50:]), label='t(10)')
ax_tail.set_title('Right Tail (zoomed)')
ax_tail.legend()

plt.tight_layout()
plt.show()

Full PDF

왼쪽에서는 두 곡선이 겹쳐 보이지만 오른쪽 확대에서는 \(t(10)\)이 정규분포 위로 또렷이 올라앉아 있다. 자유도가 10이나 되는데도 그렇다.

(1)이 유도한 세 가지, 곧 \(|x| = 1\)의 최소점과 \(0\)에서의 비와 교차점을 하나씩 확인한다.

import numpy as np
from scipy import optimize, special, stats

d = 10
ratio = lambda x: stats.t(d).pdf(x) / stats.norm.pdf(x)

# 0 에서의 비가 c4 상수와 같다는 등식을 먼저 확인한다.
c4 = np.sqrt(2 / d) * special.gamma((d + 1) / 2) / special.gamma(d / 2)
print(f"f_t(0)/phi(0) = {ratio(0):.9f},   E[sqrt(chi2_d)]/sqrt(d) = {c4:.9f}")

# 비가 |x| = 1 에서 최소라는 유도를 격자로 확인한다.
xs = np.linspace(0, 3, 30_001)
print(f"비가 최소인 곳 = {xs[ratio(xs).argmin()]:.4f},  그때의 비 = {ratio(xs).min():.4f}")

# 두 밀도가 만나는 곳. 유도에 따르면 |x| > 1 에 하나뿐이다.
x_star = optimize.brentq(lambda x: ratio(x) - 1, 1.01, 10)
print(f"교차점 x* = {x_star:.4f}  (그림 오른쪽 칸은 {np.linspace(-4, 4, 200)[-50]:.4f} 부터 시작한다)")

print(f"{'x':>8}{'t(10) 밀도':>13}{'정규 밀도':>13}{'비':>9}")
for x in (0.0, 1.0, 1.5928, 2.0302, 3.0, 4.0):
    print(f"{x:>8.4f}{stats.t(d).pdf(x):>13.6f}{stats.norm.pdf(x):>13.3e}{ratio(x):>9.3f}")

# 꼬리확률로 옮겨 보면
for x in (2.0302, 4.0):
    print(f"P(X > {x:.4f}):  t(10) {stats.t(d).sf(x):.3e}   정규 {stats.norm.sf(x):.3e}"
          f"   비 {stats.t(d).sf(x)/stats.norm.sf(x):.2f}")

출력:

f_t(0)/phi(0) = 0.975350077,   E[sqrt(chi2_d)]/sqrt(d) = 0.975350077
비가 최소인 곳 = 1.0000,  그때의 비 = 0.9520
교차점 x* = 1.5928  (그림 오른쪽 칸은 2.0302 부터 시작한다)
       x     t(10) 밀도        정규 밀도        비
  0.0000     0.389108    3.989e-01    0.975
  1.0000     0.230362    2.420e-01    0.952
  1.5928     0.112203    1.122e-01    1.000
  2.0302     0.058303    5.080e-02    1.148
  3.0000     0.011401    4.432e-03    2.572
  4.0000     0.002031    1.338e-04   15.176
P(X > 2.0302):  t(10) 3.489e-02   정규 2.117e-02   비 1.65
P(X > 4.0000):  t(10) 1.259e-03   정규 3.167e-05   비 39.76

셋 모두 유도와 맞는다. \(0\)에서의 비는 아홉째 자리까지 \(c_4\)와 같고, 격자가 찾은 최소점은 \(1.0000\)이며, 교차점은 \(x^* = 1.5928\) 하나다.

그림의 두 칸이 서로 다른 구간을 보여 준다. 오른쪽 칸은 x[-50:], 곧 \(x \ge 2.0302\)만 그리는데 이는 교차점 \(1.5928\)보다 바깥이므로 전부 \(t\)가 더 높은 구간이다. 거기서 비가 \(1.148\)에서 \(15.176\)까지 오르니 눈에 보이는 것이 당연하다. 반대로 왼쪽 칸에서 눈길이 가는 봉우리 근처는 \(|x| < 1.5928\), 곧 \(t\)가 더 낮은 구간이다. 그 구간에서 비는 \(0.952\)와 \(1\) 사이에만 머문다. 두 곡선이 "겹쳐 보인다"는 인상은 차이가 \(5\%\)를 넘지 않는다는 사실의 반영이다.

왼쪽 칸이 가리는 것이 둘 있다. 하나는 교차점이다. \(x^* = 1.5928\)에서 두 밀도가 정확히 같으므로 그 자리에는 볼 것이 아무것도 없고, 그래서 선이 교차하는 모습 자체가 보이지 않는다. 다른 하나는 꼬리의 차이다. \(x = 4\)에서 비가 \(15\)배인데도 밀도가 \(0.002\)와 \(0.00013\)이라 세로축에서 한 화소도 차지하지 못한다. 배율이 가장 큰 곳이 그림에서 가장 작게 보인다는 것이 선형 세로축의 성질이다.

검정에 쓰이는 양으로 옮기면 차이가 더 또렷해진다. 밀도가 아니라 꼬리확률로 재면 \(x = 2.0302\)에서 \(1.65\)배, \(x = 4\)에서 \(39.76\)배다. 임계값과 \(p\)값은 모두 이쪽 눈금에서 결정되며, 그래서 자유도 \(10\)이라는 "꽤 큰" 자유도에서도 \(t\)를 써야 한다.

왜 하필 t인가

앞에서 두꺼운 꼬리를 그림으로 보았지만, 정작 물어야 할 것은 그 꼬리가 왜 하필 그만큼 두꺼운가이다. 4.2절은 이 질문에 정의로 답했다. \(Z\)를 카이제곱의 제곱근으로 나눈 것이 \(t\)이고, 그렇게 정의된 분포의 밀도가 다항식 꼬리를 갖는다는 것이다. 그러나 자료를 앞에 놓은 사람이 정의부터 떠올릴 리는 없다. 실무의 순서는 정반대이며, 그 순서를 그대로 따라가 보면 \(t\)가 저절로 걸어 나온다.

모르는 값을 아는 값으로 바꾸는 순간

시작은 \(\sigma\)를 모른다는 사실이다. 앞 절의 \(Z\) 통계량

\[ Z = \frac{\bar X - \mu}{\sigma/\sqrt n} \]

은 분자의 \(\mu\)도 모르고 분모의 \(\sigma\)도 모른다. 그런데 \(\mu\)는 모르는 편이 정상이다. 추론하려는 대상이 바로 그것이고, 가설검정에서는 \(\mu = \mu_0\)을 가정해 값을 넣어 보는 것이 일이다. 문제는 분모다. \(\sigma\)는 추론의 대상도 아니면서 값을 알 수 없다. 자료에서 계산할 수 있는 것은 \(S\)뿐이므로 \(S\)를 넣는다. 다른 선택지가 없다.

여기서 무엇이 달라졌는지를 정확히 보아야 한다. 바뀐 것은 값이 아니라 자격이다. \(\sigma\)는 표본이 무엇이든 같은 수였다. 표본을 다시 뽑아도 분모는 그대로 있고, 표본마다 달라지는 것은 분자뿐이었다. \(S\)로 갈아 끼우면 분모까지 표본마다 달라진다. 상수 하나가 확률변수로 승격한 것이며, 비의 분포가 달라지는 이유 전부가 여기에 있다.

분자와 분모가 함께 흔들린다

분모가 확률변수가 되면 비는 두 가지 방식으로 더 멀리 튄다.

첫째, 분모가 작게 나온 표본에서 비가 크게 부풀려진다. \(S\)는 평균이 대략 \(\sigma\)인 값이지만 작은 표본에서는 산포가 크다. 운 나쁘게 \(S\)가 참값의 절반쯤 나오면 같은 분자에 대해 비가 두 배가 된다. 반대로 \(S\)가 크게 나오면 비가 눌린다. 그런데 이 둘은 서로 상쇄되지 않는다. 나눗셈은 대칭이 아니기 때문이다. 분모를 절반으로 만들면 비가 2배가 되지만 분모를 두 배로 만들면 비는 절반이 될 뿐이다. 작아지는 쪽의 효과가 커지는 쪽의 효과보다 훨씬 크고, 그래서 평균적으로는 비가 넓게 퍼진다.

둘째, 어느 방향으로 얼마나 흔들릴지를 미리 알 수 없다. \(\sigma\)를 쓸 때는 "관측된 값이 표준오차의 몇 배인가"라는 물음에 눈금이 고정되어 있었다. \(S\)를 쓰면 눈금 자체가 표본마다 늘었다 줄었다 한다. 자를 대고 재는데 자가 고무줄인 셈이다.

두 효과가 합쳐져 값이 원점에서 더 멀리까지 나가고, 그것이 꼬리가 두꺼워진다는 말의 내용이다. 여기까지는 방향만 말한 것이다. 얼마나 두꺼워지는지를 정하려면 \(S\)가 흔들리는 양을 정확히 알아야 한다.

대가의 정확한 값

\(S\)의 흔들림을 값매겨 주는 것이 다음 절의 카이제곱이다. 모집단이 정규라면 \((n-1)S^2/\sigma^2 \sim \chi^2_{n-1}\)이므로, 분모의 흔들림은 자유도 \(n-1\)인 카이제곱 하나로 완전히 기술된다. 그러면 통계량을 다음처럼 다시 쓸 수 있다.

\[ \frac{\bar X - \mu}{S/\sqrt n} = \frac{(\bar X - \mu)/(\sigma/\sqrt n)}{S/\sigma} = \frac{Z}{\sqrt{\dfrac{(n-1)S^2/\sigma^2}{n-1}}} \]

가운데 등식이 이 절 전체의 핵심이다. 분자와 분모에 \(\sigma\)를 각각 넣었다 뺐더니 모르는 값이 서로 약분되어 사라졌다. 왼쪽 변은 자료만으로 계산할 수 있는 양, 곧 5.1절이 말한 의미의 통계량이고, 오른쪽 변은 모르는 값 \(\sigma\)로 표현되어 있지만 그 분포는 알 수 있는 양이다. 계산할 수 있는 쪽과 분포를 아는 쪽이 같다는 것, 그것이 추론이 가능해지는 조건이다.

오른쪽 변의 모양이 \(Z \big/ \sqrt{V/(n-1)}\)인데, 이것이 정확히 4.2절이 \(t_{n-1}\)의 정의로 삼은 꼴이다. 다만 정의가 요구하는 것이 하나 더 있다. \(Z\)와 \(V\)가 독립이어야 한다. 그리고 여기서 \(Z\)는 \(\bar X\)의 함수이고 \(V\)는 \(S^2\)의 함수이므로, 필요한 것은 \(\bar X\)와 \(S^2\)의 독립성이다. 정규모집단에서는 이것이 성립한다. 4.2절 정규분포 쪽 연습문제 7이 직교변환으로 증명해 둔 사실이며, 정규분포에서만 성립하는 성질이기도 하다.

세 조각이 모두 갖추어졌으므로

\[ \frac{\bar{X} - \mu}{S / \sqrt{n}} \sim t_{n-1} \]

이다. \(\sigma\)를 모른다는 현실을 받아들인 대가가 정확히 이것이다. 분포가 정규에서 \(t_{n-1}\)로 바뀐다. 그뿐이다.

근사로 내려앉은 것이 아니다

이 결론을 읽을 때 흔히 저지르는 오해가 하나 있다. \(\sigma\)를 모르니 무언가 정확성을 잃었으리라 짐작하는 것이다. 그렇지 않다. 모집단이 정규라면 \(t_{n-1}\)은 \(n\)이 3이든 300이든 정확한 분포다. 5.4절이 같은 말을 한다. 근사로 내려앉은 것이 아니라 정확한 분포의 이름이 정규에서 \(t_{n-1}\)로 바뀌었을 뿐이다.

바꿔 말하면 \(\sigma\)를 모른다는 것은 이 자리에서 해결된 문제다. 값매김이 끝났고 청구서가 발행되었으며 금액은 자유도별 임계값 표에 적혀 있다. 5장에서 이렇게 깨끗하게 마무리되는 문제는 많지 않다. 뒤의 두 절에서 볼 \(\chi^2\)과 \(F\)는 사정이 다르다. 그쪽에서는 정규성이 깨졌을 때 치르는 대가를 값매길 수 없을뿐더러, 표본을 키워도 그 대가가 줄지 않는다. \(S^2\)에서는 어긋남의 배율이 \(n\)과 무관하게 남고, \(S_1^2/S_2^2\)에서는 오히려 커진다. 남는 길은 표본을 늘리는 것이 아니라 아예 다른 방법으로 갈아타는 것이다.

모의실험으로 확인한다

아래 모의실험은 이 결론을 눈으로 확인한다. \(N(0, 10^2)\)에서 크기 10짜리 표본을 1만 번 뽑아 매번 분모에 참값 10이 아니라 표본표준편차를 넣은 비를 계산하고, 그 히스토그램에 \(t_9\) 밀도를 겹쳐 놓는다. 분모에 참값을 넣었다면 히스토그램이 표준정규를 따랐을 것이다. 한 글자를 바꾼 대가가 곡선의 차이로 나타난다.

보기 2. 왜 t 분포가 필요한가. \(N(0, 10^2)\)에서 크기 \(n = 10\)인 표본을 1만 번 뽑아, 분모에 참값 \(\sigma = 10\) 대신 표본표준편차 \(S\)를 넣은 비를 계산한다.

(1) 그 비의 표준편차와 \(P(|\cdot| > 1.96)\)이 얼마가 되어야 하는지, 분모에 \(\sigma\)를 넣었을 때와 나란히 적으시오.

(2) 같은 표본으로 두 비를 모두 계산해 (1)을 확인하고, 임계값 \(1.96\)을 그대로 쓰면 무엇을 잃는지 말하시오.

풀이

(1) 이론값. 두 비가 따르는 분포는 둘 다 정확히 알려져 있다. 분모에 \(\sigma\)를 넣으면

\[ Z = \frac{\bar X - \mu}{\sigma/\sqrt n} \sim N(0,1), \qquad \operatorname{sd}(Z) = 1, \qquad P(|Z| > 1.96) = 0.05 \]

이고, \(S\)로 갈아 끼우면 본문의 유도대로 \(T \sim t_{n-1} = t_9\)다. 4.2절의 \(\operatorname{Var}(t_d) = d/(d-2)\)에 \(d = 9\)를 넣으면

\[ \operatorname{Var}(T) = \frac{9}{7} = 1.2857, \qquad \operatorname{sd}(T) = \sqrt{\frac97} = 1.1339 \]

이다. 늘어난 몫 \(d/(d-2) - 1 = 2/(d-2) = 2/7 = 0.2857\)이 \(\sigma\)를 모른 채 추정하느라 치른 값이며, 이 식이 \(d > 2\)에서만 뜻을 갖는다는 것도 함께 기억해 둘 일이다(연습문제 8). \(d = 9\)는 넉넉히 넘으므로 분산이 유한하다.

꼬리확률은 같은 임계값에서 재어야 비교가 된다.

\[ P(|T_9| > 1.96) = 0.0816 \]

곧 \(1.96\)으로 양측 \(5\%\) 검정을 설계했다고 믿었는데 실제로는 \(8.2\%\)에서 기각한다. 명목의 \(1.63\)배다. \(t_9\)에서 양쪽 \(5\%\)를 지키는 올바른 임계값은 \(t_{9,\,0.975} = 2.2622\)로 \(1.96\)보다 \(15.4\%\) 크다(연습문제 9의 표에 같은 수치가 있다).

(2) 모의실험. 아래 코드는 쪽에 있던 것에 비교 줄만 덧붙인 것이다. \(Z\)는 이미 뽑아 둔 samples에서 분모만 바꿔 계산하므로 난수를 새로 쓰지 않고, 따라서 그림도 달라지지 않는다.

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

np.random.seed(0)
n, mu, sigma = 10, 0, 10
n_sim = 10_000

# (n, n_sim) 배열이므로 **열 하나가 표본 하나**다. axis=0 으로 집계한다.
samples = np.random.normal(mu, sigma, (n, n_sim))
x_bar = samples.mean(axis=0)
s = samples.std(axis=0, ddof=1)

# t 통계량. 분모에 참 sigma(=10)가 아니라 **표본표준편차 s** 를 넣는 것이 요점이다.
# sigma를 썼다면 이 값은 정확히 N(0,1)을 따랐을 것이다.
# s를 쓰면 분모 자체가 흔들리므로 분포가 넓어지고 꼬리가 두꺼워진다.
# 그 넓어진 정도를 정확히 기술하는 것이 t(n-1) 이다.
t_stats = (x_bar - mu) / (s / np.sqrt(n))

# **같은 표본**에서 분모만 참 sigma 로 되돌린 것. 비교 대상이다.
# 난수를 새로 뽑지 않으므로 아래 그림은 달라지지 않는다.
z_stats = (x_bar - mu) / (sigma / np.sqrt(n))

sd_t = np.sqrt((n - 1) / (n - 3))              # Var(t_d) = d/(d-2)
p_t = 2 * stats.t(n - 1).sf(1.959964)
print(f"표준편차     : z 이론 1.0000 모의 {z_stats.std(ddof=1):.4f}  |  t 이론 {sd_t:.4f} 모의 {t_stats.std(ddof=1):.4f}")
print(f"P(|.| > 1.96): z 이론 0.0500 모의 {np.mean(np.abs(z_stats) > 1.959964):.4f}  |  t 이론 {p_t:.4f} 모의 {np.mean(np.abs(t_stats) > 1.959964):.4f}")
print(f"KS 검정 p : t_9 과 맞는가 {stats.kstest(t_stats, 't', args=(n-1,)).pvalue:.4f}"
      f"   N(0,1) 과 맞는가 {stats.kstest(t_stats, 'norm').pvalue:.2e}")
print(f"올바른 임계값 t(9, 0.975) = {stats.t(n-1).ppf(0.975):.4f}")

fig, ax = plt.subplots(figsize=(12, 3))
bins = np.arange(-6, 6, 0.1)
ax.hist(t_stats, bins=bins, density=True, alpha=0.7, label=f'Simulated $t_{{{n-1}}}$')
ax.plot(bins, stats.t(n-1).pdf(bins), '--r', lw=2, label=f'$t_{{{n-1}}}$ PDF')
ax.legend()
ax.spines[['top', 'right']].set_visible(False)
plt.show()

출력:

표준편차     : z 이론 1.0000 모의 0.9904  |  t 이론 1.1339 모의 1.1300
P(|.| > 1.96): z 이론 0.0500 모의 0.0459  |  t 이론 0.0816 모의 0.0826
KS 검정 p : t_9 과 맞는가 0.8758   N(0,1) 과 맞는가 6.74e-04
올바른 임계값 t(9, 0.975) = 2.2622

스튜던트 t 분포

네 수치가 모두 이론과 맞는다. \(Z\) 쪽은 \(0.9904\)와 \(0.0459\)로 \(1\)과 \(0.05\)에 붙고(되풀이 1만 번에서 표준편차의 몬테카를로 오차가 \(0.0071\), 비율의 오차가 \(0.0022\)이니 각각 \(1.4\)배와 \(1.9\)배 안이다), \(T\) 쪽은 \(1.1300\)과 \(0.0826\)으로 이론값 \(1.1339\)와 \(0.0816\)에 붙는다. 히스토그램에 겹친 빨간 곡선이 \(t_9\) 밀도인데, KS 검정이 \(t_9\)에 대해 \(p = 0.88\)을 주고 \(N(0,1)\)에 대해 \(p = 0.00067\)을 주어 그림으로는 닮아 보이는 둘을 가른다.

잃는 것은 유의수준이다. 분모 한 글자를 \(\sigma\)에서 \(S\)로 바꾸었을 뿐인데 표준편차가 \(13\%\) 넓어졌고, 그 넓어진 분포에 \(1.96\)을 그대로 대면 기각률이 \(5\%\)에서 \(8.2\%\)로 올라간다. 신뢰구간 쪽으로 옮기면 명목 \(95\%\) 구간이 실제로는 \(91.8\%\)만 담는다는 뜻이고, 연습문제 2의 표에서 \(n = 10\) 줄이 바로 이 수치다.

그런데 이것은 손실이 아니라 청구서다. 분포가 \(t_9\)로 바뀐 것을 알고 임계값을 \(2.2622\)로 고치면 명목 \(5\%\)가 정확히 지켜진다. 모집단이 정규이기만 하면 근사가 아니라 등식이기 때문이다. \(\sigma\)를 모른다는 문제는 이 자리에서 값이 매겨지고 끝난다. 뒤의 두 절에서 볼 \(\chi^2\)과 \(F\)에서는 이렇게 끝나지 않는다.

임계값

평균에 관한 신뢰구간과 검정에서 되풀이해 찾아보게 되는 수치다. 표본크기 \(n\)에 대해 자유도는 \(n-1\)이다.

\(n\) \(t_{0.95,\,n-1}\) \(t_{0.975,\,n-1}\) \(t_{0.995,\,n-1}\)
5 2.132 2.776 4.604
10 1.833 2.262 3.250
20 1.729 2.093 2.861
30 1.699 2.045 2.756
50 1.677 2.010 2.680
100 1.660 1.984 2.626
\(\infty\) 1.645 1.960 2.576

맨 아랫줄이 앞 절의 \(z\) 임계값이다. 위에서 아래로 내려가는 동안 줄어드는 몫이 \(\sigma\)를 모르는 대가이며, 표본을 키우는 일이 그 대가를 깎는 일이라는 것이 표 한 장에 들어 있다. 자유도별 수렴 속도를 더 자세히 본 표는 4.2절 \(t\) 분포 쪽에 있다.

이 표본분포를 언제 믿을 수 있는가

\(t\) 분포가 고쳐 주는 것과 고쳐 주지 못하는 것을 갈라 두는 일이 이 절에서 가장 실용적인 대목이다.

전제가 무엇인가. 앞의 유도에 들어간 조각은 셋이었지만 실질은 둘이다. 하나는 분자 \(\bar X - \mu\)가 정규를 따라야 한다는 것이고, 다른 하나는 그 분자와 분모가 서로 독립이어야 한다는 것이다. 분모의 \((n-1)S^2/\sigma^2\)이 카이제곱이라는 셋째 조각은 첫째와 같은 정규성에서 곧바로 따라 나오므로 따로 셀 필요가 없다. 독립성 쪽은 사정이 다르다. 그것은 \(t\)의 정의가 요구하는 조건이지 덤이 아니며, 정규분포만이 가진 성질이다. 카이제곱을 다루는 다음 절에서 이 독립성을 다시 만나는데, 두 절이 같은 하나에 함께 기대고 있는 셈이다. 표본크기에 대한 조건은 어디에도 없다. 정규모집단이면 \(n = 3\)에서도 정확하다.

깨지면 무엇이 달라지는가. 모집단이 치우쳐 있으면 \(\bar X\)와 \(S^2\)의 무상관조차 깨진다. 공분산이 \(\mu_3/n\)이므로 오른쪽으로 치우친 모집단에서는 \(\bar X\)가 클 때 \(S\)도 함께 커져 비가 눌리고, \(\bar X\)가 작을 때는 \(S\)도 작아 비가 과장된다. 그 결과 \(t\) 통계량의 분포가 왼쪽으로 치우친다. 두 꼬리가 대칭으로 두꺼워지는 것이 아니라 한쪽은 부풀고 다른 쪽은 여윈다는 것이 요점이다. 반면 모집단이 대칭이기만 하면 꼬리가 아무리 두꺼워도 이 비틀림은 생기지 않는다. \(t\)가 민감한 것은 첨도가 아니라 왜도다.

표본을 키우면 해결되는가. 해결된다. 그리고 여기가 이 절과 뒤의 두 절이 갈리는 지점이다. 중심극한정리가 첫째 재료를 대신 받쳐 주고, 둘째 재료가 어긋나며 생기는 오차도 에지워스 전개로 보면 \(n^{-1/2}\) 차수라 표본과 함께 줄어든다. 연습문제 6이 지수모집단에서 그 회복을 재어 본다. \(S^2\)과 \(S_1^2/S_2^2\)에서는 어긋남의 배율에 \(n\)이 아예 들어 있지 않아 이런 회복이 일어나지 않는다.

그 어긋남이 무엇을 망가뜨리는가. 작은 표본에서 명목 수준이 지켜지지 않는다. 치우침이 만드는 오차는 한쪽 꼬리를 부풀리고 다른 쪽을 줄이므로 양측검정에서는 상당 부분 상쇄되지만 단측에서는 그대로 남는다. 연습문제 6에서 재듯 지수모집단 \(n = 10\)에서 명목 5% 양측이 실제로는 9.9%이고, 같은 자리의 한쪽 꼬리는 13.2%까지 부푼다. 신뢰구간 쪽으로 옮기면 명목 95% 구간의 실제 포함률이 그만큼 내려앉는다는 뜻이다.

한 줄로 줄이면 이렇다. \(t\)는 \(\sigma\)를 모르는 문제를 풀어 주지만 정규성을 모르는 문제까지 풀어 주지는 않는다. 다만 표본을 키우면 그 남은 문제가 줄어든다는 점에서 \(t\)는 5장에서 형편이 나은 쪽에 속한다.

표본이 작으면서 모집단까지 치우쳐 있으면 \(z\)도 \(t\)도 믿을 수 없다. 그때는 순위를 쓰는 방법이나 재표본추출로 갈아타는 편이 낫고, 윌콕슨 부호순위 검정·부호검정 같은 대안의 가정과 검정력 비교는 16장 비모수 방법의 몫이다. 이 표본분포를 가지고 평균의 구간과 검정을 실제로 만드는 일은 8장 \(\mu\)의 신뢰구간과 9장 \(\mu\)에 대한 \(t\) 검정이 맡으며, 대응표본이나 두 표본으로 넘어가는 변형도 그쪽에 있다. 여기서 답해야 할 것은 그 계산이 딛고 설 분포가 언제 참인가 하나다.

그러면 n이 크면 z를 써도 되는가

"\(n \ge 30\)이면 \(t\) 대신 \(z\)를 써도 된다"는 경험 법칙을 흔히 듣는다. 이 규칙의 근거가 되는 수렴 속도는 4.2절 \(t\) 분포 쪽에 표로 정리되어 있다. 자유도 30에서 97.5백분위점이 2.042로 \(z\)의 1.960보다 4.2% 크고, 자유도 100에서는 1.2%까지 줄어든다는 것이다. 여기서 물을 것은 그 다음이다. 그 차이를 실무에서 무시해도 좋은가.

무시했을 때 무엇을 잃는지 세어 보면 답이 나온다. 정규모집단에서 \(n = 30\)인 표본을 놓고 \(t_{29}\) 대신 \(z = 1.96\)으로 구간을 만들면 명목 95% 구간의 실제 포함확률이 94.0%로 내려간다. 검정 쪽으로 옮겨 말하면 명목 5%로 설계한 양측검정의 실제 유의수준이 5.97%가 된다. \(n = 10\)이면 포함확률이 91.8%까지 떨어진다. 큰 손실은 아니지만 공짜로 피할 수 있는 손실이다. \(t\) 임계값을 얻는 데 드는 수고가 요즘은 없다시피 하기 때문이다.

그러므로 이 책의 권고는 간단하다. \(\sigma\)를 모르면 표본크기와 무관하게 언제나 \(t\)를 쓴다. \(n\)이 커지면 임계값이 저절로 \(z\)로 수렴하므로 큰 표본에서 손해 볼 일이 없고, 작은 표본에서는 \(z\)를 쓴 만큼 이득이다. 30이라는 숫자를 외워 두었다가 경계선에서 고민할 이유가 없다.

한 가지 덧붙일 것이 있다. 이 권고는 \(t\) 대 \(z\)의 선택에만 해당한다. 같은 숫자 30이 "\(n \ge 30\)이면 중심극한정리가 듣는다"는 전혀 다른 주장에도 쓰이는데, 그쪽은 모집단의 치우침을 보지 않는 규칙이라 훨씬 위험하다. 앞 절 정규분포 쪽 연습문제 6이 두 주장을 갈라 다룬다.

연습문제

연습문제 1. 급여가 \(\mu = \$40{,}000\)인 정규분포를 따른다. 표본 \(n = 9\), \(s = \$8{,}000\)일 때 \(P(\bar X \ge \$45{,}000)\)을 계산하라.

풀이

\(\mathrm{SE} = s/\sqrt n = 8000/3 \approx 2667\). 검정통계량: \(t = (45000 - 40000)/2667 \approx 1.875\).

\(t_8\) 아래에서 \(P(T \ge 1.875) \approx 0.048\)로 약 4.8%이다.

참고: \(\sigma\)를 모르고 표본에서 \(s\)를 추정하여 추가적인 불확실성이 들어오므로 \(z\) 대신 \(t\)를 사용한다.

연습문제 2. "자유도가 30을 넘으면 \(t\) 대신 \(z\)를 써도 된다"는 경험 법칙을 수치로 평가하라. 정규모집단에서 \(\sigma\)를 모를 때 \(t_{n-1}\) 대신 \(z_{0.975} = 1.96\)으로 95% 신뢰구간을 만들면 실제 포함확률이 얼마가 되는가? \(n = 5, 10, 30, 100\)에 대해 답하고 결론을 내려라.

풀이

\(\sigma\)를 모르면 \((\bar X - \mu)/(S/\sqrt n)\)의 정확한 분포는 \(t_{n-1}\)이다. 따라서 \(z = 1.96\)으로 만든 구간이 실제로 담는 확률은 \(P(|T_{n-1}| \le 1.96)\)이며, 이것은 95%가 아니다.

\(n\) 올바른 임계값 \(t_{0.975,\,n-1}\) 1.96을 쓸 때의 포함확률
5 2.776 87.8%
10 2.262 91.8%
30 2.045 94.0%
100 1.984 94.7%

읽는 법. \(n = 5\)에서 95%라고 이름 붙인 구간이 실제로는 88%만 담는다. 7%포인트의 차이는 작지 않다. \(n = 30\)에서도 94.0%로, 검정 쪽으로 옮겨 말하면 명목 5% 양측검정의 실제 유의수준이 5.97%가 된다. 경험 법칙이 말하는 "거의 같다"는 이 정도를 뜻한다.

결론. 이 오차는 크지 않지만 치를 이유가 없는 오차다. 올바른 임계값을 얻는 데 드는 수고가 0이기 때문이다. \(\sigma\)를 모르면 표본크기와 무관하게 \(t\)를 쓰면 되고, \(n\)이 커지면 임계값이 저절로 1.96으로 수렴하므로 큰 표본에서 손해도 없다. 30이라는 문턱은 계산기가 없던 시절 분포표를 뒤지는 수고를 아끼려고 생긴 것이며, 지금은 그 수고가 사라졌다.

한 가지 주의할 점이 있다. 여기서 평가한 것은 \(t\) 대 \(z\)의 선택뿐이다. 같은 숫자 30이 "\(n \ge 30\)이면 중심극한정리가 듣는다"는 별개의 주장에도 쓰이는데, 그것은 위 표와 아무 상관이 없다. 위 계산은 모집단이 정규라고 가정하고 한 것이기 때문이다.

연습문제 3. \(z\) 대신 \(t\)를 쓰는 이유. 어떤 통계학자가 \(z = (\bar X - \mu_0)/(\sigma/\sqrt n)\)을 계산하려다 \(\sigma\)를 모른다는 것을 깨닫고 \(s\)로 대체했다. 그 결과 \(t = (\bar X - \mu_0)/(s/\sqrt n) \sim t_{n-1}\)임을 보여라.

풀이

귀무가설 \(\mu = \mu_0\) 아래에서 \(\bar X \sim N(\mu_0, \sigma^2/n)\)이므로 \(Z = (\bar X - \mu_0)/(\sigma/\sqrt n) \sim N(0, 1)\)이다.

표본분산 \(s^2\)을 \(\sigma^2\)으로 척도조정하면 카이제곱 분포를 따른다: (정규 자료에 대해) \((n-1)s^2/\sigma^2 \sim \chi^2_{n-1}\).

정규 자료에서 \(\bar X\)와 \(s^2\)은 독립이다(정규성에만 특유한 자명하지 않은 사실이다).

따라서:

\[ t = \frac{\bar X - \mu_0}{s/\sqrt n} = \frac{(\bar X - \mu_0)/(\sigma/\sqrt n)}{\sqrt{((n-1) s^2/\sigma^2)/(n-1)}} = \frac{Z}{\sqrt{V/(n-1)}} \]

이며 \(V \sim \chi^2_{n-1}\)은 \(Z\)와 독립이다. \(t\)의 정의에 의해 이는 \(t_{n-1}\)이다.

\(\sigma\) 대신 \(s\)를 쓰면 분모에 카이제곱이 들어온다. \(t\) 분포는 정규분포보다 두꺼운 꼬리로 이 추가 불확실성을 반영한다.

연습문제 4. \(t\)의 두꺼운 꼬리. \(t_3\)에 대해 \(P(|T| > 2)\)와 \(P(|T| > 4)\)를 계산하고 정규분포와 비교하라.

풀이

\(t_3\): \(P(|T| > 2) = 2 \cdot P(T > 2)\). \(t_3\) 분포표에서 \(P(T > 2) \approx 0.07\)이므로 \(P(|T| > 2) \approx 0.14\)이다.

\(P(|T| > 4) \approx 2 \cdot 0.014 = 0.028\).

정규분포: \(P(|Z| > 2) \approx 0.046\), \(P(|Z| > 4) \approx 6 \times 10^{-5}\).

\(|x| = 4\)에서 비교하면 정규분포의 확률은 \(6 \times 10^{-5}\)로 사실상 0인데 \(t_3\)의 확률은 \(0.028\)로 400배가 넘는다. \(t_3\)은 정규분포보다 극단적인 결과에 훨씬 많은 확률을 부여한다.

실무적 귀결: 같은 유의수준에서 소표본 \(t\) 검정은 \(z\) 검정보다 검정력이 낮다. 두꺼운 꼬리를 상쇄하기 위해 임계값이 더 크기 때문이다. 이는 가정(\(\sigma\)를 안다는 것)과 꼬리에 대한 보수성 사이의 맞바꿈이다.

연습문제 5. \(t\) 통계량의 표본분포는 모집단의 왜도와 첨도 가운데 어느 쪽에 더 민감한가? 이유를 \(t\) 통계량의 구조에서 설명하라.

풀이

왜도에 훨씬 민감하다.

왜 그런가. \(t = \sqrt n(\bar X-\mu)/S\)에서 분자와 분모가 독립이 아니라는 것이 열쇠다. 정규모집단에서는 \(\bar X\)와 \(S^2\)이 독립이지만, 모집단이 치우쳐 있으면 그렇지 않다. 사실 이 독립성은 정규분포만의 성질이다. 둘이 독립이면 모집단이 정규라는 역이 성립한다는 것이 루카치의 정리(Lukacs 1942)다. 게리(Geary 1936)가 먼저 관련된 결과를 얻었으나, 이 특징화를 가리킬 때는 루카치로 부르는 것이 표준이다.

구체적으로 \(\operatorname{Cov}(\bar X, S^2) = \mu_3/n\)이다. 모집단의 3차 중심적률이 곧 공분산을 만든다. 오른쪽으로 치우친 모집단(\(\mu_3>0\))이면 \(\bar X\)가 우연히 클 때 \(S\)도 함께 크게 나온다. 그러면 분자가 커져도 분모가 함께 커져 \(t\)가 눌리고, 반대로 \(\bar X\)가 작을 때는 \(S\)도 작아 \(t\)가 과장된다.

그 결과 \(t\) 통계량의 분포 자체가 왼쪽으로 치우친다(모집단이 오른쪽으로 치우쳤을 때). 에지워스 전개로 보면 오차의 주항이

\[ P(T \le t) = \Phi(t) + \frac{\gamma_1}{6\sqrt n}(2t^2+1)\varphi(t) + O(n^{-1}) \]

로 왜도 \(\gamma_1\)에 비례하고 \(n^{-1/2}\) 차수다.

첨도의 영향. 첨도는 \(n^{-1}\) 차수의 항에만 들어간다. 수렴이 한 차수 빠르므로 같은 \(n\)에서 영향이 훨씬 작다.

이 구조에서 세 가지가 따라 나온다. 첫째, 한쪽 꼬리가 양쪽보다 위험하다. 왜도가 만드는 오차는 한쪽 꼬리를 부풀리고 다른 쪽을 줄이므로 양쪽을 함께 보면 두 오차가 상당 부분 상쇄되지만, 한쪽만 보면 그대로 남는다. 다음 문제에서 그 비대칭을 실제로 재어 본다. 둘째, 그래서 \(t\)를 근거로 만든 구간도 좌우가 같은 폭이어서는 안 되는 상황이 생기며, 이때 쓰는 왜도 보정이나 부트스트랩 계열의 구간은 16장과 8장의 몫이다. 셋째, 꼬리가 두껍기만 한 대칭 모집단(왜도가 0이고 첨도만 큰 경우, 예를 들어 \(t_3\))에서는 \(t\) 통계량의 표본분포가 거의 어긋나지 않는다. 연습문제 7이 이것을 확인한다.

한 문장으로 줄이면 치우침은 표본분포의 중심과 꼬리를 비틀고, 두꺼운 꼬리는 그러지 않는다.

연습문제 6. 지수모집단에서 \(t = (\bar X - \mu)/(S/\sqrt n)\)의 표본분포가 \(t_{n-1}\)과 얼마나 어긋나는지 \(n = 10, 30, 100, 1000\)에서 재어라. 명목 5%에 해당하는 양쪽 꼬리와 한쪽 꼬리를 따로 세고, 표본을 키우면 어긋남이 줄어드는지 답하라. 다음 절에서 볼 \(S^2\)과 무엇이 다른가?

풀이
import numpy as np
from scipy import stats

rng = np.random.default_rng(7)
B = 200_000

print(f"{'n':>6}{'양쪽':>9}{'오른쪽':>9}{'왼쪽':>9}")
for n in (10, 30, 100, 1000):
    c2 = stats.t(n - 1).ppf(0.975)      # 양쪽 5%
    c1 = stats.t(n - 1).ppf(0.95)       # 한쪽 5%
    X = rng.exponential(size=(B, n))    # Exp(1): mu = sigma = 1
    T = (X.mean(axis=1) - 1) / (X.std(axis=1, ddof=1) / np.sqrt(n))
    print(f"{n:>6}{np.mean(np.abs(T) > c2):>9.3f}"
          f"{np.mean(T > c1):>9.3f}{np.mean(T < -c1):>9.3f}")

출력:

     n       양쪽      오른쪽       왼쪽
    10    0.099    0.014    0.132
    30    0.073    0.022    0.098
   100    0.057    0.032    0.075
  1000    0.051    0.043    0.058

줄어든다. 명목 5% 양쪽이 \(n = 10\)에서 0.099였다가 \(n = 1000\)에서 0.051로 내려온다. 한쪽 꼬리도 0.014와 0.132로 크게 갈려 있던 것이 0.043과 0.058로 모인다.

한쪽 꼬리가 훨씬 더 어긋난다는 점이 이 표의 요점이다. \(n = 10\)에서 양쪽은 0.099로 명목의 두 배지만 왼쪽 하나만 보면 0.132로 거의 세 배다. 오른쪽이 0.014로 명목에 크게 못 미치는 덕분에 둘을 합칠 때 오차가 일부 상쇄되기 때문이다. 연습문제 5가 말한 "한쪽 꼬리가 양쪽보다 위험하다"가 이 숫자다. 어긋나는 방향이 왼쪽인 것도 예고와 맞는다. 지수모집단은 오른쪽으로 치우쳐 \(\mu_3 > 0\)이므로 \(t\)의 분포가 왼쪽으로 끌린다.

\(S^2\)과 무엇이 다른가. 줄어든다는 것 자체가 다르다. 다음 절 연습문제 6에서 같은 지수모집단·같은 명목 5%로 \((n-1)S^2/\sigma^2\)을 쟀을 때는 \(n = 10\)의 0.233이 \(n = 1000\)에서 0.324로 올라간다. 여기서 고장 나는 것은 정리의 수렴이라 표본이 약이 되고, 거기서 고장 나는 것은 정리의 전제라 표본이 약이 되지 못한다. 같은 자료, 같은 모집단, 반대 방향이다.

연습문제 7. 연습문제 5는 \(t\)가 왜도에 민감하고 첨도에는 덜 민감하다고 했다. 대칭이면서 꼬리만 두꺼운 모집단으로 이것을 확인하라. 자유도 5인 \(t\) 분포를 모집단으로 삼으면 왜도가 0이고 첨도가 \(\beta_2 = 9\)로 지수분포와 같다. 앞 문제와 같은 방식으로 세 꼬리 비율을 재어 견주어라.

풀이
import numpy as np
from scipy import stats

rng = np.random.default_rng(7)
B = 200_000

print(f"{'n':>6}{'양쪽':>9}{'오른쪽':>9}{'왼쪽':>9}")
for n in (10, 30, 100):
    c2 = stats.t(n - 1).ppf(0.975)
    c1 = stats.t(n - 1).ppf(0.95)
    X = stats.t(5).rvs(size=(B, n), random_state=rng)   # 대칭, beta2 = 9
    T = X.mean(axis=1) / (X.std(axis=1, ddof=1) / np.sqrt(n))
    print(f"{n:>6}{np.mean(np.abs(T) > c2):>9.3f}"
          f"{np.mean(T > c1):>9.3f}{np.mean(T < -c1):>9.3f}")

출력:

     n       양쪽      오른쪽       왼쪽
    10    0.045    0.048    0.048
    30    0.047    0.049    0.049
   100    0.049    0.050    0.049

\(n = 10\)에서 이미 맞는다. 첫 줄의 세 수치가 0.045, 0.048, 0.048로 명목값 언저리에 있고 좌우가 갈리지도 않는다. 첨도가 9로 지수분포와 똑같은데도 앞 문제의 0.099, 0.014, 0.132와는 딴판이다. 어긋남을 만든 것은 첨도가 아니라 왜도였다는 뜻이며, 에지워스 전개의 주항이 \(\gamma_1/\sqrt n\)이고 첨도가 \(n^{-1}\) 항에만 들어간다는 연습문제 5의 계산이 이렇게 나타난다.

오류율이 지켜진다고 안심할 일은 아니다. \(t_5\) 모집단에서 이따금 나오는 극단값이 \(S\)를 부풀리므로 같은 명목 수준에서 진짜 차이를 잡아내는 힘은 떨어진다. 표본분포의 어긋남은 없고 통계량의 효율이 나쁜 것이며, 두 가지는 별개의 문제다. 그 효율 비교는 순위 방법을 다루는 16장의 몫이다.

이 두 문제를 나란히 놓으면 이 쪽의 결론이 정리된다. \(t\)의 표본분포는 정규성 가운데 대칭성에 기대고 있으며, 그 기댐조차 표본을 키우면 느슨해진다.

연습문제 8. \(t_d\)의 평균과 분산을 구하라. 적률이 존재하지 않는 자유도가 있음을 밝히고, \(d = 1\)일 때 무슨 분포가 되는지 답하라. 수치로 확인하라.

풀이

평균. \(t_d\)의 밀도는 \(0\)에 대해 대칭이므로, 적분이 수렴하기만 하면 평균은 \(0\)이다. 꼬리가 \(|t|^{-(d+1)}\)로 줄므로 \(\int |t|\,f(t)\,dt\)가 수렴하려면 \(d > 1\)이어야 한다.

\[ E[T] = 0 \quad (d > 1), \qquad d \le 1 \text{이면 정의되지 않는다} \]

분산. \(T = Z/\sqrt{V/d}\)에서 \(Z \perp V\)이므로

\[ E[T^2] = E[Z^2]\cdot E\!\left[\frac{d}{V}\right] = 1 \cdot \frac{d}{d-2} = \frac{d}{d-2} \qquad (d > 2) \]

이다. \(E[d/V]\)는 역카이제곱의 기댓값이며 \(d>2\)에서만 유한하다. 따라서

\[ \operatorname{Var}(T) = \frac{d}{d-2} \quad (d>2), \qquad d \le 2 \text{이면 무한} \]

이다. \(\square\)

import numpy as np
from scipy import stats

print(f"{'d':>5}{'Var 이론':>12}{'모의':>14}")
for d in (1, 2, 3, 5, 10, 30):
    X = stats.t.rvs(d, size=500_000, random_state=2)
    th = 'inf' if d <= 2 else f"{d/(d-2):.4f}"
    print(f"{d:>5}{th:>12}{X.var():>14.4f}")

출력:

    d      Var 이론            모의
    1         inf   317384.7758
    2         inf       23.3971
    3      3.0000        2.9669
    5      1.6667        1.6499
   10      1.2500        1.2435
   30      1.0714        1.0644

\(d = 1\)의 표본분산이 \(317{,}384\)로 터무니없다. 무한한 양을 유한 표본으로 재려 했으니 당연하다. 난수 씨앗을 바꾸면 이 값이 완전히 달라지는데, 수렴하지 않는다는 것이 바로 그런 모습이다. \(d = 2\)의 \(23.4\)도 마찬가지다.

\(d = 1\)이면 코시분포다. \(t_1\)의 밀도는

\[ f(t) = \frac{1}{\pi(1+t^2)} \]

로 표준 코시분포와 같다. 평균조차 존재하지 않으므로 큰수의 법칙이 성립하지 않는다. 코시 표본의 평균은 아무리 표본을 키워도 한 점으로 수렴하지 않고, 다시 코시분포를 따른다(7장에서 다룬다).

\(d \le 2\)에서 분산이 무한한 것은 \(t\)의 정의에서 곧바로 읽힌다. 분모 \(\sqrt{V/d}\)가 \(0\) 근처의 값을 충분히 자주 가지면 \(T\)가 폭발하는데, \(\chi^2_d\)는 \(d\)가 작을수록 \(0\) 근처에 질량이 많다. \(d=1\)이면 밀도가 \(0\)에서 발산하기까지 한다.

실무적 함의. \(t\) 분포를 잡음 모형으로 쓸 때(강건 회귀, 베이즈 모형) 자유도를 \(2\) 이하로 두면 분산이 존재하지 않아 평균제곱오차 같은 기준이 무의미해진다. 보통 \(d \ge 3\), 흔히 \(4\sim7\)을 쓰는 이유이며, 꼬리는 두껍게 두되 적률은 남겨 두려는 절충이다.

연습문제 9. 연습문제 2는 \(t\) 대신 \(z\)를 썼을 때의 포함확률을 물었다. 이번에는 구간의 폭을 보라. \(t_{n-1,0.975}\)가 \(z_{0.975}=1.96\)보다 몇 퍼센트 넓은지 \(n = 3, 5, 10, 20, 30, 60, 120\)에서 계산하고 해석하라.

풀이
from scipy import stats

print(f"{'n':>6}{'t_{n-1,.975}':>14}{'z 대비':>12}")
for n in (3, 5, 10, 20, 30, 60, 120):
    tq = stats.t.ppf(0.975, n - 1)
    print(f"{n:>6}{tq:>14.4f}{(tq/1.959964 - 1) * 100:>11.2f}%")

출력:

     n  t_{n-1,.975}        z 대비
     3        4.3027     119.53%
     5        2.7764      41.66%
    10        2.2622      15.42%
    20        2.0930       6.79%
    30        2.0452       4.35%
    60        2.0010       2.09%
   120        1.9801       1.03%

\(n = 3\)이면 구간이 두 배가 넘는다. 자유도 \(2\)에서 임계값이 \(4.30\)이라, \(z\)를 쓴 구간보다 \(120\%\) 넓다. \(\sigma\)를 모른다는 사실 하나가 이만한 대가를 요구한다.

\(n = 30\)에서 \(4.35\%\). 흔히 말하는 "\(n \ge 30\)이면 \(z\)를 써도 된다"는 관행이 여기서 나온다. \(4\%\) 차이는 실무에서 대개 무시할 만하다. 다만 연습문제 2에서 본 대로 포함확률로 보면 이야기가 조금 다르므로, 굳이 \(z\)를 쓸 이유가 없다는 점도 함께 기억하라. 계산 비용이 같으니 \(t\)를 쓰면 된다.

감소 속도가 빠르다는 점이 요점이다.

\(n\) 초과 폭
\(3\) \(120\%\)
\(10\) \(15\%\)
\(30\) \(4\%\)
\(120\) \(1\%\)

\(t_{d} \to N(0,1)\)의 수렴은 \(d\)에 대해 \(O(1/d)\) 수준이라, 자유도가 조금만 늘어도 차이가 빠르게 줄어든다. 문제가 되는 구간은 \(n < 10\)이며, 거기서는 \(z\)와 \(t\)의 차이가 결론을 바꿀 만큼 크다.

작은 표본에서 진짜 문제는 따로 있다. \(n\)이 \(5\) 이하면 \(t\)를 제대로 쓰더라도 정규성 가정 자체를 확인할 방법이 없다. 2장 연습문제 10에서 본 대로 \(n=5\)의 표본왜도는 \(1.5\)를 넘을 수 없어 치우침을 탐지하지도 못한다. 임계값을 정확히 고르는 것보다 가정이 맞는지가 더 큰 문제다.

연습문제 10. \(t\) 분포는 정규분포의 척도혼합으로 쓸 수 있다. 즉 \(T = Z/\sqrt{V/d}\)에서 \(V\)를 조건으로 고정하면 \(T \mid V\)가 정규분포다. 이 표현을 적고, 그것이 \(t\)의 두꺼운 꼬리를 어떻게 설명하는지 말하라. 수치로 확인하라.

풀이

조건부로 보면 정규다. \(Z \sim N(0,1)\)과 \(V \sim \chi^2_d\)가 독립일 때 \(V = v\)로 고정하면

\[ T \mid V = v \;\sim\; N\!\left(0,\ \frac{d}{v}\right) \]

이다. 따라서 \(t_d\)는 분산이 \(d/V\)로 무작위한 정규분포들의 혼합이다.

\[ t_d = \int_0^\infty N\!\left(0,\ \tfrac{d}{v}\right) f_{\chi^2_d}(v)\,dv \]
import numpy as np
from scipy import stats

rng = np.random.default_rng(0)
d = 5
Z = rng.normal(0, 1, 500_000)
V = rng.chisquare(d, 500_000)
T = Z / np.sqrt(V / d)

print(f"  Z/sqrt(V/d) 가 t_{d} 인가?  KS p = "
      f"{stats.kstest(T, 't', args=(d,)).pvalue:.4f}")
print(f"  분산 모의 {T.var():.4f}   이론 {d/(d-2):.4f}")

출력:

  Z/sqrt(V/d) 가 t_5 인가?  KS p = 0.1685
  분산 모의 1.6672   이론 1.6667

꼬리가 두꺼워지는 메커니즘이 이 표현에 다 들어 있다. 분산이 하나로 고정된 정규분포는 꼬리가 \(e^{-t^2/2}\)로 아주 빠르게 죽는다. 그런데 분산 자체가 무작위라면, 가끔 \(V\)가 작게 나와 분산이 매우 큰 정규분포에서 값을 뽑게 된다. 그런 회차의 관측이 멀리 나가고, 그것들이 모여 두꺼운 꼬리를 만든다.

"이질적인 분산의 혼합이 꼬리를 두껍게 한다" 는 것이 일반 원리다. 4장 음이항분포 연습문제 2에서 포아송의 비율을 감마로 섞어 과대산포를 얻은 것과 정확히 같은 구조다.

혼합하는 것 결과
포아송의 비율을 감마로 음이항 — 과대산포
정규의 분산을 역카이제곱으로 \(t\) — 두꺼운 꼬리
정규의 평균을 정규로 다시 정규 — 변화 없음

세 번째 줄이 대비를 분명히 한다. 평균을 섞으면 정규가 유지되지만(앞 절 정규분포 쪽 연습문제 7의 선형결합), 분산을 섞으면 정규를 벗어난다.

어디에 쓰이는가.

  • 강건 회귀. 잔차에 정규 대신 \(t\)를 가정하면 이상치에 덜 휘둘린다. 척도혼합 표현 덕분에 이것을 "관측마다 가중치가 다른 정규 회귀"로 바꿀 수 있고, 그 가중치를 반복 갱신하는 것이 EM 알고리즘이 된다.
  • 금융 수익률 모형. 변동성이 시기마다 달라지는 자료를 "정규인데 분산이 변한다"로 보면 주변분포가 두꺼운 꼬리를 갖는다. 14장에서 수익률의 비정규성을 다룰 때 이 관점이 핵심이 된다.
  • 베이즈 추론. 분산에 역감마 사전분포를 두고 적분해 없애면 평균의 사후분포가 정확히 \(t\)가 된다. \(t\) 분포가 베이즈와 빈도주의 양쪽에서 같은 자리에 나타나는 이유다. \(\square\)

정리하며

\(t\) 분포는 모르는 \(\sigma\)를 표본에서 계산한 \(S\)로 바꿔 끼울 때 치르는 대가를 정확히 값매긴 분포다. 분모가 고정된 수에서 확률변수로 바뀌면서 비가 더 멀리까지 튀게 되고, 그 넓어진 몫이 \(N(0,1)\)보다 두꺼운 꼬리로 나타난다. 자유도가 작을수록, 곧 \(\sigma\)에 대해 아는 바가 적을수록 대가가 크다. 자유도가 커지면 대가가 사라져 \(t_d\)는 \(N(0,1)\)로 돌아온다.

이 분포가 추론에서 맡은 자리는 분명하다. 5.4절의 표본평균 \(\bar X\)에 대한 추론이 \(t\) 위에서 이루어진다. \(Z\)가 "모수를 다 안다면"이라는 가정 위의 이상적인 기준자라면, \(t\)는 그 가정 하나를 걷어내고 현실로 내려온 자다. 실제 자료에서 평균에 관한 신뢰구간과 검정이 거의 언제나 \(t\)로 계산되는 이유다.

기억해 둘 한계도 하나다. \(t\) 결과의 정확성은 모집단의 정규성에 결정적으로 기대고 있다. 유도에 쓰인 세 조각, 곧 \(\bar X\)의 정규성, \((n-1)S^2/\sigma^2\)의 카이제곱성, 그리고 둘의 독립성이 모두 정규모집단에서만 성립하기 때문이다. 표본이 크면 중심극한정리가 첫째 조각을 대신 받쳐 주지만, 표본이 작으면서 모집단까지 치우쳐 있으면 기댈 곳이 없다.

그렇더라도 앞 절과 이 절은 5장에서 형편이 나은 쪽에 속한다. \(\sigma\)를 모른다는 문제는 값이 정확히 매겨져 해결되었고, 모집단이 정규가 아니라는 문제는 표본을 키우면 중심극한정리가 받아 준다. 둘 다 빠져나갈 길이 있다. 이어지는 \(\chi^2\)과 \(F\) 쪽에서는 사정이 달라진다. 거기서는 표본을 키워도 정규성 가정이 풀리지 않으며, 그것이 5.2절 네 쪽이 둘씩 나뉘는 까닭이다.