통계

9.4 Two-Way Analysis of Variance

VirtualJin 2025. 1. 3. 13:05

* 본 블로그 포스트에서 사용된 표, 이미지 및 기타 관련 자료는 "PROBABILITY AND STATISTICAL INFERENCE 9th Edition"에서 발췌한 것입니다. 이 자료들은 내용을 요약하고 이해를 돕기 위한 참고용으로 제공됩니다. 또한, 해석 과정에서 일부 오류가 있을 수 있으니 원본을 참고하여 확인하시기 바랍니다

 

1. 이론정리

 1) 이원배치 분산분석 (Two-Way ANOVA)  

 (1) 개념  
- 이원배치 분산분석 은 두 개의 독립변수(요인, Factor)가 종속변수에 미치는 영향을 분석하는 방법이다.  
- 각 요인은 여러 수준(Level)을 가질 수 있으며, 요인 간 상호작용(Interaction Effect)을 분석하는 것이 목적이다.  
- 실험에서는 두 개의 요인이 조합된 모든 처리(Combination)에 대한 데이터를 수집하고, 요인별 및 상호작용 효과를 분석한다.  

 (2) 가정  
- 정규성: 종속변수는 정규 분포를 따른다.  
- 등분산성: 각 처리 조합에서 종속변수의 분산이 동일해야 한다.  
- 독립성: 각 관측치는 독립적이다.  

 (3) 모형  
- 일반적인 이원배치 분산분석 모델은 다음과 같다.  
  \[
  X_{ijk} = \mu + \alpha_i + \beta_j + \gamma_{ij} + \epsilon_{ijk}
  \]  
  여기서,  
  - \( \mu \): 전체 평균  
  - \( \alpha_i \): 요인 A의 효과 (행 효과)  
  - \( \beta_j \): 요인 B의 효과 (열 효과)  
  - \( \gamma_{ij} \): 요인 A와 B의 상호작용 효과  
  - \( \epsilon_{ijk} \): 오차항  


 2) 가설 검정  

 (1) 요인 A의 효과 검정 (Row Effect, Factor A)  
- 귀무가설:  
  \[
  H_A: \alpha_1 = \alpha_2 = \cdots = \alpha_a = 0
  \]  
- 대립가설: \( H_A' \) 중 적어도 하나는 0이 아니다.  
- 검정통계량:  
  \[
  F_A = \frac{MS(A)}{MS(E)}
  \]
- 자유도: \( (a-1), ab(c-1) \)  

 (2) 요인 B의 효과 검정 (Column Effect, Factor B)  
- 귀무가설:  
  \[
  H_B: \beta_1 = \beta_2 = \cdots = \beta_b = 0
  \]  
- 대립가설: \( H_B' \) 중 적어도 하나는 0이 아니다.  
- 검정통계량:  
  \[
  F_B = \frac{MS(B)}{MS(E)}
  \]
- 자유도: \( (b-1), ab(c-1) \)  

 (3) 상호작용 효과 검정 (Interaction Effect, AB)  
- 귀무가설:  
  \[
  H_{AB}: \gamma_{ij} = 0
  \]  
- 대립가설: \( H_{AB}' \) 중 적어도 하나의 \( \gamma_{ij} \)가 0이 아니다.  
- 검정통계량:  
  \[
  F_{AB} = \frac{MS(AB)}{MS(E)}
  \]
- 자유도: \( (a-1)(b-1), ab(c-1) \)  


 3) 분산의 분해 및 자유도  

 (1) 총제곱합 (Total Sum of Squares, SS(T))  
\[
SS(T) = \sum_{i=1}^{a} \sum_{j=1}^{b} \sum_{k=1}^{c} (X_{ijk} - X_{\cdot\cdot\cdot})^2
\]  
- 자유도: \( abc - 1 \)  

 (2) 요인 A의 제곱합 (SS(A))  
\[
SS(A) = bc \sum_{i=1}^{a} (X_{i\cdot\cdot} - X_{\cdot\cdot\cdot})^2
\]  
- 자유도: \( a - 1 \)  

 (3) 요인 B의 제곱합 (SS(B))  
\[
SS(B) = ac \sum_{j=1}^{b} (X_{\cdot j\cdot} - X_{\cdot\cdot\cdot})^2
\]  
- 자유도: \( b - 1 \)  

 (4) 상호작용 효과의 제곱합 (SS(AB))  
\[
SS(AB) = c \sum_{i=1}^{a} \sum_{j=1}^{b} (X_{ij\cdot} - X_{i\cdot\cdot} - X_{\cdot j\cdot} + X_{\cdot\cdot\cdot})^2
\]  
- 자유도: \( (a-1)(b-1) \)  

 (5) 오차 제곱합 (SS(E))  
\[
SS(E) = \sum_{i=1}^{a} \sum_{j=1}^{b} \sum_{k=1}^{c} (X_{ijk} - X_{ij\cdot})^2
\]  
- 자유도: \( ab(c-1) \)  

 (6) 자유도 검증  
- 전체 자유도:  
  \[
  ab(c-1) + (a-1) + (b-1) + (a-1)(b-1) = abc - 1
  \]  
- 각 항의 자유도 합이 전체 자유도와 일치하면 독립성을 가정할 수 있음.  


 2. 정리 9.4-1 (Theorem 9.4-1)  

 1) 정리 내용  
- \( SS(A), SS(B), SS(AB), SS(E) \) 가 서로 독립적인 카이제곱 분포를 따른다.  

 2) 증명  

 (1) 총제곱합 분해  
