Programs/R

[R_tidyverse] t-검정: 단일표본 t-검정 one sample t-test ②

도마도다 2024. 2. 14. 10:38

 

추론 Infer (rstatix 패키지) 활용한 단일표본 t-검정 one sampel t-test 실습

*tidyverse 패키지를 활용한 분석방법
  • 추론 (Infer) 방식을 사용하여 t-검정을 실시할 때는 부트스트래핑 방법을 활용할 수 있음
    • 부트스트래핑: 데이터에서 여러 개의 샘플을 반복적으로 추출하여 새로운 분포를 만들어 내고, 이를 활용하여 통계적 추정이나 가설 검정을 수행하는 방법
  • 사용되는 함수
    • specify(): 어떤 데이터를 가져올거야?
    • generate(): 데이터에서 가상의 샘플들을 뽑아줘 
    • calculate(): 각각의 통계치 계산해
    • visualize(): 새로운 분포 그래프 만들기
    • hypothesize(): 귀무가설 가정
  • 두 가지 방법 있음: 표본평균 활용, t분포 활용

 

<차례>
  • 패키지 설치 및 불러오기, 데이터 불러오기
  • 1번 방법: 표본평균 활용
    1. 귀무가설 분포 생성
    2. 신뢰구간 계산
    3. 시각화
  • 2번 방법: t분포 활용
    1. 가설 설정 및 통계량 계산
    2. 신뢰구간 계산 및 시각화
 

 

패키지 설치 및 불러오기, 데이터 불러오기

  • 오늘의 실습을 위해 필요한 R 패키지. 패키지는 한 번 설치하면 다음에 다시 설치할 필요 없음. 그러나 라이브러리는 매번 불러와야 함!
  • 아이스크림의 무게 데이터를 불러옴. 아이스크림의 무게가 320그램인지 확인하고자 함.
# 패키지 설치
install.packages("tidyverse") #쌍따옴표 주의
install.packages("tidymodels")
install.packages("rstatix")

#설치한 패키지 불러오기 (라이브러리)
library(tidyverse) #쌍따옴표 없음
library(tidymodels)
library(rstatix)

# <데이터 불러오기>
## R스크립트와 csv파일이 같은 폴더에 있을 경우의 코드
## 티블형식 데이터는 read.csv 아니라 read_csv 활용
ost_tb <- read_csv("05.ost.csv", # csv 파일명
                   col_names = TRUE, # 데이터의 첫번째 행을 변수명으로 설정하겠다는 뜻
                   na = ".") # 결측치를 . 으로 설정하겠다는 뜻

 

1번 방법: 표본평균(Xbar) 활용

  1. 귀무가설 분포 생성
x_bar <- ost_tb %>% # 표본평균
  specify(response = weight) %>%
  calculate(stat = "mean")

# 귀무가설(무게가 320g이다)의 분포 만들기: 1000번 샘플링해서 분포를 만들고, 그 평균이 320인지 봐라
null_dist_x <- ost_tb %>% # 귀무가설 가정
  specify(response = weight) %>% # weight를 갖고 와라
  hypothesize(null = "point", # 특정한 값을 귀무가설로 설정한다는 뜻
              mu = 320) %>%  # 그 특정값을 320으로 설정
  generate(reps = 1000, # 1000번 샘플링
           type = "bootstrap") %>% # 부트스트래핑 방법으로
  calculate(stat = "mean")%>% # 평균 계산해줘
  print() # 저장과 동시에 프린트
 
 
위를 실행시키면 아래와 같이 출력됨. 1000번 추출한 샘플들 각각의 평균을 보여줌
 
Response: weight (numeric)
Null Hypothesis: point
# A tibble: 1,000 × 2
   replicate  stat
       <int> <dbl>
 1         1  321.
 2         2  320.
 3         3  317.
 4         4  319.
 5         5  321.
 6         6  322.
 7         7  321.
 8         8  317.
 9         9  320.
10        10  323.
# ℹ 990 more rows
# ℹ Use `print(n = ...)` to see more rows

 

 
 
 
 
 
 
  1. 신뢰구간 계산
# 신뢰구간 계산: 이 구간 안에 값이 들어와야 무게가 320g이라고 가정할 수 있다!
null_dist_ci <- null_dist_x %>% 
  get_ci(level = 0.95, 
         type = "percentile") %>% # 95% 신뢰구간
  print() 
 
 
위의 코드를 실행시키면 아래와 같이 출력됨. 신뢰구간 316~324, 일단 구간 안에 320이 들어오는 것을 확인할 수 있음.
 
# A tibble: 1 × 2
  lower_ci upper_ci
     <dbl>    <dbl>
1     316.     324.
 
 
 
 
 
 
  1. 시각화
null_dist_x %>%
  get_p_value(obs_stat = x_bar,
              direction = "two-sided") # p밸류 거의 0에 가깝다

null_dist_x %>%
  visualize() + # 분포 시각화
  shade_p_value(obs_stat = x_bar, # shade_p_value: p밸류 시각화, obs_stat: p밸류에 대응하는 관측치(여기서는 x_bar)의 영역을 표시할 수 있음
                direction = "two-sided") + # 양측 검정, "-" 주의! 
  shade_confidence_interval(endpoints = null_dist_ci) # 신뢰구간을 그래프 상에 표시, 방금구한 null_dist_ci 값 활용
 
 
빨간 선이 p-value, 초록영역이 신뢰구간. 신뢰구간 안에 관측치가 들어와야 귀무가설 채택, 아래를 보면 아닌 것을 알 수 있음  
 
-> 대체가설 채택(아이스크림의 무게는 320g이 아니다)
 
 

 

 

2번 방법: t분포 활용

  1. 가설 설정 및 통계량 계산
t_cal <- ost_tb %>%
  specify(response = weight) %>%
  hypothesize(null = "point",
              mu = 320) %>%
  calculate(stat = "t") %>%
  print()

null_dist_t <- ost_tb %>% # 귀무가설 가정
  specify(response = weight) %>%
  hypothesize(null = "point",
              mu = 320) %>% # "아이스크림 무게는 320g이다"
  generate(reps = 1000, 
           type = "bootstrap") %>% # 1000번 샘플링
  calculate(stat = "t")%>%
  print()

 

 

 

 


  1. 신뢰구간 계산 및 시각화
null_dist_ci <- null_dist_t %>% 
  get_ci(level = 0.95,
         type = "percentile") %>%
  print() 

null_dist_t %>%
  visualize(method = "both") + # method = both를 넣으면 이론적 분포(라인그래프)와 샘플의 값(바차트)을 비교할 수 있어
  shade_p_value(obs_stat = t_cal, 
                direction = "two-sided") + 
  shade_confidence_interval(endpoints = null_dist_ci)
 
 
아래의 그래프가 생성됨 → 귀무가설 기각