mmings_pring_day

[통계 데이터분석] 분산분석- 이원분산분석 본문

통계

[통계 데이터분석] 분산분석- 이원분산분석

mming_10 2024. 10. 17. 01:31

1. 이원분산분석 

- 이원분산분석) 집단을 구분하는 독립변수가 두 개인 경우에 '모집단 간 평균의 동일성'을 검정

-> 이원분산분석) 두 개의 주효과와 하나의 상호작용 효과를 검정/ 

   '두 개의 주효과검정' = '각 독립변수에 의해 만들어지는 집단 간 평균의 차이에 대한 검정'

  • 주효과 검정: 두 독립변수가 각각 개별적으로 종속변수에 유의한 영향을 미친느 검정하는 것
  • 상호작용 효과검정 : 두 독립변수의 조합이 종속변수와 유의한 영향관계를 갖는지 검정하는 것

-> 상호작용 효과검정이 존재함 = 독립변수와 종속변수 간의 관계 패턴이, 두 독립변수에 의해 만들어지는 집단 간 조합에 따라 달라지게 됨


[상호작용 효과]

(예- 학력 수준과 소득수준이 '인터넷 쇼핑몰 이용 횟수에 미치는 영향' 을 분석)

  • 독립변수: 학력 수준과 소득 수준
  • 종속변수: 인터넷 쇼핑몰 이용 횟수

- 학력 수준과 소득 수준, 이 두 변수 간의 상호작용 효과가 존재하면,

 -> '학력수준과 인터넷 쇼핑몰 이용 횟수'간의 관계 패턴은 '소득 수준'에 따라 달라짐 

 -> '소득수준과 인터넷 쇼핑몰 이용횟수 간의 관계 패턴' 역시 학력수준에 따라 달라짐

- 학력 수준과 소득 수준, 이 두 변수 간의 상호작용 효과가 존재하지 않으면,

 -> 관계 패턴의 변화는 없음

- 왼쪽 그래프) 상호작용효과가 존재하지 않는 경우 
 -> x 축 (독립변수 중 학력 변수)/ y축 (종속변수 중 인터넷 쇼핑몰 이용 횟수)
 -> 그래프 상에 포현된 세 개의 그래프는 '또다른 독립변수인 소득수준'의 3개의 범주를 의미함 

 -> 소득 수준 관점) 학력 수준에 관계 없이, 소득 수준이 '상'인 집단이 '가장 높은 인터넷 쇼핑몰 이용 횟수'를 보임
 -> 소득 수준 관점) 소득 수준이 '하'인 집단이 '가장 낮은 인터넷 쇼핑몰 이용 횟수'를 보임
 -> 중학교/ 고등학교/ 대학교/ 대학원 학력 집단 = 소득 수준이 '상'인 집단이 '인터넷 쇼핑몰 이용 횟수'가 가장 높고, 소득수준이 '하'인 집단이 '인터넷 쇼핑몰 이용 횟수'가 가장 낮음

 -> 학력 수준 관점) 소득 수준에 관계없이, '대학교 학력 집단'이 가장 높은 인터넷 쇼핑몰 이용횟수를 보이고 있고, '중학교 학력 집단'이 가장 낮은 인터넷 쇼핑몰 이용횟수를 나타내고 있음
