Loading [MathJax]/jax/output/CommonHTML/jax.js

AI/기초통계

[기초통계] 모평균 비교 :: 독립인 두 모집단에서 표본의 크기가 클 때 비교 :: R에서 확인하기 :: t.test() in R

슈퍼짱짱 2019. 11. 25. 08:00
반응형

이전 포스팅에서 자료수집과정에 따른 두 모집단 비교 방법에 대해 알아보았다.

이번에는 그 중 두 모집단이 독립일 경우에 모평균 차이를 추론하는 방법에 대해 알아보겠다.


>> 두 모집단 비교 방법 바로가기


두 개의 독립 표본에서 모평균 차이 추론하는 방법


우선 두 모집단으로부터 추출된 표본과 그로부터 계산되는 통계량은 다음과 같다.


X1,,Xn1 : 평균이 μ1이고 표준편차가 σ1인 모집단으로부터 추출된 표본

ˉX=1n1n1i=1Xis21=1n11n1i=1(XiˉX)2


Y1,,Yn2 : 평균이 μ2이고 표준편차가 σ2인 모집단으로부터 추출된 표본

ˉY=1n2n2i=1Yis22=1n21n2i=1(YiˉY)2


여기서 우리의 관심사는 두 모집단의 평균 반응값의 차이이다. 즉, 모수 μ1μ2에 대한 추론이다.



모평균의 차(μ1μ2)에 대한 추론은 표본의 크기가 충분히 클 때와 작을 때로 나뉜다.


1. 표본의 크기가 클 때


두 모평균의 차 (μ1μ2)에 대한 추론을 위해서는 두 표본평균의 차 (ˉXˉY)를 이용한다. 두 표본의 크기 μ1,μ2가 모두 큰 경우(30 이상)에는 중심극한정리에 의해 ˉXˉY는 근사적으로 정규분포를 따른다.

ˉXN(μ1,σ21n1), ˉYN(μ2,σ22n2) 


여기서 중요한 정규분포의 특징은 다음과 같다.


두 개의 확률변수 X, Y가 서로 독립이고 다음과 같이 정규분포를 따를 때

XN(μ1,σ21), YN(μ2,σ22) 

두 변수의 합과 차는 각각 정규분포를 따르고, 평균은 μ1±μ2, 분산은 σ1+σ2이 된다. 이를 기호로 나타내면 다음과 같다.

(X±Y)N(μ1±μ2,σ1+σ2)


위의 특징으로 두 표본은 서로 독립이기때문에 두 표본평균의 차인 ˉXˉY도 다음과 같은 정규분포를 따른다.

(ˉXˉY)N(μ1μ2,σ21n1+σ22n2)


모분산을 모를 때에는 이를 표본분산으로 대체해도 다음과 같이 근사적으로 표준정규분포를 따른다.

Z=(ˉXˉY)(μ1μ2)s21/n1+s22/n2N(0,1)


이를 바탕으로 (μ1μ2)에 대한 신뢰구간은 다음과 같다.


* 모평균의 차 (μ1μ2)에 대한 신뢰구간(표본의 크기가 클 때)


표본의 크기 n1,n2가 모두 30 이상일 때 (μ1μ2)에 대한 100(1α) 신뢰구간은

((ˉXˉY)zα/2×s21n1+s22n2, (ˉXˉY)+zα/2×s21n1+s22n2)

혹은

(ˉXˉY)±zα/2×s21n1+s22n2

이다.


표본의 크기가 클 때 두 모평균의 차에 대한 검정은 다음과 같이 한다.


* H0 : μ1μ2=δ0에 대한 검정


표본의 크기 n1,n2가 모두 30이상 일 때 가설 H0 : μ1μ2=δ0에 대한 검정통계량을 다음과 같다.

Z=(ˉXˉY)δ0s21/n1+s22/n2

검정통계량의 분포는 H0이 맞을 때 N(0, 1)을 따른다. 각 대립가설에 대해 유의수준 α를 갖는 기각역은 다음과 같다.

H1 : μ1μ2<δ0R : Zzα

