Data Analysis/Statistics

Python_Statistics_t-test

mansoorrr 2023. 12. 7. 17:53

t-test

  • t-분포를 따르는 통계적 가설 검정 방법
    • 모집단 표준편차를 알 수 없을때
    • 표본평균과 모집단 평균 사이의 표준화된 거리를 설명
    • 관측값은 정규분포를 따르는 모집단에서 추출
    • 정규분포(z분포)는 모집단의 표준편차를 알고 있다고 가정
    • 표본크기가 커질수록 t분포는 정규분포와 비슷해짐
    • 정규분포와 마찬가지로 t분포의 평균도 0
    • 기본적으로 정규분포와 모양이 비슷하지만 꼬리가 두꺼움
    • 일반적으로 표본 크기가 30이상인 경우 z분포 사용 가능
  • 모집단을 대표하는 표본의 분산이나 표준편차를 가지고 검정하는 방법
  • 어느 특정 집단의 평균값을 추정하거나 차이를 검정할때 사용가능
  • 종속변수는 연속형이어야 하며 독립변수는 범주형이어야 함
  • t검정통계량: 분산을 사용하여 집단간의 차이를 통계적으로 표현한 것
    • 두 집단의 차이의 평균(X)을 표준오차(SE)로 나눈 값
    • 결국 표준오차와 표본평균차이의 비율
  • t-test에는 대표적으로 3가지 분석방법이 있음(일표본, 독립표본, 대응표본)

 

일표본

  • 관심있는 변수의 평균값을 특정 기준값과 비교
  • 검증하고자 하는 기준값이 있어야함(1)
  • 정규성 검정실시(2)
    • 정규성을 만족할때: 일표본 t-test실행
    • 정규성을 만족하지 않을때: 윌콕슨의 부호 순위검정 실행
    • H0: 정규성을 가진다
    • H1: 정규성을 가지지 않는다
  • 가설수립(3)
    • H0: 모평균의 평균은 ****이다.
    • H1: 모평균의 평균은 ****이 아니다.
  • 유의수준(a)설정: 보통 .05
  • 검정통계량의 값 및 p-value계산(4)
  • 귀무가설 기각여부 판단 및 해석(5)

예시 1) 고양이의 몸무게가 평균이 2.6kg인지 통계적 검정(양측검정, 유의수준=.05) 

 

  • 정규성검정
    • H0: 데이터가 정규분포를 따른다.
    • H1: 데이터가 정규분포를 따르지 않는다.
    • statistic: 0.95 / p-value: 6.730e-05로 유의수준보다 작게 나타나므로 귀무가설을 기각한다.
    • 따라서 데이터가 정규분포를 따르지 않으므로 윌콕슨의 부호 순위 검정을 실시한다.
# 정규성검정
import scipy.stats as stats
from scipy.stats import shapiro

shapiro(cats["Bwt"])

# ShapiroResult(statistic=0.9518786668777466, pvalue=6.730228778906167e-05)

실제로 분포를 그려보면 정규분포를 따르지 않음

 

  • wilcoxon t-test
    • 검정을 위한 기준평균 설정
    • H0: 고양이의 평균 무게는 2.6kg이다.
    • H1: 고양이의 평균 무게는 2.6kg이 아니다.
    • wilcoxon t-test결과 statistic: 3573.0 / p-value: 0.025로 유의수준보다 작게 나타난다.
    • 따라서 귀무가설을 기각하고 대립가설을 채택한다.
    • 그러므로 고양이의 평균 무게는 2.6kg이라고 할 수 없다.
#wilcoxon t-test
#기준이되는 평균(모집단의 평균)
mu = 2.6

#wilcoxon
stats.wilcoxon(cats["Bwt"] - mu, alternative="two-sided")

#WilcoxonResult(statistic=3573.0, pvalue=0.02524520294814093)

 

독립표본

  • 두 개의 독립된 모집단의 평균을 비교할때 사용
  • 두 모집단은 정규성을 만족해야함(1)
    • H0: 정규성을 따른다. -> 등분산 가정 실시
    • H1: 정규성을 따르지 않는다. -> 윌콕슨의 부호순위 검정 실행
  • 집단간 등분산성 가정(2)
    • H0: 등분산을 만족한다. 
    • H1: 등분산을 만족하지 않는다.
  • 가설수립(3)
    • H0: 두 모평균의 차이가 없다.
    • H1: 두 모평균의 차이가 있다.
  • 유의수준(a) 설정: 기본적으로 .05 (4)
  • 검정통계량의 값 및 p-value 계산 (5)
  • 귀무가설의 기각여부 판단 및 해석 (6)

예시 1) cats데이터로 수컷고양이와 암컷고양이의 몸무게 차이 검정

  • 정규성 검정
    • H0: 정규성을 따른다.
    • H1: 정규성을 따르지 않는다.
