아이티윌_데이터 분석 55기/강의내용 필기_통계 및 분석

#8 8일차_가설검정 절차, 문제풀이

ecosso 2026. 4. 22. 15:51

01 가설검정 절차

 

02 문제풀이
 -01 문제1

 -02 문제2

 -03 문제3

 -04 문제4

 -05 문제5

 -06 문제6


01 가설검정 절차
 1. 모수
 2. 검정통계량
 3. 가설형태
 4. 검정통계량의 기각역/채택역
 5. 유의확률
 6. 함수

02 문제풀이
 -01 문제1
# 프로세스에서 10개의 제품을 랜덤 샘플링하여 검사한 결과 2개의 불량품이 
# 발견되었다. 공정 불량률이 0.1보다 크다고 할 수 있는지 
# 유의수준 10%에서 검정하시오.

더보기

[ 내 답변 ]

 

# 가설
# H0 : p = 0.1
# H1 : p > 0.1 (오른쪽검정)


# 모비율 단일 집단 비교
phat <- 2/10
p0 <- 0.1
n <- 10

# 검정통계량
(phat - p0) / sqrt(p0*(1-p0)/n) # 1.054093

# 가설형태 및 기각역/ 채택역
# 오른쪽검정
# 유의수준 10%

qnorm(0.90, mean = 0, sd = 1) # 1.281552

# 기각역 : [1.281552, inf]
# 채택역 : [-inf, 1.281552]
# 검정통계량이 채택역 내 위치하므로 귀무가설을 채택한다.
# 따라서 공정 불량률은 유의수준 90% 수준에서 0.1보다 크다고 말할 수 없다.

# 유의확률
P(P* > 1.054093)
1-(P* < 1.054093)
z <- (phat - p0) / sqrt(p0*(1-p0)/n)
1 - pnorm(z)
# 0.1459203


# 함수
result <- prop.test(2, n, p=0.1, alternative = 'greater', correct = F)
result

> result

	1-sample proportions test without continuity correction

data:  2 out of n, null probability 0.1
X-squared = 1.1111, df = 1, p-value = 0.1459
alternative hypothesis: true p is greater than 0.1
95 percent confidence interval:
 0.06855799 1.00000000
sample estimates:
  p 
0.2 

 

[ 문제풀이 ]

 

불량'률' -> 단일집단에 대한 모비율 가설검정

z분포선상에 있어서 윗쪽(분자)의 값을 확인

소표본일때는 P0가 phat이 된다.

 

문제는 소표본(10개)에 해당되기 때문에 정확한 유의확률을 구할 수 없으나, 이론적인 공식에 따른 z값은 얼마냐는 prop.test의 correct를 F로 지정하여 구한다. (실제로 소표본일 때는 z값을 구하지 않는다)

 

# 가설)
H0 : P = 0.1
H1 : P > 0.1 (오른쪽 검정)

# 검정통계량)
n <- 10
x <- 2
p0 <- 0.1
alpha <- 0.01

phat <- x / n

z0 <- (phat - p0) / sqrt(p0 * (1 - p0) / n)   # 1.054093

# 임계값
z_alpha <- qnorm(1 - alpha)  # 1.281552

# 기각역 : [1.281552, inf]
# 채택역 : [-inf, 1.281552]
# => 귀무가설 채택!

# 유의확률)
p_value <- 1 - pnorm(z0)     # 0.1459202 > 0.1  => 귀무가설 채택


# 함수) prop.test
result <- prop.test(X, n, p=p0, alternative = 'greater', correct = F)  

  F로 옵션을 넣어주어야 연속성보정을 하지 않는다는 옵션이 적용된다.
sqrt(result$statistic)      # 1.054093
result$p.value              # 0.1459203

 


 -02  문제2
# A회사의 두 라인의 특정 제품의 질량이 동일한지를 가설검정 하기 위해 각각 샘플 
# 50개를 조사하였다. 하지만 line_1에 비해 항상 line_2의 질량의 분산이 큰 것으로
# 측정되었는데 수집한 샘플을 통해 line_2의 분산이 크다고 말할 수 있는지를
# 유의수준 1%내에서 가설검정하세요.
v1 <- read.csv('samples.csv')

더보기

[ 내 답변 ]

 

# 가설수립
H0 : line_1 - line_2 = 0
H1 : line_1 - line_2 < 0 (왼쪽검정)

# 두집단의 모분산 비교
# 검정통계량 구하기
x1 <- v1[v1$line==1, 2]
x2 <- v1[v1$line==2, 2]
  
var1 <- var(v1[v1$line==1, 2])
var2 <- var(v1[v1$line==2, 2])