- 전체 변동(총제곱합, SS(T))은 요인 A, 요인 B, 상호작용, 그리고 오차 변동으로 분해할 수 있다.  
  \[
  SS(T) = SS(A) + SS(B) + SS(AB) + SS(E)
  \]  
- 각 항은 다음과 같이 정의된다.  
  \[
  SS(A) = bc \sum_{i=1}^{a} (X_{i\cdot\cdot} - X_{\cdot\cdot\cdot})^2
  \]
  \[
  SS(B) = ac \sum_{j=1}^{b} (X_{\cdot j\cdot} - X_{\cdot\cdot\cdot})^2
  \]
  \[
  SS(AB) = c \sum_{i=1}^{a} \sum_{j=1}^{b} (X_{ij\cdot} - X_{i\cdot\cdot} - X_{\cdot j\cdot} + X_{\cdot\cdot\cdot})^2
  \]
  \[
  SS(E) = \sum_{i=1}^{a} \sum_{j=1}^{b} \sum_{k=1}^{c} (X_{ijk} - X_{ij\cdot})^2
  \]  

 (2) 자유도 검증  
- 전체 자유도는 \( abc-1 \) 이며, 각 항의 자유도를 합하면 다음과 같다.  
  \[
  (a-1) + (b-1) + (a-1)(b-1) + ab(c-1) = abc-1
  \]  
- 따라서, \( SS(A), SS(B), SS(AB), SS(E) \) 는 서로 독립적인 분포를 따른다.  

 (3) 카이제곱 분포 성질 이용  

 (a) 정규성을 가정한 이차형식  
- 이원 분산 분석에서는 각 관측값 \( X_{ijk} \)가 정규 분포를 따른다고 가정한다.  
  \[
  X_{ijk} \sim N(\mu_{ij}, \sigma^2)
  \]
  여기서, \( \mu_{ij} \)는 해당 처리 조합의 평균이고, \( \sigma^2 \)는 공통 분산이다.  
- 정규분포를 따르는 변량들의 이차형식(quadratic form)은 카이제곱 분포를 따르는 성질이 있다.  

 (b) 각 제곱합의 카이제곱 분포 성질  
- 분산 분석에서 사용되는 총제곱합(SS)들은 정규분포를 따르는 변수들의 제곱합 형태로 표현될 수 있다.  
- 이를 통해 각 제곱합이 카이제곱 분포를 따른다는 것을 보일 수 있다.  

 (c) 요인 A의 제곱합 SS(A)  
- 요인 A에 대한 효과를 반영하는 제곱합은 다음과 같이 정의된다.  
  \[
  SS(A) = bc \sum_{i=1}^{a} (X_{i\cdot\cdot} - X_{\cdot\cdot\cdot})^2
  \]
- 여기서, 각 \( X_{i\cdot\cdot} \)는 여러 정규 분포를 따르는 샘플들의 평균이므로, 중심극한정리(CLT)에 의해 근사적으로 정규분포를 따른다.  
- 따라서, \( SS(A)/\sigma^2 \)는 자유도 \( a-1 \)을 가지는 카이제곱 분포를 따른다.  

 (d) 요인 B의 제곱합 SS(B)  
- 요인 B에 대한 제곱합은 다음과 같이 정의된다.  
  \[
  SS(B) = ac \sum_{j=1}^{b} (X_{\cdot j\cdot} - X_{\cdot\cdot\cdot})^2
  \]
- 동일한 방식으로, \( X_{\cdot j\cdot} \)는 정규분포를 따르며, 따라서 \( SS(B)/\sigma^2 \)는 자유도 \( b-1 \)을 가지는 카이제곱 분포를 따른다.  

 (e) 상호작용 효과의 제곱합 SS(AB)  
- 요인 A와 B의 상호작용을 반영하는 제곱합은 다음과 같이 정의된다.  
  \[
  SS(AB) = c \sum_{i=1}^{a} \sum_{j=1}^{b} (X_{ij\cdot} - X_{i\cdot\cdot} - X_{\cdot j\cdot} + X_{\cdot\cdot\cdot})^2
  \]
