기초통계

[기초통계] 집단 비교 : 독립표본 t검정, 검정력, 효과크기, 분산분석, 분할표

2022. 8. 18. 19:47

 

집단비교


A/B 테스트와 MVP를 만들어 실험을 했다. 

그럼 통계적으로는 어떻게 분석해야 할까?


 
 
 Multi - Armed Bandit 솔루션
딜레마를 해결하기 위해
대규모 서비스 같은 경우에는 이 솔루션을 사와서 실험 추이를 보며 리소스 통제 계획을 정한다.
예) optimizely


집단 비교 통계 처리 순서도

'종속변수'의 예
 - A와 B군중 어디가 매출이 더 잘 나오는가? > 매출은 연속된 값 > 연속형
 - 가입을 하느냐, 탈퇴를 하느냐? > 가입 아니면 탈퇴 > 범주형
 


독립표본 t-검정


 두 집단의 평균 차이

𝑋1: 대조군 평균
𝑋2: 실험군 평균

•  두 집단의 모집단이 모두 정규분포를 따르거나, 또는 각 집단의 크기가 충분히 큰 경우 (𝑛 >  30)
    t-분포를 이용해서(𝑋1  − 𝑋2)의 신뢰구간을 계산
•  가설검정의 경우 독립표본 t-검정을 수행

 

Python에서 독립표본 t-검정

car.xlsx 데이터 활용

car = pd.read_excel("car.xlsx")              # xlsx 파일 읽어오기 : pd.read_excel()

k3 = car.price[car.model == 'K3']            # k3 가격
avante = car.price[car.model == 'Avante']    # Avante 가격

k3.mean()         # k3 가격 평균 913.8115942028985 원
avante.mean()     # Avante 가격 평균 833.4146341463414 원

 표본에서는 K3가 Avante보다 평균 80만원 더 비쌋다.
그러면모집단에서도 그럴까?
 
·귀무가설 : k3와 avante, 두 집단의 평균이 같다.
· 신뢰구간 : k3와 avante의 '평균 차이'의 신뢰구간
 
혹은 두 평균의 차이의 가설검정을 구하면 된다.  

import pingouin as pg
pg.ttest(k3, avante)   # k3, avante 두 집단의 평균에 대한 차이를 구하는 독립표본 t검정 실시
구분 설 명
T 검정통계량
dof 자유도
tail  
p-val p-value
CI95% 신뢰구간
cohen-d 코헨의 d
BF10  
power 검정력


 ( k3 평균 - Avante 평균 ) 이 적게는 8만원부터 최대 152만원까지 차이가 날 수 있다.
귀무가설은 모집단에서 평균의 차이가 0. (즉 k3평균 = Avante 평균)
 
귀무가설은 기각되고 'k3는 Avante보다 비싸다' 라고 결론지을 수 있다.

 


연습 

single과 married의 rating 평균은 차이가 있을까?

# 데이터 불러오기
import pandas as pd
import numpy as np

hr = pd.read_excel('c:\\data\\hr.xlsx')

# 결혼 여부 컬럼값 확인하기
hr.marriage.value_counts()

"""
single     763
married    707
Name: marriage, dtype: int64
"""

# marriage 컬럼에 'single'과 'marriage'의 만족도를 두 집단으로 분류한다.
single_r = hr.rating[hr.marriage == 'single']
married_r = hr.rating[hr.marriage == 'married']

# 두 집단의 평균 차이에 대한 가설검정
import pingouin as pg
pg.ttest(single_r, married_r)

# pg.ttest(k3, 800) : k3의 평균이 800인가? 를 검정
# pg.ttest(k3, avante) : k3 평균과 avante의 평균이 같은가? 를 검정

p-val가 아주 작다 → 귀무가설을 기각한다.
귀무가설 > single과 married와 평균이 같다.
 

import seaborn as sns
sns.kdeplot(x='rating', hue='marriage', data=hr, bw_adjust=2.0)

# hue 카테고리 변수이름
# bw_adjust < 그래프 매끄럽게 보는 코드

 

평균이 아닌 다른 것을 비교할 수도 있다.
 
 
맨 휘트니 U검정

pg.mwu(married_r, single_r)    # 무작위로 기혼자와 미혼자 중에 한명씩 뽑았을 때
                               # 귀무가설 : P(기혼자 > 미혼자) = P(기혼자 < 미혼자)