cov1 <- (((n1 - 1) * var1) + ((n2 - 1) * var2)) / (n1 + n2 - 2)

n1 <- length(v1[v1$line==1, 2])
n2 <- length(v1[v1$line==2, 2])

mean1 <- mean(v1[v1$line==1, 2])
mean2 <- mean(v1[v1$line==2, 2])

var1 / var2 # 0.8884758

# 가설형태 및 기각역/ 채택역
# 왼쪽검정
# 유의수준 1%

q1 <- qf(0.01, df1 = n1 - 1, df2 = n2 - 1)
q1

# 채택역 : [0.5095301, inf]
# 기각역 : [- inf, 0.5095301]
# 검정통계량이 채택역 내 위치하므로 귀무가설 채택

# 유의확률
pf(0.8884758, df1 = n1 - 1, df2 = n2 - 1) # 0.3403008

# 함수
var.test(x1, x2, alternative = "less", conf.level = 0.99)

 

[ 문제풀이 ]

 

모평균(질량)이 같냐는 질문에 대답하기 위해서는 등분산성 가정이 필요하다.

 

# 가설)
H0 : 분산1/분산2 = 1
H1 : 분산1/분산2 < 1 (왼쪽검정)

# 검정통계량)
var1 <- var(y1)
var2 <- var(y2)

F* = var1/var2 ~ F(n-1,m-1)
= 0.8884758

qf(alpha, n-1, m-1)     # 0.5095301

# 기각역 : [0, 0.5095301]
# 채택역 : [0.5095301, inf]
# => 귀무가설 채택!

# 유의확률)
P(F < 0.8884758) = pf(0.8884758, n-1, m-1)
= 0.3403008  => 귀무가설 채택!
  
# 함수) var.test
var.test(y1, y2, alternative = 'less', conf.level = 0.99)

  * varTest (EnvStats 패키지) : 단일집단의 모분산 추정 시 사용하며, 두 집단에 대한 모분산 비교는 지원하지 않는다.

  * var.test (기본패키지) : 등분산성의 가설에 대한 가정 (두 집단의 분산이 등분산인가? 그렇지 않은가?)

                                       기본패키지는 단일집단의 모분산 추정이 지원되지 않는다.

# F = 0.88848, num df = 49, denom df = 49, p-value = 0.3403
# alternative hypothesis: true ratio of variances is less than 1
# 99 percent confidence interval:
#   0.000000 1.743716
# sample estimates:
#   ratio of variances 
# 0.8884758 

 


 -03 문제3
# 비만약 복용 전후의 체중 측정 결과로서, 체중은 정규분포를 따른다고 가정하자. 
# 이를 토대로 비만약 복용 전후의 체중 변화가 있었는지 유의수준 5%에서 검정
x <- c(68, 61, 60, 68, 67, 64, 66, 67, 66, 67, 72, 74, 61, 71, 58, 77)   # 복용전
y <- c(56, 55, 67, 62, 59, 67, 50, 60, 59, 53, 60, 65, 62, 61, 64, 57)   # 복용후

더보기

[ 내 답변 ]

 

# 가설수립
H0 : x - y = 0
H1 : x - y ! = 0 (양쪽검정)

# 모평균 - 대응되는 두 집단
# 유의수준 5%
# 검정통계량
minus <- x-y
dbar <- mean(minus)
var2 <- var(minus)
sd2 <- sd(minus)

length(x) # 16

dbar / (sd2 / sqrt(16)) # 3.562627

# 가설형태 및 기각역/ 채택역
# 양쪽검정
# 유의수준 5% 

qt(0.025, df = 15) # -2.13145
qt(1- 0.025, df = 15) # 2.13145

# 채택역 : [-2.13145, 2.13145]
# 기각역 : -[2.13145 < | 2.13145 >]

# 유의확률
pt(, df = 15)  ????

# 함수
t.test(x, y, alternative = '???', paired = TRUE)

 

[ 문제풀이 ]

 

# 가설)
H0 : 복용전몸무게평균 - 복용후몸무게평균 = 0
H1 : 복용전몸무게평균 - 복용후몸무게평균 > 0 (오른쪽검정)

# 검정통계량)
D <- x - y
dbar <- mean(x-y) 
Sd <- sd(D)
n <- length(D)
alpha <- 0.05

T* = (dbar - 0) / (Sd/sqrt(n))
= 3.562627

qt(1-alpha, df = n-1)      # 1.75305

# 기각역 : [1.75305, inf]
# 채택역 : [-inf, 1.75305]
# => 귀무가설 기각!

# 유의확률)
P(T > 3.562627) = 1 - P(T < 3.562627)
= 1 - pt(3.562627, df = n-1)
= 0.00141742 << 0.05  => 귀무가설 기각!
  