=> 소득수준이 '상'인 집단에서, 가장 인터넷 이용 횟수가 높은 학력수준은 '대학교 학력 집단'이고, 가장 낮은 학력 집단은 '중학교 학력 집단' 
=> 소득수준이 '중'인 집단에서, 가장 인터넷 제품을 이용 횟수가 많은 학력수준은 '대학교 학력 집단'이고, 가장 낮은 학력 집단은 '중학교 학력 집단'
=> 소득수준이 '하'인 집단에서도 보임 
=> 소득 수준을 나타내는 세 개의 그래프 모양이 모두 유사한 패턴을 보임, 선의 간격도 서로 일정함
(* 이러한 패턴으로 보아, 학력 수준과 소득 수준에 상호작용 효과가 없다 */
상호작용 효과가 없을 때 '주효과'만으로 상황을 설명하는 것이 가능함!

-> 대학교 학력 수준을 가진 집단이 가장 자주 인터넷 쇼핑몰을 이용한다 고 말할 수 있음
-> 소득수준이 '상'인 집단이 가장 자주 인터넷 쇼핑몰을 이용한다 고 말할 수 있음
=> 종속변수에 대하여 '두 가지 독립변수' 가 아닌, '한 가지 독립변수' 만을 가지고도 얘기하는 것이 가능함!
- 오른쪽 그래프) 상호작용효과가 존재하는 경우
  ->  중학교 학력 집단 = 소득 수준이 '하'인 집단이 '인터넷 쇼핑몰 이용 빈도'가 가장 높고,
  -> 고등학교 학력 집단 = 소득수준이 '상'인 집단이 '인터넷 쇼핑몰 이용 빈도'가 가장 높음
  -> 대학교 학력 집단 = 소득수준이 '중'인 집단이 가장 자주 인터넷 쇼핑몰을 이용함
  -> 대학원 학력 집단 = 소득수준이 '상'인 집단이 가장 자주 인터넷 쇼핑몰을 이용함
(* 어느 특정 학력 집단이 인터넷 쇼핑몰 이용횟수가 가장 높다고 얘기할 수 없고, 어느 특정 소득수준 집단이 인터넷 쇼핑몰 이용 횟수가 가장 높다고 얘기할 수도 없음*)
=> 인터넷 쇼핑몰 이용 횟수는 '학력수준'과 '소득수준' 모두 의존해서 결정되기 때문임
=> 상호작용 효과가 존재하는 경우) 어느 하나의 독립변수 만으로 종속변수를 설명할 수 없음

 

 

[보충제 종류와 투여량에 따른 이원분산분석]

 

- ToothGrowth 데이터셋 이용 = 10마리의 기니피그를 대상으로 비타민 C가 이빨의 성장에 미치는 데이터를 저장함

- len 변수 = 이빨의 길이 (종속변수)

- supp 변수 = 비타민 C 보충제 (독립변수) -> 오렌지주스 형태 (OJ), 아스코르브산 형태 (VC)

- dose 변수 = 보충제의 투여량 (독립변수) -> 투여가 세 가지 수준으로 이루어짐

 

-> (숫자형) dose -> (범주형) dose 로 변환 = 0.5 (low)/ 1.0 (med)/ 2.0 (high)로 변환함 [factor]

#투여량의 값을 범주화함 
ToothGrowth$dose <- factor(ToothGrowth$dose, 
                           levels=c(0.5, 1.0, 2.0), labels=c("low", "med", "high"))
str(ToothGrowth)
ToothGrowth

 

 

- 두 독립변수에 의해 만들어지는 집단의 요약통계량 계산 (각 집단의 크기와 집단별 평균 및 표준편차 계산)

- with( ) 함수 = 특정 데이터셋으로부터 변수를 추출할 때, 데이터셋에 이름을 반복적으로 적는 불편함을 피해갈 수 있게 하는 함수

# with()함수의 첫번째 인수 = 데이터셋 이름 지정
# -> 다음부터는 데이터셋 이름 없이 바로 변수명을 지정해도, 해당 데이터셋으로부터 변수 추출 가능
# tapply()함수의 첫번째 인수 = 대상 벡터 지정
# tapply()함수의 두번째 인수 = 사용하고자 하는 집단 변수 지정
# tapply()함수의 세번째 인수 = 집단별로 적용할 함수 지정
# (1) length 함수 = 2개의 집단별로 관측값의 길이 추출
# (2) mean 함수 = 집단별 평균 계산
# (3) sd 함수 = 집단별 표준편차 계산

with(ToothGrowth, tapply(len, list(supp, dose), length))
# -> 투여량 별로 관측값의 개수가 출력됨
with(ToothGrowth, tapply(len, list(supp, dose), mean))
with(ToothGrowth, tapply(len, list(supp, dose), sd))

 

 

- 오렌지주스(OJ) 가 투여된 경우와 아스코르브산(VC) 이 투여된 경우, 이빨 성장에 미치는 영향 간의 차이 확인

-> 표본데이터의 한정된 얘기이긴 하지만, 보충제의 종류에 따라서 '이빨의 성장'은 영향을 받는다!

