05단계 · 3유형 — 검정과 해석

대응표본 t검정 — 같은 사람의 전후

`ttest_rel` 과 `ttest_ind` 를 같은 데이터에 써서 결과가 얼마나 달라지는지 본다.

먼저 알아볼게요

코드로 이동 ↓

대응표본은 같은 대상을 두 번 잰 것이다. 투약 전과 후, 교육 전과 후. 짝이 지어져 있으므로 짝끼리의 차이를 본다.

stats.ttest_rel(전, 후) 을 쓴다. rel 은 related(짝지어진)의 줄임이다.

짝을 무시하고 ttest_ind 를 쓰면 사람마다 원래 다른 정도(개인차)가 잡음으로 섞인다. 개인차가 클수록 손해가 큰데, 언제나 통계량이 작아지는 것은 아니다 — 아래 이 데이터에서는 7.2339 가 3.3863 으로 떨어진다.

데이터 순서가 곧 짝이다. 두 열의 행 순서가 어긋나 있으면 완전히 엉뚱한 결과가 나오는데 오류는 나지 않는다.

대응표본 t검정은 짝별 차이가 정규분포를 따른다는 가정 위에 있다. 원래 값이 정규분포인지가 아니라 차이가 기준이다.

p-value 가 아주 작으면 round(p, 4) 는 0.0 이 되어 정보가 사라진다. 이럴 때는 f"{p:.10f}" 처럼 자리수를 넉넉히 지정해 출력한다.

이렇게 써요
from scipy import stats

before = [10, 12, 11, 13]
after = [8, 9, 10, 10]
print(round(float(stats.ttest_rel(before, after).statistic), 4))
print(round(float(stats.ttest_ind(before, after).statistic), 4))
기억할 한 가지

같은 대상의 전후는 ttest_rel 이다. 짝을 버리면 개인차가 잡음으로 섞인다 — 이 데이터에서는 통계량이 절반 아래로 떨어졌다.

이 단계의 수업
  1. 1가설·유의수준·p-value
  2. 2일표본 t검정과 단측검정
  3. 3독립표본 t검정과 등분산 가정
  4. 4대응표본 t검정 — 같은 사람의 전후
  5. 5카이제곱 독립성 검정
  6. 6일원배치 분산분석 (ANOVA)
  7. 7선형 회귀 — 계수와 R²
  8. 8로지스틱 회귀와 오즈비
직접 해보기

bp.csv 로 ① 투약 전·후 평균(소수 4) ② 짝별 차이의 평균(소수 4) ③ ttest_rel 의 통계량 ④ 그 p-value 를 소수 10자리 문자열로 ⑤ ttest_ind 의 통계량 ⑥ 그 p-value 를 소수 10자리 문자열로 출력하세요.

제공 파일 1개 · 내용 보기

파일은 준비되어 있어요. 코드에서 이름으로 불러오세요.

bp.csv
참가자,투약전,투약후
P01,129,126
P02,138,127
P03,130,129
P04,142,133
P05,133,136
P06,149,153
P07,135,123
P08,138,127
P09,139,131
P10,140,133
P11,138,128
P12,130,128
P13,155,149
P14,148,137
P15,154,141
P16,153,149
P17,142,134
P18,143,142
P19,141,135
P20,140,130
P21,138,139
P22,152,150
P23,139,135
P24,142,140
P25,149,144
P26,131,125
P27,142,135
P28,152,148
P29,134,139
P30,136,136
P31,142,142
P32,142,130
P33,143,137
P34,135,124
P35,141,122
P36,156,145
P37,141,127
P38,135,132
P39,158,151
P40,137,125
내 코드 Python
Python 준비 중… 처음 한 번만 내려받아요

들여쓰기: Tab · 편집기에서 나가기: Esc 다음 Tab

실행 결과

실행하면 코드가 출력한 내용이 여기에 나타나요.

막혔을 때

풀이와 비교하기

내 코드와 한 줄씩 비교해 보세요. 풀이를 보는 것만으로 완료되지는 않아요.

import pandas as pd
from scipy import stats

bp = pd.read_csv("bp.csv")
before = bp["투약전"]
after = bp["투약후"]
print(round(before.mean(), 4), round(after.mean(), 4))
print(round((before - after).mean(), 4))
rel = stats.ttest_rel(before, after)
ind = stats.ttest_ind(before, after)
print(round(float(rel.statistic), 4))
print(f"{float(rel.pvalue):.10f}")
print(round(float(ind.statistic), 4))
print(f"{float(ind.pvalue):.10f}")