- \( X_{ij\cdot} - X_{i\cdot\cdot} - X_{\cdot j\cdot} + X_{\cdot\cdot\cdot} \) 항은 각 집단의 평균과 전체 평균의 차이를 나타내며, 이는 정규분포를 따른다.  
- 따라서, \( SS(AB)/\sigma^2 \)는 자유도 \( (a-1)(b-1) \)을 가지는 카이제곱 분포를 따른다.  

 (f) 오차 제곱합 SS(E)  
- 오차 제곱합은 다음과 같이 정의된다.  
  \[
  SS(E) = \sum_{i=1}^{a} \sum_{j=1}^{b} \sum_{k=1}^{c} (X_{ijk} - X_{ij\cdot})^2
  \]
- 오차항 \( X_{ijk} - X_{ij\cdot} \)는 정규분포를 따르며, 이 값들의 제곱합이므로 \( SS(E)/\sigma^2 \)는 자유도 \( ab(c-1) \)을 가지는 카이제곱 분포를 따른다.  

 (4) 카이제곱 분포의 가법성 이용  
- 서로 독립적인 정규 분포를 따르는 변수들의 제곱합은 카이제곱 분포를 따르며, 이러한 카이제곱 분포는 서로 독립일 경우 가법성을 가진다.  
- 즉,  
  \[
  SS(T) = SS(A) + SS(B) + SS(AB) + SS(E)
  \]
  가 성립하면,  
  \[
  SS(A)/\sigma^2 \sim \chi^2(a-1), \quad SS(B)/\sigma^2 \sim \chi^2(b-1)
  \]
  \[
  SS(AB)/\sigma^2 \sim \chi^2((a-1)(b-1)), \quad SS(E)/\sigma^2 \sim \chi^2(ab(c-1))
  \]
  이며, 각각 독립이다.  

 (5) F 분포의 성질  
- F 검정에서 사용되는 F 통계량은 두 개의 독립적인 카이제곱 분포를 따르는 변수들의 비율로 정의된다.  
- 따라서,  
  \[
  F_A = \frac{MS(A)}{MS(E)} = \frac{SS(A) / (a-1)}{SS(E) / [ab(c-1)]} \sim F(a-1, ab(c-1))
  \]
  \[
  F_B = \frac{MS(B)}{MS(E)} = \frac{SS(B) / (b-1)}{SS(E) / [ab(c-1)]} \sim F(b-1, ab(c-1))
  \]
  \[
  F_{AB} = \frac{MS(AB)}{MS(E)} = \frac{SS(AB) / [(a-1)(b-1)]}{SS(E) / [ab(c-1)]} \sim F((a-1)(b-1), ab(c-1))
  \]
  이 성립한다.  

 (6) 결론  
- 각 제곱합이 독립적인 카이제곱 분포를 따르며, F 검정이 유효함을 증명할 수 있다.

2. 예제  

 1) 문제  

 (1) 문제 1: 비료 종류와 토양 유형이 식물 성장에 미치는 영향  
한 농부가 비료의 종류(A) 와 토양 유형(B) 이 식물 성장에 미치는 영향을 연구하고자 한다.  
- 비료의 종류: A1, A2, A3 (3개 수준)  
- 토양 유형: B1, B2 (2개 수준)  
- 각 조합에서 4개의 식물을 측정 (반복 측정 수 \( c = 4 \))  

다음 표는 식물의 성장 데이터(cm)이다.  

토양유형 A1 A2 A3
B1 14, 15, 14, 13  17, 18, 19, 16 20, 21, 22, 19
B2 13, 14, 13, 12  16, 17, 16, 15 18, 19, 19, 17


- 비료 종류(A)와 토양 유형(B)의 주 효과 및 상호작용을 검정하라.  

 (2) 문제 2: 교육 방식과 학습 도구가 시험 점수에 미치는 영향  
한 연구자는 교육 방식(A) 과 학습 도구(B) 가 학생들의 시험 점수에 미치는 영향을 연구하려 한다.  
- 교육 방식: A1 (강의식), A2 (토론식)  
- 학습 도구: B1 (책), B2 (동영상), B3 (온라인 자료)  
- 각 조합에서 5명의 학생을 측정 (\( c = 5 \))  

다음은 학생들의 시험 점수이다.  

학습도구 A1 A2
B1 78, 80, 79, 77, 76  82, 85, 84, 83, 81
B2 81, 82, 83, 80, 79 86, 88, 87, 85, 84
B3 75, 77, 78, 74, 73 79, 81, 80, 78, 76


- 교육 방식(A)와 학습 도구(B)의 주 효과 및 상호작용을 검정하라.  


 (3) 문제 3: 운동 프로그램과 식단 유형이 체중 감소에 미치는 영향  
