brunch

빅분기 실기연습(3)

R프로그램_분산 분석(세 개 그룹의 평균 비교)

by 첨물

이번에 세 개의 그룹의 처음 상태의 몸무게와 거식증 치료 방법에 따른 몸무게 변화에 대해 boxplot 및 일원 분산 분석을 통해 유의한 결과를 가지는지 보도록 하겠다.


먼저 데이터는 R에 있는 anorexia를 불러오기


data(anorexia,package="MASS")

anorexia

df<-anorexia


> anorexia

Treat Prewt Postwt

1 Cont 80.7 80.2

2 Cont 89.4 80.1

3 Cont 91.8 86.4

4 Cont 74.0 86.3

5 Cont 78.1 76.1

6 Cont 88.3 78.1

7 Cont 87.3 75.1

8 Cont 75.1 86.7

9 Cont 80.6 73.5

10 Cont 78.4 84.6

11 Cont 77.6 77.4

12 Cont 88.7 79.5

13 Cont 81.3 89.6

14 Cont 78.1 81.4

15 Cont 70.5 81.8

16 Cont 77.3 77.3

17 Cont 85.2 84.2

18 Cont 86.0 75.4

19 Cont 84.1 79.5

20 Cont 79.7 73.0

21 Cont 85.5 88.3

22 Cont 84.4 84.7

23 Cont 79.6 81.4

24 Cont 77.5 81.2

25 Cont 72.3 88.2

26 Cont 89.0 78.8

27 CBT 80.5 82.2

28 CBT 84.9 85.6

29 CBT 81.5 81.4

30 CBT 82.6 81.9

31 CBT 79.9 76.4

32 CBT 88.7 103.6

33 CBT 94.9 98.4

34 CBT 76.3 93.4

35 CBT 81.0 73.4

36 CBT 80.5 82.1

37 CBT 85.0 96.7

38 CBT 89.2 95.3

39 CBT 81.3 82.4

40 CBT 76.5 72.5

41 CBT 70.0 90.9

42 CBT 80.4 71.3

43 CBT 83.3 85.4

44 CBT 83.0 81.6

45 CBT 87.7 89.1

46 CBT 84.2 83.9

47 CBT 86.4 82.7

48 CBT 76.5 75.7

49 CBT 80.2 82.6

50 CBT 87.8 100.4

51 CBT 83.3 85.2

52 CBT 79.7 83.6

53 CBT 84.5 84.6

54 CBT 80.8 96.2

55 CBT 87.4 86.7

56 FT 83.8 95.2

57 FT 83.3 94.3

58 FT 86.0 91.5

59 FT 82.5 91.9

60 FT 86.7 100.3

61 FT 79.6 76.7

62 FT 76.9 76.8

63 FT 94.2 101.6

64 FT 73.4 94.9

65 FT 80.5 75.2

66 FT 81.6 77.8

67 FT 82.1 95.5

68 FT 77.6 90.7

69 FT 83.5 92.5

70 FT 89.9 93.8

71 FT 86.0 91.7

72 FT 87.3 98.0


여기서 Cont는 대조군, CBT는 인지치료, FT는 가족치료이고 치료 전후 몸무게가 Prewet과 Postwet으로 구별되어 있음



그리고 분산분석을 하기 위하여 패키지를 불러옴 (lawstat)


install.packages("lawstat")

library(lawstat)


세 그룹 간의 평균을 비교하기 위해서는 각 그룹이 분산 정도가 등분산성인지 먼저 검증해야 함.

leventest라는 것이고, p>0.05 보다 커야 등분산성임 (여기서는 0.1785)


leveneTest(Postwt~Treat,data=anorexia)


> leveneTest(Postwt~Treat,data=anorexia)

Levene's Test for Homogeneity of Variance (center = median)

Df F value Pr(>F)

group 2 1.7671 0.1785


69


다음은 세 개의 그룹의 평균을 비교하기에 앞서 boxplot으로 그래프를 그려서 대충 결과를 알아보자


boxplot(Prewt~Treat,data=anorexia)

boxplot(Postwt~Treat,data=anorexia)


음... 치료 전 세 그룹은 몸무게가 비슷한데, 치료 후 FT 그룹만 약간 올라간 느낌이 든다.


좀 더 Boxplot을 예쁘게 그려보자


boxplot(df[,-1], boxfill = NA, border = NA) #빈 박스 그리기


boxplot(df[df$Treat=="Cont", -1], xaxt = "n", add = TRUE, boxfill="red",

boxwex=0.15, at = 1:ncol(df[,-1]) - 0.25) #shift these left by -0.15

boxplot(df[df$Treat=="CBT", -1], xaxt = "n", add = TRUE, boxfill="blue",

boxwex=0.15, at = 1:ncol(df[,-1]) + 0) #shift to the right by +0.15

boxplot(df[df$Treat=="FT", -1], xaxt = "n", add = TRUE, boxfill="green",

boxwex=0.15, at = 1:ncol(df[,-1]) + 0.25) #shift to the right by +0.15

#세 개의 그룹을 R, G, B 색을 넣어 치료 전, 후 그래프 그리기

legend("topleft",legend=c("대조군","인지치료", "가족치료"),fill=c("red","blue", "green"),border="white",box.lty=1,cex=1)

#범례 표시하기

음. 이렇게 보니, 확실히 치료 전 세 개의 그룹은 몸무게가 비슷했지만 가족치료를 받은 그룹만 몸무게가 늘었다는 것을 알 수 있었다.


그러면 치료 전 세 개의 그룹의 평균을 비교해보고, 치료 후 세 개의 그룹의 몸무게의 평균은 차이가 있는지를 알아보자.




#일원분산분석(aov 함수)

out1=aov(Prewt~Treat,data=df)

out1

summary(out1)

out2=aov(Postwt~Treat,data=df)

out2

summary(out2)


> summary(out1)

Df Sum Sq Mean Sq F value Pr(>F)

Treat 2 32.6 16.29 0.599 0.552

Residuals 69 1874.3 27.16


> summary(out2)

Df Sum Sq Mean Sq F value Pr(>F)

Treat 2 919 459.5 8.651 0.000444 ***

Residuals 69 3665 53.1

---

Signif. codes:

0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1



치료 전 세 그룹의 몸무게의 평균은 유의차 없음 (p=0.552>0.05)

치료 후 세 그룹의 몸무게의 평균은 유의차 있음 (p=0.000444<0.05)


그런데 이렇게 세 개 그룹의 평균 비교 함수는 aov 이외 anova와 oneway 도 있다.



#일원분산분석(anova 함수)

out3=anova(lm(Prewt~Treat,data=df))

out4=anova(lm(Postwt~Treat,data=df))

summary(out3)

summary(out4)


#일원분산분석(oneway.test 함수)

out5=oneway.test(Prewt~Treat,data=df)

out6=oneway.test(Postwt~Treat,data=df)

summary(out5)

summary(out6)

keyword
매거진의 이전글빅분기 실기연습(2)