2 단순 적합도 검정 #
단순 적합도 검정이란, 모집단의 기대도수가 특정한 형태를 따르지 않는 경우의 적합도 검정.
예제
8종류의 소주에 대한 소비자의 선호조 조사를 위해서 상표를 가리고 128명을 상대로 시음을 시킨다음 가장 좋아하는 소주를 선택하도록 하였다. 소주 맛에 대한 선호도의 차이가 있다고 할 수 있는가?
tmp <- textConnection(
"소주종류 관측도수
1 12
2 18
3 11
4 21
5 23
6 16
7 7
8 20")
x <- read.table(tmp, header=TRUE)
close.connection(tmp)
head(x)
소주의 선호도에 차이가 없다는 것은 선택의 비율이 같음을 말한다. 그러므로 각 소주의 기대 관측도수는 16이다.
> sum(x$관측도수) / nrow(x)
[1] 16
카이제곱 검정을 해보자.
기대도수 <- replicate(nrow(x), (sum(x$관측도수) / nrow(x)))
x <- cbind(x,e)
chisq.test(x=x$관측도수, y=x$기대도수)
결과
> chisq.test(x=x$관측도수, y=x$기대도수)
Chi-squared test for given probabilities
data: x$관측도수
X-squared = 13.5, df = 7, p-value = 0.06082
결과해석
- 귀무가설: 차이가 없다. (소주 선호도의 차이는 없다)
- 대립가설: (소주 선호도의 차이가 있다)
- p-value가 0.06082로 유의수준 0.05에서 귀무가설 지지
3 독립성 검정 #
여기(http://freesearch.pe.kr/archives/2555)의 데이터를 이용해 보자.
tmp <- textConnection(
"교육수준 흡연실태 사원수
대졸 과흡연 51
고졸 과흡연 22
중졸 과흡연 43
대졸 흡연 92
고졸 흡연 21
중졸 흡연 28
대졸 비흡연 68
고졸 비흡연 9
중졸 비흡연 22")
x <- read.table(tmp, header=TRUE)
close.connection(tmp)
head(x)
t <- xtabs(사원수~교육수준+흡연실태, data=x)
t
결과
> t
흡연실태
교육수준 과흡연 비흡연 흡연
고졸 22 9 21
대졸 51 68 92
중졸 43 22 28
기대값은 다음의 집계를 이용하여 비(ratio)를 계산하면 된다.
> apply(t, 1, sum)
과흡연 비흡연 흡연
116 99 141
> apply(t, 2, sum)
고졸 대졸 중졸
52 211 93
만약, 교육수준과 흡연이 상관없을 가정해보자. 무작위로 사원들을 30명 뽑아 교육수준을 살펴보면 전체(고졸:대졸:중졸 = 52:211:93)와 유사한 형태를 띌 것이다. 이런 의미에서 기대값과 관측값에 유의미한 차이가 없으면 독립성이 있다는 것이다. 하지만, 기대값과 관측값에 유의미한 차이가 있다면 변수간에 서로 영향을 주는 것이다. 즉, 독립이 아니다.
기대값을 계산해보자. 전체:흡연 = 356:141다. 그러므로 흡연자중 중졸인 사람들은 356:141 = 93:x 즉, x = 141 * 93 / 356 = 36.8347이다. 이렇게 일일이 계산하는게 짜증나니까 통계패캐지를 이용하는 거다. R에서 summary(xtabs())하면 독립성 su검정을 그냥 끝난다.
> summary(t)
Call: xtabs(formula = 사원수 ~ 교육수준 + 흡연실태, data = x)
Number of cases in table: 356
Number of factors: 2
Test for independence of all factors:
Chisq = 18.51, df = 4, p-value = 0.0009808
- 귀무가설: 교육수준은 흡연에 영향을 끼치지 않는다. (독립이다, 관측값과 기대값의 차이가 없다)
- 대립가설: 교육수준은 흡연에 영향을 끼친다. (독립이 아니다, 관측값과 기대값의 차이가 있다)
- p-value = 0.0009808, 귀무가설 기각
책에 보니 '기대도수 5이하인 cell이 전체의 20%가 넘으면 fisher의 exact test'를 쓰라고 되어있다. fisher의 exact test(
fisher.test)는 초기하분포를 이용하여 p-value를 계산한다고 한다.
4 적합성 검정 #
다음의 A는 모집단의 기대도수이고, B는 표본의 관측도수다. 표본이 모집단과 같은 분포 형태를 가지는지 검정해보자.
tmp <- textConnection(
"A B
829 772
217 211
110 111
79 59
61 73
45 41
37 42
23 32
21 21
17 18
")
x <- read.table(tmp, header=TRUE)
close.connection(tmp)
plot(x$A)
lines(1:nrow(x), x$B)
v <- x$B
e <- x$A/sum(x$A)
chisq.test(v, p=e)
결과
> chisq.test(v, p=e)
Chi-squared test for given probabilities
data: v
X-squared = 14.2971, df = 9, p-value = 0.1121
- 귀무가설: A와 B는 차이가 있다. --> p-value = 0.1121로 유의수준 0.05에서 귀무가설 지지
- 대립가설: A와 B는 차이가 없다.
어느 부분에 차이가 있나?
분모 <- c(x$A[1], x$B[1]) #첫 번째 행이 분모인 경우
# 분모 <- c(sum(x$A), sum(x$B)) #전체 sum이 분모인경우
for(i in 2:nrow(x)){
분자 <- c(x$A[i], x$B[i])
#pval <- poisson.test(분자, 분모)$p.value * (nrow(x)-1) # nrow(x)-1 은 bonferroni conrrection
pval <- prop.test(분자, 분모)$p.value * (nrow(x)-1) # nrow(x)-1 은 bonferroni conrrection
print(paste0(i, "=", pval))
}
5 동질성 검정 #
안락사에 대한 여론조사 결과다.
tmp <- textConnection(
"종교 찬성여부 사람수
기독교 찬성 175
기독교 반대 125
천주교 찬성 100
천주교 반대 100
불교 찬성 160
불교 반대 140
무교 찬성 250
무교 반대 150")
x <- read.table(tmp, header=TRUE)
close.connection(tmp)
summary(xtabs(사람수~종교+찬성여부, data=x))
결과
> summary(xtabs(사람수~종교+찬성여부, data=x))
Call: xtabs(formula = 사람수 ~ 종교 + 찬성여부, data = x)
Number of cases in table: 1200
Number of factors: 2
Test for independence of all factors:
Chisq = 10.8, df = 3, p-value = 0.01286
- 귀무가설: 종교와 관계없이 안락사에 대한 의견은 동일하다.
- 대립가설: 종교와 관계없이 안락사에 대한 의견은 동일하지 않다.
- p-value = 0.01286로 유의수준 0.05에서 귀무가설 기각