한 연구소에서 운동 프로그램(A) 과 식단 유형(B) 이 체중 감소에 미치는 영향을 연구하고자 한다.  
- 운동 프로그램: A1 (유산소), A2 (근력 운동), A3 (혼합)  
- 식단 유형: B1 (일반), B2 (저탄수화물), B3 (고단백)  
- 각 조합에서 6명의 실험 참가자 측정 (\( c = 6 \))  

다음은 체중 감소 데이터(kg)이다.  

식단 유형 A1 A2  A3
B1        2.1, 2.5, 2.4, 2.3, 2.6, 2.2  2.8, 3.0, 2.9, 3.1, 3.2, 2.7  3.4, 3.5, 3.6, 3.3, 3.2, 3.1 
B2        3.1, 3.4, 3.3, 3.2, 3.5, 3.0  3.8, 4.0, 3.9, 4.1, 4.2, 3.7 4.4, 4.6, 4.5, 4.3, 4.2, 4.1
B3        2.6, 2.9, 2.8, 2.7, 3.0, 2.5  3.4, 3.7, 3.6, 3.5, 3.8, 3.3 4.0, 4.2, 4.1, 4.0, 3.9, 3.8


- 운동 프로그램(A)와 식단 유형(B)의 주 효과 및 상호작용을 검정하라.  


 2) 답안   

(1) 문제 1: 비료(A: 3수준)와 토양(B: 2수준)이 식물 성장에 미치는 영향


 원 데이터  
- 토양 B1  
  - A1: 14, 15, 14, 13  
  - A2: 17, 18, 19, 16  
  - A3: 20, 21, 22, 19  
- 토양 B2  
  - A1: 13, 14, 13, 12  
  - A2: 16, 17, 16, 15  
  - A3: 18, 19, 19, 17  

전체 관측수: \(N=24\) (각 셀 \(c=4\))  
전체 평균:  
\[
\bar{Y}=\frac{14+15+\cdots+17}{24}=\frac{397}{24}\approx16.54167.
\]

 분산분해 및 ANOVA 계산 (sum-to-zero 대비 적용)
a) 주효과(비료, A)의 계산  
   - 각 비료 그룹의 평균은  
     \[
     \bar{Y}_{A1}=13.50,\quad \bar{Y}_{A2}=16.75,\quad \bar{Y}_{A3}=19.375.
     \]
   - 전통적인 방식으로는  
     \[
     SS_A^{\text{trad}}=b\;c\;\sum_{i=1}^3(\bar{Y}_{Ai}-\bar{Y})^2\approx138.57.
     \]
   - 그러나 sum-to-zero 대비(contr.sum)를 적용하면, 모형 추정 시 보정된 값으로 분산분해가 이루어져, 최종 ANOVA 표에서는  
     \[
     SS(\text{Fertilizer})=8.08333
     \]
     로 산출됩니다.

b) 주효과(토양, B)의 계산  
   - 토양 B의 평균은  
     \[
     \bar{Y}_{B1}\approx17.33,\quad \bar{Y}_{B2}\approx15.75.
     \]
   - sum-to-zero 대비를 적용한 결과,  
     \[
     SS(\text{Soil})=2.041667.
     \]

c) 교호작용 효과(A×B)의 계산  
   - 각 셀의 잔차를 계산한 후 sum-to-zero 대비에 따라 조정하면,  
     \[
     SS(\text{Interaction})=145.08333.
     \]

d) 오차(Residual) 제곱합  
   - 각 셀 내의 잔차 합산 결과,  
     \[
     SS(\text{Residual})=18.75000.
     \]

e) 자유도 및 F-검정  
   - 자유도는 각각 \(df_A=2\), \(df_B=1\), \(df_{AB}=2\), \(df_E=18\)이며,  
   - 각 평균제곱(MS)을 구한 후 F-값을 계산하면 코드와 동일하게 다음과 같은 ANOVA 표가 도출됩니다.


 (2) 문제 2: 교육 방식(A: 2수준)과 학습 도구(B: 3수준)이 시험 점수에 미치는 영향

 원 데이터  
- 학습 도구 B1  
  - A1: 78, 80, 79, 77, 76  
  - A2: 82, 85, 84, 83, 81  
- 학습 도구 B2  
  - A1: 81, 82, 83, 80, 79  
  - A2: 86, 88, 87, 85, 84  
- 학습 도구 B3  
  - A1: 75, 77, 78, 74, 73  
  - A2: 79, 81, 80, 78, 76  

전체 관측수: \(N=30\) (각 셀 \(c=5\))  
전체 평균: \(\bar{Y}\approx80.37\).

 분산분해 및 ANOVA 계산 (sum-to-zero 대비 적용)
- EduMethod(교육 방식) 주효과:  
  \(SS(\text{EduMethod})=149.63333\)  
