검정 평가 방법 — p-값의 이론과 실무

p-Values: 유효 p-값의 정의, 구성 이론, 조건부 p-값, 그리고 올바른 사용법

p-값을 유효한 검정 통계량으로 엄밀히 정의하고, Theorem 8.3.27로 유효 p-값을 구성하는 방법, 충분통계량을 이용한 조건부 p-값, Fisher 정확 검정을 체계적으로 설명한다. ASA 공식 입장, 표본 크기 문제, 흔한 오해와 올바른 실무 활용법까지 통합하여 다룬다.

Statistics
저자

Kwangmin Kim

공개

2026년 04월 09일

1 개요

p-값은 통계학에서 가장 흔히 보고되지만 가장 자주 오해받는 지표다. 대부분의 입문 교재는 p-값을 직관으로만 설명하고, 이론 교재는 수식만 다루는 경향이 있다. 이 포스트는 두 관점을 통합한다.

이론 측면 (Casella & Berger, 2002, Ch.8 §8.3.4): - 유효 p-값의 수학적 정의 (Definition 8.3.26) - 임의의 검정 통계량으로부터 유효 p-값 구성 (Theorem 8.3.27) - 충분통계량 기반 조건부 p-값 → Fisher 정확 검정

실무 측면: - p-값의 장단점과 올바른 해석 - ASA(미국통계학회) 공식 성명 6원칙 - 표본 크기와 p-값의 관계 - 데이터 과학에서의 실용적 활용 지침


2 핵심 개념 정리

2.1 통계적 유의성 (Statistical Significance)

실험 결과가 우연히 생성된 것보다 더 극단적인 경우를 통계적으로 유의하다고 한다. 직관적으로는 “이 결과가 귀무 가설 하의 분포가 아닌, 다른 분포에서 나왔을 가능성이 있다”고 생각하는 것이다.

2.2 p-값 (p-value)

p의 ’p’는 probability(확률)를 뜻한다. p-값은 귀무 가설이 참인 상황에서 실험의 관측 결과만큼 또는 더 극단적인 결과가 나올 확률이다. 즉, p-값은 실험 결과가 우연히 얻어질 확률의 요약이다.

2.3 유의수준 Alpha ( \(\alpha\) )

\(\alpha\) 는 우연한 결과를 “통계적으로 유의하다”고 잘못 판단하지 않기 위해 설정하는 확률 임계값이다. p-값이 \(\alpha\) 보다 작으면 결과가 우연만으로는 설명하기 어렵다고 판단하여 \(H_0\) 를 기각한다. 관례적으로 \(\alpha = 0.05\) 를 많이 쓰지만 이는 고정된 진리가 아니다.


3 p-값을 검정 결과 보고에 사용하는 이유

3.1 전통적 보고 방식의 한계

전통적 접근: “size \(\alpha = 0.05\) 검정을 사용하여 \(H_0\) 를 기각(또는 채택)했다.”

문제점: - 독자가 \(\alpha = 0.05\) 에 동의하지 않을 수 있다 - 기각/채택이라는 이분법적 결론만 제공 — 증거의 강도를 알 수 없다 - \(\alpha = 0.05\) 기준으로 기각한 경우와 \(\alpha = 0.049\) 기준으로 기각한 경우의 차이가 사라진다

3.2 p-값 보고 방식의 장점

p-값을 보고하면 독자 각자가 자신의 \(\alpha\) 를 선택하여 판단할 수 있다. p-값이 작을수록 \(H_0\) 를 기각하는 증거가 강하다는 것을 더 세밀하게 전달한다.

3.3 회귀분석에서의 실용적 역할

회귀분석 결과로 계수 \(\beta\) 와 표준오차 \(\text{s.e.}\) 를 얻는다. 이 두 정보만으로는 해석이 모호한 경우가 있다.