> p-val 가 작으므로 귀무가설은 기각한다.

 


어디에 쓰일 수 있나?

> 두 집단 비교할 때
 
· 신약 개발
    신약       vs  플라시보(가짜약) 의 회복 기간을 비교한다
   평균5일      평균7일
 
· 제품
신제품 vs 경쟁제품
만족도3.8  2.9           


독립표본  t 검정  순서도


 

검정력 power

•  유의수준(𝛼) :귀무가설이 참일 때, 기각하는 1종 오류의 확률
•  𝛽 : 귀무가설이 거짓일 때, 기각하지 못하는 2종 오류의 확률
•  검정력(1 − 𝛽) : 귀무가설이 거짓일 때, 이를 올바르게 기각할 확률
                                 - 보통 검정력은 0.8 이상을 요구

 
검정력이 낮은 예)

                               표본의 크기가 크면 증가
                               분석 결과에 나오는 검정력은 모수가 통계량과 같다는 가정 아래 계산됨.


 

효과 크기  effect size

관찰된 현상의 크기를 나타내는 방법

•  방법:
 분산을 이용하는 방법 > 에타제곱
 평균 차이를 이용하는 방법 > 코헨의 d

 

에타 제곱 𝜂²  eta squared                                                                        코헨의  d    Cohen's d  

  분산을 이용한 효과 크기 표현 방법



•  전체 SS =  (X – 전체평균)²의 합계
•  처치 SS = (집단평균 - 전체평균)²의 합계
•  SS : 편차제곱합(Sum of Squares)
• 두 집단의 평균 차이를 데이터의 표준편차로 나눈 것


 평균 차이의 크기를 알기 쉽게 나타낸 것
t-test 하면 쉽게 확인할 수 있다.

•  에타 제곱 = 1
•   집단 간 차이만 있고 집단 내 차이는 없음
•   실험 조건에 따라 모든 것이 달라짐
•   실험 조건이 같으면 결과도 같음

•  에타 제곱 = 0
•   집단 간 차이는 없고 집단 내 차이만 있음
•   실험 조건에 따라 아무 것도 달라지지 않음
•   같은 실험 조건에도 서로 다름
 
예)대조군 데이터는 1, 1, 1이고, 실험군 데이터는 3, 3, 3인 경우
•  집단 내 차이는 없고, 집단 간 차이만 존재
•  에타 제곱 = 1

예) 대조군 데이터는 1, 2, 3이고, 실험군 데이터도 1, 2, 3인 경우
•  집단 내 차이만 있고, 집단 간 차이는 없음
•  에타 제곱 = 0
예) 친구와 나의 IQ 검사

1표준편차 = 15점

나 100    친구 115      →   Cohen's d     1         
나 120    친구 123      →   Cohen's d     0.24

*에타제곱< R² 와 같은 개념.
 

  효과크기 계산

import pingouin as pg
pg.compute_effsize( 집단1,  집단2, eftype='방법')

 

•  에타 제곱  eta-square

pg.compute_effsize(avante, k3, eftype='eta-square')

•  코헨의 d  cohen

pg.compute_effsize(avante, k3, eftype='cohen')

 

분산분석


 
•  집단 간 차이가 크다면 집단 내 분산에 비해 집단 간 분산이 커질 것
•  모집단이 정규분포를 따르거나, 
    각 집단의 표본 크기가 충분히 크면 집단 간분산/집단 내분산의 비율은 F 분포를 따름
   이를 통해"모든 집단들의 평균이 같다"는 귀무가설을 검정할 수 있음.
• 귀무가설을 기각할 경우, "적어도 한 집단의 평균은 다르다"라는 대립가설을 채택
 
 

분산분석  순서도

Python 분산 분석 

pg.anova(dv=' ', between=' ', data= , detailed=True/False)

car = pd.read_excel("car.xlsx")

import pingouin as pg
pg.anova(dv='price', between='model', data=car, detailed=True)
  • 집단간 분산분석 p-val = 0.082432

           집단 간
           
           집단 내
                                                                                                                                                 검정통계량         p-value          에타제곱
                                             SS(편차제곱합)      자유도       편차제곱평균       

 