# 함수) t.test
t.test(x, y, alternative = 'greater', paired = T)

# t = 3.5626, df = 15, p-value = 0.001417
# alternative hypothesis: true mean difference is greater than 0
# 95 percent confidence interval:
#   3.492041      Inf
# sample estimates:
#   mean difference 
# 6.875     


 -04 문제4
# 두 라인에서 생산되는 초콜릿의 무게는 정규분포 
# 라인 1 표본 25개의 무게는 평균 198.5(g), 표준편차 4.8(g), 
# 라인 2 표본 34개의 무게는 평균 201.3(g), 표준편차 5.1(g)
# 모평균의 차이가 있는지 유의수준 5%에서 검정하시오.

더보기

[ 내 답변 ]

 

# 가설수립
H0 : 라인1 평균 - 라인2 평균 = 0
H0 : 라인1 평균 - 라인2 평균 != 0  (양측검정)

# 검정통계량
mean1 <- 198.5
mean2 <- 201.3

sd1 <- 4.8
sd2 <- 5.1

n1 <- 25
n2 <- 34

cov1 <- (((n1-1)*sd1^2) + ((n2-1)*sd2^2)) / (n1 + n2 -2) # 24.75947
cov2 <- sqrt(24.75947) # 4.975889

mean1 - mean2 # -2.8

-2.8/(cov2*sqrt(1/n1+1/n2)) # -2.13585

# 채택역 구하기
qt(0.025, df = n1+n2-2) # -2.002465
qt(1- 0.025, df = n1+n2-2) # 2.002465

# 채택역 : [-2.002465, 2.002465]

# 검정통계량이 기각역에 위치하므로 두 라인에서의 평균차이가 유의하게 있다라고 말할 수 있다.

# 유의확률
pt(-2.13585, df = n1+n2-2) # 0.01849992

 

[ 문제풀이 ]

 

# 가설)
H0 : 초콜릿무게평균1 - 초콜릿무게평균2 = 0
H1 : 초콜릿무게평균1 - 초콜릿무게평균2 != 0

# 검정통계량)
xbar1 <- 198.5
xbar2 <- 201.3
var1 <- 4.8^2
var2 <- 5.1^2
n <- 25
m <- 34
Var <- ((n-1)*var1 + (m-1)*var2) / (n+m-2) #공통분산 구하기
alpha <- 0.05

T* = (xbar1 - xbar2) / sqrt(var1/n + var2/m) = -2.156016 (등분산성 가정X)
= (xbar1 - xbar2) / sqrt(Var/n + Var/m) = -2.13585(*) (등분산성 가정)  # 공통분산이기 때문에 Var가 들어감

qt(alpha/2, n+m-2)  # -2.002465

# 채택역 : [-2.002465, 2.002465]
# => 귀무가설 기각!

# 유의확률)
P(T < -2.13585) = pt(-2.13585, df = n+m-2)
= 0.01849992 << 0.025   => 귀무가설 기각!
  
  
# ** 추가 : 등분산성 가설검정
H0 : 분산1/분산2 = 1
H1 : 분산1/분산2 != 1

# 검정통계량)
F* = var1/var2 ~ F(n-1, m-1)
= 0.8858131
qf(alpha/2, n-1, m-1)     # 0.4573714
qf(1-alpha/2, n-1, m-1)   # 2.088486

# 채택역 : [0.4573714, 2.088486]
# => 귀무가설 채택!

* 따라서 등분산성을 가정해야 한다. (공통분산으로 계산을 해주는 것이 맞다.)

 


 -05 문제5
# 품질특성치가 정규분포를 따르는 생산공정에서 품질특성에 대한 분산을 
# 추정하기 위하여 10개 제품을 랜덤 샘플링한 결과 다음의 데이터를 구하였다. 
# 모분산이 2와 다르다고 할 수 있는지 유의수준 5%에서 검정하시오.
vx <- c(20.0, 21.5, 20.9, 19.8, 22.5, 20.3, 23.6, 18.0, 23.3, 17.8)

더보기

[ 내 답변 ]

 

# 가설수립
H0 : sigma^2 = 2
H1 : sigma^2 != 2

# 검정통계량 구하기
n <- length(vx)
mean1 <- mean(vx)


var(vx) # 4.022333
(n-1) * var(vx) / 2 # 18.1005

q1 <- qchisq(0.025, df = n-1) # 2.700389
q2 <- qchisq(1 - 0.025, df = n-1) # 19.02277

c((n-1)*var(vx)/q2, (n-1)*var(vx)/q1) # [ 1.903035 13.405844 ]