표준오차 큼 표준오차 작음
\(\beta\) 해석 모호 유의함
\(\beta\) 작음 유의하지 않음 해석 모호

네 가지 경우를 구체적으로 해석하면:

  1. \(\beta\) 크고 표준오차 큼: 변수의 영향력이 강하지만 추정이 불안정하다. 계수가 유의할 수도 있고 아닐 수도 있어 해석이 모호하다.
  2. \(\beta\) 크고 표준오차 작음: 강한 영향력 + 안정적 추정 → 유의한 계수.
  3. \(\beta\) 작고 표준오차 큼: 영향력도 작고 추정도 불안정하다 → 명확하게 유의하지 않다.
  4. \(\beta\) 작고 표준오차 작음: 영향력은 작지만 추정이 정밀하다. 실질적 의미는 없어도 통계적으로 유의할 수 있어 해석이 모호하다.

모호한 경우(1번, 4번)에서 p-값이 명확한 판단 기준을 제공한다. p-값은 검정 통계량

\[t = \frac{\hat\beta}{s.e. / \sqrt{n}}\]

이 귀무 가설 분포에서 얼마나 극단적인지를 하나의 수치로 요약한다. 표준오차가 크더라도 \(\beta\) 가 충분히 크면 t 비율이 커지고 p-값이 작아진다 — 이것이 p-값이 모호성을 해소하는 방식이다.


4 유효 p-값의 정의

Definition 8.3.26 (유효 p-값)

p-값 \(p(\mathbf{X})\)\(0 \leq p(\mathbf{x}) \leq 1\) 인 검정 통계량이다. \(p(\mathbf{X})\) 의 작은 값이 \(H_1\) 이 참이라는 증거를 제공한다.

p-값이 유효(valid) 하려면 모든 \(\theta \in \Theta_0\)\(0 \leq \alpha \leq 1\) 에 대해:

\[P_\theta(p(\mathbf{X}) \leq \alpha) \leq \alpha \tag{8.3.8}\]

조건 (8.3.8)의 의미: “\(H_0\) 가 참인 상태에서 p-값이 \(\alpha\) 이하일 확률이 \(\alpha\) 를 넘지 않는다.” 즉, \(H_0\) 참에서 p-값은 균등 분포 \(U(0,1)\) 보다 확률론적으로 크거나 같다.

유효 p-값이 있으면 즉시 level \(\alpha\) 검정을 구성한다: 기각 영역 \(\{p(\mathbf{x}) \leq \alpha\}\).


5 유효 p-값의 구성: Theorem 8.3.27

Theorem 8.3.27

\(W(\mathbf{X})\) 가 큰 값이 \(H_1\) 에 대한 증거가 되는 검정 통계량이면, 각 표본점 \(\mathbf{x}\) 에 대해

\[p(\mathbf{x}) = \sup_{\theta \in \Theta_0} P_\theta(W(\mathbf{X}) \geq W(\mathbf{x})) \tag{8.3.9}\]

로 정의하면 \(p(\mathbf{X})\) 는 유효 p-값이다.

5.1 증명

임의의 \(\theta \in \Theta_0\) 를 고정한다. \(F_\theta\)\(-W(\mathbf{X})\) 의 CDF라 하면:

\[p_\theta(\mathbf{x}) := P_\theta(W(\mathbf{X}) \geq W(\mathbf{x})) = F_\theta(-W(\mathbf{x}))\]

확률 적분 변환에 의해 \(p_\theta(\mathbf{X}) = F_\theta(-W(\mathbf{X}))\) 의 분포는 \(U(0,1)\) 보다 확률론적으로 크거나 같으므로:

\[P_\theta(p_\theta(\mathbf{X}) \leq \alpha) \leq \alpha\]

\(p(\mathbf{x}) = \sup_{\theta'} p_{\theta'}(\mathbf{x}) \geq p_\theta(\mathbf{x})\) 이므로:

