728x90
: 데이터가 정규분포를 따르는지 확인하는 통계적 방법
1. 모수적 방법(Parametric Methods)
: 데이터가 특정 분포(정규분포 등)에 따른다고 가정하여 해당 분포의 모수(평균, 분산 등)를 추정한 후 검정
: 정규성 가정이 틀리면 결과가 부정확할 수 있음
1) Shapiro-Wilk Test
- 가장 많이 사용
- 데이터 분포와 정규분포 간의 상관계수를 기반으로 검정
- 데이터가 작아도 신뢰도가 높음
- 데이터가 크면 민감도가 증가하여 정규성을 지나치게 엄격히 평가할 수 있음
from scipy.stats import shapiro
stat, p = shapiro(data)
print(f'Statistic={stat}, p-value={p}')
2) Anderson-Darling Test
- Kolmogorov-Smirnov Test를 개선한 방법
- 누적분포함수(CDF)와 정규분포의 CDF간 차이를 측정
- 정규분포뿐만 아니라 다른 특정 분포에 대한 적합성 검정
- 더 세밀한 검정 결과 제공
- 데이터가 크면 민감도가 높아질 수 있음
from scipy.stats import anderson
result = anderson(data)
print(f'Statistic={result.statistic}, Critical Values={result.critical_values}')
3) D'Agostino and Pearson's Test
- 데이터 왜도(Skewness)와 첨도(Kurtosis)를 사용
- 중간 크기의 데이터에서 유용
- 데이터 크기가 작으면 정확도가 떨어짐
from scipy.stats import normaltest
stat, p = normaltest(data)
print(f'Statistic={stat}, p-value={p}')
4) Jarque-Bera Test
- 데이터의 왜도와 첨도가 정규분포의 이론적 값(왜도=0, 첨도=3)과 일치하는지 검정
- 데이터가 극단적인 왜도나 첨도를 가지는 경우 민감도가 높음 (이상치에 민감)
from scipy.stats import jarque_bera
stat, p = jarque_bera(data)
print(f'Statistic={stat}, p-value={p}')
5) Robust Jarque-Bera Test
- Jarque-Bera Test의 변형으로 계산 복잡성이 높음
- 이상치(Outlier)에 덜 민감하도록 개선 되어 이상치에 강함
6) Ryan-Joiner Test
- Shapiro-Wilk Test와 유사
- 상관계수를 사용해 정규성 평가
- 정규성 확인에 간단하고 효과적
- 미니탭 등 일부에서만 지원
7) Z-Test for Skewness and Kurtosis
- 표본 데이터의 왜도와 첨도가 정규분포의 이론적 값과 유의미하게 다른지 검정
- Z 통계량으로 검정
- 왜도와 첨도를 별도로 분석 가능
- 데이터 크기가 크면 민감도가 매우 높아질 수 있음
8) Zheng-Li Test
- 데이터의 CDF와 정규분포의 이론적 CDF간의 차이를 기반으로 한 감정
- 표본 크기에 따라 유연하게 적용 가능
9) Variance Ratio Test
- 데이터의 분산이 정규분포의 분산과 일치하는지 확인
- 특정 데이터(주로 시계열 데이터)의 분산 패턴을 확인할 때 유용
10) Q-Q Plot
- 데이터 분포과 정규분포를 시각적으로 비교 -> 쉽게 판단 가능
- 점들이 대각선에 가까울수록 정규성 만족
import statsmodels.api as sm
import matplotlib.pyplot as plt
sm.qqplot(data, line='s')
plt.show()
2. 비모수적 방법(Non-parametric Methods)
: 특정 분포에 대한 가정을 하지 않으며, 데이터 순위나 분포의 형태를 기반으로 검정
: 계산 복잡성이 높거나 민감도가 낮을 수 있음
1) Kolmogorov-Smirnov Test
- 데이터의 누적 분포함수(CDF)와 정규분포의 CDF 간의 최대 차이를 검정
- 간단하고 직관적
- 데이터가 크면 민감도가 증가하여 정규성을 지나치게 엄격히 평가할 수 있음
from scipy.stats import kstest, norm
stat, p = kstest(data, 'norm')
print(f'Statistic={stat}, p-value={p}')
2) Lilliefors Test
- Kolmogorov-Smirnov Test 의 변형
- 모수 추정 없이 사용 가능하여 더 유연함
- Python library 없음. 별도 구현 필요
3) Cramer-von Mises Test
- 데이터의 누적분포 함수(CDF)와 정규분포의 이론적 CDF간의 차이를 측정
- 데이터의 분포적 특징을 더 세밀하게 검토
- 큰 데이터에서 계산이 복잡
from statsmodels.stats.diagnostic import normal_ad
stat, p = normal_ad(data)
print(f'Statistic={stat}, p-value={p}')
4) Henze-Zirkler Test
- 다변량 정규성 검정을 위해 설계된 방법으로 다차원 데이터의 정규성을 검정하는데 적합
- 단변량 데이터에도 적용 가능
- 계산 복잡성 증가
5) Energy Test
- 정규분포와 데이터 분포 간의 에너지 거리(확률분포간의 차이)를 측정
- 데이터의 다차원 정규성도 검정 가능
from hyppo.independence import Energy
e = Energy()
stat, p = e.test(data, norm.rvs(size=len(data)))
print(f'Statistic={stat}, p-value={p}')
728x90
'통계학 > 통계' 카테고리의 다른 글
| [통계분석] ANOVA (분산분석) (2) | 2024.12.23 |
|---|---|
| [통계분석] t-test (t-검정) (2) | 2024.12.22 |
| 상관분석 정의 및 종류 + 예시(w. Python) (4) | 2024.12.09 |
| [확률분포] 연속형 확률분포 (2) | 2024.12.01 |
| [확률분포] 이산형 확률분포 (5) | 2024.11.30 |