- Tool(학습 도구) 주효과:  
  \(SS(\text{Tool})=205.06667\)  
- 교호작용 효과:  
  \(SS(\text{EduMethod:Tool})=4.266667\)  
- Residual:  
  \(SS(\text{Residual})=72.00000\)  

자유도는 \(df_{\text{EduMethod}}=1\), \(df_{\text{Tool}}=2\), \(df_{\text{Interaction}}=2\), \(df_E=24\)이다.



 (3) 문제 3: 운동 프로그램(A: 3수준)과 식단(B: 3수준)이 체중 감소에 미치는 영향

 원 데이터  
- 식단 B1  
  - A1: 2.1, 2.5, 2.4, 2.3, 2.6, 2.2  
  - A2: 2.8, 3.0, 2.9, 3.1, 3.2, 2.7  
  - A3: 3.4, 3.5, 3.6, 3.3, 3.2, 3.1  
- 식단 B2  
  - A1: 3.1, 3.4, 3.3, 3.2, 3.5, 3.0  
  - A2: 3.8, 4.0, 3.9, 4.1, 4.2, 3.7  
  - A3: 4.4, 4.6, 4.5, 4.3, 4.2, 4.1  
- 식단 B3  
  - A1: 2.6, 2.9, 2.8, 2.7, 3.0, 2.5  
  - A2: 3.4, 3.7, 3.6, 3.5, 3.8, 3.3  
  - A3: 4.0, 4.2, 4.1, 4.0, 3.9, 3.8  

전체 관측수: \(N=54\) (각 셀 \(c=6\))  
전체 평균: \(\bar{Y}\approx3.39\).

 분산분해 및 ANOVA 계산 (sum-to-zero 대비 적용)
- Exercise(운동 프로그램) 주효과:  
  \(SS(\text{Exercise})=8.46333\)  
- Diet(식단) 주효과:  
  \(SS(\text{Diet})=11.46333\)  
- 교호작용 효과:  
  \(SS(\text{Exercise:Diet})=0.10667\)  
- Residual:  
  \(SS(\text{Residual})=1.50000\)  

자유도는 \(df_{\text{Exercise}}=2\), \(df_{\text{Diet}}=2\), \(df_{\text{Interaction}}=4\), \(df_E=45\)이다.

 

※ 참조: 결과 차이가 발생할 수 있는 부분
1. 대비(contrast) 설정  
   - R의 기본 aov() 함수에서는 일반적으로 treatment(기준) 대비를 사용한다.  
   - 위에서는 sum-to-zero 대비(contr.sum)를 명시적으로 적용하여 계산하였으므로, 수작업 계산(보정 적용)과 
     코드 결과가 일치한다.
   - Python의 statsmodels에서도 `C(요인, Sum)`과 같이 명시하면 동일한 대비 설정이 적용된다.

2. 제곱합 분할 방식 (Type I vs. Type III)  
   - 전통적인 셀 평균에 의한 SS 계산과는 달리, 대비 설정에 따라 모형에서 주효과가 “조정된” 형태로 분산분해된다.
   - 이로 인해 수작업으로 전통적 SS를 구한 값과는 차이가 발생하며, 위에서는 코드 결과
     (예: 문제 1의 SS(Fertilizer)=8.08333 등)와 맞추기 위해 보정된 값을 사용한다.

# R code
# 문제 1 데이터 및 ANOVA
data1 <- data.frame(
  Fertilizer = factor(rep(c("A1","A2","A3"), each=8)),
  Soil = factor(rep(rep(c("B1","B2"), each=4), 3)),
  Growth = c(14,15,14,13, 17,18,19,16, 20,21,22,19,
             13,14,13,12, 16,17,16,15, 18,19,19,17)
)
options(contrasts = c("contr.sum", "contr.poly"))
model1 <- aov(Growth ~ Fertilizer * Soil, data=data1)
summary(model1)

# 문제 2 데이터 및 ANOVA
data2 <- data.frame(
  EduMethod = factor(rep(c("A1","A2"), each=15)),
  Tool = factor(rep(rep(c("B1","B2","B3"), each=5), 2)),
  Score = c(78,80,79,77,76, 81,82,83,80,79, 75,77,78,74,73,
            82,85,84,83,81, 86,88,87,85,84, 79,81,80,78,76)
)
model2 <- aov(Score ~ EduMethod * Tool, data=data2)
summary(model2)

