💛 대응표본검정
대응표본검정은 쌍체표본검정이라고도 이야기를 합니다.
동일한 집단에서 두번 측정한 결과를 비교할때 사용하고있습니다!
시간차를 두고 두 번의 측정결과를 비교할때 사용합니다!
대응표본검정
함수로 보자면 scipy.stats의 ttest_rel()을 사용합니다.
ttest_rel(a,b, alternative='less,greater,two-sided')
여기서 a는첫번째 모집단에서 뽑은 데이터를 의미하고 b는 두번째 모집단에서 뽑은 표본 데이터를 의미합니다.
당연히 데이터 수는 같겠죠.
그럼 여기서 미래의 나에게 내는 문제! 1. a,b는 집단이 총 몇개인가? -> 답은 1개! 이유는 사전, 사후로 해서 a,b를 나눈것이기때문에 총 1개의 집단입니다~ |
쨌든 다시 돌아와서
그러면 alternative는 뭘 넣으냐? 라고 헷갈릴거같은데 대립가설의 정의니까 그 대립가설에 맞는것을 적으면 됩니다.
예를들어
퇴근후딴짓 크리에이터는 수험생의 점수 향상을 위해 새로운 교육 프로그램을 도입했다.
도입 전과 도입 후의 점수 차이를 확인하기 위해 동일한 수험생의 점수를 비교하였습니다. 다음은 교육 전과 후의 점수 데이터이다. 새로운 교육 프로그램이 효과가 있는지 검정하시오. (데이터는 정규분포를 따른다고 가정한다.) μd = (before – after)의 평균 💛여기서 뮤 뒤를 잘 봐야합니다 d는 difference의 약자입니다.
|
여기서는 대립가설이 0보다 작으니까 less가 들어가게 되겠죠?!
💛문제를 직접 풀어볼게요
퇴근후딴짓 크리에이터는 수험생의 점수 향상을 위해 새로운 교육 프로그램을 도입했다. 도입 전과 도입 후의 점수 차이를 확인하기 위해 동일한 수험생의 점수를 비교하였습니다. 다음은 교육 전과 후의 점수 데이터이다. 새로운 교육 프로그램이 효과가 있는지 검정하시오.(데이터는 정규분포를 따른다고 가정한다.)
μd = (before – after)의 평균
|
# 데이터
import pandas as pd
df = pd.DataFrame({
'before':[85,90,92,88,86,89,83,87,65,50],
'after':[88,89,96,89,85,88,85,89,78,61]
})
데이터는 위와같이 주어졌습니다.
💛 대응표본검정을 하기 위해서 임포트를 하하고 대응표본검정을 구해봅니다.
# 대응표본검정
from scipy import stats
stats.ttest_rel(df['before'], df['after'], alternative='less')
💛결과
TtestResult(statistic=-2.119860886666164, pvalue=0.03152591671694539, df=9)
여기서 pvalue값이 0.05보다 작으니까 귀무가설 기각하고 대립가설 채택할 수 있습니다.
💛그런데 반대로 아래와 같은 상황이라면?
μd = (after - before)의 평균
|
a,b순서를 바꾸면 되겠죠?
# 대응표본검정
from scipy import stats
stats.ttest_rel(df['after'],df['before'], alternative='less')
결과
TtestResult(statistic=2.119860886666164, pvalue=0.9684740832830546, df=9)
statistic의 양,음수만 바뀌어야되는데 pvalue가 왜 이상하게 나오지 하고 보니까
제가 alternative를 greater로 변경해야하는데 변경하지 않아서 쌍표본(대응표본)결과가 말도안되게 나왔습니다.
다시 alternative를 변경하고 계산해보면
# 대응표본검정
from scipy import stats
stats.ttest_rel(df['after'],df['before'], alternative='greater')
💛결과
TtestResult(statistic=2.119860886666164, pvalue=0.03152591671694539, df=9)
로 statistic(검정통계량)의 양,음만 바뀐걸 확인할 수 있습니다.
2.심화(정규분포를 따르지 않을 때)
# 데이터
import pandas as pd
df = pd.DataFrame({
'before':[85,90,92,88,86,89,83,87,65,50],
'after':[88,89,96,89,85,88,85,89,78,61]
})
μd = (after - before)의 평균
|
💛위와같은 가정을 가지고 있는 데이터를 가지고 샤피로 , 윌콕슨 검정까지 해보려고 합니다.
일단 샤피로-윌크 검정은 정규분포를 따르지 않을때 해볼 수 있는 비모수 검정이니까
정규성 검정을 먼저 해야겠죠?
지난번 리뷰를 하자면 샤피로윌크는 대립가설이 채택되지 않기를 바라야합니다.
💜 여기서 살짝 알아둬야할것이 있습니다. 보통 귀무가설을 기각하는 목적으로 연구결과를 발표할텐데.. 샤프로윌크검정에서만큼은 귀무가설이 채택되기를 바라야합니다.. (https://so-fast.tistory.com/entry/%EC%9E%91%EC%97%85%ED%98%953-%EB%8B%A8%EC%9D%BC%ED%91%9C%EB%B3%B8%EA%B2%80%EC%A0%95-%EC%8B%AC%ED%99%94) |
여기서는 after-before의 차이 가지고 정규성 검사를 실시하게 됩니다.
그래서
# Shapiro-Wilk(샤피로-윌크) 정규성 검정
df['diff']=df['after']-df['before']
from scipy import stats
stats.shapiro(df['diff'])
를 변수로 만들고 샤피로 윌크 정규성 검정을 하게 됩니다.
💛결과
ShapiroResult(statistic=0.8106808132606462, pvalue=0.019542902973577702)
로 pvalue가 0.05보다 낮고 샤피로윌슨에서는 대립가설은 정규분포를 따르지 않는다 라고 볼 수 있습니다.
💛그런데 말입니다...?
# Shapiro-Wilk(샤피로-윌크) 정규성 검정
df['diff']=df['before']-df['after']
from scipy import stats
stats.shapiro(df['diff'])
#ShapiroResult(statistic=0.8106808132606458, pvalue=0.01954290297357753)
before, after을 반대로 쓰더라도 같은 결과를 가질 수 있습니다.그래도 뮤d 순서에 맞춰서하는것이 좋습니다. (나중에 헷갈리지않음)
💛그렇다면?
이제 비모수검정인 윌콕슨검정을 진행해야합니다.
윌콕슨은 ttest랑 동일합니다.
# Wilcoxon(윌콕슨)의 부호 순위 검정 수행
from scipy import stats
stats.wilcoxon(df['after'], df['before'], alternative='greater')
💛결과
WilcoxonResult(statistic=47.5, pvalue=0.0244140625)
대립가설 채택합니다.
💛tip
또 한가지의 방법은 diff를 그냥 넣어서 구하는 방법인데요
# Wilcoxon(윌콕슨)의 부호 순위 검정 수행 (diff)
stats.wilcoxon(df['diff'], alternative='greater')
💛결과
WilcoxonResult(statistic=47.5, pvalue=0.0244140625)
결과는 위에 값이랑 동일하게 나오는것을 확인할 수 있습니다.
단!!!!! diff는 뮤d를 구했던 것과 같아야합니다~
μd = (after - before)의 평균 <<이것!!
'자격증 > [빅분기] 빅데이터분석기사' 카테고리의 다른 글
[작업형3] 범주형 데이터 분석 - 카이제곱검정 (0) | 2024.11.08 |
---|---|
[작업형3] 독립표본검정 + 심화 (0) | 2024.11.07 |
[작업형3] 단일표본검정 심화 (0) | 2024.11.05 |
[작업형3] 단일표본검정 (1) | 2024.11.04 |
[작업형3] 가설검정 (0) | 2024.10.28 |