본문 바로가기
Big Data/DataAnalysis & Manipulate

ANOVA 예제

by Wikinist 2023. 8. 10.

각 유형의 ANOVA에 대한 예시

일원배치 ANOVA (One-Way ANOVA)

시나리오: 세 가지 다른 공부 방법(A, B, C)을 사용하여 시험을 준비한 학생들의 성적을 비교하려고 합니다.
가설: 적어도 한 그룹의 평균 성적이 다른 그룹과 다르다.
데이터: 각 그룹별로 여러 학생들의 시험 성적이 포함된 데이터셋.

예제

아래는 세 가지 다른 공부 방법(A, B, C)을 사용하여 시험을 준비한 학생들의 성적을 비교하기 위한 일원배치 ANOVA를 수행하는 파이썬 코드 예제입니다. 이를 위해 scipy.stats 라이브러리를 사용합니다.

import numpy as np
from scipy.stats import f_oneway

# 각 공부 방법별 시험 성적 데이터 생성
group_a = np.array([85, 88, 82, 78, 90])
group_b = np.array([70, 75, 68, 72, 74])
group_c = np.array([92, 88, 95, 90, 85])

# 일원배치 ANOVA 수행
f_statistic, p_value = f_oneway(group_a, group_b, group_c)

# 결과 출력
print("F-statistic:", f_statistic)
print("p-value:", p_value)

# p-value를 기준으로 유의수준을 설정하여 결과 해석
alpha = 0.05
if p_value < alpha:
    print("귀무가설을 기각합니다. 적어도 한 그룹의 평균 성적이 다른 그룹과 다릅니다.")
else:
    print("귀무가설을 기각하지 못합니다. 그룹 간 평균 성적에 통계적으로 유의미한 차이가 없습니다.")

위 코드에서는 group_a, group_b, group_c라는 세 가지 공부 방법에 대한 시험 성적 데이터를 생성하고, f_oneway 함수를 사용하여 일원배치 ANOVA를 수행합니다. 마지막으로 p-value를 기준으로 귀무가설을 기각할지 여부를 결정하고 결과를 출력합니다.

이원배치 ANOVA (Two-Way ANOVA)

시나리오: 두 가지 요인인 비료 종류(A, B)와 물주기 빈도(매일, 매주)에 따라 작물의 성장을 비교하려고 합니다.
가설: 비료 종류와 물주기 빈도 간에 작물의 성장에 유의미한 상호 작용이 있는지 확인하고, 각 요인별로도 성장 차이가 있는지 판단합니다.
데이터: 작물의 성장 데이터를 비료 종류와 물주기 빈도에 따라 정리한 데이터셋.

예제

 두 가지 요인 (비료 종류와 물주기 빈도) 간의 상호 작용을 포함한 이원배치 ANOVA를 수행하는 Python 예제 코드를 아래에 제시해 드리겠습니다. 이를 위해 scipy.stats 모듈의 f_oneway 함수 대신 statsmodels 라이브러리를 사용하여 ANOVA를 수행합니다.

먼저, 필요한 라이브러리를 설치하고 코드를 작성해보겠습니다.

pip install pandas numpy statsmodels
이제 아래의 예제 코드를 사용하여 이원배치 ANOVA를 수행해보세요:

python
Copy code
import pandas as pd
import numpy as np
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

# 데이터 생성
data = {
    'Growth': [15, 18, 20, 14, 16, 19, 22, 17, 21, 23, 12, 10, 11, 13, 9, 8],
    'Fertilizer': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B'],
    'Watering': ['Daily', 'Daily', 'Daily', 'Daily', 'Weekly', 'Weekly', 'Weekly', 'Weekly',
                 'Daily', 'Daily', 'Weekly', 'Weekly', 'Weekly', 'Weekly', 'Daily', 'Daily']
}

df = pd.DataFrame(data)

# 이원배치 ANOVA 모델 적합
model = ols('Growth ~ C(Fertilizer) + C(Watering) + C(Fertilizer):C(Watering)', data=df).fit()

# ANOVA 분석 실행
anova_table = anova_lm(model, typ=2)

# 결과 출력
print(anova_table)

위 코드에서는 pandas를 사용하여 데이터프레임을 생성하고, statsmodels 라이브러리를 사용하여 이원배치 ANOVA를 수행합니다. 모델을 적합시킨 후 anova_lm 함수를 사용하여 분산분석 테이블을 생성하고 출력합니다.