\[P_\theta(p(\mathbf{X}) \leq \alpha) \leq P_\theta(p_\theta(\mathbf{X}) \leq \alpha) \leq \alpha \qquad \square\]

5.2 직관적 해석

\(p(\mathbf{x}) = P_\theta(W(\mathbf{X}) \geq W(\mathbf{x}))\)\(H_0\) 가 참일 때 관측값보다 더 극단적인 검정 통계량이 나올 확률”이다.

  • \(\Theta_0\) 가 점 \(\{\theta_0\}\) 이면: sup 불필요
  • \(\Theta_0\) 가 집합이면: 모든 \(\theta \in \Theta_0\) 중 Type I Error가 가장 크게 만드는 값을 취한다

p-값의 핵심 의미: 이 데이터(또는 더 극단적인 데이터)가 \(H_0\) 하에서 나올 확률. 이 확률이 작으면 \(H_0\) 가 참이라는 가정 하에서는 관측된 결과가 매우 드물다 → \(H_0\) 를 의심한다.


6 예시 1: 정규분포 양측 t 검정 p-값 (Example 8.3.28)

\(X_1, \ldots, X_n \sim N(\mu, \sigma^2)\), \(H_0: \mu = \mu_0\) vs \(H_1: \mu \neq \mu_0\)

검정 통계량: \(W(\mathbf{x}) = |\bar{x} - \mu_0|/(s/\sqrt{n})\)

\(H_0\) 에서 \(\mu = \mu_0\) 이면 \((\bar{X} - \mu_0)/(S/\sqrt{n}) \sim t_{n-1}\) (\(\sigma\) 값에 무관). sup 불필요:

\[p(\mathbf{x}) = 2P\left(T_{n-1} \geq \left|\frac{\bar{x} - \mu_0}{s/\sqrt{n}}\right|\right)\]

이것이 양측 t 검정에서 흔히 사용하는 p-값이다.


7 예시 2: 정규분포 단측 t 검정 p-값 (Example 8.3.29)

\(H_0: \mu \leq \mu_0\) vs \(H_1: \mu > \mu_0\)

검정 통계량: \(W(\mathbf{x}) = (\bar{x} - \mu_0)/(s/\sqrt{n})\)

\(\Theta_0 = \{(\mu, \sigma): \mu \leq \mu_0\}\) 에서 sup 계산:

\[P_{\mu,\sigma}(W(\mathbf{X}) \geq W(\mathbf{x})) = P\left(T_{n-1} \geq W(\mathbf{x}) + \frac{\mu_0 - \mu}{S/\sqrt{n}}\right) \leq P(T_{n-1} \geq W(\mathbf{x}))\]

\(\mu \leq \mu_0\) 이면 \((\mu_0 - \mu)/(S/\sqrt{n}) \geq 0\) 이므로 등호는 \(\mu = \mu_0\) 에서 달성:

\[p(\mathbf{x}) = P\left(T_{n-1} \geq \frac{\bar{x} - \mu_0}{s/\sqrt{n}}\right)\]

sup는 경계 \(\mu = \mu_0\) 에서 달성된다. 검정력 함수가 \(\theta_0\) 에서 최대인 것과 일치한다.


8 p-값과 임계값의 동치 관계

유효 p-값이면 임계값 기반 검정과 p-값 기반 검정이 완전히 동치다:

\[p(\mathbf{x}) \leq \alpha \iff W(\mathbf{x}) \geq c_\alpha\]

따라서 p-값 = “\(H_0\) 를 기각할 수 있는 최소 유의 수준”:

\[p(\mathbf{x}) = \min\{\alpha: \text{size } \alpha \text{ 검정이 } \mathbf{x} \text{ 에서 } H_0 \text{ 를 기각}\}\]


9 조건부 p-값 — 이산 분포 처리