# 검정통계량이 기각역 외 위치하므로 귀무가설이 기각되었다.
# 유의수준 5%에서 해당 모분산은 2와 같다고 말할 수 없다.

# 유의 확률
qchisq(0.5, df = n-1) # 8.342833
pvalue <- 2 * min(pchisq(18.1005, df = n - 1), 1 - pchisq(18.1005, df = n - 1)) #

0.06805061



# 함수
library(EnvStats)
result <- varTest(vx, alternative = 'two.sided', sigma.squared = 2)
result$statistic

 

[ 문제풀이 ] 

 

# 가설)
H0 : 모분산 = 2
H1 : 모분산 != 2 (양측검정)

# 검정통계량)
n <- length(vx)
Var <- var(vx)
alpha <- 0.05

V* = (n-1) * Var / 2  ~ Chisq(n-1)
= 18.1005

qchisq(alpha/2, df = n-1)    # 2.700389
qchisq(1-alpha/2, df = n-1)  # 19.02277

# 채택역 : [2.700389, 19.02277]
# => 귀무가설 채택!

# 유의확률)
P(V > 18.1005) = 1 - P(V < 18.1005)
= 1 - pchisq(18.1005, df = n-1)
= 0.0340253 > 0.025  => 귀무가설 채택!
  
# 함수) varTest
library(EnvStats)
result <- varTest(vx, sigma.squared = 2)
result$statistic   # 18.1005 
result$p.value     # 0.06805061

 


 -06  문제6
# iris 데이터에서 Speces별로 Sepal.Length의 평균차이가 존재하는지 유의수준5%로 가설검정

더보기

[ 내 답변 ]

 

df2 <-iris
df2$Species


# anova
df2$Species <- factor(df2$Species)
lm1 <- lm(Sepal.Length ~ Species, data = df2)
summary(aov(lm1))

# SSE
nrow(df2)


v1 <- df2[df2$Species == 'setosa', 1]
v2 <- df2[df2$Species == 'versicolor', 1]
v3 <- df2[df2$Species == 'virginica', 1]

sse1 <- sum((v1-mean(v1))^2)
sse2 <- sum((v2-mean(v2))^2)
sse3 <- sum((v3-mean(v3))^2)

n1 <- length(v1)
n2 <- length(v2)
n3 <- length(v3)

sse <- sse1 + sse2 + sse3
mse <- sse / (150-3) # 0.2650082

# SSt

sst1 <- n1 * (mean(v1)-mean(df2$Sepal.Length))^2
sst2 <- n2 * (mean(v2)-mean(df2$Sepal.Length))^2
sst3 <- n3 * (mean(v3)-mean(df2$Sepal.Length))^2

sst <- sst1 + sst2 + sst3
mst <- sst / (3-1)


#  fscore
mst / mse # 119.2645

# 유의확률
1 - pf(119.2645, 2, 147)

 

[ 문제풀이 ]

 

# 가설)
# H0 : 세집단의 평균이 모두 같다
# H1 : 세집단의 평균이 모두 같지 않다 (오른쪽검정)

# 검정통계량)
y1 <- iris[iris$Species == 'setosa', 'Sepal.Length']
y2 <- iris[iris$Species == 'versicolor', 'Sepal.Length']
y3 <- iris[iris$Species == 'virginica', 'Sepal.Length']
n <- 150
n1 <- 50
n2 <- 50
n3 <- 50
alpha <- 0.05
k <- 3

# mse)
sse1 <- sum((y1 - mean(y1))^2)
sse2 <- sum((y2 - mean(y2))^2)
sse3 <- sum((y3 - mean(y3))^2)
sse <- sse1 + sse2 + sse3
mse <- sse / (n-k)              # 0.2650082

# mst)
sst1 <- n1 * (mean(y1) - mean(iris$Sepal.Length))^2
sst2 <- n2 * (mean(y2) - mean(iris$Sepal.Length))^2
sst3 <- n3 * (mean(y3) - mean(iris$Sepal.Length))^2
sst <- sst1 + sst2 + sst3
mst <- sst / (k-1)               # 31.60607

F* = mst/mse ~ F(k-1, n-k)
= 119.2645

qf(1-alpha, k-1,n-k)              # 3.057621

# 기각역 : [3.057621, inf]
# 채택역 : [0, 3.057621]
# => 귀무가설 기각!


# 함수)
m1 <- lm(Sepal.Length ~ Species, data = iris)
summary(aov(m1))

#              Df Sum Sq Mean Sq F value Pr(>|F|) <=> P(F>F*)    
# Species       2  63.21  31.606   119.3 <2e-16 ***
# Residuals   147  38.96   0.265