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 이다. 짝을 버리면 개인차가 잡음으로 섞인다 — 이 데이터에서는 통계량이 절반 아래로 떨어졌다.
직접 해보기
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}")