R Academy · 강의

R에서 부트스트랩 재표본추출

복원추출을 사용하는 sample()로 부트스트랩 신뢰구간을 구현합니다.

레슨 4/413개 단계

R에서 부트스트랩 재표본추출은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

부트스트랩이란 무엇인가요?

부트스트랩은 관측된 데이터에서 복원 추출을 수행하여 통계량의 표본분포를 추정하는 재표본 추출 방법입니다. 분포에 대한 가정이 필요하지 않으며, 데이터 자체가 분포를 나타냅니다.

set.seed(42)
# Original sample of 20 observations
original_data <- c(14, 18, 11, 13, 6, 8, 2, 17,
                   20, 10, 15, 12, 9, 16, 7, 3,
                   19, 5, 4, 1)
n <- length(original_data)

# One bootstrap resample: sample WITH replacement
bootstrap_sample1 <- sample(original_data, n, replace = TRUE)
print(bootstrap_sample1)
# Contains repeats! Some original values are missing.

mean(original_data)    # original mean
mean(bootstrap_sample1)  # bootstrap mean (different)

평균의 부트스트랩 분포

부트스트랩 재표본을 많이 생성하고 각각에서 통계량을 계산한 다음 결과를 모읍니다. 이렇게 얻은 부트스트랩 분포는 통계량의 표본분포를 근사합니다.

set.seed(42)
x <- c(14, 18, 11, 13, 6, 8, 2, 17, 20, 10,
        15, 12, 9, 16, 7, 3, 19, 5, 4, 1)
n <- length(x)
B <- 5000  # number of bootstrap replicates

# Bootstrap distribution of the mean
boot_means <- replicate(B, {
  x_star <- sample(x, n, replace = TRUE)
  mean(x_star)
})

cat('Original mean:', mean(x), '\n')
cat('Bootstrap mean:', mean(boot_means), '\n')
cat('Bootstrap SE:', sd(boot_means), '\n')
cat('Theoretical SE:', sd(x)/sqrt(n))

모든 통계량에 대한 부트스트랩

부트스트랩은 모든 통계량에 사용할 수 있습니다. 예를 들면 중앙값, 상관관계, 회귀 계수, 절사평균 등이 있습니다. 반복문에서 mean()을 관심 있는 통계량으로 바꾸기만 하면 됩니다.

set.seed(42)
x <- c(2, 4, 6, 8, 10, 12, 100, 1, 3, 5)
# Notice the outlier 100 - makes the mean unreliable
B <- 5000; n <- length(x)

# Bootstrap distribution of the median
boot_medians <- replicate(B, {
  median(sample(x, n, replace = TRUE))
})

# Bootstrap distribution of the trimmed mean (10%)
boot_tmeans <- replicate(B, {
  mean(sample(x, n, replace = TRUE), trim = 0.1)
})

cat('Sample median:', median(x), '\n')
cat('Bootstrap SE of median:', sd(boot_medians), '\n')
cat('Bootstrap SE of trimmed mean:', sd(boot_tmeans))

부트스트랩 신뢰구간: 백분위수 방법

가장 간단한 부트스트랩 신뢰구간은 부트스트랩 분포의 분위수를 사용하는 방법입니다. 95% 신뢰구간에는 2.5번째 백분위수와 97.5번째 백분위수를 사용합니다. 빠르고 직관적이지만, 왜도가 있는 통계량에서는 포함 확률에 문제가 생길 수 있습니다.

set.seed(42)
x <- rnorm(30, mean = 5, sd = 2)
B <- 5000; n <- length(x)

# Bootstrap CI for the mean
boot_means <- replicate(B, mean(sample(x, n, replace = TRUE)))

# Percentile CI
ci_percentile <- quantile(boot_means, c(0.025, 0.975))
cat('Percentile CI:', round(ci_percentile, 3), '\n')

# For comparison: t-interval (parametric)
t_ci <- mean(x) + qt(c(0.025, 0.975), df = n-1) * sd(x)/sqrt(n)
cat('t-interval CI:', round(t_ci, 3), '\n')

cat('True mean: 5')

부트스트랩 표준 오차

부트스트랩 표준 오차는 간단히 sd(boot_statistics)로 계산합니다. 분포를 가정하지 않고도 모집단에서 표본을 반복 추출했을 때 통계량이 얼마나 변하는지 추정합니다.

set.seed(42)
# Bootstrap SE for the ratio of two means
group_a <- rnorm(20, mean = 10, sd = 2)
group_b <- rnorm(20, mean = 8, sd = 2)
all_data <- data.frame(
  value = c(group_a, group_b),
  group = rep(c('A', 'B'), each = 20)
)