이산 분포에서는 원하는 임의의 \(\alpha\) 에 대한 size \(\alpha\) 검정을 구성하기 어렵다. 이때 \(H_0\) 하에서의 충분통계량 \(S(\mathbf{X})\) 에 조건을 부여하면 \(\theta\) 에 무관한 분포를 얻는다.

\[p(\mathbf{x}) = P(W(\mathbf{X}) \geq W(\mathbf{x}) \mid S = S(\mathbf{x})) \tag{8.3.10}\]

\(H_0\) 가 참이면 \(\mathbf{X} | S=s\) 의 분포가 \(\theta\) 에 무관하므로 (8.3.8) 이 성립한다.


10 예시 3: Fisher 정확 검정 (Example 8.3.30)

\(S_1 \sim \text{Binomial}(n_1, p_1)\), \(S_2 \sim \text{Binomial}(n_2, p_2)\) 독립. \(H_0: p_1 = p_2\) vs \(H_1: p_1 > p_2\)

\(H_0\) 하에서 \(S = S_1 + S_2\) 가 충분통계량. \(S = s\) 가 주어졌을 때 \(S_1\) 의 조건부 분포는 초기하 분포:

\[f(s_1 | S = s) = \frac{\binom{n_1}{s_1}\binom{n_2}{s-s_1}}{\binom{n_1+n_2}{s}}\]

이 분포는 \(p\) 에 무관하다. p-값:

\[p(s_1, s_2) = P(S_1 \geq s_1 | S = s) = \sum_{j=s_1}^{\min(n_1,s)} f(j | S=s)\]

이것이 Fisher 정확 검정의 p-값이다. 결합분포나 \(p\) 의 추정 없이, 오직 초기하 분포만으로 계산한다. 소표본 2×2 분할표 검정에 주로 사용한다.


11 p-값에 대한 흔한 오해와 올바른 해석

오해 올바른 해석
p-값 = \(H_0\) 가 참일 확률 p-값 = “\(H_0\) 하에서 이 데이터보다 극단적인 결과의 확률”
p < 0.05 이면 \(H_1\) 이 참 통계적 유의성 ≠ \(H_1\) 의 진실
p < 0.05 이면 중요한 결과 통계적 유의성 ≠ 실질적 중요성
p = 0.049 vs p = 0.051 은 큰 차이 임계값 기준 이분법의 임의성. 두 값은 거의 동일한 증거
p-값이 크면 \(H_0\) 가 참 표본이 부족해 \(H_1\) 을 감지 못한 것일 수 있다
p-값이 작으면 효과가 크다 표본이 크면 작은 효과도 작은 p-값을 만든다
p-값의 올바른 해석

“p-값 = 0.03”의 의미: “\(H_0\) 가 참이라는 가정 하에서, 관측된 것보다 더 극단적인 결과가 나올 확률이 3%다.”

즉, “\(H_0\) 하에서 이 결과는 흔하지 않다”는 것이지, “\(H_0\) 가 참일 확률이 3%”가 아니다. \(H_0\) 의 사후 확률을 계산하려면 베이즈 검정이 필요하다.


12 ASA 공식 입장: p-값에 관한 6원칙

미국통계학회(ASA)는 연구자와 학술지 편집인을 위해 p-값에 관한 공식 성명을 발표했다 (출처: ASA Statement on Statistical Significance and p-values).

  1. p-값은 데이터와 통계 모델의 비양립성 정도를 나타낼 수 있다 — 귀무 모델에서 관측값이 얼마나 드문가를 측정한다.
  2. p-값은 연구 가설이 참일 확률이나 데이터가 우연히 생성될 확률이 아니다 — 가장 흔한 오해.
  3. 과학적 결론과 정책 결정은 p-값이 특정 임계값을 통과하는지 여부만으로 결정해서는 안 된다 — 이분법적 판단의 위험.
  4. 적절한 추론은 완전한 보고와 투명성을 요구한다 — p-값 하나만이 아니라 효과 크기, 신뢰구간, 연구 설계 등을 함께 보고해야 한다.
  5. p-값 또는 통계적 유의성은 효과의 크기나 결과의 중요성을 측정하지 않는다 — 실질적 유의성(practical significance)은 별도로 평가해야 한다.
  6. p-값만으로는 모델이나 가설에 대한 좋은 증거 척도가 되지 않는다 — 베이즈 팩터나 효과 크기 등 다른 지표를 함께 사용한다.