ttest는 원래 두 집단의 분산이 같아야 한다. (분산을 보정하는 과정이 들어간다.)
서로 분산이 다르면 분산을 보정해주는데 (correction=True)
이 보정 옵션을 제거하면 분산분석과 동일한 p-val이 나오게 된다.

 

# 보정 옵션을 끄면 ttest의 p-val와 분산분석의 p-val는 같다.
pg.ttest(k3, avante, correction=False)

 
ttest에서 보정 옵션을 주지 않으면, 두 집단의 분산이 같은지 먼저 가설검정을 한다.
이 가설검정이 기각되면, 자동 보정이 된다. 기각이 안되면 보정 별도로 하지 않음.

pg.ttest(k3, avante)

 

anova는 수동 보정이 필요하다.
pg.welch_anova()

pg.welch_anova(dv='price', between='model', data=car)

 

다중비교   multiple comparison

•  분산 분석은 한 번에 여러 집단을 비교할 수 있음.
•  독립표본 t-검정은 한 번에 두 집단만 비교 가능.
•  집단이 여러 개 있을 경우 독립표본 t-검정은 집단 간의 모든 짝을 비교해야 함.

   - 집단이 k개일 경우 필요한 비교 횟수 = k(k-1) / 2


연습


Python 집단별 평균 확인

import pandas as pd

st = pd.read_csv('student-mat.csv')
st.groupby('Mjob').agg({'G3':'mean'})

 

CASE1 )집단 간 분산이 같은 데이터 

 
① 데이터 import 하기

import pandas as pd

st = pd.read_csv("student-mat.csv")
st.head()


② 집단 간 분산이 같은지 확인하기 :Levene 검정
 
pg.homoscedasticity(dv=' ', group=' ', data= )

import pingouin as pg

pg.homoscedasticity(dv='G3', group='Mjob', data=st)
# G3 = 학점, Mjob = 어머니 직업
# 귀무가설 : Mjob(어머니 직업)별 학생 집단의 G3(학점) 분산이 같다.
equal_var = True 등분산성 만족

 
 
③ 집단 간 분산이 같다면 Tukey HSD검정,  같지 않다면 Pairwise_gameshowell 검정

# 분산분석
pd.anova(dv='G3', between='Mjob', data=st)

> p-value가 0.05 보다 작으므로 귀무가설은 기각된다.
   즉, Mjob에 따라 나누어진 학생 집단중 G3의 평균이 같지 않은 집단이 있을 수 있다.
 
 

집단 간 분산이 같으므로 Tukey HSD 검정선택

import pingouin as pg
pg.pairwise_tukey(dv='G3', between='Mjob', data=st)

# hedges : cohen-d와 비슷한 개념
# p-tukey : p-value

CASE2 )집단간 분산이다른데이터

 
① 데이터 import 하기

import pandas as pd

hr = pd.read_csv("c:\\data\\hr.xlsx")
hr.head()

 

 
 
② 집단 간 분산이 같은지 확인하기
 
agg()메소드 사용

hr.groupby('job_level').agg({'rating':'var'})
분산이 다 다름.

: pg.homoscedasticity(dv=' ', group=' ', data= )

pg.homoscedasticity(dv='rating', group='job_level', data=hr)

>집단 간 분산이 다른 집단이 존재한다.

 
③ 분산분석 : 분산이 같지 않을 때

import pingouin as pg
pg.welch_anova(dv='rating', between='job_level', data=hr)

np2< 에타 제곱
0-1 사이
 0 : 전혀 영향력이 없음 ~
 1 : 영향력이 매우큼
 
 

 집단 간 분산이 다르므로 gameshowell 검정 선택

pg.pairwise_gameshowell(dv='raing', between='job_level', data=hr)

 

FWER   Familywise Error Rate

다중 비교를 할 경우,적어도 한 번1종 오류가 발생할 확률

 
예) 세 집단이 모집단에서 평균이 모두 같은 경우
    유의수준(𝛼)5%인 비교를 3번해서,3번 모두 1종 오류를 피할 확률(독립적이라고 가정할 경우):
     95%   ×   95%   ×   95 %    ≈   86%

   
     바꿔 말하면적어도 한 번 1종 오류가 발생할 확률(FWER)은 14%
    비교를 많이 할수록 FWER은 증가

 


 