B <- 4000; n <- nrow(all_data)
boot_ratio <- replicate(B, {
  idx <- sample(1:n, n, replace = TRUE)
  d <- all_data[idx, ]
  mean(d$value[d$group == 'A']) /
    mean(d$value[d$group == 'B'])
})

cat('Observed ratio:', mean(group_a)/mean(group_b), '\n')
cat('Bootstrap SE:', round(sd(boot_ratio), 4), '\n')
cat('95% CI:', round(quantile(boot_ratio, c(.025,.975)), 3))

BCa 신뢰구간

BCa (편향 보정 및 가속) 신뢰구간은 백분위수 신뢰구간보다 정확하며, 특히 왜도가 있거나 편향된 통계량에서 유용합니다. 부트스트랩 분포의 편향과 왜도를 보정합니다.

# BCa CI implementation
bca_ci <- function(data, stat_fn, B = 2000, alpha = 0.05) {
  n <- length(data)
  theta_hat <- stat_fn(data)
  # Bootstrap replicates
  boot_vals <- replicate(B, stat_fn(sample(data, n, replace = TRUE)))
  # Bias correction z0
  z0 <- qnorm(mean(boot_vals < theta_hat))
  # Acceleration a (jackknife)
  jk <- sapply(seq_len(n), function(i) stat_fn(data[-i]))
  num <- sum((mean(jk) - jk)^3)
  den <- 6 * (sum((mean(jk) - jk)^2))^(3/2)
  a <- num / den
  # Adjusted quantiles
  z_alpha <- qnorm(c(alpha/2, 1 - alpha/2))
  p_adj <- pnorm(z0 + (z0 + z_alpha) / (1 - a * (z0 + z_alpha)))
  quantile(boot_vals, p_adj)
}

set.seed(42)
x <- rexp(25, rate = 0.5)  # skewed distribution
bca_ci(x, median)

회귀를 위한 부트스트랩

데이터 프레임의 행을 재표본 추출하여 회귀의 부트스트랩 신뢰구간을 계산할 수 있습니다. 이 방법은 정규분포가 아닌 오차를 처리하며 정규성 가정 없이도 타당한 추론을 제공합니다.

set.seed(42)
n <- 40
x <- runif(n, 0, 10)
y <- 2 + 1.5 * x + rnorm(n, sd = 2)
df <- data.frame(x = x, y = y)
B <- 3000

# Bootstrap the slope coefficient
boot_slopes <- replicate(B, {
  idx <- sample(1:n, n, replace = TRUE)
  d_boot <- df[idx, ]
  coef(lm(y ~ x, data = d_boot))[2]
})

cat('OLS slope:', round(coef(lm(y~x, data=df))[2], 3), '\n')
cat('Bootstrap SE of slope:', round(sd(boot_slopes), 4), '\n')
cat('Bootstrap 95% CI:', round(quantile(boot_slopes, c(.025,.975)), 3))

부트스트랩 반복 횟수

부트스트랩 반복을 B번 수행해야 한다면 몇 번이 적절할까요? 표준 오차에는 B=200-500, 백분위수 신뢰구간에는 B=1000-2000, BCa 신뢰구간에는 B=2000-5000을 사용합니다. 반복 횟수는 많을수록 좋지만 10,000을 넘으면 추가 효과가 점점 작아집니다.

set.seed(42)
x <- rnorm(50, mean = 3, sd = 1)
B_values <- c(100, 500, 1000, 2000, 5000, 10000)

# See how CI width varies with B
results <- sapply(B_values, function(B) {
  boot_m <- replicate(B, mean(sample(x, length(x), replace = TRUE)))
  q <- quantile(boot_m, c(0.025, 0.975))
  q[2] - q[1]  # CI width
})

result_df <- data.frame(B = B_values, ci_width = round(results, 4))
print(result_df)
# CI width stabilizes as B increases

쌍체 부트스트랩

두 표본 문제에서는 x와 y를 독립적으로 재표본 추출하지 말고 쌍 (x, y)을 함께 재표본 추출하십시오. 이렇게 하면 쌍 내부의 의존 구조가 유지되어 상관관계와 쌍체 차이에 대한 타당한 신뢰구간을 얻을 수 있습니다.

set.seed(42)
# Paired data: before/after treatment
before <- c(10, 12, 8, 15, 11, 9, 14, 13)
after  <- c(12, 14, 9, 16, 11, 10, 15, 12)
n <- length(before)
B <- 4000

