Last Updated: 2022-02-28
Population(모집단), Sampling(표본추출), Probability Sampling(확률표본추출), Sample(표본), Sample size(표본크기) 의 용어를 알아보고 Standard Error(표준오차) 가 무엇인지 알아봅니다. 그리고 MIT 6.0002 강의 8번의 내용 일부를 Python 에서 R 로 옮겼습니다.
Popuation은 일일 최고 기온의 전체 집합이 되며, 이에 대한 Histogram 은 아래와 같다.
population = read.csv("data/temperatures.csv")
temp <- population$TEMP # 모집단: 일일 최고기온
hist(temp, main="Daily High 1961-2015, Population", breaks = 100)
# 모집단 평균
popMean <- mean(temp) # 모집단 평균
popSD <- sd(temp) # 모집단 표준편차
모집단의 모평균은 16.3 이고, 모표준편차는 9.44 이다.
샘플링 방법
set.seed(2021)
sampleSize <- 100 # 표본크기
sampleSet <- sample(temp, sampleSize, replace = FALSE) # 비복원 추출
hist(sampleSet, main="Daily High 1961-2015, Sample", breaks = 50)
# sample 평균
sampleMean = mean(sampleSet)
sampleSD <- sd(sampleSet)
모집단과 샘플의 평균, 표준편차를 비교한다.
16.3, 모표준편차(\(\sqrt{Var(X)} = \sigma\)) = 9.4415.31, 표본표준편차(\(s\)) = 11.61, 표준오차(Standar Error) = \(\sigma / \sqrt{n}= s / \sqrt{n}\) = 1.16하나의 표본은 100개의 원소로 구성되어 있다. 이와 같은 표본의 평균을 구하고, 이 작업을 1000번 반복한다. 그리고 이렇게 구한 표본평균 1000개에 대한 히스토그램을 그린다.
numTrials <- 1000
sampleMeans <- sapply(1:numTrials, function(i) mean(sample(temp, sampleSize, replace=FALSE)))
hist(sampleMeans, main="Means of Samples", breaks = 100)
sampleMeansMean = mean(sampleMeans) # 표본평균의 평균
sampleMeansSD = sd(sampleMeans) # 표본평균의 표준편차
표본평균의 평균은 16.35 이고, 표본평균의 표준편차는 0.95 이다.
16.3, 모표준편차 = 9.44,15.31, 표본표준편차 = 11.61,16.35, 표본평균 분포의 표준편차 = 0.9514.49 ~ 18.2114.08 ~ 16.54모평균이 표본평균의 95% 신뢰구간에 포함되기는 하지만, 범위가 너무 크다. 범위를 좁히려면?
# 1) 표본추출 횟수를 1000 에서 2000 으로 증가시킨다.
numTrials <- 2000
sampleSize <- 100
sampleMeans <- sapply(1:numTrials, function(i) mean(sample(temp, sampleSize, replace=FALSE)))
sampleSD1 = sd(sampleMeans) # 표본평균의 표준편차
# 2) 표본크기를 100에서 200으로 증가시킨다.
numTrials <- 1000
sampleSize <- 2000
sampleMeans <- sapply(1:numTrials, function(i) mean(sample(temp, sampleSize, replace=FALSE)))
sampleSD2 = sd(sampleMeans) # 표본평균의 표준편차
0.95 가 0.93 로 변한다.0.95 가 0.2 로 변한다.표본평균에 대한 표준편차를 줄이려면, 표본크기를 증가시키는 것이 좋다. 즉, 95% 신뢰구간이 좁아진다.
표본크기를 크게 할 경우, 표본평균의 표준편차가 어떻게 달라지는지 확인한다.
sampleSizes <- c(25, 50, 100, 200, 300, 400, 500, 600) # 표본크기를 크게 할 경우
numTrials <- 100 #표본추출횟수
sampleSD <- c() # ㅍ본평균 분포의 표준편차 집합
for (sampleSize in sampleSizes) {
# 표본평균 분포의 표준편차를 계산한다.
sampleMeans <- sapply(1:numTrials, function(i) mean(sample(temp, sampleSize, replace=FALSE)))
sd1 = sd(sampleMeans) # 표본평균의 표준편차
sampleSD <- c(sampleSD, sd1)
}
barplot(sampleSD, names.arg = sampleSizes, main='Mean Temperature (100 trials)'
, xlab='Sample Size', ylab='Standard Deviation')
표본크기가 커질수록, 표본평균 분포에 대한 표준편차는 작아진다.
연구대상에게 인위적인 조작을 가하여 자료를 수집하는 방법을 실험(experiment)이라 한다. (출처: 기초통계학 - 박중양, 이계민, 김영순 - page 87)
설문조사나 데이터를 수집하기에 비용이 비싼 실험들은 샘플링을 여러 번 해서 여러 번의 샘플을 얻기가 어렵다. 그럼, 한 번의 데이터 수집을 통한 하나의 샘플을 통해서 우리는 무엇을 알 수 있을까?
중심극한정리 복습
\(SE = \sigma / \sqrt{n} = s / \sqrt{n}\) (모분산을 모를 경우, 표본의 불편분산을 사용한다.)
popSD <- sd(temp) # 모집단 표준편차
sampleSizes <- c(25, 50, 100, 200, 300, 400, 500, 600) # 표본크기를 크게 할 경우
numTrials <- 50 #표본 크기
sampleSDs <- c() # 표본평균의 표준편차 집합
oneSampleSD <- c() # 평균의 표준오차 = 모표준편차 / 표본크기
for (sampleSize in sampleSizes) {
# 표본평균 분포의 표준편차를 계산한다.
sampleMeans <- sapply(1:numTrials, function(i) mean(sample(temp, sampleSize, replace=FALSE)))
sd1 <- sd(sampleMeans) # 표본평균의 표준편차
sampleSDs <- c(sampleSDs, sd1)
# 1개 표본을 이용한 표준오차 = 모표준편차 / sqrt(표본크기)
#oneSampleSD <- c(oneSampleSD, popSD / sqrt(sampleSize))
sample_sd <- sd(sample(temp, sampleSize, replace=FALSE))
oneSampleSD <- c(oneSampleSD, sample_sd / sqrt(sampleSize))
}
df_data <- data.frame(sampleSizes = sampleSizes, sem = oneSampleSD, sd = sampleSDs)
g <- ggplot(df_data) + geom_line(aes(x = sampleSizes, y = oneSampleSD, col='sem'))
g <- g + geom_line(aes(x = sampleSizes, y = sd, col='sd'))
g
그래프를 통해서 알 수 있듯이, 표본평균의 분포에서 표준편차는 단일 표본에 대한 표준편차/\(\sqrt{n}\)와 값이 비슷하다. 이 값을 표준오차라 부른다.
하지만, 모집단의 표준편차를 모른다면??? 표본이 적당한 크기에 이르면, 표본표준편차는 모표준편차에 매우 좋은 근사가 된다.
하지만, 모집단의 분포가 다르면? 모집단의 크기가 다르면? 아래 내용을 통해서 확인한다.
모집단의 분포가 균등분포, 정규분포, 지수분포일 경우 표본크기가 커짐에 따라 모집단의 표준편차와 표본평균의 표준편차 사이에 어떤 관계가 있는지 살펴본다.
getDiffs <- function(population, sampleSizes) {
# 모집단의 표준편차와 샘플의 표준편차가 얼마나 차이가 나는지 확인한다.
popStd <- sd(population)
diffsFracs <- c()
numTrials <- 100 # 표본추출횟수
# sampling
for (sampleSize in sampleSizes) {
# 표본평균의 표준편차를 계산한다.
# TEST CODE:
#sampleMeans <- sapply(1:numTrials, function(i) mean(sample(population, sampleSize, replace=FALSE)))
#sampleSDs <- sd(sampleMeans)
sampleSDs <- sapply(1:numTrials, function(i) sd(sample(population, sampleSize, replace=FALSE)))
# 모표준편차와의 차이값을 계산한다.
diffs <- abs(popStd - sampleSDs) # 표본평균의 표준편차
# 차이값에 대한 평균을 구한다.
diffMean <- mean(diffs)
# 모표준편차 대비, 샘플의 표준편차 차이가 얼마나 차지하는지
diffsFracs <- c(diffsFracs, diffMean/popStd)
}
return (diffsFracs * 100)
}
sampleSizes <- seq(20, 600, 1) # 표본크기를 20에서 600까지 1씩 증가시킨다.
N <- 100000
uniformDist <- runif(N) # 균등분포 생성
normalDist <- rnorm(N, 0, 1) # 정규분포 생성
expDist <- rexp(N, rate=0.5) # 지수분포 생성
# 모집단의 표준편차와 표본크기가 달라질경우의 표본의 표준편차와 차이를 비교한다.
udiffs <- getDiffs(uniformDist, sampleSizes)
ndiffs <- getDiffs(normalDist, sampleSizes)
ediffs <- getDiffs(expDist, sampleSizes)
# 그래프를 그려서 확인한다.
df_data <- data.frame(sampleSizes = sampleSizes, uniform = udiffs
, normal = ndiffs, exponential = ediffs)
g <- ggplot(df_data) + geom_line(aes(x = sampleSizes, y = udiffs, col='uniform'))
g <- g + geom_line(aes(x = sampleSizes, y = ndiffs, col='normal'))
g <- g + geom_line(aes(x = sampleSizes, y = ediffs, col='exponential'))
g
모집단의 분포가 영향을 미칠까? 확률분포의 비대칭성을 나타내는 지표인 왜도(skew) 가 영향을 미친다.
그럼, 모집단의 크기가 영향을 미칠까?
popSizes <- c(10000, 100000, 1000000) # 모집단의 크기 설정
sampleSizes <- seq(20, 600, 1) # 표본크기를 20에서 600까지 1씩 증가시킨다.
count <- 0
for (size in popSizes) {
expDist <- rexp(size, rate=0.5) # 지수분포 생성
ediffs = getDiffs(expDist, sampleSizes)
assign(paste0("diff_", count), ediffs)
count <- count + 1
}
# 그래프를 그려서 확인한다.
df_data <- data.frame(sampleSizes = sampleSizes, diff_0=diff_0, diff_1=diff_1, diff_2=diff_2)
g <- ggplot(df_data) + geom_line(aes(x = sampleSizes, y = diff_0, col='Population size = 10000'))
g <- g + geom_line(aes(x = sampleSizes, y = diff_1, col='Population size = 100000'))
g <- g + geom_line(aes(x = sampleSizes, y = diff_2, col='Population size = 1000000'))
g
모집단의 크기는 표본크기에 큰 영향을 주지 않는 것을 알수 있다.