데이터분석/통계

분산분석 ANOVA (일원, 이원, 다원)

씩씩한 IT블로그 2022. 8. 28. 23:19
반응형

검정 종류

다음과 같은 가설검정 들 중 모집단의 개수가 3개이상일 때 사용하는 분산분석(ANOVA)분석에 대해서 알아 본다

 

일원분산분석(one-way ANOVA)

1. 정의 : 종속변인 1개, 독립변인 1개인 상황에서 3개이상의 모집단의 평균이 다른지 검증하는 것

2. 예시

  2.1 A,B,C 반은 30명으로 구성되어 있다. 반별 수학점수는 같은가 다른가

    귀무가설 : 세 반의 수학점수는 모두 같다. (독립변수 : 반)

    대립가설 : 적어도 한 반의 수학점수가 다르다.

  2.2 제약회사에서 세 종류의 두통약을 개발했다. 두통약 별 효과의 차이가 있는가?

    귀무가설 : 두통약의 효과에 차이가 없다. (독립변수 : 약)

    대립가설 : 두통약에 효과가 있는 약이 적어도 하나 있다.

  2.3 (3,4,5,6)월에 생산된 티셔츠가 있다. 생산월에 따른 옷의 치수 비교 

    귀무가설 : 월마다 생산된 티셔츠의 기장에 차이가 없다 (티셔츠 생산 월)

    대립가설 : 적어도 하나의 월에 생산된 티셔츠의 기장에 차이가 있다.

 3. 코드

  3.1 데이터 준비

# url로 데이터 얻어오기
import os
import numpy as np
import pandas as pd

path = '/gdrive/MyDrive/Colab Notebooks/adp/iris.txt'
df = pd.read_csv(path)
df.columns = ["sepalLength","sepalWidth","petalLength","petalWidth","group"]
display(df)

 

  3.2 결과만 나오게

# 결과
from scipy.stats import f_oneway

group1 = df[df["group"]=="setosa"]["sepalLength"]
group2 = df[df["group"]=="versicolor"]["sepalLength"]
group3 = df[df["group"]=="virginica"]["sepalLength"]

display(f_oneway(group1, group2, group3))

 

  3.3 분산분석표 나오게

from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

model = ols('sepalLength ~ C(group)', df).fit() # group을 기준으로, sepallength의 평균차이
anova_lm(model)

 

이원분산분석(two-way ANOVA)

1. 정의 : 독립변인 2개, 종속변인 1개인 상황에서 (적어도 하나의 독립변인이)3개이상의 모집단의 평균이 다른지 검증하는 것

2. 예시

  2.1 (1,2,3)반의 남녀 성별로 학생의 수학점수가 차이가 있는가

    귀무가설1 : 1,2,3반 별 학생의 수학점수 차이가 없다.

    귀무가설2: 성별 학생의 수학점수 차이가 없다.

    귀무가설3: 반과 성별의 상호작용효과가 없다.

3. 코드

  3.1 데이터

df = pd.DataFrame({
    "class_num" : ["class1","class1","class1","class2","class2","class2","class3","class3","class3","class1","class1","class1","class2","class2","class2","class3","class3","class3"],
    "gender" : ["M","M","M","M","M","M","M","M","M","F","F","F","F","F","F","F","F","F"],
    "score" : [71,77,78,76,77,78,71,70,69,80,76,80,79,78,77,73,71,70]
})
df

  3.2 이원분산분석

from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

model = ols('score ~ C(class_num) * C(gender)', df).fit()
anova_lm(model)

 - (class_num의 p-value < 0.5) => class에 따른 유의미한 차이가 존재

 - (gender의 p-value > 0.05) => gender에 따른 유의미한 차이가 존재하지 않음

 - (class와 gender의 상호작용효과 p-value > 0.05) => 상호작용 효과에 따른 유의미한 차이가 존재하지 않음

반응형