-> 투여제의 양에 따라서도 '이빨 성장'은 영향을 받는다

* 보충제 종류와는 관계없이, 투여량이 증가할수록 이빨 성장에 더 큰 영향을 끼침을 확인 가능

 

-> 보충제의 종류와 투여량 간에는 OJ vs VC = 'low','med' (대체로) 일 떈 OJ의영향이 큼, but 'High' 일 때, OJ < VC (상호작용효과 발생! )

# *상호작용 효과가 없으면 모든 범주에서 같은 결과 (OJ> VC)가 나옴!*

 

=> 표본 데이터에 한정되어 있기 때문에, 모집단으로 일반화하기 위헤서는 '이원분산분석'을 통한 가설 검증이 필요함!

 

 

- aov( ) 함수 = 이원분산분석 수행 함수

# aov()함수의 첫번째 인수(포뮬러 형식)= 종속변수(len)와 독립변수(supp*dose)
# aov()함수의 두번째 인수(data 인수)= 사용하고 있는 데이터셋 지정
# -> '*' = 개별 독립변수의 영향뿐만 아니라 독립변수 간의 모든 가능한 상호작용을 나타냄
# -> len ~ supp* dose= len ~ supp + dose + supp:dose
# -> supp:dose = supp와 dose 간의 상호작용을 의미함
# supp + dose= 주효과
# supp:dose= 상호작용효과

ToothGrowth.aov <- aov(len ~ supp * dose, data=ToothGrowth)
ToothGrowth.aov <- aov(len ~ supp + dose + supp:dose, data=ToothGrowth)
summary(ToothGrowth.aov)

# supp(보충제에 의한 주효과)

# dose(투여량에 의한 주효과)
# supp:dose= 보충제와 투여량 간 상호작용 효과
-> p 값의 크기가 모두 유의수준 0.05 보다 작으므로 '보충제/투여량/ 보충제 + 투여량 모두 이빨의 생장에 효과가 있다' 

(대립가설 채택) *귀무가설 = 주효과와 상호작용효과가 없다*

=> '기니피그의 이빨 성장은 보충제의 종류와 투여량에 따라서 달라지고, 보충제와 투여량의 조합에 의해서도 영향을 받음

 

- model.tables( ) 함수 = 각 효과에 따른 요약통계량 계산

# model.tables()함수의 첫번째 인수 = 분산분석 결과 생성된 모델 객체 지정
# model.tables()함수의 두번째 인수(type 인수) = 기능 함수 지정

model.tables(ToothGrowth.aov, type="means")

-> 보충제 별로 & 투여량 별로 & 보충제와 투여량의 상호작용 별로 해당되는 '집단'의 평균 값 계산되는 것을 확인 가능!

 

- [supp] : 오렌지주스 (OJ)가 아스코르브산(VC) 보다 기니피그의 이빨 성장에 더 큰 영향을 미침 (보충제의 주효과) 

- [dose] : 투여량이 많을수록 이빨의 길이는 더 길어진다 (투여량의 주효과)

- [supp:dose] : 전반적으로 오렌지주스(OJ)가 아스코르브산(VC) 보다 이빨 성장에 더 큰 영향을 미치긴 하지만, 이러한 영향관계 패턴을 투여량이 많은 경우에는 달라짐 (보충제 및 투여량의 상호작용효과)

 

- boxplot( ) 함수 = 주효과 및 상호작용 분석 결과를 시각적으로 확인

   -> 비타민 C 보충제와 투여량의 조합에 따른 이빨 성장의 정도를 시각적으로 파악해볼 수 있음

windows(width=7.0, height=5.5)
boxplot(len ~ supp * dose, data=ToothGrowth)

boxplot(len ~ supp * dose, data=ToothGrowth,
        col=c("deeppink", "yellowgreen"), las=1,
        xlab="Vitamin C Type", ylab="Tooth Growth",
        main="Effects of Vitamin C on Tooth Growth of Guinea Pigs")

- x 축 (보충제의 종류, 투여량의 조합에 따른 6개의 집단이 표시되어 있음)/ y 축 (이빨의 길이)

