콘텐츠로 이동

μ의 신뢰구간

일표본 z 신뢰구간

경영, 의료, 교육을 비롯한 현실의 여러 응용에서 확률표본으로 모평균 \(\mu\)를 추정하는 일은 흔히 필수적이다. 모분산을 알고 있으면 표준정규분포를 이용해 신뢰구간을 구성할 수 있다.

공식

모분산 \(\sigma^2\)을 알고 있다면, 크기 \(n\)인 표본에 기반한 모평균 \(\mu\)의 신뢰구간은

\[ \bar{X} \pm z_{\alpha/2} \times \frac{\sigma}{\sqrt{n}} \]

여기서

  • \(\bar{X}\)는 표본평균,
  • \(\alpha\)는 유의수준(\(\text{유의수준} = 1 - \text{신뢰수준}\)),
  • \(z_{\alpha/2}\)는 \(P(Z > z_{\alpha/2}) = \alpha/2\)를 만족하는 표준정규분포의 임계값,
  • \(\sigma\)는 알려진 모표준편차,
  • \(n\)은 표본크기이다.

양 \(\sigma / \sqrt{n}\)은 표본평균의 표준오차이다.

타당성 조건

\[ \bar{x}\pm z_{\alpha/2}\frac{\sigma}{\sqrt{n}} \quad\text{if}\quad \begin{cases} n \text{이 크다, 예: } n \ge 30, \text{ 그래야 중심극한정리 근사가 통한다} \\ n \text{이 } N \text{에 비해 작다, 예: } n \le 0.1N, \text{ 그래야 i.i.d. 근사가 통한다} \end{cases} \]

\(\sigma\)를 모르고 \(n\)이 클 때 \(\sigma\) 자리에 표본표준편차 \(s\)를 쓰는 것은 대수의법칙으로 정당화된다:

\[ \bar{x}\pm z_{\alpha/2}\frac{s}{\sqrt{n}} \quad\text{if}\quad \begin{cases} n \ge 30 \text{ (중심극한정리)} \\ n \ge 30 \text{ (} s \approx \sigma \text{를 위한 대수의법칙)} \\ n \le 0.1N \text{ (i.i.d.)} \end{cases} \]

보기 1. 일표본 \(z\) 신뢰구간 계산. 크기 \(n = 40\)인 확률표본에서 \(\bar x = 85\)를 얻었고 모표준편차가 \(\sigma = 12\)로 알려져 있다.

(1) \(\mu\)의 \(95\%\) 신뢰구간을 구하시오. 임계값으로 \(z_{0.95}\)가 아니라 \(z_{0.975}\)를 쓰는 까닭과, 표준오차를 \(\sigma\)가 아니라 \(\sigma/\sqrt n\)으로 쓰는 까닭을 밝히시오.

(2) 같은 오차한계를 절반으로 줄이려면 \(n\)을 얼마로 해야 하는가. 코드로 (1)과 (2)를 확인하시오.

풀이

(1) 구간. \(\alpha = 0.05\)이므로 \(z_{\alpha/2} = z_{0.025} = 1.95996\)이다. 표준오차와 오차한계는

\[ \text{SE} = \frac{\sigma}{\sqrt n} = \frac{12}{\sqrt{40}} = 1.89737, \qquad \text{MOE} = 1.95996 \times 1.89737 = 3.71877 \]

이고 구간은

\[ 85 \pm 3.71877 = (81.2812,\ 88.7188) \]

이다.

왜 \(0.975\) 분위수인가. 구하려는 것은 \(P(-c \le Z \le c) = 0.95\)를 만족하는 \(c\)다. 남는 확률 \(0.05\)가 양쪽 꼬리에 절반씩 놓이므로 위쪽 꼬리가 \(0.025\)이고, 따라서 \(c\)는 누적확률 \(1 - 0.025 = 0.975\)인 자리다. norm.ppf(0.95) = 1.645를 쓰면 한쪽 꼬리만 \(5\%\)로 둔 것이라 단측 \(95\%\) 구간이 되고, 양측으로 읽으면 실제 신뢰수준이 \(90\%\)로 떨어진다. 이것이 신뢰구간 코드에서 가장 흔한 한 줄 오류다.

왜 \(\sqrt n\)으로 나누는가. 구간이 재는 것은 관측값 하나의 산포가 아니라 \(\bar X\)의 산포다. 독립인 관측값에서 \(\operatorname{Var}(\bar X) = \sigma^2/n\)이므로 \(\text{SD}(\bar X) = \sigma/\sqrt n\)이다. \(\sigma = 12\)를 그대로 쓰면 구간이 \(\sqrt{40} = 6.32\)배 넓어진다.

(2) 오차한계는 \(1/\sqrt n\)에 비례한다. \(\text{MOE}(n) = z\sigma/\sqrt n\)이므로