# Bootstrap paired mean difference
boot_diff <- replicate(B, {
  idx <- sample(1:n, n, replace = TRUE)
  mean(after[idx] - before[idx])
})

observed_diff <- mean(after - before)
cat('Observed mean diff:', observed_diff, '\n')
cat('Bootstrap SE:', round(sd(boot_diff), 4), '\n')
cat('95% CI:', round(quantile(boot_diff, c(0.025, 0.975)), 3))

부트스트랩 가설 검정

부트스트랩은 가설 검정에도 사용할 수 있습니다. H₀: θ=θ₀를 검정하려면 부트스트랩 표본을 이동하거나 재중심화하여 귀무분포를 생성한 다음, 관측된 통계량을 초과하는 비율로 p값을 계산합니다.

set.seed(42)
# Test H0: mean = 0 vs H1: mean != 0
x <- rnorm(30, mean = 0.5, sd = 2)
theta0 <- 0  # null hypothesis
observed_t <- (mean(x) - theta0) / (sd(x) / sqrt(length(x)))

B <- 5000; n <- length(x)
# Shift x to have mean = theta0 under H0
x_centered <- x - mean(x) + theta0

boot_t <- replicate(B, {
  x_star <- sample(x_centered, n, replace = TRUE)
  (mean(x_star) - theta0) / (sd(x_star) / sqrt(n))
})

p_value <- mean(abs(boot_t) >= abs(observed_t))
cat('Observed t:', round(observed_t, 3), '\n')
cat('Bootstrap p-value:', round(p_value, 4))

Boot 패키지 개요

boot 패키지는 고급 기능을 갖춘 boot(data, statistic, R)를 제공합니다. 여기에는 boot.ci()를 통한 BCa 신뢰구간, 병렬 계산, 층화 표본 추출이 포함됩니다. statistic 함수는 데이터와 인덱스 벡터를 받습니다.

# library(boot)  # uncomment to use

# The boot() statistic function signature:
# statistic(data, indices) -> scalar or vector

# Example (conceptual - requires boot package):
# mean_stat <- function(data, indices) {
#   mean(data[indices])
# }
# results <- boot(data = x, statistic = mean_stat, R = 5000)
# boot.ci(results, type = c('perc', 'bca'))  # CIs
# plot(results)  # histogram of bootstrap distribution

# Manual equivalent:
set.seed(42)
x <- rnorm(30, mean = 5)
B <- 2000
boot_vals <- replicate(B, mean(sample(x, length(x), replace = TRUE)))
quantile(boot_vals, c(0.025, 0.975))

빠른 확인

R에서 부트스트랩 재표본 추출에 대한 이해도를 확인해 보십시오.

복습: 부트스트랩 재표본 추출

핵심 내용: 부트스트랩은 sample(x, n, replace=TRUE)를 사용하여 복원 추출로 데이터를 재표본 추출합니다. replicate(B, ...)를 사용하여 B개의 부트스트랩 통계량을 생성하십시오. sd(boot_stats)는 부트스트랩 SE를 반환합니다. 백분위수 신뢰구간은 quantile(boot_stats, c(0.025, 0.975))로 계산합니다. 신뢰구간에는 B≥2000을 사용하십시오. boot 패키지는 BCa 신뢰구간과 병렬 계산을 추가로 제공합니다. 부트스트랩은 분포에 대한 가정 없이 모든 통계량에 사용할 수 있습니다.

set.seed(42)
x <- c(3, 5, 7, 2, 9, 4, 6, 8, 1, 10)
n <- length(x); B <- 3000

# Generic bootstrap template:
boot_stat <- replicate(B, {
  x_star <- sample(x, n, replace = TRUE)
  median(x_star)  # replace with any statistic
})

# Summary
cat('Original median:', median(x), '\n')
cat('Bootstrap SE:', round(sd(boot_stat), 3), '\n')
ci <- quantile(boot_stat, c(0.025, 0.975))
cat('95% Percentile CI: [', ci[1], ',', ci[2], ']')
무료로 시작

AI 튜터와 함께 R을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
43
레슨
159

자주 묻는 질문

“R에서 부트스트랩 재표본추출” 강의는 무료인가요?

네 — “R에서 부트스트랩 재표본추출” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“R에서 부트스트랩 재표본추출”에서 뭘 배우나요?

복원추출을 사용하는 sample()로 부트스트랩 신뢰구간을 구현합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“R에서 부트스트랩 재표본추출” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. set.seed()와 재현성
  2. 확률분포에서 난수 생성
  3. 몬테카를로 시뮬레이션 기초
  4. R에서 부트스트랩 재표본추출
← R Academy(으)로 돌아가기