대응 표본
대응표본
- 대응표본(paired samples): 두 집단의 자료를 쌍으로 묶을 수 있을 때 평균 차이가 유의한지 검정하는 방법
- 동일한 개체를 전후로 측정하는 경우
- 장비 개선 전후
- 치료 전후 환자의 증상 개선 정도
- 교육 프로그램 전후 학생의 시험 점수
- 쌍으로 관찰된 경우
- 같은 차량의 좌우 두 바퀴
- 남편과 아내의 비교
- 쌍둥이 형제의 비교
- 같은 날짜의 두 지역 온도 차이
- 두 집단의 자료를 쌍으로 묶어야 하므로, 독립표본과 달리 두 집단의 자료 개수가 같아야 함
대응표본 t-검정의 절차
- 각 쌍의 차이 를 계산
- 귀무가설(): 쌍별 차이의 모집단 평균이 0.
- 차이의 평균과 표준편차를 계산
- 통계량을 계산해 t-분포에서 p-value를 계산
- 자유도(df):
- p-value가 유의수준(보통 0.05)보다 작으면 귀무가설 기각
- 으로 판단
대응표본 t-검정 실습
- 각 설비에서 개선 전후 불량률(%) 측정 데이터 사용
import pandas as pd
df_paired = pd.read_excel("machine_defect_before_after.xlsx")
- 전후 차이(
diff)를 만들고 기술통계 확인
df_paired["diff"] = df_paired["after"] - df_paired["before"]
df_paired[["before", "after", "diff"]].agg(["mean", "std"])
pingouin의ttest에서paired=True를 지정해 대응표본 t-검정 수행
import pingouin as pg
pg.ttest(
df_paired["before"],
df_paired["after"],
paired=True,
)
- 개선 전 평균: 3.186%
- 개선 후 평균: 2.726%
after - before의 평균: -0.460%p- 대응표본 검정:
p_val=4.45e-10,CI95=[0.38, 0.54] - 검정은
before - after를 계산하므로 신뢰구간은 양수 - 개선 후 불량률이 평균 0.46%p 감소
같은 자료를 독립표본으로 처리한 결과와 비교
pg.ttest(
df_paired["before"],
df_paired["after"],
)
- 독립표본 검정:
p_val=0.000617,CI95=[0.21, 0.71] - 대응 관계를 반영한 검정의 신뢰구간이 더 좁음
독립표본 t-검정과 대응표본 t-검정의 차이
- 독립표본 t-검정: 평균의 차이를 비교
- 대응표본 t-검정: 차이의 평균을 비교
- 평균의 차이와 차이의 평균 자체는 같음
- 하지만 표준편차가 달라져 신뢰구간이 달라짐
- 예:
[1, 2, 3]vs.[2, 3, 4]- 독립표본일 경우: 평균 차이 -1, 합동 표준편차 1
- 대응표본일 경우: 차이
[-1, -1, -1]의 평균 -1, 표준편차 0
독립표본과 대응표본의 예시
- 예시 데이터 생성
import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = np.array([3, 3, 4, 5, 6])
- 독립표본 t-검정은 두 배열을 서로 독립적인 표본으로 보고 비교
pg.ttest(a, b)
# p_val=0.2268, CI95=[-3.31, 0.91]
- 독립표본일 경우 집단별 분산으로 합동 표준편차 계산
n_a, n_b = len(a), len(b)
pooled_sd = np.sqrt(
((n_a - 1) * a.var(ddof=1) + (n_b - 1) * b.var(ddof=1))
/ (n_a + n_b - 2)
)
pooled_sd
# 1.4491
- 대응표본 t-검정은 같은 위치에 있는 값들의 차이를 기준으로 검정
pg.ttest(a, b, paired=True)
# p_val=0.0039, CI95=[-1.76, -0.64]
- 대응표본일 경우 쌍별 차이의 표준편차를 봄
np.std(b - a, ddof=1)
# 0.4472
b = [2, 3, 4, 5, 6]이면 모든 차이가 1이 되어 표준편차가 0- 차이의 변동이 없으면 검정통계량이 유한하게 계산되지 않을 수 있음
전후 변화 시각화
- 같은 설비의 전후 값을 선으로 연결
- 대부분의 선이 아래로 내려가면 개선 후 불량률이 감소하는 경향으로 해석
import seaborn as sns
import matplotlib.pyplot as plt
df_long = df_paired.melt(
id_vars="machine",
value_vars=["before", "after"],
var_name="timing",
value_name="defect_rate",
)
sns.pointplot(data=df_long, x="timing", y="defect_rate", hue="machine")