H1 : μ1μ2>δ0R : Zzα

H1 : μ1μ2δ0R : |Z|zα/2




위 정규분포의 특징을 R에서 확인해보면 다음과 같다.


예를 들어, 평균이 5이고 표준편차가 1인 정규분포를 따르는 모집단 X와, 평균이 3이고 표준편차가 2인 정규분포를 따르는 모집단 Y에서 각각 30개의 표본을 뽑아 평균을 구했다.

XN(5,12), YN(3,22)

이론상, ˉXˉY의 분포는 다음과 같을 것이다.

ˉXN(5,12/30), ˉYN(3,22/30)

이를 R에서 확인해보면 다음과 같다.


1
2
3
4
5
6
7
8
9
10
11
x_mu <- 5; x_sigma <- 1
y_mu <- 3; y_sigma <- 2
 
x_bar <- c()
y_bar <- c()
 
n <- 30
for (i in 1:1000) {
  x_bar <- c(x_bar,mean(rnorm(n, x_mu, x_sigma)))
  y_bar <- c(y_bar,mean(rnorm(n, y_mu, y_sigma)))
}
cs


> mean(x_bar) 

[1] 5.002784 # x_mu=5


> mean(y_bar) 

[1] 3.006945 # y_mu=3

 

> var(x_bar) 

[1] 0.03487879

> x_sigma^2/30 

[1] 0.03333333


> var(y_bar) 

[1] 0.1326863

> y_sigma^2/30

[1] 0.1333333


이론상의 ˉXˉY의 분포가 실제로도 잘 맞는 것을 확인할 수 있다.

이를 그래프로 그려보면 다음과 같다.


() X의 분포

() 계산된 ˉX의 분포

(--) 이론상ˉX의 분포


1
2
3
4
5
6
7
plot(seq(-5,10,length.out = 200),
      dnorm(seq(-5,10,length.out = 200),x_mu,x_sigma), 
      type="l", ylim = c(0, max(density(x_bar)$y)), lwd=2)
lines(density(x_bar), type="l", col = "red", lwd=2)
lines(seq(-5,10,length.out = 200),
     dnorm(seq(-5,10,length.out = 200),x_mu,sqrt(x_sigma^2/n)), 
     type="l", ylim = c(0, max(density(x_bar)$y)), col = "blue", lwd = 2, lty=2)
cs


x_bar의 분포


예시의 ˉX의 분포와 이론상 ˉX의 분포가 거의 일치하는 것을 볼 수 있으며, X의 분포와 ˉX의 분포는 같은 평균을 갖지만, ˉX의 분산이 훨씬 작은 것을 볼 수 있다.


() Y의 분포

() 계산된 ˉY의 분포

(--) 이론상ˉY의 분포


1
2
3
4
5
6
7
plot(seq(-3,10,length.out = 200),
     dnorm(seq(-3,10,length.out = 200),y_mu,y_sigma), 
     type="l", ylim = c(0, max(density(y_bar)$y)), lwd=2)
lines(density(y_bar), type="l", col = "red", lwd=2)
lines(seq(-3,10,length.out = 200),
      dnorm(seq(-3,10,length.out = 200),y_mu,sqrt(y_sigma^2/n)), 
      type="l", ylim = c(0, max(density(y_bar)$y)), col = "blue", lwd = 2, lty=2)
cs


y_bar의 분포




(ˉXˉY)의 분포 역시 이론상 평균은 2(=5-3), 분산은 12/30+22/30인 정규분포를 따른다.


> mean(x_bar - y_bar)

[1] 1.995839 


> var(x_bar - y_bar) # 실제 값

[1] 0.1610267

> (x_sigma^2/n) + (y_sigma^2/n) # 이론상 계산값

[1] 0.1666667


() 이론상 (ˉXˉY)의 분포

(--) 계산된 (ˉXˉY)의 분포


1
2
3
4
plot(seq(-3,10,length.out = 200),
     dnorm(seq(-3,10,length.out = 200),(x_mu-y_mu),sqrt((x_sigma^2/n) + (y_sigma^2/n))), 
     type="l", lwd = 2)
