AI/빅데이터분석기사(통계)
[빅데이터 분석기사 실기] 작업형3유형 1.통계적검정
brave_sol
2024. 11. 19. 00:49
1. 언제 검정이 필요할까?
1) 그룹 간 평균 차이가 유의미한가? 그룹이 2개면 T-검정, 그룹이 3개이상이면 ANOVA
- t-검정 또는 ANOVA 검정을 수행하기 전에, 독립성 > 정규성 > 등분산성 순으로 가정을 만족하는지 확인
가정 | 확인방법 | 가정의 가정 | 가정 만족하지 않는다면 t-test, ANOVA 대신 |
독립성 | - 연구설계(무작위 샘플링, 실험군-대조군) - 범주형: 카이제곱 검정 - 잔차: Durbin-Watson, ACF 플롯 - 군집: ICC - 시계열: Ljung-Box, ACF |
* 카이제곱 독립성 검정 - 각 기대빈도 값 5 이상 (5미만은 피셔의 정확검정) - 데이터 독립적으로 수집 |
- Paired t-test - Mixed Effects Model |
정규성 | - 시각적: 히스토그램, Q-Q플롯 - Shapiro-Wilk - Kolmogorov-Smirnov |
- 독립성 - 샘플 랜덤 추출 |
비모수 검정 - Mann-Whitney U test - Rank Sums - Wilcoxon Signed-Rank(대응) - Kruskal-Wallis test |
등분산성 | - Bartlett's Test (정규성 만족시) - Levene'sTest(정규성 만족X) - Fligner-Killeen Test(비모수) |
- Welch's t-test - Welch's ANOVA |
2. Python 코드
1) 독립성 검정
- 카이제곱 검정: 두 범주형 변수의 독립성을 검정
from scipy.stats import chi2_contingency
# 교차표 생성
data= np.array([[10,20,30],[6,9,17]])
# 카이제곱 검정
chi_stat, p_value, dof, expected = chi2_contingency(data)
print(p_value, "두 변수는 서로 독립이다" if p_value > 0.05 else "두 변수는 독립이 아니다")
# 0.873028283380073 두 변수는 서로 독립이다
2) 정규성 검정
- shapiro 검정: 데이터가 정규 분포를 따르는지 검정
# 정규성 검정
from scipy.stats import shapiro
data = [10, 20, 15, 30, 90, 10, 1, 5, 7, 20 ]
# 귀무가설: 데이터는 정규분포를 따른다
stat, p_value = shapiro(data)
print(p_value, "정규분포를 따른다" if p_value> 0.05 else "정규분포를 따르지 않는다")
# 0.00043917806690261466 정규분포를 따르지 않는다
3) 등분산성 검정
- 레빈 검정 (Levene's Test): 정규분포를 따르지 않는 경우 사용
from scipy.stats import levene
group1 = [10, 12, 14, 16, 18]
group2 = [20, 22, 24, 26, 28]
group3 = [30, 32, 34, 36, 38]
# 귀무가설: 그룹 간 분산은 동일하다
stat, p_value = levene(group1, group2, group3)
print(p_value, "등분산성을 만족한다" if p_value > 0.05 else "등분산성을 만족하지 않는다")
# 출력 예시: 0.324 등분산성을 만족한다
- 바틀렛 검정(Bartlett's Test): 정규분포를 따르는 경우 사용
from scipy.stats import bartlett
group1 = [10, 12, 14, 16, 18]
group2 = [20, 22, 24, 26, 28]
group3 = [30, 32, 34, 36, 38]
# 귀무가설: 그룹 간 분산은 동일하다
stat, p_value = bartlett(group1, group2, group3)
print(p_value, "등분산성을 만족한다" if p_value > 0.05 else "등분산성을 만족하지 않는다")
# 출력 예시: 1.0 등분산성을 만족한다
- 플리그너-킬린 검정(Fligner-Killeen Test): 비모수 검정, 데이터가 정규분포를 따르지 않는 경우 사용
from scipy.stats import fligner
group1 = [10, 12, 14, 16, 18]
group2 = [20, 22, 24, 26, 28]
group3 = [30, 32, 34, 36, 38]
# 귀무가설: 그룹 간 분산은 동일하다
stat, p_value = fligner(group1, group2, group3)
print(p_value, "등분산성을 만족한다" if p_value > 0.05 else "등분산성을 만족하지 않는다")
# 출력 예시: 0.545 등분산성을 만족한다
4) t검정: 표본의 평균이 정규분포를 따르고, 모분산을 모를때, 모평균을 검정
- 단일 표본 t검정: 표본 평균과 특정 값 비교
from scipy.stats import ttest_1samp
#데이터 생성
data= np.random.normal(55,10,30) # 평균이 55, 표준편차가 10인 표본 30개
# 단일 표본 t검정
t_stat, p_value = ttest_1samp(data, 50)
print(p_value, "유의수준 초과, 귀무가설을 기각할 수 없다(평균이 50)" if p_value>0.05 else "유의수준 미만, 귀무가설을 기각(평균이 50이 아니다)")
# 0.002922275650744329 유의수준 미만, 귀무가설을 기각(평균이 50이 아니다)
- 독립 표본 t검정: 독립된 두 그룹의 평균을 비교
from scipy.stats import ttest_ind
# 데이터 생성
group1 = np.random.normal(50,10,30)
group2 = np.random.normal(55,10,30)
# 독립표본 t검정: 두 그룹의 평균 비교
t_stat, p_value= ttest_ind(group1, group2)
print(p_value, "두 그룹의 평균은 같다" if p_value > 0.05 else "두 그룹의 평균은 다르다")
# 0.1372371925519809 두 그룹의 평균은 같다
- 대응표본 t검정: 동일한 집단에서 처리 전/후의 평균 차이를 검정
from scipy.stats import ttest_rel
# 데이터 생성
before= np.random.normal(50,10,30)
after = before + np.random.normal(2,5,30)
# 대응 표본 t검정
t_stat, p_value = ttest_rel(before, after, alternative="two_sided)
## 양측 검정(기본, 생략가능) alternative="two-sided" : (대립) b와 a의 평균에 차이가 있다.
## 단측 검정의 경우 alternative='greater' : (대립) b가 a보다 크다
## 단측 검정의 경우 alternative='less' : (대립) b가 a보다 작다
print(p_value, "처리 전후 평균 차이가 유의미하지 않다(같다)" if p_value > 0.05 else "처리 전후 평균 차이가 유의미하다")
# 0.012707786773851518 처리 전후 평균 차이가 유의미하다
5) ANOVA 분석: 세 그룹 이상의 평균 차이를 검정
from scipy.stats import f_oneway
# 데이터 생성
group1 = np.random.normal(50, 10, 30)
group2 = np.random.normal(55, 10, 30)
group3 = np.random.normal(60, 10, 30)
f_stat, p_value = f_oneway(group1, group2, group3)
print(p_value, "그룹간 평균차이가 유의미 하지 않다" if p_value > 0.05 else "적어도 한 그룹의 평균이 다르다")
# 3.3982018102480806e-07 적어도 한 그룹의 평균이 다르다
※ (참고) z 검정: 표본의 평균이 정규분포를 따르고, 모집단의 분산이 알려져 있을 경우, 모평균을 검정할 떄 사용
# z검정: 모집단의 표준편차를 알고 있을때, 평균 비교에 사용
import numpy as np
from statsmodels.stats.weightstats import ztest
# 데이터 생성
data= np.random.normal(55,5,100) # 평균이55, 표준편차가 5인 표본 100개
# z검정
z_stat, p_value = ztest(data, value=50) # 귀무가설: 평균이 50이다
print(p_value, "유의수준 초과, 귀무가설을 기각할 수 없다(평균이 50)" if p_value>0.05 else "유의수준 미만, 귀무가설을 기각(평균이 50이 아니다)")
# 4.448752145173029e-25 유의수준 미만, 귀무가설을 기각(평균이 50이 아니다)
반응형