-> 투여량이 작거나 중간이 경우) 오렌지 주스의 영향이 더 크나, 투여량이 많은 경우 (high)에는 두 보충제의 영향이 비슷해짐

(상자도표) 투여량이 많은 경우에는 작거나 중간인 경우와 달리, 두 보충제가 이발의 성장에 미치는 영향이 비슷해짐


- interaction.plot( ) 함수 = 상호작용도표 그래프를 그려보면, 주효과와 상호작용효과를 선도표 형태로 시각적으로 표현 가능

windows(width=7.0, height=5.5)

# interaction.plot() 함수의 첫번째 인수(x.factor)= x 축에 위치할 집단변수 지정
# interaction.plot() 함수의 두번째 인수(trace.factor)= 그래프상에 선으로 그려질 집단변수 지정
# interaction.plot() 함수의 세번째 인수(respose)= 숫자 벡터인 반응변수 (종속변수) 지정
# interaction.plot() 함수의 추가적인 인수
# (1) type= 'b' => 점과 선을 모두 나타내기 위함
# (2) pch 인수 = 점의 모양 지정
# (3) trace.label 인수 = 범례의 제목 지정

interaction.plot(x.factor=ToothGrowth$dose, trace.factor=ToothGrowth$supp, 
                 response=ToothGrowth$len, las=1, type="b", lwd=1.5,
                 pch=c(1, 19), col=c("blue", "red"), trace.label="Supplement",
                 xlab="Dose Level", ylab="Tooth Length",
                 main="Interaction Plot for Tooth Growth of Guinea Pigs")

- > 투여량이 작거나 중간 수준) 이빨 성장에 미치는 오렌지주스(OJ)의 영향이 아스코브르산(VC) 보다 더 컸으나, 투여량이 많은 경우에는 그 차이가 매우 작긴 하지만 오히려 반대로! 아스코브르산(VC)의 영향이 더 크다 

=> 즉, '보충제와 투여량의 상호작용효과가 존재함' 을 그래프상에서 확인 가능!

(상호작용도표) 투여량이 많은 경우에는 작거나 중간인 경우와 달리, 두 보충제가 이발의 성장에 미치는 영향이 비슷해짐


- plotmeans( ) 함수 = 평균도표 그리는 함수 (독립변수의 조합별 평균과 신뢰구간, 그리고 표본 크기가 함꼐 표현됨) 

windows(width=7.0, height=5.5)
library(gplots)
# plotmeans() 함수의 첫번째 인수(포뮬러 형식) = 종속변수(len) ~ 독립변수(두 개의 독립변수의 모든 조합상)
# -> interaction() 함수 = 모든 조합상 표현 함수
# -> interaction() 함수의 인수 = 첫번째 독립변수, 두번째 독립변수, sep 인수
# --> sep 인수 = 두 독립변수 조합상을 연결할 때 사용할 구분자 (sep= " ", 공백으로 지정)
# --> 모든 조합상이 공백으로 연결되도록 함
# plotmeans() 함수의 두번째 인수 = 데이터셋 지정

# plotmeans() 함수의 인수(connect)= 선으로 연결할 집단평균의 인덱스 지정
# -> 비타민 C 보충제 별로 구별되도록 (평균값 연결하는) 그래프 생성
# -> 기본값은 'connect= TRUE' 로 모든 집단평균이 선으로 연결됨

plotmeans(len ~ interaction(supp, dose, sep=" "), data=ToothGrowth,
          connect=list(c(1,3,5), c(2,4,6)), col=c("red", "green3"), 
          barcol="royalblue", barwidth=3, las=1,
          xlab="Supplement and Dose Combination", ylab="Tooth Length",
          main="Means Plot for Tooth Growth of Guinea Pigs\nwith 95% CI of Mean")

 

-> 비타민 C 보충제의 유형과 투여량의 조합에 따른 모든 조합상을 데이터 값으로 갖는 벡터가 생성됨!

(평균도표) 투여량이 많은 경우에는 작거나 중간인 경우와 달리 두 보충제가 이빨의 성장에 미치는 영향이 비슷해짐


- coplot( ) 함수 = 조건부도표 또한 집단 간의 영향의 차이를 살펴보는 데 유용한 그래프를 만드는 함수

