일원분산분석은 평균에 영향을 주는 요인이 1개인 경우에 사용하는 분산분석이다. 예를 들어 4개의 기계별로 생산량을 조사할 때는 집단이 4개이지만 집단 별 영향을 주는 요인은 "기계" 하나이기 때문에 일원분산분석을 사용한다. 만약 기계와 기계를 다루는 작업자 5명을 조사한다고 했을 때는 집단의 수와 상관없이 평균에 영향을 주는 요인은 "기계"와 "작업자"이기 때문에 이원분산분석을 사용한다.
일원분산분석에서는 귀무가설과 대립가설을 세울 때 집단의 수를 맞춰야 한다. 위의 예제처럼 기게가 4대 일 때는 가설을 μ4까지 표현해야한다.
또한 분산분석에서는 여러 계산이 헷갈릴 수 있어 분산분석표를 기준으로 삼아서 하는데, 일원분산분석의 표는 아래와 같다.( 일원분산분석은 크게 "반복이 같은 경우"와 "반복이 다른 경우"로 나뉘는데, 이 반복은 각 집단의 표본 수를 나타내는 말이다.)
1. 반복이 같은 경우(집단 간 샘플 수 동일)의 분산분석표
표에 있는 값들을 다 구해야 하는데, 먼저 제곱합인 SSA와 SSE와 SST를 구해야 한다. 집단 간에 발생하는 치우침을 요인제곱합(SSA)이라 하고, 집단 내에서 여러 개의 표본을 뽑았을 때 표본 간에 발생하는 치우침을 오차제곱합(SSE)라고 한다. 이 모든 치우침을 합쳐서 총제곱합(SST)라고 한다.
2. 반복이 다른 경우(집단 간 샘플 수 다름)의 분산분석표
반복이 같은 경우와 비교해보면 자유도가 다른다. a는 집단의 개수를 나타내고 n은 전체 표본 수를 나타내므로, 요인자유도는 a-1이고 총 자유도는 n-1이다. (SSA를 계산하는 방법도 다른데, 예제에서 확인 가능)
또 표의 "자유도"에서 a는 집단의 개수, r은 각 집단의 표본의 수를 나타낸다. 그 다음 "평균제곱"은 분산과 비슷한 개념으로 제곱합/자유도로 구하면 되고,F값은 MSA/MSE로 구하면 된다.
EX)
1. 어느 농가에서 비료의 종류에 따라 종작물의 수확량 차이를 알아보려한다. 4개의 비료에 따른 수확량을 조사했더니, 아래 표와 같이 나왔다. 비료의 종류에 따라 농작물의 수확량에 차이가 있는지 유의수준 5%에서 검정하라. (집단 간 샘플 수 동일한 경우)
분삽분석을 기본적으로 '평균이 같은지 비교하는 분석'이므로 귀무가설은 "네가지 비료에 따른 수확량 평균은 모두 같다"로 설정하고 대립가설은 "적어도 하나의 비료에 의한 수확량 평균은 다르다"로 설정한다.
위 표본을 토대로 분산분석표의 값들을 구하면 아래와 같다.
다음 기각역을 구해보면, 유의수준 0.05 내에서 자유도(3, 16)일 때 3.24가 나온다. 따라서 검정통계량 F값이 채택역 안에 위치하므로 귀무가설을 기각할 수 없다. 따라서 "비료의 종류에 따라서 수확량의 차이가 있다고 할 수 없다".
## 일원분산분석(One-way ANOVA)
## 반복이 같은 경우 - 집단 별 샘플 사이즈가 동일한 완전확률화계획법
from scipy.stats import f
import pandas as pd
import numpy as np
data = pd.DataFrame({'B1' : [74, 68, 75, 80, 73],
'B2' : [67, 61, 72, 65, 69],
'B3' : [69, 75, 71, 59, 72],
'B4' : [73, 72, 69, 74, 75]})
test_a = 0.05 # 유의수준
means = np.array(data.mean().values) #집단별 평균
mu = np.mean(data.values) # 전체 평균
vs = np.array(data.std(axis=0, ddof=1)**2) # 집단별 분산
n = len(data.values.flatten()) # 표본 전체 개수
k = data.shape[0] # 집단별 표본 개수
level = data.shape[1] # 집단 개수
dfr = level-1 # 자유도
dfe = level*(k-1) # 자유도
# F 검정통계량
SSA = (k * (means - mu)**2).sum()
SSE = ((k - 1) * vs).sum()
SST = ((data.values - mu)**2).sum() # SSA + SSE
MSA = SSA/dfr
MSE = SSE/dfe
F = MSA / MSE
print(f"SSA : {SSA:.3f}, SSE : {SSE:.3f}, SST : {SST:.3f}")
print(f"MSA : {MSA:.3f}, MSE : {MSE:.3f}, F : {F:.2f}")
cv = f.ppf(1-test_a, dfr, dfe)
sp = 1-f.cdf(F, dfr, dfe)
print(f"오른쪽 검정 임계값 : {cv:.2f}, 검정통계량 : {F:.2f}")
print(f"유의수준 : {test_a}, 유의확률 : {sp:.3f}")
if F<cv:
print("귀무가설을 기각할 수 없음 = 집단 간 평균 차이가 있다고 할 수 없음")
else:
print("귀무가설을 기각하고, 대립가설을 채택함 = 집단 간 평균이 같다고 할 수 없음")
2. 한 기업에서 광고 종류에 따라 제품 판매량이 얼마나 증가하는지 알아보려 한다. 광고의 종류에 따라 제품의 판매 증가량에 차이가 있는지 유의수준 10%에서 검정하시오. (집단 간 샘플 수가 다를 경우)
귀무가설은 "세 집단의 평균이 같다"로 설정하고 대립가설은 "적어도 하나의 평균은 다르다"고 설정한다. 참고로 평균이 같다는 것은 곧 "판매 증가량"도 같다는 뜻이다.
위 표본을 토대로 분산분석표의 값들을 구하면 아래와 같다.
기각역을 구하면 유의수준 0.1에서 자유도 (2, 15)일 때 2.70이 나온다. 검정통계량 F값이 기각역 안에 위치하므로 귀무가설이 기가된다. 따라서 세 집단 중 적어도 하나의 평균은 다르므로 "광고의 종류에 따라 제품의 판매 증가량이 모두 같다고 할 수 없다"
## 일원분산분석(One-way ANOVA)
## 반복이 같은 경우 - 집단 별 샘플 사이즈가 다른 경우
from scipy.stats import f
import pandas as pd
import numpy as np
data = [[22.2, 11.7, 20.1, 6.3, 13.5, 10.9],
[24.6, 22.4, 19.3, 28.1, 20.2, 17.9, 15.4],
[18.4, 15.7, 13.4, 23.5, 12.3]]
data_df = pd.DataFrame(data, index = ['A%d'%i for i in range(len(data))]).T
data_1d = sum(data, [])
test_a = 0.1 # 유의수준
means = [] #집단 별 평균
vs = [] # 집단 별 분산
n = 0
k = [] # 집단 별 표본개수
for d in data:
means.append(np.mean(d))
vs.append(np.std(d, ddof=1)**2)
n += len(d)
k.append(len(d))
mu = np.mean(data_1d) # 전체 평균
vs = np.array(vs) # 집단별 분산
k = np.array(k) #집단별 표본 개수
dfr = len(k)-1 # 모집단 자유도
dfe = n-1-dfr # 오차 자유도
# F 검정통계량
SSA = (k * (means - mu)**2).sum() # SSA는 반복이 같은 경우와 구하는 법이 다르다고 했는데,
# 각 집단 별 표본의 개수에 따라 나눠주면되는데 df에서
# NaN 값이 따로 계산되지 않아 그냥 진행하면 된다
SSE = ((k - 1) * vs).sum()
SST = ((data_1d - mu)**2).sum() # SSA + SSE
MSA = SSA/dfr
MSE = SSE/dfe
F = MSA / MSE
print(f"SSA : {SSA:.3f}, SSE : {SSE:.3f}, SST : {SST:.3f}")
print(f"MSA : {MSA:.3f}, MSE : {MSE:.3f}, F : {F:.2f}")
cv = f.ppf(1-test_a, dfr, dfe)
sp = 1-f.cdf(F, dfr, dfe)
print(f"오른쪽 검정 임계값 : {cv:.2f}, 검정통계량 : {F:.2f}")
print(f"유의수준 : {test_a}, 유의확률 : {sp:.3f}")
if F<cv:
print("귀무가설을 기각할 수 없음 = 집단 간 평균 차이가 있다고 할 수 없음")
else:
print("귀무가설을 기각하고, 대립가설을 채택함 = 집단 간 평균이 같다고 할 수 없음")
'Statistics' 카테고리의 다른 글
이원분산분석(Two-way ANOVA)(feat.Python) (1) | 2024.01.23 |
---|---|
분산분석(ANOVA) (0) | 2024.01.23 |
분산분석(ANOVA)의 가정(feat.Python) (1) | 2024.01.18 |
이표본 검정(Two-sample)(feat.Python) (1) | 2024.01.17 |
일표본(One-sample) 검정(feat.Python) (0) | 2024.01.16 |