\[ \frac{\text{MOE}(n')}{\text{MOE}(n)} = \sqrt{\frac{n}{n'}} = \frac12 \;\Longrightarrow\; n' = 4n = 160 \]

이다. 절반으로 줄이려면 네 배가 든다. 자료 수집 비용이 \(n\)에 비례한다면 정밀도 한 자리를 더 얻는 값이 네 배라는 뜻이다.

확인.

import scipy.stats as stats
import numpy as np

# 주어진 자료
n = 40
sample_mean = 85
sigma = 12          # 알고 있는 모표준편차
confidence_level = 0.95

# 임계값. 0.95가 아니라 1 - 0.05/2 = 0.975를 넣는다.
# 양쪽 꼬리에 alpha/2씩 나눠 주기 때문이다.
z_critical = stats.norm.ppf(1 - (1 - confidence_level) / 2)

# 표준오차는 자료의 산포가 아니라 **표본평균**의 산포다. sqrt(n)으로 나눈다.
standard_error = sigma / np.sqrt(n)
margin_of_error = z_critical * standard_error

confidence_interval = (sample_mean - margin_of_error, sample_mean + margin_of_error)
print(f"{z_critical = :.5f}")
print(f"{standard_error = :.5f}, {margin_of_error = :.5f}")
print(f"{confidence_interval = }")

# (2) 오차한계를 절반으로 줄이려면 n 을 네 배로 한다.
for m in (40, 160):
    moe = z_critical * sigma / np.sqrt(m)
    print(f"n = {m:>4}:  MOE = {moe:.5f}")

출력:

z_critical = 1.95996
standard_error = 1.89737, margin_of_error = 3.71877
confidence_interval = (81.28122980617263, 88.71877019382737)
n =   40:  MOE = 3.71877
n =  160:  MOE = 1.85939

손 계산과 맞는다. \(z = 1.95996\), \(\text{SE} = 1.89737\), \(\text{MOE} = 3.71877\), 구간 \((81.2812,\ 88.7188)\) 이 모두 (1)과 같다. \(n = 160\)의 오차한계 \(1.85939\) 는 \(3.71877/2 = 1.85939\) 로 정확히 절반이다.

임계값을 \(1.96\) 으로 반올림해 써도 답은 거의 같다. \(1.96 \times 1.89737 = 3.71884\) 이고 구간이 \((81.2812,\ 88.7188)\) 로, 반올림의 영향이 소수 넷째 자리에서야 나타난다.


일표본 t 신뢰구간

실무에서는 모분산 \(\sigma^2\)을 모르는 경우가 많다. 이때는 표본분산 \(s^2\)으로 분산을 추정하는데, 이 과정에서 추가적인 불확실성이 생긴다. 이를 반영하기 위해 정규분포 대신 \(t\)-분포를 쓴다.

공식

모분산을 모를 때 모평균 \(\mu\)의 신뢰구간은

\[ \bar{X} \pm t_{\alpha/2, \, n-1} \times \frac{s}{\sqrt{n}} \]

여기서

  • \(\bar{X}\)는 표본평균,
  • \(\alpha\)는 유의수준(\(\text{유의수준} = 1 - \text{신뢰수준}\)),
  • \(n - 1\)은 \(t\)-분포의 자유도,
  • \(t_{\alpha/2, \, n-1}\)은 \(P(T > t_{\alpha/2, \, n-1}) = \alpha/2\)를 만족하는 \(t\)-분포의 임계값,
  • \(s\)는 표본표준편차,
  • \(n\)은 표본크기이다.

타당성 조건

\[ \bar{x}\pm t_{\alpha/2,n-1}\frac{s}{\sqrt{n}} \quad\text{if}\quad \begin{cases} n \text{이 작다, 예: } n < 30, \text{ 그래서 중심극한정리 근사가 통하지 않는다} \\ \text{모집단 분포가 정규이다, 그래서 표본분포를 정확히 안다} \\ n \le 0.1N \text{ (i.i.d.)} \end{cases} \]

보기 2. 일표본 \(t\) 신뢰구간 계산. 크기 \(n = 25\)인 확률표본에서 \(\bar x = 50\), \(s = 8\)을 얻었다. 모표준편차는 모른다.

(1) \(\mu\)의 \(95\%\) \(t\)-구간을 구하시오. 자유도가 \(n\)이 아니라 \(n - 1\)인 까닭을 밝히시오.

(2) \(\sigma\)를 모른다는 사실의 값을 재시오. 곧 같은 \(\bar x\)와 같은 산포에 \(z\) 임계값을 썼다면 구간의 폭이 몇 배였겠는지 구하고, 그 비가 \(n\)에 따라 어떻게 변하는지 \(n = 5,\ 10,\ 25,\ 100\)에서 계산하시오.

풀이

(1) 구간. 자유도는 \(n - 1 = 24\)이고 \(t_{0.025,\,24} = 2.06390\)이다.

\[ \text{SE} = \frac{s}{\sqrt n} = \frac{8}{5} = 1.6, \qquad \text{MOE} = 2.06390 \times 1.6 = 3.30224 \]
\[ 50 \pm 3.30224 = (46.6978,\ 53.3022) \]

왜 자유도가 \(n - 1\)인가. \(s^2\)이 편차를 참 평균 \(\mu\)가 아니라 표본평균 \(\bar x\)에서 재기 때문이다. \(n\)개의 편차 \(x_i - \bar x\)는 항상 \(\sum (x_i - \bar x) = 0\)이라는 하나의 선형제약을 만족하므로, 자유롭게 움직이는 것은 \(n - 1\)개뿐이다. 그 결과 \((n-1)s^2/\sigma^2 \sim \chi^2_{n-1}\)이고 \(t\)의 자유도가 \(n - 1\)이 된다. 자유도를 \(n\)으로 잘못 주면 임계값이 \(2.06390\) 대신 \(2.05954\)가 되어 구간이 조용히 좁아진다. 오류 메시지가 나지 않으므로 더 위험하다.

(2) \(\sigma\)를 모르는 값은 임계값의 비다. 두 구간의 \(\text{SE}\)가 같으므로 폭의 비가 곧 임계값의 비다.

\[ \frac{\text{폭}_t}{\text{폭}_z} = \frac{t_{0.025,\,n-1}}{z_{0.025}} \]

\(n = 25\)에서 \(2.06390/1.95996 = 1.05303\) 으로 \(5.3\%\) 넓다. 이 비는 \(n\)에 대해 단조감소한다.

\(n\) \(t_{0.025,\,n-1}\) \(t/z\)
\(5\) \(2.77645\) \(1.41658\)
\(10\) \(2.26216\) \(1.15418\)
\(25\) \(2.06390\) \(1.05303\)
\(100\) \(1.98422\) \(1.01237\)

처음 몇 개의 관측값이 압도적으로 비싸다. \(n = 5\)에서는 \(42\%\)를 더 치러야 하지만 \(n = 100\)에서는 \(1.2\%\)다. 거꾸로 읽으면, \(n\)이 작은데 \(z\)를 쓰면 구간이 \(1/1.41658 = 0.706\)배로 \(30\%\) 가까이 좁아지고 그 좁아진 구간은 약속한 \(95\%\)를 지키지 못한다.

확인.

import scipy.stats as stats
import numpy as np

# 주어진 자료
n = 25
sample_mean = 50
sample_std = 8      # 모표준편차가 아니라 자료에서 얻은 표본표준편차
confidence_level = 0.95

# 앞의 z-구간과 달라지는 곳은 여기 한 줄뿐이다.
# 자유도가 n-1인 것은 편차를 참 평균이 아니라 x_bar에서 쟀기 때문이다.
degrees_of_freedom = n - 1
t_critical = stats.t.ppf(1 - (1 - confidence_level) / 2, degrees_of_freedom)

standard_error = sample_std / np.sqrt(n)
margin_of_error = t_critical * standard_error

confidence_interval = (sample_mean - margin_of_error, sample_mean + margin_of_error)
print(f"{t_critical = :.5f}, {standard_error = :.5f}, {margin_of_error = :.5f}")
print(f"{confidence_interval = }")

# (2) sigma 를 모르는 값: 같은 SE 에서 임계값의 비가 곧 폭의 비다.
z_critical = stats.norm.ppf(1 - (1 - confidence_level) / 2)
print(f"\n{'n':>5}{'t*':>10}{'t*/z*':>10}")
for m in (5, 10, 25, 100):
    tm = stats.t.ppf(1 - (1 - confidence_level) / 2, m - 1)
    print(f"{m:>5}{tm:>10.5f}{tm / z_critical:>10.5f}")

출력:

t_critical = 2.06390, standard_error = 1.60000, margin_of_error = 3.30224
confidence_interval = (46.697762301395166, 53.302237698604834)

    n        t*     t*/z*
    5   2.77645   1.41658
   10   2.26216   1.15418
   25   2.06390   1.05303
  100   1.98422   1.01237

(1)과 (2)가 모두 맞는다. 임계값 \(2.06390\), 표준오차 \(1.6\), 오차한계 \(3.30224\), 구간 \((46.6978,\ 53.3022)\) 가 손 계산과 같고, 표의 네 비도 그대로 재현된다.

다만 이 수들이 보장하는 것은 폭뿐이다. \(t\)-구간의 포함률은 모집단이 정규라는 가정 아래 정확히 \(0.95\)다. \(n = 5\)의 \(1.41658\)배라는 값은 "정규모집단에서 \(\sigma\)를 모르는 대가"이지, 모집단이 크게 치우쳐 있을 때의 대가가 아니다. 그쪽은 임계값이 아니라 포함률이 무너지는 문제이며 평균 신뢰구간의 포함확률 모의실험에서 다룬다.

\(t_{0.025,\,24} = 2.0639\)로 \(z_{0.025} = 1.9600\)보다 5.3% 크다. 같은 \(\bar x\)와 같은 산포에서 구간이 그만큼 넓어지며, 이것이 \(\sigma\)를 모른다는 사실의 값이다.

t 분포의 두꺼운 꼬리가 임계값을 밀어내는 모습과, n에 따른 임계값 비율

\(\sigma\)를 모르는 대가가 정확히 어디서 나오는지는 왼쪽 그림에 있다. 세 곡선은 넓이가 모두 1인 확률밀도이고, 우리가 하는 일은 오른쪽 끝에서 2.5%를 남기는 자리를 찾는 것이다. 표준정규에서는 그 자리가 \(1.960\)이다. \(t_{24}\)는 꼬리가 조금 더 두꺼워 같은 2.5%를 남기려면 \(2.064\)까지 가야 하고, 자유도가 4뿐인 \(t_4\)는 \(2.776\)까지 밀려난다. 구간의 너비는 이 임계값에 정비례하므로, 밀려난 만큼이 그대로 구간의 너비가 된다.

오른쪽 그림은 그 대가를 \(n\)의 함수로 그린 것이다. \(n = 5\)에서는 \(t\) 임계값이 \(z\)의 \(1.417\)배지만, \(n = 10\)에서 \(1.154\)배, \(n = 25\)에서 \(1.053\)배, \(n = 100\)에서는 \(1.012\)배로 줄어든다. 처음 몇 개의 관측값이 압도적으로 비싸다. 곡선이 \(n = 30\) 부근에서 이미 1에 거의 붙어 있고, 이것이 "\(n \ge 30\)이면 \(z\)를 써도 된다"는 관행의 근거다. 다만 이 문턱이 보장하는 것은 임계값의 차이가 작다는 것뿐이며, 모집단이 크게 치우쳐 있으면 \(n = 30\)으로도 중심극한정리 근사가 부족할 수 있다.

실무적인 결론은 단순하다. 의심스러우면 \(t\)를 써라. \(n\)이 크면 \(t\)와 \(z\)가 어차피 같아지므로 잃는 것이 1% 남짓이고, \(n\)이 작으면 \(t\)가 반드시 필요하다. 반대로 \(z\)를 골랐다가 틀리면 \(n = 5\)에서 구간이 \(1/1.417 = 0.71\)배, 곧 30% 가까이 좁아지고, 그 좁아진 구간은 약속한 95%를 지키지 못한다.


보기

보기 3. 모평균의 95% 신뢰구간 (분산을 아는 경우). 어떤 모집단에서 크기 \(n = 40\)인 확률표본을 모았다고 하자. 표본평균은 \(\bar{X} = 85\)이고 알려진 모표준편차는 \(\sigma = 12\)이다. 모평균 \(\mu\)의 95% 신뢰구간을 구성하라.

풀이

95% 신뢰수준에서 임계값 \(z_{\alpha/2}\)는 약 1.96이다. 대입하면:

\[ 85 \pm 1.96 \times \frac{12}{\sqrt{40}} \]

표준오차: \(\text{SE} = 12 / \sqrt{40} \approx 1.8974\). 오차한계: \(1.96 \times 1.8974 \approx 3.717\).

\[ \boxed{(81.283,\ 88.717)} \]

참 모평균 \(\mu\)가 \((81.283, 88.717)\) 안에 있다고 95% 신뢰한다.

보기 4. 모평균의 95% 신뢰구간 (큰 표본). 성인 남성 100명의 확률표본에서 평균 키 175 cm, 표준편차 6 cm를 얻었다. 모평균 키의 95% 신뢰구간을 계산하라.

풀이

\(n = 100 \ge 30\)이므로 표본표준편차와 함께 표준정규분포를 쓴다.

\[ \text{SE} = \frac{6}{\sqrt{100}} = 0.6, \qquad \text{ME} = 1.96 \times 0.6 = 1.176 \]
\[ \boxed{(173.82,\ 176.18) \text{ cm}} \]
import numpy as np
import scipy.stats as stats

n = 100
x_bar = 175
s = 6
confidence_level = 0.95
alpha = 1 - confidence_level

# n = 100 >= 30 이므로 s를 sigma처럼 쓰고 z를 쓴다.
# 이 표본크기에서 t를 써도 임계값이 1.984로 1.960과 1% 남짓 차이다.
z_star = stats.norm().ppf(1 - alpha / 2)
standard_error = s / np.sqrt(n)
margin_of_error = z_star * standard_error

print(f"{confidence_level:.0%} confidence interval: {x_bar} ± {margin_of_error:.2f}")

출력:

95% confidence interval: 175 ± 1.18

보기 5. 표본크기의 결정 (천문학자). 한 천문학자가 멀리 있는 별까지의 거리를 측정한다. 측정값은 i.i.d.이고 평균이 \(d\)(실제 거리), 분산이 4 광년이다. 추정값이 95% 신뢰수준에서 \(\pm 0.5\) 광년 이내로 정확하려면 측정을 몇 번 해야 하는가?

풀이

다음이 필요하다.

\[ 1.96 \sqrt{\frac{4}{n}} \leq 0.5 \]

\(n\)에 대해 풀면:

\[ n \geq \frac{4 \times 1.96^2}{0.5^2} = 61.4656 \]

\(n\)은 정수여야 하므로 적어도 62번의 측정이 필요하다.

보기 6. 모평균의 95% 신뢰구간 (분산을 모르는 작은 표본). 크기 \(n = 25\)인 확률표본에서 \(\bar{X} = 50\), \(s = 8\)을 얻었다. \(\mu\)의 95% 신뢰구간을 구성하라.

풀이

자유도 \(df = 24\), 95% 신뢰수준에서 \(t_{\alpha/2, 24} \approx 2.064\)이다.

\[ \text{SE} = \frac{8}{\sqrt{25}} = 1.6, \qquad \text{ME} = 2.064 \times 1.6 \approx 3.302 \]
\[ \boxed{(46.698,\ 53.302)} \]

보기 7. t*의 계산. 관측값이 \(n = 15\)개일 때 98% 신뢰구간의 임계값 \(t_*\)는 얼마인가?

풀이
import scipy.stats as stats

confidence_level = 0.98
alpha = 1 - confidence_level
n = 15
df = n - 1

# 98% 구간이므로 한쪽 꼬리에 1%씩 남긴다. 즉 왼쪽 누적확률 0.99 지점.
t_star = stats.t(df=df).ppf(1 - alpha / 2)
print(f"{t_star = :.4f}")

출력:

t_star = 2.6245

같은 98%라도 정규분포라면 \(z = 2.3263\)이다. 자유도가 14밖에 안 되어 꼬리가 두껍기 때문에 임계값이 13% 커졌다.

보기 8. 도장 두께. Felix는 자동차 부품에서 무작위로 50개 지점을 골라 도막 두께를 측정했다. 표본에서 \(\bar{x} = 148\) 마이크론, \(s = 3.3\) 마이크론을 얻었고 95% 신뢰구간 \((147.1, 148.9)\) 마이크론을 구성했다. 평균 두께가 목표값 150 마이크론과 일치한다고 보는 것이 그럴듯한가?

풀이

아니다. 신뢰구간 \((147.1, 148.9)\)가 목표 두께 150 마이크론을 포함하지 않기 때문이다. 자료는 평균 두께가 목표에서 유의하게 벗어난다는 증거를 준다.


연습문제

연습문제 1. 병 50개에서 \(\bar X = 503\) mL, \(s = 5\) mL이다. \(\mu\)의 95% 신뢰구간을 구하라.

풀이

\(n\)이 크므로 \(z\)를 쓴다: \(\mathrm{SE} = 5/\sqrt{50} \approx 0.707\). 오차한계 = \(1.96 \cdot 0.707 \approx 1.39\).

신뢰구간: \((501.6, 504.4)\) mL.

목표값 500 mL가 신뢰구간 밖이다 — 이 배치의 평균이 목표를 넘는다는 증거이다.

연습문제 2. 표본크기 계획. 목표 오차한계 10 km, \(\sigma = 15\) km, 신뢰수준 90%. 필요한 \(n\)은?

풀이

\(z_{0.05} = 1.645\). \(n = (1.645 \cdot 15/10)^2 = (2.47)^2 \approx 6.09\). 올림하면 \(n = 7\).

아주 작아서 실행 가능하다. 신뢰수준을 높이면(95%) \(z = 1.96\)이고 \(n \approx 9\)이다. \(\sigma\)가 더 크면(예: 30) \(n \approx 25\)이다.

표본크기는 \(\sigma^2\)과 \(z^2\)에 비례한다 — 둘 다에 대해 이차이다.

연습문제 3. 작은 표본에서의 \(t\)-구간. 병 \(n = 25\)개에서 \(\bar X = 500\) mL, \(s = 10\) mL이다. 95% 신뢰구간을 구하라.

풀이

\(\sigma\)를 모르므로 \(t\)를 쓴다: \(t_{0.025, 24} = 2.064\). 오차한계 = \(2.064 \cdot 10/\sqrt{25} = 4.13\).

신뢰구간: \((495.87, 504.13)\).

\(t_{0.025, 24} > z_{0.025}\)임에 유의하라 — 같은 신뢰수준에서 \(t\) 구간이 \(z\) 구간보다 넓은 것은 \(s\)의 불확실성을 반영하기 때문이다.

연습문제 4. \(\sigma\)를 아는 시험점수. \(n = 36\), \(\bar X = 78\), \(\sigma = 12\). 95% 신뢰구간을 구하라.

풀이

\(\sigma\)를 알므로 \(z\)를 쓴다: 오차한계 = \(1.96 \cdot 12/\sqrt{36} = 1.96 \cdot 2 = 3.92\).

신뢰구간: \((74.08, 81.92)\).

\(\sigma\)를 알면 표준오차 공식 외에는 표본크기가 \(z\) 구간의 형태를 바꾸지 않는다. 가장 깔끔한 상황이지만 현실적인 경우는 드물다(보통은 \(\sigma\)를 모른다).

연습문제 5. 신뢰수준의 맞바꿈. 90% 신뢰구간이 \((72, 78)\)이다. (a) 해석. (b) 99% 신뢰구간이 더 넓은 이유.

풀이

(a) 올바른 해석: "이 표본추출과 신뢰구간 구성을 여러 번 반복하면 그 결과 구간들 중 약 90%가 참 평균을 담는다." "\(\mu \in (72, 78)\)일 확률이 90%이다"가 아니다 — 모수는 고정되어 있다.

(b) 99% 신뢰구간은 \(z_{0.005} = 2.576\)을 쓰고 90% 신뢰구간은 \(z_{0.05} = 1.645\)를 쓴다. 너비의 비: \(2.576/1.645 \approx 1.57\). 99% 신뢰구간이 57% 더 넓다.

더 높은 확신을 위해서는 더 큰 변동을 감당해야 하므로 구간이 넓어진다. 신뢰수준이 낮으면 구간이 조이지만 덜 믿을 만하다. 정밀도와 확신 사이의 맞바꿈이다.

연습문제 6. 전구. \(n = 25\), \(\bar X = 1200\)시간, \(s = 150\)시간. (a) 95% 신뢰구간. (b) 99% 신뢰구간. (c) 오차한계 20시간을 위한 \(n\).

풀이

(a) \(t_{0.025, 24} = 2.064\). 오차한계 = \(2.064 \cdot 150/5 = 61.9\). 신뢰구간: \((1138.1, 1261.9)\).

(b) \(t_{0.005, 24} = 2.797\). 오차한계 = \(2.797 \cdot 30 = 83.9\). 신뢰구간: \((1116.1, 1283.9)\). 예상대로 더 넓다.

(c) (\(n\)이 커질 것이므로) \(z\) 근사를 쓰면 \(n = (1.96 \cdot 150/20)^2 = (14.7)^2 \approx 216.1\). 올림하면 \(n = 217\).

오차한계 20을 달성하려면 원래의 \(n = 25\)보다 거의 9배 많은 표본이 필요하다. 오차한계를 약 62에서 20으로 줄이려면 자료가 \(217/25 \approx 8.7\)배 필요하다 — 오차한계 감소에 대해 이차이다.

연습문제 7. \(\sigma\)를 아는 \(z\)-구간과 모르는 \(t\)-구간의 기대 폭의 비를 \(n\)의 함수로 구하라. \(\sigma\)를 모르는 대가가 얼마나 되는가?

풀이

\(z\)-구간의 폭은 \(2z_{0.975}\sigma/\sqrt n\)으로 고정이다.

\(t\)-구간의 기대 폭은 \(2t_{n-1,0.975}E[S]/\sqrt n\)이다. 여기서

\[ E[S]=\sigma\,c_4(n),\qquad c_4(n)=\sqrt{\frac{2}{n-1}}\;\frac{\Gamma(n/2)}{\Gamma\!\left(\frac{n-1}{2}\right)} \]

이다(\(c_4\)는 앞서 본 \(S\)의 편향 보정 상수로 \(c_4<1\)).

따라서 비는

\[ \frac{E[\text{폭}_t]}{\text{폭}_z}=\frac{t_{n-1,0.975}}{z_{0.975}}\,c_4(n) \]
import numpy as np
from scipy import stats
from scipy.special import gammaln

def c4(n):
    return np.sqrt(2 / (n - 1)) * np.exp(gammaln(n / 2) - gammaln((n - 1) / 2))

z = stats.norm.ppf(0.975)
print(f"{'n':>5s} {'t/z':>7s} {'c4':>7s} {'기대 폭 비':>11s}")
for n in [3, 5, 10, 20, 30, 50, 100, 500]:
    t = stats.t.ppf(0.975, n - 1)
    print(f"{n:5d} {t / z:7.4f} {c4(n):7.4f} {t / z * c4(n):11.4f}")
    n     t/z      c4      기대 폭 비
    3  2.1953  0.8862      1.9455
    5  1.4166  0.9400      1.3316
   10  1.1542  0.9727      1.1226
   20  1.0679  0.9869      1.0539
   30  1.0435  0.9914      1.0345
   50  1.0253  0.9949      1.0201
  100  1.0124  0.9975      1.0098
  500  1.0024  0.9995      1.0019

읽기.

\(n\) 추가 비용
3 95% 더 넓다
10 12%
30 3.5%
100 1.0%

\(\sigma\)를 모르는 대가는 \(n\)이 커지면 빠르게 사라진다. \(n\ge30\)이면 3% 남짓이고, \(n\ge100\)이면 1%다.

두 요인이 반대로 작용한다.

  • \(t/z>1\)은 폭을 넓히고(불확실성을 반영),
  • \(c_4<1\)은 \(E[S]<\sigma\)이므로 폭을 좁힌다(\(S\)가 평균적으로 \(\sigma\)를 과소추정).

\(t/z\)가 더 커서 순효과는 넓어지는 쪽이다. \(c_4\)의 효과를 무시하면 대가를 과대평가한다(\(n=10\)에서 15.4%가 아니라 12.3%다).

실무적 함의. 산업 공정처럼 \(\sigma\)가 과거 자료로 잘 알려진 경우에도, 이득이 작다면 \(t\) 구간을 쓰는 것이 안전하다. \(\sigma\)가 변했을 위험이 3%의 폭보다 크다.

연습문제 8. 크기 \(N=800\)인 유한모집단에서 \(n=200\)을 비복원으로 뽑아 \(\bar x=45.2\), \(s=8.6\)을 얻었다. 유한모집단 수정을 반영한 95% 구간을 구하고, 수정을 빠뜨렸을 때와 비교하라.

풀이

수정 인자. 비복원추출에서 표본평균의 분산은

\[ \operatorname{Var}(\bar X)=\frac{\sigma^2}{n}\cdot\frac{N-n}{N-1} \]

이고, \(\sqrt{(N-n)/(N-1)}\)을 유한모집단 수정(FPC) 이라 한다.

import numpy as np
from scipy import stats

N, n, xbar, s = 800, 200, 45.2, 8.6
t = stats.t.ppf(0.975, n - 1)
se0 = s / np.sqrt(n)
fpc = np.sqrt((N - n) / (N - 1))
se1 = se0 * fpc

print(f"표집비율 f = n/N = {n / N:.3f}")
print(f"FPC = {fpc:.4f}")
print(f"수정 없음 SE {se0:.4f}  구간 ({xbar - t * se0:.3f}, {xbar + t * se0:.3f})  "
      f"폭 {2 * t * se0:.3f}")
print(f"수정 적용 SE {se1:.4f}  구간 ({xbar - t * se1:.3f}, {xbar + t * se1:.3f})  "
      f"폭 {2 * t * se1:.3f}")
print(f"폭이 {1 - fpc:.1%} 줄어든다")
표집비율 f = n/N = 0.250
FPC = 0.8666
수정 없음 SE 0.6081  구간 (44.001, 46.399)  폭 2.398
수정 적용 SE 0.5270  구간 (44.161, 46.239)  폭 2.078
폭이 13.3% 줄어든다

표집비율이 25%나 되므로 수정이 무시할 수 없다. 폭이 13% 좁아진다.

언제 무시해도 되는가. \(f=n/N\)이 작으면 \(\text{FPC}\approx\sqrt{1-f}\)이므로

\(f\) FPC 폭 감소
0.01 0.995 0.5%
0.05 0.975 2.5%
0.10 0.949 5.1%
0.25 0.866 13.4%
0.50 0.707 29.3%

관행적 기준은 \(f<0.05\)면 무시다. 그 이상이면 적용하는 것이 맞다.

극단적 경우. \(n=N\)이면 FPC\(=0\)이 되어 구간의 폭이 0이다. 전수조사를 했으므로 표집오차가 없다는 뜻으로, 옳다. 다만 측정오차나 무응답은 여전히 남는다.

주의. 여론조사 보도에서 "전국 유권자 4천만 명 중 1천 명 표본"이면 \(f=0.000025\)로 FPC가 무의미하다. 모집단이 크다고 표본을 더 뽑아야 하는 것이 아니다 — 정밀도는 \(n\)이 결정하지 \(N\)이 아니다. 이것이 표본조사에서 가장 흔한 오해 중 하나다.

연습문제 9. \(n=20\)인 자료에 이상치 하나가 섞이면 \(t\)-구간이 어떻게 변하는지 보이고, 강건한 대안과 비교하라.

풀이
import numpy as np
from scipy import stats

rng = np.random.default_rng(101)
x = np.round(rng.normal(50, 5, 20), 1)
y = x.copy()
y[-1] = 120.0                                   # 이상치 하나 (기록 오류)

def t_ci(v):
    n = len(v)
    h = stats.t.ppf(0.975, n - 1) * v.std(ddof=1) / np.sqrt(n)
    return v.mean() - h, v.mean() + h, 2 * h

def trim_ci(v, prop=0.1):
    n = len(v)
    k = int(np.floor(n * prop))
    sv = np.sort(v)
    tm = sv[k:n - k].mean()
    # 윈저화 분산으로 절사평균의 표준오차를 구한다
    w = np.concatenate([np.full(k, sv[k]), sv[k:n - k], np.full(k, sv[n - k - 1])])
    se = w.std(ddof=1) / ((1 - 2 * prop) * np.sqrt(n))
    h = stats.t.ppf(0.975, n - 2 * k - 1) * se
    return tm - h, tm + h, 2 * h

for name, v in [("원자료", x), ("이상치 포함", y)]:
    lo, hi, w = t_ci(v)
    lo2, hi2, w2 = trim_ci(v)
    print(f"{name}")
    print(f"  평균 {v.mean():7.3f}  t 구간 ({lo:7.3f}, {hi:7.3f})  폭 {w:6.3f}")
    print(f"  10% 절사평균 {np.sort(v)[2:18].mean():7.3f}  "
          f"구간 ({lo2:7.3f}, {hi2:7.3f})  폭 {w2:6.3f}")
원자료
  평균  49.665  t 구간 ( 47.104,  52.226)  폭  5.121
  10% 절사평균  49.706  구간 ( 46.849,  52.563)  폭  5.714
이상치 포함
  평균  53.465  t 구간 ( 45.726,  61.204)  폭 15.478
  10% 절사평균  50.594  구간 ( 47.396,  53.792)  폭  6.396

두 방향으로 망가진다.

  1. 중심이 이동한다. 평균이 49.67에서 53.47로 3.8 옮겨 갔다. 이상치 하나가 바꾼 양은 정확히 \((120-44.0)/20=3.80\)이다.
  2. 폭이 폭발한다. 5.12에서 15.48로 3.0배가 되었다. \(S\)가 이상치의 제곱거리를 흡수하기 때문이다.

역설적인 결과. 폭이 넓어져서 구간이 원래의 참값을 여전히 담는다. "보수적이니 괜찮다"고 생각하기 쉽지만 그렇지 않다. 정밀도를 3배 잃은 것이고, 다른 자료에서는 중심 이동이 더 커서 참값을 놓칠 수 있다.

절사평균 구간은 훨씬 안정적이다. 중심이 0.9만 움직이고 폭은 5.71에서 6.40으로 12%만 늘었다.

실무 절차.

  1. 먼저 그림을 본다. 상자그림이나 점도표에서 이상치를 찾는다.
  2. 원인을 확인한다. 기록 오류면 고치거나 지운다. 진짜 관측값이면 지우면 안 된다.
  3. 민감도 분석. 포함/제외 두 결과를 모두 보고한다.
  4. 치우친 분포라면 이상치가 아니라 분포의 성질이다. 앞 장에서 본 대로 제거가 아니라 적절한 모형이 답이다.

연습문제 10. "\(\mu\)의 95% 구간이 \((48.2, 52.7)\)이다"에서 출발하여, 이 구간만으로 답할 수 있는 것과 없는 것을 구분하라.

풀이

답할 수 있는 것.

  1. 점추정값과 오차한계. 대칭 \(t\) 구간이라면 \(\bar x=50.45\), 오차한계 \(2.25\)다.
  2. 양측 검정의 결과. \(H_0:\mu=50\)은 5%에서 기각되지 않는다(50이 구간 안). \(H_0:\mu=55\)는 기각된다.
  3. 다른 신뢰수준의 구간. \(t\) 임계값의 비를 곱하면 된다. 자유도를 알아야 정확하다.

\(n=20\)이면 90% 구간은 \(50.45\pm2.25\times(1.729/2.093)=50.45\pm1.86=(48.59,\ 52.31)\)이다.

  1. \(p\)-값의 대략적 범위. 50이 구간 중앙 근처이므로 \(H_0:\mu=50\)의 \(p\)-값은 크다(0.6쯤). 끝에 가까울수록 0.05에 가깝다.

답할 수 없는 것.

  1. 개별 관측값의 범위. 앞서 본 대로 이것은 예측구간의 몫이다. \(n=20\)이면 표준편차가 \(2.25\sqrt{20}/2.093=4.81\)이므로 자료의 95%는 대략 \((41,\ 60)\)에 있다. 구간보다 4배 넓다.

  2. 분포의 모양. 치우쳤는지, 이봉인지, 이상치가 있는지 알 수 없다. 요약통계는 분포를 대신하지 못한다.

  3. 표본크기. \(n\)과 \(s\)의 조합이 같은 폭을 줄 수 있다. \(n=20,s=4.8\)과 \(n=100,s=11.3\)이 비슷한 구간을 준다.

  4. 실무적 중요성. 50과 52.7의 차이가 의미 있는지는 통계가 아니라 영역 지식이 답한다.

  5. 어떻게 만들었는지. \(t\)인지 부트스트랩인지, 단측인지 양측인지, 이상치를 뺐는지. 비대칭 구간이라면 위의 계산이 모두 틀린다.

  6. 표집오차 외의 오차. 무응답, 측정오차, 표본틀 오류는 구간에 들어 있지 않다.

  7. 인과적 해석. 관측자료라면 이 평균이 무엇을 뜻하는지는 설계가 결정한다.

교훈. 구간은 표집 불확실성 한 가지만 요약한다. 나머지는 자료, 설계, 맥락을 보아야 한다. 논문에서 구간만 인용하고 원자료의 분포를 보이지 않는 관행이 이 점에서 문제다.


정리하며

\(\sigma\) 를 알 때 \(\mu\) 의 신뢰구간은 \(z\) 임계값을 쓴다.

\[ \bar X \pm z_{\alpha/2}\cdot\frac{\sigma}{\sqrt n} \]
  • \(z_{0.025}=1.96\) 이 가장 자주 쓰이는 값이다. \(0.95\) 가 아니라 \(0.975\) 의 분위수라는 점이 요령이며, 양쪽 꼬리에 \(2.5\%\) 씩 남기기 때문이다.
  • 폭이 \(2z_{\alpha/2}\sigma/\sqrt n\) 이고 자료에 의존하지 않는다. \(\sigma\) 를 알고 있으므로 표본을 보기 전에 구간의 폭이 정해진다. 표본크기 설계가 가능한 이유다.
  • \(\sigma\) 를 아는 경우는 실무에서 드물다. 이 구간의 가치는 주로 개념적이며, 다음 단계인 \(t\) 구간의 출발점이 된다.
  • 정규성이 필요한가. 모집단이 정규면 모든 \(n\) 에서 정확하고, 아니면 중심극한정리에 기대는 근사다. 3장에서 보았듯 치우친 모집단에서는 \(n\ge30\) 으로도 부족할 수 있다.

다음 절 \(p\) 의 신뢰구간으로 넘어간다. 비율에서는 표준오차가 추정하려는 모수 자체에 의존해 새로운 문제가 생긴다.