#---------- shapiro검정 실시
import scipy.stats as stats
from scipy.stats import shapiro

# 경우 1)
#shapiro검정 결과 p-value <.05 이므로 귀무가설을 기각한다.
#따라서 정규성을 따르지 않는다.
#그러므로 wilcoxon 검정을 실시한다.

# 경우 2)
#shapiro검정 결과 p-value >.05 이므로 귀무가설을 체택한다.
#따라서 정규성을 따른다.
#그러므로 등분산 검정을 실시한다.

 

  • 등분산 검정 실시
    • H0: 두 집단이 등분산이다.
    • H1: 두 집단이 등분산이 아니다.
#---------- 집단으로 구분
male = cats.loc[cats["Sex"]=="M", "Bwt"]
female = cats.loc[cats["Sex"]=="F", "Bwt"] 

#---------- 등분산검정실시
stats.levene(male, female) #LeveneResult(statistic=19.43101190877999, pvalue=2.0435285255189404e-05)

# 등분산 검정의 p-value <.05 미만으로 나타나 귀무가설을 기각한다.
# 따라서 집단간의 등분산이 가정되지 않는다.
# 등분산이 가정되지 않는 것을 포함하여 독립표본 t-test를 진행한다.

 

  • 독립표본 t-test 실시
    • H0: 집단간(수컷고양이와 암컷고양이) 몸무게 차이는 없다.
    • H1: 집단간(수컷고양이와 암컷고양이) 몸무게 차이는 있다.
#----------- 독립표본 t-test실시(equal_var=False로 설정: 등분산이 가정되지 않았기 때문)
stats.ttest_ind(male, female, equal_var=False) #TtestResult(statistic=8.70948849909559, pvalue=8.831034455859356e-15, df=136.83788299625363)

# p-value < .05로 나타나므로 귀무가설을 기각한다.
# 따라서 집단간(수컷고양이과 암컷 고양이)의 몸무게 차이는 존재한다.

 

 

대응표본

  • 단일 모집단에게 어떤 처리를 가했을 경우
  • 처리 전과 처리 후의 평균의 차이를 비교할때 사용한다.
  • 같은 집단으로 기본적으로 등분산을 가정한다.
  • 모집단의 관측값은 정규성을 만족해야 한다.
    • H0: 정규성을 가정한다. -> 대응표본 검정 실시
    • H1: 정규성을 가정하지 않는다 -> 윌콕슨 검정 실시
  • 대응표본 검정 실시
    • H0: 처리 전과 처리 후의 평균에 차이는 없다.
    • H1: 처리 전과 처리 후의 평균은 차이가 있다.

예시 2) 수면영양제 복용 전과 후의 수면시간을 측정하여 영양제의 효과가 있는지 판단

  • 정규성 검정
    • H0: 수면영양제 복용 전과 복용 후는 정규성을 따른다.
    • H1: 수면영양제 복용 전과 복용 후는 정규성을 따르지 않는다.
    • 정규성 검정 결과 p-value >.05 이므로 귀무가설을 채택
    • 따라서 정규성을 만족함
    • 대응표본 t-test실시
#---------- 데이터 생성
data = {
    "before": [7, 3, 4, 5, 2, 1, 6, 6, 5, 4],
    "after": [8, 4, 5, 6, 2, 3, 6, 8, 6, 5]
}
data = pd.DataFrame(data)
data

#---------- 정규성 검정
import scipy.stats as stats

stats.shapiro(data["before"]) # ShapiroResult(statistic=0.9644591808319092, pvalue=0.835266649723053)
stats.shapiro(data["after"]) # ShapiroResult(statistic=0.945683479309082, pvalue=0.6177965998649597)

 

  • 대응표본 t-test 실시
    • H0: 복용전과 복용 후의 수면시간은 차이가 없다.
    • H1: 복용전과 복용 후의 수면시간은 차이가 있다.
    • p-value < .05 이므로 귀무가설을 기각한다.
    • 대립가설을 채택하고 복용 전과 복용 후의 수면시간의 차이가 있으므로
    • 영양제를 복용한 후 수면시간이 늘었다는 결론을 도출한다.
#---------- 대응표본 t-test실행
# 두 집단의 평균이 다른지: alternative = 양측검정(two-sided)
# 두 집단의 평균중 어디가 더 큰지 작은지: alternative = 단측검정
#--> 효과성검증: 사전보다 사후가 더 큰지 작은지 --> before가 after보다 작은지 --> alternative="less"
stats.ttest_rel(data["before"], data["after"], alternative="less") #TtestResult(statistic=-4.743416490252569, pvalue=0.0005269356285082764, df=9)