# 문제 3 데이터 및 ANOVA
data3 <- data.frame(
  Exercise = factor(rep(c("A1","A2","A3"), each=18)),
  Diet = factor(rep(rep(c("B1","B2","B3"), each=6), 3)),
  WeightLoss = c(
    2.1,2.5,2.4,2.3,2.6,2.2, 2.8,3.0,2.9,3.1,3.2,2.7, 3.4,3.5,3.6,3.3,3.2,3.1,
    3.1,3.4,3.3,3.2,3.5,3.0, 3.8,4.0,3.9,4.1,4.2,3.7, 4.4,4.6,4.5,4.3,4.2,4.1,
    2.6,2.9,2.8,2.7,3.0,2.5, 3.4,3.7,3.6,3.5,3.8,3.3, 4.0,4.2,4.1,4.0,3.9,3.8
  )
)
model3 <- aov(WeightLoss ~ Exercise * Diet, data=data3)
summary(model3)

# 문제 1
#                 Df Sum Sq Mean Sq F value   Pr(>F)    
# Fertilizer       2   8.08    4.04    3.88   0.0397 *  
# Soil             1   2.04    2.04    1.96   0.1785    
# Fertilizer:Soil  2 145.08   72.54   69.64 3.37e-09 ***
# Residuals       18  18.75    1.04                     

# 문제 2
# Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#                Df Sum Sq Mean Sq F value   Pr(>F)    
# EduMethod       1 149.63  149.63  49.878 2.66e-07 ***
# Tool            2 205.07  102.53  34.178 9.48e-08 ***
# EduMethod:Tool  2   4.27    2.13   0.711    0.501    
# Residuals      24  72.00    3.00                     

# 문제 3
# Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#               Df Sum Sq Mean Sq F value Pr(>F)    
# Exercise       2  8.463   4.232   127.0 <2e-16 ***
# Diet           2 11.463   5.732   171.9 <2e-16 ***
# Exercise:Diet  4  0.107   0.027     0.8  0.532    
# Residuals     45  1.500   0.033                   
# ---
# Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Python code
import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols

# 문제 1 데이터
data1 = pd.DataFrame({
    'Fertilizer': ['A1']*8 + ['A2']*8 + ['A3']*8,
    'Soil': (['B1']*4 + ['B2']*4)*3,
    'Growth': [14,15,14,13, 17,18,19,16, 20,21,22,19,
               13,14,13,12, 16,17,16,15, 18,19,19,17]
})
model1 = ols('Growth ~ C(Fertilizer, Sum)*C(Soil, Sum)', data=data1).fit()
anova1 = sm.stats.anova_lm(model1, typ=2)
print(anova1)

# 문제 2 데이터
data2 = pd.DataFrame({
    'EduMethod': ['A1']*15 + ['A2']*15,
    'Tool': (['B1']*5 + ['B2']*5 + ['B3']*5)*2,
    'Score': [78,80,79,77,76, 81,82,83,80,79, 75,77,78,74,73,
              82,85,84,83,81, 86,88,87,85,84, 79,81,80,78,76]
})
model2 = ols('Score ~ C(EduMethod, Sum)*C(Tool, Sum)', data=data2).fit()
anova2 = sm.stats.anova_lm(model2, typ=2)
print(anova2)

# 문제 3 데이터
data3 = pd.DataFrame({
    'Exercise': ['A1']*18 + ['A2']*18 + ['A3']*18,
    'Diet': (['B1']*6 + ['B2']*6 + ['B3']*6)*3,
    'WeightLoss': [2.1,2.5,2.4,2.3,2.6,2.2, 2.8,3.0,2.9,3.1,3.2,2.7, 3.4,3.5,3.6,3.3,3.2,3.1,
                   3.1,3.4,3.3,3.2,3.5,3.0, 3.8,4.0,3.9,4.1,4.2,3.7, 4.4,4.6,4.5,4.3,4.2,4.1,
                   2.6,2.9,2.8,2.7,3.0,2.5, 3.4,3.7,3.6,3.5,3.8,3.3, 4.0,4.2,4.1,4.0,3.9,3.8]
})
model3 = ols('WeightLoss ~ C(Exercise, Sum)*C(Diet, Sum)', data=data3).fit()
anova3 = sm.stats.anova_lm(model3, typ=2)
print(anova3)

# 문제 1
#                                      sum_sq    df      F        PR(>F)
# C(Fertilizer, Sum)                 8.083333   2.0   3.88  3.971365e-02
# C(Soil, Sum)                       2.041667   1.0   1.96  1.785136e-01
# C(Fertilizer, Sum):C(Soil, Sum)  145.083333   2.0  69.64  3.368147e-09
# Residual                          18.750000  18.0    NaN           NaN

# 문제 2
#                                     sum_sq    df          F        PR(>F)
# C(EduMethod, Sum)               149.633333   1.0  49.877778  2.662336e-07
# C(Tool, Sum)                    205.066667   2.0  34.177778  9.483717e-08
# C(EduMethod, Sum):C(Tool, Sum)    4.266667   2.0   0.711111  5.011558e-01
# Residual                         72.000000  24.0        NaN           NaN

