주의사항: 본 블로그 내용은 통계 학습차원에서 정리한 내용이며, 틀린 내용이 포함될 수 있습니다. 혹시 틀린 내용이 있다면 알려주세요. 감사합니다.
95% 신뢰구간의 내용을 정리한다.
참고한 책은 다음과 같다.
’95% 신뢰구간’에 대한 핵심 내용은 보건의학통계에 정리가 잘 되어 있다. 이 내용을 위주로 재정리한다.
통계는 크게 기술통계와 추리통계로 구분된다. 추리통계는 다시 검정과 추정으로 구분할 수 있다.
검정은 샘플로 모집단을 추정하는 방법의 하나이다. 예를 들어 한 반의 인원이 60명이다. 이 반의 수학 평균이 70점일거라고 가정한다. 70점이 정말 맞는지 확인하는 방법으로 전체 학생의 성적을 모두 더해서 60명으로 나눈 평균을 구하면 된다. 그런데, 시간과 비용이 많이 든다. 10명을 무작위 샘플로 성적의 평균을 구했더니 65점이 나왔다. 그럼, 70점이라고 가정한 내용이 맞는가? 이를 해결하는 방법이 통계학에서는 ’가설검정’이라고 부른다.
추정도 마찬가지로 샘플에서 모집단을 추정하는 방법이다. 점추정(point estimation)과 구간추정(inverval estimation)이 있다. 추정은 가설검정과 같이 가설(가정)이 없다. 예를들어, 한 반의 인원이 60명이고 그 중 10명의 수학 성적 평균이 65점이다. 평균을 65점이라고 믿는 것을 점추정(point estimation)이라고 한다. 그런데, 정말 65점이라고 꼭 집어서 이야기하기 보다는 ~보다 크고 ~보다 작다고 이야기 하는 것이 좀더 설득력이 있지 않을까? 예를 들어, 60~70점 사이라고 이야기하면 이것을 신뢰구간(confidence interval)이라고 한다. 신뢰구간을 구할 때, 먼저 신뢰수준을 정한다. 예를 들어 95%수준이라고 믿음의 정도를 주는 것이다.
그럼, 수학 성적의 ’95% 신뢰구간’은 어떻게 되는가? 예를 들어, 60~70점 사이이다. 라고 구하는 것이 신뢰구간이 된다. 신뢰구간은 대표적인 구간추정이다.
95%가 의미하는 것은 무엇일까? 샘플에서 구한 평균값으로 모집단 평균값의 구간추정을 할 때, 이 구간안에 모집단 평균값이 들어 있어야 하는데… 모집단 평균값이 없을 수도 있다. 100번 구간추정을 해서 100개의 신뢰구간을 구했을 때, 이 중 95개의 신뢰구간에는 모평균값이 들어 있다고 판단하는 것이 95%의 의미이다.
모평균의 95% 신뢰구간을 구해보자. 샘플의 수가 10이고, 평균은 65, 표준편차는 5라고 하자. 95% 신뢰구간은 다음과 같다.
# p(a < mu < b) = 0.95
# p(-.196 < (x - mu) / sigma < 1.96) = 0.95
# mu - 1.96 * sigma < x < mu + 1.96 * sigma
n <- 10
mu <- 65
sigma <- sqrt(5^2 / n)
interval <- mu + c(-1.96, 1.96) * sigma
interval
## [1] 61.90097 68.09903
즉, 95% 신뢰구간은 62~68점이라고 보면 된다.
이번에는 1000명의 학생이 있고, 모평균이 65, 편차가 5라고 모수를 가정하자. 여기서 무작위 비복원 샘플링을 하고 샘플의 평균과 분산을 이용해 95% 신뢰구간을 구해보자. 이걸 100번 시도해본다. 이렇게 구한 신뢰구간에 모수가 몇번이나 포함되는지 시뮬레이션 해보자.
set.seed(3456)
score <- rnorm(1000, mean = 65, sd = 5) # 1000명의 학생의 성적 (모집단)
hist(score)
score_mean <- mean(score) # 모집단의 평균
score_sd <- sd(score) # 모집단의 표준편차
score_mean
## [1] 65.09506
score_sd
## [1] 5.060097
# 30명을 무작위로 추출한다. (샘플)
n <- 30 # 샘플 수
try_count <- 100 # 시행 횟수
result <- c() # 모집단의 평균이 신뢰구간에 포함되는지의 결과값
for(i in 1:try_count)
{
sample_score <- sample(score, n, replace = FALSE) # 무작위 비복원 샘플링 수행
sample_mean <- mean(sample_score) # 샘플의 평균
sample_sd <- sd(sample_score) # 샘플의 표준편차
interval_low <- sample_mean - 1.96 * sample_sd / sqrt(n) # 샘플의 신뢰구간 하한값 (신뢰한계)
interval_high <- sample_mean + 1.96 * sample_sd / sqrt(n) # 샘플의 신뢰구간 상한값 (신뢰한계)
# 만약 샘플의 신뢰구간안에 모집단의 평균이 포함되면 1을 아니면 0을 결과에 추가한다.
in_score <- (score_mean >= interval_low && score_mean <= interval_high)
result <- c(result, in_score)
}
result
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [13] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [25] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [37] TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [49] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [61] TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [73] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [85] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [97] TRUE TRUE TRUE TRUE
sum(result)
## [1] 98
즉, 1번 샘플링 할 때 30를 뽑아서 신뢰구간을 얻고, 이를 100번 시도해서 100개의 신뢰구간을 얻었는데, 신뢰구간안에 모집단의 평균이 포함된 횟수가 93번이다.
모집단의 표준편차에 따라서 모집단의 신뢰구간이 달라질까? 예제를 다시 보자.
# 모집단, 시행횟수, 샘플수
getCICount <- function(score, try_count, n)
{
score_mean <- mean(score) # 모집단의 평균값
result <- c() # 모집단의 평균이 신뢰구간에 포함되는지의 결과값
for(i in 1:try_count)
{
sample_score <- sample(score, n, replace = FALSE) # 무작위 비복원 샘플링 수행
sample_mean <- mean(sample_score) # 샘플의 평균
sample_sd <- sd(sample_score) # 샘플의 표준편차
# qnorm(0.025): -1.959
interval_low <- sample_mean - 1.96 * sample_sd / sqrt(n) # 샘플의 신뢰구간 하한값 (신뢰한계)
interval_high <- sample_mean + 1.96 * sample_sd / sqrt(n) # 샘플의 신뢰구간 상한값 (신뢰한계)
# 만약 샘플의 신뢰구간안에 모집단의 평균이 포함되면 1을 아니면 0을 결과에 추가한다.
in_score <- (score_mean >= interval_low && score_mean <= interval_high)
result <- c(result, in_score)
}
return (mean(result))
}
# 모집단의 표준편차를 0.5에서 10까지 0.2씩 증가시켜 모집단을 생성한다.
p_sd <- seq(0.5,10, by=0.2)
try_count <- 100 # 샘플링 시도 횟수
n <- 30 # 샘플수
# 모집단의 평균이 신뢰구간안에 들어 있는 비율
ratio_interval <- c()
for(i in p_sd)
{
score <- rnorm(10000, mean = 65, sd = i) # 1000명의 학생의 성적 (모집단), 편차를 달리해서 생성한다.
ratio <- getCICount(score, try_count, n) # 시뮬레이션 결과값, 모집단 평균이 신뢰구간안에 들어 있는 횟수
ratio_interval <- c(ratio_interval, ratio)
}
library(ggplot2)
g <- ggplot(data.frame(x = p_sd, y = ratio_interval), aes(x = x, y = y, group = 1)) + geom_line()
g <- g + labs(title = "모의실험", x = "모집단의 편차", y="신뢰구간에 포함된 비율")
#g <- g + theme(text = element_text(family = "나눔명조")) # for windows
g <- g + theme(text = element_text(family = "NanumGothic")) # for mac
g
mean(ratio_interval)
## [1] 0.940625
모집단의 표준편차하고 상관없이 샘플을 이용한 신뢰구간의 95% 정도는 거의 유사함을 알 수 있다.
신뢰구간에는 표준편차가 사용되는데, 모집단의 표준편차를 알면 모집단의 표준편차를 사용하면 되고, 모를 경우 샘플의 불편분산을 이용하면 된다. 모집단의 표준편차가 무엇인지도 모르고 샘플 수도 30미만이면 정규분포를 이용한 신뢰구간을 구하는 것이 아니라 t-분포의 신뢰구간을 구한다.
t-분포 예를 보자. 아침에 출근버스를 기다리는데 10일동안 평균을 내보니 6시 25분에 도착한다. 표본의 편차가 2분이라고 할 경우, 도착시간의 95% 신뢰구간을 구해보자.
# 1. 모집단 통계를 선택
# 도착시간을 모집단이라고 하고, 도착 평균시간 mu에 대한 신뢰구간을 설정한다.
s_mean <- 0
s_sd <- 2
n <- 10
# 2. 표본분포 선택
# 모집단의 편차를 모르고, 샘플수도 30보다 작으니까 t-분포를 사용한다.
# X_bar ~ t(9)
# 3. 신뢰수준은 95%이다.
tc <- c(1, -1) * qt(0.025, df=(n-1))
interval <- s_mean + tc * s_sd / sqrt(n)
interval
## [1] -1.430714 1.430714
즉, 6시 23분~6시 27분 사이에는 버스가 도착할 가능성이 95% 정도 된다고 볼 수 있다.
다른 예제를 하나 더 보자. Galton의 데이터는 아버지와 자식의 키에 대한 정보가 있다. 자식의 키에 대한 95% 신뢰구간을 구해라.
library(UsingR)
data(galton)
x <- galton$child
interval <- mean(x) + c(-1, 1) * qnorm(0.975) * sd(x) / sqrt(length(x))
interval
## [1] 67.92647 68.25047