이 예제에서는 'Growth' 변수가 작물의 성장을 나타내며, 'Fertilizer'와 'Watering'이 두 가지 요인을 나타냅니다. 'C(Fertilizer):C(Watering)'는 상호작용 항을 나타냅니다. 데이터와 분석 방법을 실제 상황에 맞게 수정하여 사용하시면 됩니다.

다원배치 ANOVA (Multiple-Way ANOVA)

시나리오: 세 가지 독립 변수인 교육 수준(고졸, 대학 졸업, 대학원 이상), 근무 경험(1년 미만, 1년~5년, 5년 이상), 지역(도심, 교외, 농촌)에 따라 급여 차이를 조사하려고 합니다.
가설: 교육 수준, 근무 경험, 지역 간에 급여 차이가 있는지 확인하고, 이들 독립 변수 간의 상호 작용도 고려합니다.
데이터: 각 개인의 교육 수준, 근무 경험, 지역 및 급여 정보가 포함된 데이터셋.
이러한 예시들을 통해 각 ANOVA 유형이 어떻게 다양한 상황에서 사용될 수 있는지 이해하실 수 있을 것입니다. 실제 데이터에 ANOVA를 적용할 때는 가정을 확인하고, 적절한 사후 분석을 수행하여 그룹 간의 차이를 자세히 이해하는 것이 중요합니다.

예제

import pandas as pd
import numpy as np
import statsmodels.api as sm
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

# 데이터 생성
data = {
    'Salary': [55000, 60000, 62000, 45000, 50000, 53000, 72000, 68000, 70000, 62000,
               58000, 55000, 58000, 59000, 61000, 42000, 47000, 48000, 40000, 45000,
               48000, 52000, 49000, 53000, 62000, 54000, 56000, 58000, 46000, 51000],
    'Education': ['High School', 'College', 'Graduate', 'High School', 'College', 'Graduate',
                  'High School', 'College', 'Graduate', 'High School', 'College', 'Graduate',
                  'High School', 'College', 'Graduate', 'High School', 'College', 'Graduate',
                  'High School', 'College', 'Graduate', 'High School', 'College', 'Graduate',
                  'High School', 'College', 'Graduate', 'High School', 'College', 'Graduate'],
    'Experience': ['<1 Year', '1-5 Years', '>5 Years', '1-5 Years', '>5 Years', '<1 Year',
                   '>5 Years', '1-5 Years', '>5 Years', '1-5 Years', '>5 Years', '<1 Year',
                   '1-5 Years', '>5 Years', '<1 Year', '>5 Years', '1-5 Years', '<1 Year',
                   '1-5 Years', '>5 Years', '<1 Year', '1-5 Years', '>5 Years', '<1 Year',
                   '1-5 Years', '>5 Years', '<1 Year', '1-5 Years', '>5 Years', '<1 Year'],
    'Region': ['Urban', 'Suburban', 'Rural', 'Urban', 'Suburban', 'Rural', 'Urban',
               'Suburban', 'Rural', 'Urban', 'Suburban', 'Rural', 'Urban', 'Suburban',
               'Rural', 'Urban', 'Suburban', 'Rural', 'Urban', 'Suburban', 'Rural',
               'Urban', 'Suburban', 'Rural', 'Urban', 'Suburban', 'Rural', 'Urban',
               'Suburban', 'Suburban']
}

df = pd.DataFrame(data)

# 다원배치 ANOVA 모델 적합
model = ols('Salary ~ C(Education) + C(Experience) + C(Region) + C(Education):C(Experience)', data=df).fit()

# ANOVA 분석 실행
anova_table = anova_lm(model, typ=2)

# 결과 출력
print(anova_table)

위 코드에서는 Salary, Education, Experience, Region 변수를 포함하는 데이터프레임을 생성하고, statsmodels 라이브러리를 사용하여 다원배치 ANOVA를 수행합니다. 모델을 적합시킨 후 anova_lm 함수를 사용하여 분산분석 테이블을 생성하고 출력합니다.

이 예제에서는 교육 수준, 근무 경험, 지역 및 이들 요소 간의 상호작용을 고려하여 급여 차이를 분석합니다. 실제 데이터를 사용할 때에는 위 코드의 데이터 부분을 해당 데이터로 대체하시면 됩니다.

해당 게시글은 ChatGPT의 도움을 받아 작성되었습니다.

'Big Data > DataAnalysis & Manipulate' 카테고리의 다른 글

DataFrame Function 1  (0) 2023.08.11
pandas DataFrame 인덱스  (0) 2023.08.10
정규분포 표현과 통계적 계산  (0) 2023.08.09
t-검정 수행  (0) 2023.08.09
Tukey 이상치 검출  (0) 2023.08.09