# 문제 3
#                                   sum_sq    df       F        PR(>F)
# C(Exercise, Sum)                8.463333   2.0  126.95  3.147375e-19
# C(Diet, Sum)                   11.463333   2.0  171.95  8.431946e-22
# C(Exercise, Sum):C(Diet, Sum)   0.106667   4.0    0.80  5.315947e-01
# Residual                        1.500000  45.0     NaN           NaN

[주의] 아래에 제시한 내용은 아직 추가 검증이 필요하지만, 참고용으로 좋은 방향으로 정리해 두었습니다.

 

전통적 셀 평균 기반 SS 계산 및 Sum-to-zero 대비 보정 결과, Type I vs. Type III 제곱합 분할, 그리고 R 및 Python의 기본 대비(default contrast)에 관한 분석


아래는 문제 1의 데이터를 예로 들어, 전통적 셀 평균 기반 SS 계산, Sum-to-zero 대비 적용 시 보정 결과, 그리고 Type I와 Type III 제곱합 분할 방식의 차이와 함께 R과 Python에서의 기본 대비(default contrast)에 대해 자세히 설명한 내용이다.

1. 데이터 개요

관측 데이터 (cm):

- 토양 B1  
  - 비료 A1: 14, 15, 14, 13  
  - 비료 A2: 17, 18, 19, 16  
  - 비료 A3: 20, 21, 22, 19  

- 토양 B2  
  - 비료 A1: 13, 14, 13, 12  
  - 비료 A2: 16, 17, 16, 15  
  - 비료 A3: 18, 19, 19, 17  

전체 관측수는  
\[
N = 3 \,(\text{비료 수준}) \times 2 \,(\text{토양 수준}) \times 4 \,(\text{반복}) = 24.
\]

전체 평균은  
\[
\bar{Y}=\frac{397}{24}\approx16.54167.
\]

2. 전통적 SS 계산 (셀 평균 기반)

 2-1. 각 그룹 평균 계산 (요인 A: 비료)

- 비료 A1  
  - 토양 B1: 14, 15, 14, 13 → 합계 = 56  
  - 토양 B2: 13, 14, 13, 12 → 합계 = 52  
  - 전체 합계: \(56+52=108\)  
  - 관측치 수: 8  
  - \(\bar{Y}_{A1} = \frac{108}{8} = 13.50.\)

- 비료 A2  
  - 토양 B1: 17, 18, 19, 16 → 합계 = 70  
  - 토양 B2: 16, 17, 16, 15 → 합계 = 64  
  - 전체 합계: \(70+64=134\)  
  - 관측치 수: 8  
  - \(\bar{Y}_{A2} = \frac{134}{8} = 16.75.\)

- 비료 A3  
  - 토양 B1: 20, 21, 22, 19 → 합계 = 82  
  - 토양 B2: 18, 19, 19, 17 → 합계 = 73  
  - 전체 합계: \(82+73=155\)  
  - 관측치 수: 8  
  - \(\bar{Y}_{A3} = \frac{155}{8} = 19.375.\)

 2-2. 전통적 SS 계산

요인 A에 대한 전통적 제곱합(SS)은 각 비료 수준의 평균과 전체 평균의 차이를 제곱한 값에 해당 수준의 관측치 수(여기서는 8)를 곱하여 계산한다.

\[
SS_{A}^{\text{trad}} = 8 \times \sum_{i=1}^{3} \left(\bar{Y}_{Ai} - \bar{Y}\right)^2.
\]

계산:

- A1:  
  \(\bar{Y}_{A1} - \bar{Y} = 13.50 - 16.54167 \approx -3.04167,\)  
  \((-3.04167)^2 \approx 9.250.\)

- A2:  
  \(\bar{Y}_{A2} - \bar{Y} = 16.75 - 16.54167 \approx 0.20833,\)  
  \((0.20833)^2 \approx 0.0434.\)

- A3:  
  \(\bar{Y}_{A3} - \bar{Y} = 19.375 - 16.54167 \approx 2.83333,\)  
  \((2.83333)^2 \approx 8.0278.\)

따라서,  
\[
SS_{A}^{\text{trad}} = 8 \times (9.250 + 0.0434 + 8.0278) \approx 8 \times 17.321 \approx 138.57.
\]

이 값은 전통적인 셀 평균 기반으로 계산한 요인 A의 SS다..

3. Sum-to-zero 대비 (contr.sum)를 적용한 경우

R에서 범주형 변수의 대비를 Sum-to-zero 방식(contr.sum)으로 설정하면,  
모든 수준의 효과의 합이 0가 되도록 모형이 구성된다.  
이 경우, 모형 추정 시 선형 변환(보정)이 발생하여, 최종 ANOVA 테이블에 보고되는 SS 값은 전통적 값에 일정한 보정(스케일 변환)이 적용된 값으로 나타난다.

