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이 아니다)

 

반응형