=> 두 개의 집단 변수 (독립변수)가 있을 때, 하나의 집단 변수를 기준으로, 남은 집단 변수와 종속변수 간의 관계를 산점도 형식으로 별도의 패널 그래프를 생성하는 함수

 

[보충별로 투여량과 이빨 성장 간의 관계를 나타내는 산점도 그래프]

windows(width=7.0, height=5.5)

# coplot()함수의 첫번째 인수(포뮬러 형식) = 종속변수 ~ 독립변수
# -> 'len ~ dose | supp' = 보충제별 투여량과 이빨 성장 간의 관계
# coplot()함수의 두번째 인수= 데이터셋 지정
# coplot()함수의 추가적인 인수 지정
# (1) col 인수 = 점의 색깔 지정/ pch 인수 = 점의 모양 지정
# (2) 'panel= panel.smooth' => 점들을 통과하흔 직선을 추가하기 위함
# (3) lwd 인수 = 선의 두께 지정
# (4) col.smooth 인수 = 선의 색상 지정

coplot(len ~ dose | supp, data=ToothGrowth, 
       pch=21, col="blue", bg="skyblue", 
       panel=panel.smooth, lwd=2, col.smooth="coral",
       xlab="Dose Level", ylab="Tooth Length")

-> 각 산점도) 보충제 투여량과 이빨 성장 길이 간의 관계를 보여줌

- > 조건부도표로부터 오렌지주스와 아스코르브산(보충제 종류별)이 이빨 성장에 미치는 영향은 투여량이 증가함에 따라 달라지는 것을 확인할 수 있음

(조건부도표) 투여량이 많은 경우에는 작거나 중간인 경우와 달리 두 보충제가 이빨의 성장에 미치는 영향이 비슷해진다


- interaction2wt( ) 함수 = 주효과와 상호작용 효과를 동시에 볼 수 있는 그래프를 생성하는 함수

* 좌하단과 우상단을 연결하는 대각선상의 상자도표는 '주효과'를 나타내며, 비대각선상의 선도표는 '상호작용효과'를 나타남.

library(HH)
interaction2wt(len ~ supp * dose, data= ToothGrowth)

 

- TukeyHSD( ) 함수 = 사훈분석을 통해 집단 간 차이에 대한 추가 검정을 수행할 수 있음

(상자도표와 선도표) 대각선상의 상자도표는 주효과를 나타내며, 비대각선상의 선도표는 상호작용 효과를 나타낸다. 투여량이 많은 경우엔 작거나 중간인 경우와 달리 두 보충제가 이빨의 성장에 미치는 영향이 비슷해짐


=> 이원분산분석의 결과로, '귀무가설을 기각하고, 대립가설을 채택'하게 되면, 일원분산분석 에서와 마찬가지로, 사후 분석을 통해

[집단 간 차이] 에 대한 추가 검증을 수행할 수 있음

=> 이원분산분석도, 일원분산분석과 마찬가지로 TukeyHSD( ) 함수 이용하여 사후 분석 수행

# TukeyHSD()함수 인수 = 분산분석의 결과로 생성된 모델 객체 지정
TukeyHSD(ToothGrowth.aov)

-> 주효과와 상호작용 효과 별로, 세부 집단별 차이에 대한 검정을 한 것을 볼 수 있음

*투여량의 세 가지 범주별로 p 값을 나타냄 = '투여량 별로 집단 간의 차이가 없다'는 귀무가설 기각 *

=> 투여량에 대한 주효과가 유의하다

 

- 투여량이 많은 경우, 오렌지주스와 아스코브르산 분산의 이빨 성장의 차이가 존재하지 않음!

 

- TukeyHSD( ) 함수는 달리 지정하지 않으면, 95% 신뢰구간을 계산함

-> conf.level 인수에 '95% 신뢰구간 이외의 다른 신뢰구간을 지정할 수 있음.

-> 모든 가능한 집단 간 비교를 원치 않으면  which 인수에 비교하고자 하는 집단 만을 지정

TukeyHSD(ToothGrowth.aov, which=c("dose"), conf.level=0.99)

-

-