05단계 · 3유형 — 검정과 해석
일원배치 분산분석 (ANOVA)
세 집단 이상의 평균이 모두 같은지 `f_oneway` 로 검정한다.
먼저 알아볼게요
코드로 이동 ↓집단이 셋 이상이면 t검정을 여러 번 반복하지 않는다. 반복할수록 우연히 "차이 있음" 이 나올 확률이 쌓이기 때문이다. 대신 분산분석(ANOVA) 을 쓴다.
귀무가설은 "모든 집단의 평균이 같다" 다. 기각하면 "적어도 한 집단은 다르다" 까지만 말할 수 있고, 어느 집단이 다른지는 말할 수 없다.
stats.f_oneway(그룹1, 그룹2, 그룹3) 처럼 집단을 따로따로 넘긴다. 하나의 리스트로 묶어 주면 안 된다.
집단 수가 많으면 groupby 로 만들고 * 를 붙여 펼친다: stats.f_oneway(*groups). * 는 "리스트의 원소를 각각의 인자로 넘겨라" 라는 뜻이다.
결과는 F 통계량과 p-value 다. F 는 "집단 사이의 차이" 를 "집단 안의 흩어짐" 으로 나눈 값이라, 클수록 집단 간 차이가 두드러진다.
분산분석은 집단 간 관측이 독립이고, 각 집단이 정규분포를 따르며, 집단들의 분산이 비슷하다는 가정 위에 있다. 가정이 많이 어긋나면 결과를 조심해서 읽는다.
from scipy import stats
g1 = [5, 6, 7]
g2 = [8, 9, 7]
g3 = [12, 11, 13]
print(round(float(stats.f_oneway(g1, g2, g3).statistic), 4))
print(round(float(stats.f_oneway(g1, g2, g3).pvalue), 6))ANOVA 를 기각해도 "적어도 하나가 다르다" 까지다. 어느 집단인지는 말할 수 없다.
health.csv 에서 식단(A·B·C)별 콜레스테롤 을 비교하세요. ① 각 집단의 크기 리스트 ② 집단별 평균(소수 2) ③ F 통계량과 p-value(소수 4) ④ p < 0.05 인지를 출력하세요.
제공 파일 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")
groups = [g["콜레스테롤"].values for _, g in df.groupby("식단")]
print([len(g) for g in groups])
print(df.groupby("식단")["콜레스테롤"].mean().round(2))
result = stats.f_oneway(*groups)
print(round(float(result.statistic), 4), round(float(result.pvalue), 4))
print(bool(result.pvalue < 0.05))