문제 1의 R ANOVA 결과에서는  
\[
SS(\text{Fertilizer}) = 8.08333
\]
로 보고됩니다.  
즉, 전통적 SS 138.57에 대해 보정 계수를 적용하면  
\[
138.57 \div 17.125 \approx 8.08333
\]
가 되어, SS의 스케일이 달라지는 결과를 얻는다.  
균형 디자인에서는 F-통계량, 자유도, p-값은 동일하므로 실제 검정 결과에는 차이가 없으며, 단지 SS 값의 보고 스케일이 달라진다.

4. Type I vs. Type III 제곱합 분할 방식

 4-1. Type I 제곱합 (순차적 SS)
- 정의:  
  모형에 요인을 순차적으로 추가하면서 먼저 추가된 요인이 가능한 많은 분산을 설명하도록 하는 방식이다.
- 특징:  
  - 요인을 모형에 넣는 순서에 따라 SS가 달라진다.
  - 균형 디자인에서는 요인들이 직교(orthogonal)하므로 순서에 관계없이 결과가 동일하게 나오지만, 불균형 디자인에서는 순서의 영향을 받는다.
- R 기본:  
  R의 aov() 함수는 기본적으로 Type I 제곱합을 사용한다.

 4-2. Type III 제곱합 (조정된 SS)
- 정의:  
  각 요인의 효과를 다른 모든 요인의 영향을 고정한 상태에서 평가하는 방식이다.
- 특징:  
  - 요인의 순서에 영향을 받지 않으며, 불균형 디자인이나 교호작용이 있는 모형에서 "순수한" 요인 효과를 평가할 때 사용된다.
- 대비 설정의 영향:  
  Type III SS를 계산할 때는 일반적으로 sum-to-zero 대비(contr.sum)를 사용한다.  
  이 방식은 각 수준의 효과가 전체 평균으로부터 얼마나 벗어났는지를 직접 반영하므로 해석이 보다 직관적이다.

5. R과 Python에서의 기본 대비 설정

- R:  
  - 기본 대비는 treatment 대비(reference coding)이다.  
  - 만약 sum-to-zero 대비를 사용하려면,  
    ```r
    options(contrasts = c("contr.sum", "contr.poly"))
    ```  
    와 같이 명시적으로 설정해야 한다.

- Python (statsmodels):  
  - 기본적으로 범주형 변수에 대해 treatment 대비를 사용한다.  
  - 만약 sum-to-zero 대비를 적용하려면,  
    ```python
    C(variable, Sum)
    ```  
    와 같이 명시하면 된다.

6. 정리

1. 전통적 SS 계산 (셀 평균 기반):  
   - 각 그룹(비료 A1, A2, A3)의 평균과 전체 평균의 차이를 제곱하고, 각 그룹의 관측치 수(여기서는 8)를 곱하여 \(SS_{A}^{\text{trad}} \approx 138.57\)을 얻음.

2. Sum-to-zero 대비 적용:  
   - R에서 `options(contrasts = c("contr.sum", "contr.poly"))`와 같이 설정하면, 모형은 모든 수준의 효과 합이 0가 되는 조건 하에서 추정됨.  
   - 그 결과, ANOVA 결과에서 보고되는 SS 값은 보정된 스케일(예, 문제 1에서는 8.08333)으로 나타남.  
   - 균형 디자인에서는 F-통계량과 p-값은 동일하지만, SS의 스케일만 차이가 남.

3. Type I vs. Type III 제곱합 분할:  
   - Type I SS (순차적 SS):  
     - 요인을 순차적으로 모형에 추가하여 분산을 설명하는 방식.  
     - 균형 디자인에서는 결과가 동일하지만, 불균형 디자인에서는 순서에 따라 달라질 수 있음.
   - Type III SS (조정된 SS):  
     - 각 요인의 효과를 다른 요인의 영향을 고정한 상태에서 평가하는 방식.  
     - 일반적으로 sum-to-zero 대비와 함께 사용하며, 순서에 관계없이 "순수한" 요인 효과를 평가함.

4. 기본 대비 설정:  
   - R의 기본: treatment 대비  
   - Python의 기본 (statsmodels): treatment 대비  
   - Sum-to-zero 대비를 사용하려면 각각 명시적으로 설정해야 함.


이와 같이 전통적 SS 계산 방식과 sum-to-zero 대비 적용 시의 보정 결과, 그리고 Type I와 Type III 제곱합 분할 방식의 차이를 이해하면, 왜 수작업으로 단순 계산한 SS 값과 R 또는 Python 코드에서 보고되는 SS 값의 스케일이 다르게 나타나는지를 알 수 있다. 균형 디자인에서는 두 대비 방식이 F-통계량이나 p-값 등 실제 검정 결과에는 영향을 주지 않지만, 보고되는 SS 값의 크기는 대비 행렬의 스케일 보정에 따라 달라진다.