13 표본 크기와 p-값의 관계

t 검정 통계량의 구조:

\[t = \frac{\hat{\beta}}{s.e./\sqrt{n}} = \frac{\hat{\beta} \cdot \sqrt{n}}{s.e.}\]

표본 크기 \(n\) 이 커질수록 \(t\) 통계량이 커지고 p-값이 작아진다. 이는 표본 크기 \(n\) 이 충분히 크면 아무리 작은 효과도 통계적으로 유의하게 만들 수 있음을 의미한다.

실질적 문제: 대형 데이터셋에서는 임상적으로나 실무적으로 무의미한 차이(예: 혈압 0.1 mmHg 차이)도 p < 0.001 이 될 수 있다.

해결책:

  • 효과 크기(effect size) 와 함께 보고: Cohen’s d, \(R^2\), odds ratio 등
  • 신뢰구간(confidence interval) 함께 보고: 임상적 의미가 있는 범위인지 확인
  • 검정력 분석(power analysis) 을 통한 표본 크기의 적절성 확인

p-값과 검정력의 관계:

\[p \text{-값이 작다} \iff W(\mathbf{x}) \text{가 크다} \iff \text{데이터가 } H_1 \text{ 방향으로 극단적}\] \[\text{검정력이 높다} \iff \beta(\theta) = P_\theta(W(\mathbf{X}) \geq c) \text{가 크다}\]

같은 효과 크기에서 \(n\) 이 증가하면 검정력이 높아지고 p-값이 작아진다. p-값 해석은 반드시 표본 크기를 함께 고려해야 한다.


14 실무 활용 지침

개인적 실용 원칙: p-값은 EDA(탐색적 데이터 분석)나 데이터 마이닝 단계에서 “이 신호가 노이즈인가?”를 확인하는 첫 번째 필터다. 모델 결과나 변수 집합이 우연의 정상 변동 범위 내에 있는지 빠르게 점검하는 도구로 사용한다. p-값이 작아도 효과 크기가 실질적으로 의미 없다면 해석을 멈춰야 하고, p-값이 크더라도 표본이 너무 작아서 검정력이 낮은 것일 수 있다는 점을 항상 염두에 둔다.

단, p-값만으로 결론을 내리는 것은 위험하다. 통계적 유의성의 정확도를 높이기 위한 보완 방법론을 함께 사용한다:

상황 권장 보완 지표
소표본, 이산 데이터 Fisher 정확 검정, 정확 검정(exact test)
다중 비교 Bonferroni 보정, FDR(q-값), 순열 p-값(permuted p-value)
효과 크기 파악 Cohen’s d, \(\eta^2\), OR, RR
베이즈 관점 필요 Bayes Factor, 사후 확률
재현성 중시 순열 p-값(permuted p-value), 교차 검증

15 코드 구현

15.1 Python: p-값 계산 — 이론적 구현

import numpy as np
from scipy import stats


def compute_pvalue_normal_two_sided(
    data: np.ndarray,
    mu0: float = 0.0,
) -> dict:
    """
    H0: mu = mu0 vs H1: mu != mu0 (양측 t 검정 p-값)
    Theorem 8.3.27: Theta0 = {mu0}, sup 불필요
    """
    n = len(data)
    t_stat = (np.mean(data) - mu0) / (np.std(data, ddof=1) / np.sqrt(n))
    p_value = 2 * stats.t.sf(abs(t_stat), df=n - 1)
    return {
        "표본 평균": np.mean(data),
        "t 통계량 W(x)": t_stat,
        "p-값": p_value,
        "해석": f"H0 하에서 |t| >= {abs(t_stat):.3f} 인 확률 = {p_value:.4f}",
    }