사후 검정    post hoc test

FWER을 통제하기 위해분산 분석을 먼저 실시한다.

분산 분석 결과가 통계적으로 유의하면( 𝑝 < 𝛼 ) 사후 검정을 실시
•  여러 집단 중 통계적으로 유의한 차이가 나는 집단을 식별

•  사후 검정에서도 𝛼를 조절하여 FWER이 커지지 않도록 제어
 -  각 집단의 분산이같은경우:Tukey HSD
  - 각 집단의 분산이다른경우:Games-Howell검정

 
 

등분산성   homoscedasticity

집단간 분산이 같은지는Levene  검정으로 확인 가능


 

🤷🏻‍♀️ 등분산성을 확인하고 바로 tukey 나 Gameshowell 검정을 하지 않는 이유?

 
Gameshowell이나 Tukey는 유의수준이 5% 가 된다는 보장이 없다.
최대한 유의수준이 5% 가 되도록 보정이 들어가 있긴 하지만 보장은 되지 않는다.
 하지만 anova는 이게 가능하다.
 
anova에서 귀무가설 기각
→ 제대로 기각
→ 잘못 기각 (1종 오류) 5%
 

anova에서 잘 판단하면,다음 단계에서 tukey나 gameshowell을 해서 틀려도 이미 anova에서 잘못 기각됐기 때문에(1종 오류) 의미가 없다.즉 엄격하게 먼저 판단을 한다.
 


 

분할표    contingency table

행과 열이 서로 다른 범주형 변수의 값을 나타내는 표.
.pivot_table( index = ' ', columns = ' ' , aggfunc = 'size' )

• 범주형 변수의 값에 대한 사례 수 (size)를 표기해준다.


 
: 결혼 여부와 부서에 대한 사례수를 표기함.

import pandas as pd
hr = pd.read_excel("c:\\data\\hr.xlsx")

hr.pivot_table(index='marriage', columns='department', aggfunc='size')

위에는 표본집단.
모집단에서도 재무부서가 결혼 비율이 높다고 할 수 있나?
 
부서별로 결혼한 사람의 비율의 차이가 있을까?
= 결혼한 사람들 중에 부서별 비율이 차이가 있을까?
 
>가설 검정이 필요하다.
 

이 때 필요한 검정이'카이제곱 검정'


카이제곱 검정

두 범주형 변수가 독립적이라는 귀무가설을 검정
 

예) 부서와 결혼
   H0: 부서별 결혼 비율이같다
  H1: 부서별 결혼 비율이 다르다
 

•  데이터가 적으면 p-value가 부정확할 수 있음.
 기대 빈도(expected)가  5 이하인 경우가 20% 이하를 권장

 
•  Cramér's V: 두 변수의 관계를 0~1로 표시
  -  0 : 전혀 관련이 없음
  -  1 : 완전히 일치
 
 

카이제곱 검정 순서도

 

Python에서 카이제곱검정

pg.chi2_independence( x=' ', y=' ', data= )

import pingouin as pg

# 카이제곱 검정
expected, observed, stats = pg.chi2_independence( x='marriage', y='department', data=hr)
귀무가설이 참이라면 예상되는expected 값 = 기대빈도 observed 관측값
# 부서별 결혼 비율
print(462.195238 / 498.804762,
      30.3 / 32.7,
      214.504762 / 231.495238)

 

> stats 

 

결과해석

  • 귀무가설 :부서별로 결혼 비율은같다.
  • 결과 :p-value > 0.05  →귀무가설을 기각할 수 없음.
  • 해석 :부서별 결혼 비율에 통계적으로 유의한 차이는 없다.

  • cramer
    :집단간의 차이가 얼마나 나는가 (range : 0 ~ 1)
      1에 가까우면 부서에 따라 결혼의 여부가갈리는것
      위 결과에서는 cramer가 0.03으로 매우 작으므로 부서와 결혼을 관련이 별로 없다.

 


예) 카이제곱 검정을 할 수 있는 경우

 
광고를 여러가지 버전으로 했을 때
A 집단은 광고를 보고 지나쳤고, B집단은 광고를 보고 들어왔다.
 
VER2 광고가 클릭이 좀더 높다면, 이것이 통계적으로 유의한 차이가 있을까?