통계

[통계] ANOVA 분산분석

우언 2022. 2. 23. 13:01

 

1. ANOVA란?

ANalysis Of VAriance의 약자로 한국말로 직역하면 분산분석이다.

anova는 2개이상의 그룹의 평균을 비교하는 방법이다.

정규분포로부터 생성한 다음 예를 활용해서 설명을 지속하겠다.

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

from scipy import stats

rvs1 = np.random.normal(1,1,100)
rvs2 = np.random.normal(3,1,100)
rvs3 = np.random.normal(5,1,100)

mean1, std1, size1 = np.mean(rvs1), np.std(rvs1), len(rvs1)
print(f'data1  mean : {mean1:0.2f}, std: {std1:0.2f}, size : {size1}')
mean2, std2, size2 = np.mean(rvs2), np.std(rvs2), len(rvs2)
print(f'data2  mean : {mean2:0.2f}, std: {std2:0.2f}, size : {size2}')
mean3, std3, size3 = np.mean(rvs3), np.std(rvs3), len(rvs3)
print(f'data2  mean : {mean3:0.2f}, std: {std3:0.2f}, size : {size3}')


plt.figure(figsize = (10, 5))
sns.kdeplot(data = rvs1, color = 'red', shade = True)
sns.kdeplot(data = rvs2, color = 'blue', shade = True)
sns.kdeplot(data = rvs3, color = 'green', shade = True)
plt.show()
data1  mean : 0.81, std: 1.01, size : 100
data2  mean : 3.09, std: 0.96, size : 100
data2  mean : 4.92, std: 1.04, size : 100

1번그래프

 

rvs_total =np.concatenate((rvs1, rvs2, rvs3))
plt.figure(figsize = (10, 5))
sns.kdeplot(data = rvs_total, color = 'purple', shade = True)
plt.show()

2번그래프

2번그래프를 보면 하나의 집단이지만 각각 다른 수준으로 보면 1번그래프의 모양을 띈다.

anova는 이러한 그룹간의 평균을 비교하여 통계적으로 그룹끼리 다른지 유사한지 알아내기를 도와준다.

 

anova의 결과는 f통계량이다.

정규분포를 제곱하면 chisq분포가 된다. 정규분포는 평균을 추정하는데 사용하고 평균에 제곱이 들어가는 다른 통계값은 분산이다. 정규분포를 제곱한 chisq분포는 분산을 추정하는데에 사용한다.

F분포는 두가지의 chisq분포를 분자와 분모로 나눈 값이다.

다시말하면 분산의 비를 추정할 수 있는 분포이다.

 

anova에서는 집단간의 분산 / 집단내의 분산 으로 집단간의 이질성을 검정한다.

집단 내의 동질성이 늘어나고 집단간의 분산이 커지면  F통계량은 커질것이며 이것은 귀무가설을 강하게 반하는 결과를 가져오게된다.

 

귀무가설(H0) : 그룹이나 평균 간에 차이가 없다.

대립가설(H1) : 집단의 평균 사이에 차이가 있다.

 

 

2. 분산분석의 가정

  • 독립성: 한 관측치에 대한 종속 변수 값은 다른 관측치 값과 독립
  • 종속 변수의 값이 정규 분포를 따릅니다.
  • 등분산성 
  • 종속 변수는 연속적.

저번 포스팅에서 사용했던 levene_test와 norm_test를 그대로 사용해서 각각 확인하면된다.

https://gwoolab.tistory.com/39

 

[통계] t-test

1. T-분포란 - 표본평균으로 정규분포를 따르는 모집단의 평균을 해석할 때 사용 - 모집단의 분산이 알려져 있지 않은 경우에 정규분포 대신 이용하는 확률분포 - 정규분포 보다 두꺼운 꼬리 - 일

gwoolab.tistory.com

 

3. 분산분석의 종류와 실습

- 일원배치분산분석

scipy 이용

anova_one = stats.f_oneway(rvs1, rvs2, rvs3)

print('oneway anova F-statistic = %6.3f pvalue = %6.4f' % anova_one )
oneway anova F-statistic = 354.784 pvalue = 0.0000

pvalue가 0에 가까운 값이기에 귀무가설을 기각한다. 즉 최소 한가지에 그룹이 다른 그룹의 평균과는 다르다

 

statsmodel 이용

import statsmodels.api as sm 
from statsmodels.formula.api import ols 

model = ols('value ~ C(group)', data=anova_df).fit() 
sm.stats.anova_lm(model, typ=1)
  df sum_sq mean_sq F PR(>F)
C(group) 2.0 709.583707 354.791854 354.784462 1.914565e-79
Residual 297.0 297.006187 1.000021 NaN NaN

statsmodel은 좀 더 자세한 결과를 보여줍니다.

연산의 결과는 같음

 

위의 결과에 따르면 그룹에 따라 값이 영향을 받는다고 할 수 있다.

 

- 이원배치분산분석

penguin = sns.load_dataset('penguins')
penguin = penguin[['species','sex','body_mass_g']].dropna()
penguin.head()
  species sex body_mass_g
0 Adelie Male 3,750.0000
1 Adelie Female 3,800.0000
2 Adelie Female 3,250.0000
4 Adelie Female 3,450.0000
5 Adelie Male 3,650.0000

펭귄의 종과 성별에 따라서 몸무게가 영향을 받는지를 검정하고자한다.

 

model = ols('body_mass_g ~ C(species)+C(sex)+C(species):C(sex)', penguin).fit()
result = sm.stats.anova_lm(model, typ=1)

pd.options.display.float_format = '{:,.4f}'.format
# pd.options.display.float_format = '{:.2e}'.format

result
  df sum_sq mean_sq F PR(>F)
C(species) 2.0000 145,190,219.1132 72,595,109.5566 758.3581 0.0000
C(sex) 1.0000 37,090,261.7815 37,090,261.7815 387.4600 0.0000
C(species):C(sex) 2.0000 1,676,556.7364 838,278.3682 8.7570 0.0002
Residual 327.0000 31,302,628.2847 95,726.6920 NaN NaN

formula 부분에서 C(species):C(sex)는 두 변수의 교호작용을 의미한다.

 

모든 pvalue와 F값이 귀무가설을 기각하고 있다.

 

즉 펭귄의 종, 펭귄의 성별에 따라서 펭귄의 몸무게 차이가 유의하다 즉 영향을 준다라고 할 수 있고

교호작용 텀도 유의한 것으로 보아 종이 몸무게에 미치는 영향력의 크기가 성별에 따라서 달랒 질 수 있다는 것을 의미한다

4. etc

ANOVA는 최소 두 그룹의 평균 간에 유의한 차이가 있는지 여부만 알 수 있지만 평균이 다른 쌍은 설명할 수 없다. 

데이터가 정규 곡선에 분포하지 않고 이상값이 있는 경우 검정의 결론이 부정확할 수 있다.

표준편차의 차이가 크면 검정의 결론이 부정확할 수 있다.

 

ANOVA는 모델의 복잡성을 줄이기 위해 입력 변수의 수를 최소화한다.

ANOVA는 독립 변수가 대상 변수에 영향을 미치는지 여부를 결정하는 데 도움이 된다.

 

또한 그룹간의 평균이 다른지 아닌지만을 아렬주고 어떤 그룹의 평균이 큰지에 대한 내용은 제공하지않기때문에 

사후분석이 수반되기도한다.