def compute_pvalue_normal_one_sided(
    data: np.ndarray,
    mu0: float = 0.0,
) -> dict:
    """
    H0: mu <= mu0 vs H1: mu > mu0 (단측 t 검정 p-값)
    Theorem 8.3.27: sup는 mu = mu0에서 달성
    """
    n = len(data)
    t_stat = (np.mean(data) - mu0) / (np.std(data, ddof=1) / np.sqrt(n))
    p_value = stats.t.sf(t_stat, df=n - 1)
    return {
        "t 통계량 W(x)": t_stat,
        "p-값": p_value,
        "해석": f"alpha > {p_value:.4f} 이면 H0 기각",
    }


def pvalue_as_minimum_alpha(
    data: np.ndarray,
    mu0: float = 0.0,
    alpha_grid: np.ndarray = None,
) -> dict:
    """
    p-값 = H0를 기각할 수 있는 최소 alpha 임을 수치적으로 확인
    """
    if alpha_grid is None:
        alpha_grid = np.linspace(0.001, 0.2, 200)

    n = len(data)
    t_stat = abs((np.mean(data) - mu0) / (np.std(data, ddof=1) / np.sqrt(n)))
    p_val = 2 * stats.t.sf(t_stat, df=n - 1)

    min_reject_alpha = None
    for alpha in alpha_grid:
        t_crit = stats.t.ppf(1 - alpha / 2, df=n - 1)
        if t_stat > t_crit:
            min_reject_alpha = alpha
            break

    return {
        "직접 계산 p-값": p_val,
        "최소 기각 alpha (수치)": min_reject_alpha,
        "차이": abs(p_val - min_reject_alpha) if min_reject_alpha else None,
    }


def sample_size_pvalue_demo(
    mu_true: float,
    mu0: float = 0.0,
    sigma: float = 1.0,
    n_list: list = None,
    n_sim: int = 5000,
    seed: int = 42,
) -> None:
    """
    표본 크기에 따른 p-값 변화 시뮬레이션 (같은 효과 크기)
    """
    if n_list is None:
        n_list = [10, 50, 200, 1000]
    rng = np.random.default_rng(seed)
    print(f"효과 크기 delta = {mu_true - mu0} (sigma={sigma})")
    print(f"{'n':>8} {'평균 p-값':>12} {'p<0.05 비율':>14}")
    for n in n_list:
        pvals = []
        for _ in range(n_sim):
            data = rng.normal(mu_true, sigma, n)
            t = (np.mean(data) - mu0) / (np.std(data, ddof=1) / np.sqrt(n))
            pvals.append(2 * stats.t.sf(abs(t), df=n - 1))
        pvals = np.array(pvals)
        print(f"{n:>8} {np.mean(pvals):>12.4f} {np.mean(pvals < 0.05):>14.3f}")


np.random.seed(42)
data = np.random.normal(loc=0.5, scale=1.0, size=30)

print("=== 양측 t 검정 p-값 ===")
result = compute_pvalue_normal_two_sided(data, mu0=0.0)
for k, v in result.items():
    print(f"  {k}: {v:.4f}" if isinstance(v, float) else f"  {k}: {v}")

print()
print("=== 단측 t 검정 p-값 ===")
result = compute_pvalue_normal_one_sided(data, mu0=0.0)
for k, v in result.items():
    print(f"  {k}: {v:.4f}" if isinstance(v, float) else f"  {k}: {v}")

print()
print("=== 표본 크기에 따른 p-값 변화 (delta=0.1 소효과) ===")
sample_size_pvalue_demo(mu_true=0.1)

15.2 Python: Fisher 정확 검정 p-값 (조건부 접근)