lines(density(x_bar - y_bar), type="l", col = "red", lwd = 2, lty=2)
cs


x_bar - y_bar의 분포



Z=(ˉXˉY)(μ1μ2)σ21/n1+σ22/n2 역시 이론상 N(0, 1)을 따라야 한다. 

* 모분산(σ21,σ22)를 알고 있기 때문에 표본분산이 아닌 모분산 그대로 계산


> z <- ((x_bar - y_bar) - (x_mu - y_mu))/sqrt(x_sigma^2/n + y_sigma^2/n)


> mean(z)

[1] -0.0101931 # 0

> var(z)

[1] 0.9661604 # 1


() 이론상 Z의 분포 :: N(0, 1)

(--) 계산된 Z의 분포


1
2
3
4
plot(seq(-5,5,length.out = 200),
     dnorm(seq(-5,5,length.out = 200),0,1), 
     type="l", lwd = 2, ylim = c(0, max(density(z)$y)))
lines(density(z), type = "l", col = "red", lwd = 2, lty=2)
cs


z의 분포




신뢰구간의 의미 in R


위의 예시를 그대로 95% 신뢰구간을 구하면 다음과 같다.


1
2
l <- (x_bar - y_bar) - 1.96*sqrt((x_sigma^2/n) + (y_sigma^2/n))
u <- (x_bar - y_bar) + 1.96*sqrt((x_sigma^2/n) + (y_sigma^2/n))
cs


이론상 95% 신뢰구간이란 100개의 표본에 대한 각각의 신뢰구간 중 95개의 신뢰구간에 모평균의 차이값이 포함되어야 한다.


신뢰구간의 의미


위의 예시에서 이론상 1000개의 표본에 대해 각각 1000개의 신뢰구간이 있을 때 알고자 하는 모평균의 차이값이 포함되는 신뢰구간은 950개가 될 것이다.


> sum(l <= (x_mu - y_mu) & u >= (x_mu - y_mu))

[1] 945




모평균 비교검정 in R


실제 통계프로그램에서는 위의 식들을 일일이 계산하지 않고 이미 구현된 함수로 검정한다. R에서는 t.test()를 사용한다.


t.test(x, y = NULL,

       alternative = c("two.sided", "less", "greater"),

       mu = 0, paired = FALSE, var.equal = FALSE,

       conf.level = 0.95, ...)


alternative : "two.sided"(양측검정)/ "less", "greater"(단측검정)

mu : 검정하고자 하는 값

paired : 짝비교시 TURE

var.equal : 모표준편차가 같을 시 TURE

conf.level : α


예를 들어)

XN(453,802)YN(401,602)

인 두 모집단에 대해 

H0:μ1μ2=52

에 대해 검정한다고 하자.


1
2
3
4
5
6
7
x_mu <- 453; x_sigma <- 80; x_n <- 50
y_mu <- 401; y_sigma <- 60; y_n <- 100
 
x <- rnorm(x_n, x_mu, x_sigma)
y <- rnorm(y_n, y_mu, y_sigma)
 
t.test(x = x, y=y, mu=52)
cs


Welch Two Sample t-test


data:  x and y

t = -0.2832, df = 72.218, p-value = 0.7778

alternative hypothesis: true difference in means is not equal to 52

95 percent confidence interval:

 22.11602 74.44900

sample estimates:

mean of x mean of y 

 447.7554  399.4729 


p-value = 0.7778 > 0.05로 귀무가설을 기각하지 못한다.


위 표본에 대한 95% 신뢰구간을 직접 구해보면 다음과 같다.


> l <- (mean(x)-mean(y)) - 1.96*sqrt(var(x)/x_n + var(y)/y_n)

> u <- (mean(x)-mean(y)) + 1.96*sqrt(var(x)/x_n + var(y)/y_n)


> l

[1] 22.55394

> u

[1] 74.01107




표본이 작을 때 두 모집단 평균의 차이를 추론하는 방법은 다음 포스팅에서 다루도록 하겠다.


반응형