05단계 · 3유형 — 검정과 해석
독립표본 t검정과 등분산 가정
두 집단의 평균을 비교하고, `equal_var` 가 무엇을 가정하는지 확인한다.
먼저 알아볼게요
코드로 이동 ↓독립표본 t검정은 서로 다른 두 집단의 평균을 비교한다. 운동하는 사람과 안 하는 사람처럼 사람이 겹치지 않는 경우다.
scipy 문서의 표현 그대로: equal_var=True(기본값)는 "두 모집단의 분산이 같다고 가정하는 표준 독립 2표본 검정", equal_var=False 는 "분산이 같다고 가정하지 않는 Welch 검정" 이다.
Levene 검정(stats.levene(a, b))은 분산이 다른지를 본다. p 가 크다고 해서 분산이 같다는 것이 증명되지는 않는다 — 여기서도 "기각하지 못했다" 일 뿐이다. 그래서 이 검정 결과로 equal_var 를 자동으로 정하는 절차를 규칙처럼 쓰지 않는다. 발문이 가정을 지정하면 그것을 따르고, 지정이 없으면 내가 어떤 가정을 썼는지 밝힌다.
검정통계량의 부호는 순서가 정한다. ttest_ind(a, b) 는 a 의 평균에서 b 의 평균을 뺀 방향이라, 순서를 바꾸면 부호가 뒤집힌다. p-value 는 양측이면 그대로다.
발문이 "등분산을 가정하고" 라고 하면 equal_var=True, "등분산을 가정하지 않고" 라고 하면 False 다. 아무 말이 없으면 기본값이 True 라는 것을 알고 쓴다.
t검정은 두 집단의 관측이 서로 독립이고, 각 집단이 정규분포를 따른다(또는 표본이 충분히 크다) 는 가정 위에 있다. 가정이 많이 어긋나면 나온 p-value 를 그대로 믿을 수 없다.
from scipy import stats
a = [5, 7, 6, 8, 7]
b = [3, 4, 5, 4, 6]
print(round(float(stats.levene(a, b).pvalue), 4))
print(round(float(stats.ttest_ind(a, b).statistic), 4))equal_var=True 가 기본이고 등분산 가정이다. False 는 Welch 검정이다.
health.csv 에서 운동 이 예 인 집단과 아니오 인 집단의 콜레스테롤 을 비교하세요. ① 두 집단의 크기 ② 두 집단의 평균(소수 4) ③ Levene p-value(소수 4) ④ equal_var=True 의 통계량과 p-value ⑤ equal_var=False 의 통계량과 p-value 를 출력하세요.
제공 파일 1개 · 내용 보기
파일은 준비되어 있어요. 코드에서 이름으로 불러오세요.
성별,나이,키,몸무게,콜레스테롤,식단,운동,진단 여,27,167,79,203.3,C,예,0 남,73,176,77,235.1,A,아니오,0 남,74,168,57,229.0,B,아니오,1 여,50,159,60,251.0,C,아니오,0 여,71,161,46,201.6,C,예,0 남,70,182,82,189.1,C,예,0 여,47,161,59,240.0,C,아니오,1 남,52,179,73,197.5,A,예,0 남,57,176,74,207.0,A,예,0 남,65,167,51,185.8,A,예,0 여,25,165,49,202.1,B,아니오,0 남,59,169,59,205.3,B,아니오,0 여,26,164,58,201.2,B,아니오,0 남,38,166,65,193.3,C,아니오,0 남,58,170,60,199.0,A,아니오,1 여,55,160,66,191.8,C,아니오,0 여,37,160,69,234.6,C,아니오,0 여,50,161,65,204.2,B,예,0 남,59,172,50,228.9,C,예,0 남,64,168,61,196.7,A,아니오,1 남,60,178,73,208.7,B,예,0 남,38,168,71,183.0,A,예,0 여,42,159,53,204.0,A,예,0 여,45,164,55,183.2,A,예,0 여,37,157,72,212.6,B,아니오,0 남,38,171,66,200.9,A,아니오,0 남,25,164,55,213.1,C,아니오,0 여,37,166,64,178.7,A,아니오,0 남,37,173,79,197.4,C,예,0 남,42,177,75,262.3,C,아니오,1 남,49,173,64,161.1,C,예,0 여,39,158,64,187.9,A,아니오,0 남,58,171,68,225.6,A,아니오,0 여,29,167,71,176.7,A,예,0 남,46,179,71,222.7,B,아니오,0 여,39,161,48,158.9,C,예,0 남,60,168,60,175.7,B,아니오,0 여,42,169,58,181.6,B,예,0 여,49,155,50,221.8,C,예,0 여,60,156,51,252.5,A,아니오,0 남,29,174,74,213.5,C,아니오,0 여,34,164,57,172.4,A,아니오,0 여,69,155,40,188.8,A,아니오,0 여,59,165,56,211.3,B,아니오,0 여,71,161,46,188.6,A,아니오,1 남,25,174,66,168.0,A,예,0 여,35,147,31,180.7,C,예,0 여,73,155,54,211.2,C,아니오,0 여,48,159,63,191.7,A,예,0 남,30,167,69,166.0,A,아니오,0 여,36,168,58,158.9,A,아니오,0 남,25,162,68,202.5,B,예,0 여,52,166,60,155.4,C,예,0 여,51,161,62,196.7,A,예,0 여,33,163,57,169.2,A,아니오,0 남,52,177,68,217.5,A,아니오,0 남,51,172,65,204.7,C,예,0 남,38,172,79,201.2,B,예,0 남,67,181,79,238.9,C,아니오,0 남,50,170,62,186.9,C,예,0 여,55,155,67,214.7,B,예,0 여,38,166,63,188.7,B,예,0 남,35,177,80,149.7,A,예,0 여,73,167,60,220.7,C,예,0 남,37,173,57,157.1,B,아니오,0 여,42,157,51,190.2,A,예,0 여,60,160,61,180.4,A,아니오,0 남,49,176,71,208.3,C,예,0 남,27,168,64,198.4,B,예,0 여,47,165,53,183.3,A,예,0 여,38,147,37,210.2,B,예,0 남,34,171,63,207.8,C,예,0 여,74,166,59,190.5,C,예,1 여,61,160,52,190.7,C,아니오,0 여,57,162,70,195.5,C,아니오,0 여,37,166,63,164.6,A,예,0 여,32,153,53,202.9,B,아니오,0 남,74,169,66,219.7,C,아니오,0 남,62,178,67,207.1,A,아니오,0 남,56,175,75,177.0,A,아니오,0 남,46,170,57,139.4,B,예,0 남,32,180,84,191.4,B,아니오,0 남,26,172,61,177.9,A,예,0 남,53,171,76,195.3,A,예,0 남,51,167,53,188.8,C,예,0 남,39,178,75,204.0,A,예,0 여,73,158,53,189.1,B,아니오,0 남,59,171,53,193.8,C,예,0 남,46,167,77,200.4,C,예,0 여,42,159,63,205.1,C,아니오,0 남,53,175,62,138.0,C,예,0 남,71,176,66,210.3,B,예,1 남,35,175,73,196.1,A,아니오,0 남,32,158,48,199.7,B,예,0 여,73,155,61,182.1,B,예,0 남,69,180,72,192.8,B,예,0 남,56,161,59,168.3,A,예,0 남,57,190,75,193.9,C,예,0 여,63,162,56,192.5,B,아니오,0 남,74,175,76,211.0,A,예,0 남,39,178,89,210.9,A,아니오,0 여,67,160,55,202.4,C,예,0 남,64,172,55,206.3,B,예,0 여,52,165,75,209.5,B,아니오,0 남,66,172,70,215.0,C,아니오,0 남,67,177,84,187.1,A,예,0 남,39,183,75,180.3,C,예,0 여,71,162,61,199.0,B,예,0 남,56,168,72,210.1,A,아니오,0 여,25,158,42,172.7,C,예,0 여,64,147,50,177.1,B,예,0 남,26,180,74,201.2,A,아니오,0 여,36,162,55,215.4,C,아니오,0 남,70,175,73,212.7,B,아니오,1 여,73,164,53,197.3,A,예,0 여,31,154,45,192.5,B,아니오,0 여,29,159,51,147.9,A,아니오,0 여,66,162,46,202.9,C,아니오,0 남,51,181,95,179.2,A,예,0 남,50,174,59,181.2,A,아니오,0 남,50,160,65,187.8,B,예,0 여,72,175,65,216.2,A,아니오,1 남,69,171,68,192.1,B,아니오,0 남,52,177,78,185.5,C,예,0 남,70,169,83,206.2,A,예,0 여,37,159,50,177.4,C,예,0 남,67,162,60,235.3,C,아니오,0 여,42,158,56,224.3,B,예,0 여,59,154,36,214.2,B,예,0 남,30,170,68,163.8,B,예,0 남,73,168,61,218.5,C,예,0 남,57,157,57,191.5,B,예,0 남,52,166,59,225.2,C,아니오,0 여,26,159,63,181.1,A,아니오,1 남,35,177,75,200.6,A,아니오,0 여,29,155,41,132.1,A,예,0 여,60,162,64,244.1,C,예,0 여,55,159,55,222.1,B,아니오,1 남,62,181,67,214.9,C,예,0 남,64,171,64,215.4,B,아니오,0 남,56,176,72,227.0,C,아니오,0 여,36,163,46,183.5,C,아니오,0 여,48,155,46,201.9,C,예,0 여,67,163,44,156.1,A,예,0 남,27,176,71,167.5,A,예,0 여,64,158,48,198.1,C,아니오,0 남,46,167,66,170.4,B,아니오,0 여,39,159,65,208.6,C,아니오,0 남,52,167,55,191.7,B,예,0 여,45,155,60,205.7,B,예,0
들여쓰기: Tab · 편집기에서 나가기: Esc 다음 Tab
실행 결과
실행하면 코드가 출력한 내용이 여기에 나타나요.
막혔을 때
풀이와 비교하기
내 코드와 한 줄씩 비교해 보세요. 풀이를 보는 것만으로 완료되지는 않아요.
import pandas as pd
from scipy import stats
df = pd.read_csv("health.csv")
a = df[df["운동"] == "예"]["콜레스테롤"]
b = df[df["운동"] == "아니오"]["콜레스테롤"]
print(len(a), len(b))
print(round(a.mean(), 4), round(b.mean(), 4))
print(round(float(stats.levene(a, b).pvalue), 4))
eq = stats.ttest_ind(a, b, equal_var=True)
we = stats.ttest_ind(a, b, equal_var=False)
print(round(float(eq.statistic), 4), round(float(eq.pvalue), 4))
print(round(float(we.statistic), 4), round(float(we.pvalue), 4))