import numpy as np
from scipy import stats
from scipy.stats import hypergeom


def fisher_exact_test(
    s1: int,
    s2: int,
    n1: int,
    n2: int,
    alternative: str = "greater",
) -> dict:
    """
    Fisher 정확 검정 (Example 8.3.30)
    H0: p1 = p2 vs H1: p1 > p2
    조건부 p-값: S1 | S = s ~ Hypergeometric
    """
    s = s1 + s2  # 충분통계량의 관측값

    if alternative == "greater":
        p_value = hypergeom.sf(s1 - 1, n1 + n2, n1, s)
    elif alternative == "less":
        p_value = hypergeom.cdf(s1, n1 + n2, n1, s)
    else:
        table = [[s1, n1 - s1], [s2, n2 - s2]]
        _, p_value = stats.fisher_exact(table, alternative="two-sided")

    k_range = range(max(0, s - n2), min(n1, s) + 1)
    cond_pmf = {k: hypergeom.pmf(k, n1 + n2, n1, s) for k in k_range}

    return {
        "S1 관측값": s1,
        "S2 관측값": s2,
        "충분통계량 S = S1+S2": s,
        "조건부 분포": f"Hypergeometric(N={n1+n2}, K={n1}, n={s})",
        "p-값": p_value,
        "조건부 pmf": {k: round(v, 4) for k, v in cond_pmf.items()},
    }


print("=== Fisher 정확 검정 (치료군 15/20, 대조군 10/20) ===")
result = fisher_exact_test(s1=15, s2=10, n1=20, n2=20, alternative="greater")
for k, v in result.items():
    if isinstance(v, float):
        print(f"  {k}: {v:.4f}")
    elif isinstance(v, dict):
        print(f"  {k}: {v}")
    else:
        print(f"  {k}: {v}")

15.3 Python: p-값 분포 시뮬레이션 (유효 p-값 조건 검증)

import numpy as np
from scipy import stats


def simulate_pvalue_distribution(
    n_sim: int = 10000,
    n: int = 30,
    mu0: float = 0.0,
    sigma: float = 1.0,
    mu_true: float = 0.0,
    seed: int = 42,
) -> dict:
    """
    H0 참 (mu_true = mu0): p ~ U(0,1) 확인
    H1 참 (mu_true != mu0): p 가 0 근처에 집중됨 확인
    유효 p-값 조건 (8.3.8) 수치 검증
    """
    rng = np.random.default_rng(seed)
    p_values = []

    for _ in range(n_sim):
        data = rng.normal(mu_true, sigma, n)
        t_stat = (np.mean(data) - mu0) / (np.std(data, ddof=1) / np.sqrt(n))
        p = 2 * stats.t.sf(abs(t_stat), df=n - 1)
        p_values.append(p)

    p_values = np.array(p_values)
    alpha_levels = [0.01, 0.05, 0.10]
    empirical_type1 = {a: float(np.mean(p_values <= a)) for a in alpha_levels}

    return {
        "mu_true": mu_true,
        "p-값 평균": float(np.mean(p_values)),
        "p < 0.05 비율": float(np.mean(p_values < 0.05)),
        "유효 p-값 조건 P(p≤α)≤α": empirical_type1,
    }


print("=== H0 참 (mu=0)에서 p-값 분포 ===")
r0 = simulate_pvalue_distribution(mu_true=0.0)
for k, v in r0.items():
    print(f"  {k}: {v}")

print()
print("=== H1 참 (mu=0.5)에서 p-값 분포 ===")
r1 = simulate_pvalue_distribution(mu_true=0.5)
for k, v in r1.items():
    print(f"  {k}: {v}")

15.4 R

library(stats)

# 단측/양측 p-값 계산
compute_pvalues <- function(data, mu0 = 0) {
  n <- length(data)
  t_stat <- (mean(data) - mu0) / (sd(data) / sqrt(n))
  p_two <- 2 * pt(-abs(t_stat), df = n - 1)
  p_one <- pt(t_stat, df = n - 1, lower.tail = FALSE)

  cat(sprintf("양측 p-값: %.4f  (alpha > %.4f 이면 H0 기각)\n", p_two, p_two))
  cat(sprintf("단측 p-값: %.4f\n", p_one))
}

# Fisher 정확 검정 (조건부 p-값)
fisher_demo <- function(s1, s2, n1, n2) {
  s <- s1 + s2
  p_val <- phyper(s1 - 1, n1, n2, s, lower.tail = FALSE)
  cat(sprintf("치료군: %d/%d, 대조군: %d/%d\n", s1, n1, s2, n2))
  cat(sprintf("S = S1+S2 = %d (충분통계량)\n", s))
  cat(sprintf("조건부 분포: Hypergeometric(N=%d, K=%d, n=%d)\n", n1+n2, n1, s))
  cat(sprintf("Fisher p-값 (단측): %.4f\n", p_val))
  # R 내장 함수 검증
  table <- matrix(c(s1, n1-s1, s2, n2-s2), 2, 2)
  r <- fisher.test(table, alternative = "greater")
  cat(sprintf("R fisher.test p-값: %.4f\n", r$p.value))
}

# 표본 크기 vs p-값 시뮬레이션
sample_size_pvalue_demo <- function(delta = 0.1, sigma = 1, n_sim = 3000) {
  set.seed(42)
  n_list <- c(10, 50, 200, 1000)
  cat(sprintf("효과 크기 delta = %.2f\n", delta))
  cat(sprintf("%8s %12s %14s\n", "n", "평균 p-값", "p<0.05 비율"))
  for (n in n_list) {
    pvals <- replicate(n_sim, {
      x <- rnorm(n, delta, sigma)
      t <- mean(x) / (sd(x) / sqrt(n))
      2 * pt(-abs(t), df = n - 1)
    })
    cat(sprintf("%8d %12.4f %14.3f\n", n, mean(pvals), mean(pvals < 0.05)))
  }
}

set.seed(42)
data <- rnorm(30, mean = 0.5)

cat("=== p-값 계산 ===\n")
compute_pvalues(data, mu0 = 0)

cat("\n=== Fisher 정확 검정 ===\n")
fisher_demo(s1 = 15, s2 = 10, n1 = 20, n2 = 20)

cat("\n=== 표본 크기와 p-값 (소효과 delta=0.1) ===\n")
sample_size_pvalue_demo(delta = 0.1)

16 핵심 정리

p-값의 수학적 구조:

\[p(\mathbf{x}) = \sup_{\theta \in \Theta_0} P_\theta(W(\mathbf{X}) \geq W(\mathbf{x})) \tag{Thm 8.3.27}\]

유효성 보장: \(H_0\) 참에서 \(p(\mathbf{X})\) 는 확률론적으로 \(U(0,1)\) 이상.

두 가지 구성법:

방법 공식 적용 상황
표준 (Thm 8.3.27) \(\sup_{\theta \in \Theta_0} P_\theta(W \geq W(\mathbf{x}))\) 연속 분포, 복합 귀무
조건부 (식 8.3.10) \(P(W(\mathbf{X}) \geq W(\mathbf{x}) \mid S = S(\mathbf{x}))\) 이산 분포, Fisher 정확 검정

실무 주의사항:

  • p-값은 “\(H_0\) 가 참일 확률”이 아니다
  • 작은 p-값 ≠ 크거나 중요한 효과
  • 표본 크기가 크면 실질적으로 무의미한 차이도 작은 p-값을 만든다
  • ASA 원칙: p-값 하나만으로 과학적 결론을 내리지 말라

17 관련 주제

(Casella & Berger, 2002, Ch.8 §8.3.4)

Subscribe

Enjoy this blog? Get notified of new posts by email: