통계
6주차의 통계를 정리한다. 데이터의 종류에서 시작해 요약 통계량, 분위수와 상자 그림, 상관관계, 그리고 가설 검정을 다룬다.
데이터의 종류
- 데이터는 값들 사이의 관계에 따라 네 가지로 나뉜다.
네 가지 데이터 척도
- 명목형 데이터nominal data(범주형categorical data): 순서 관계가 없음(예: 눈 색깔). 신경망에 쓸 때는 원핫 부호화one-hot encoding로 변환한다.
- 순서형 데이터ordinal data: 순서는 있으나 값들의 차이에 수학적 의미가 없음(예: 설문의 "매우 그렇다").
- 구간 데이터interval data: 차이에 의미가 있으나 절대적 영점이 없음(예: 섭씨·화씨 온도).
- 비율 데이터ratio data: 차이에 의미가 있고 진정한 영점zero point이 존재함(예: 키, 나이, 절대온도).
요약 통계량
- 데이터셋을 효과적으로 파악하는 방법은 요약 통계량summary statistic을 구하는 것이다. 가장 대표적인 것은 산술 평균arithmetic mean으로, 가중치를 부여하면 가중weighted 평균이 된다.
- 기하 평균geometric mean과 조화 평균harmonic mean도 자주 쓰인다.
- 기계학습의 F1 점수F1 score는 재현율recall과 정밀도precision의 조화 평균이다.
- 중앙값median은 정렬된 데이터의 가운데 값이다(원소가 짝수 개이면 가운데 두 값의 평균). 순서가 중요한 중앙값과 값의 합이 반영되는 평균은 서로 다른 정보를 준다.
- 데이터의 변동variation을 재는 방법으로 범위range(최댓값 − 최솟값), 평균 편차mean deviation, 분산이 있다.
- 절댓값 대신 제곱을 쓰는 분산이 더 흔하다. 편향 표본 분산biased sample variance과 비편향 표본 분산unbiased sample variance은 다음과 같다.
- 분모에
대신 을 쓰는 것을 베셀 보정Bessel's correction이라 하며, 표본 분산의 편향성을 낮춘다. 모평균 와 분산 를 모르므로 표본으로 추정하는데, 데이터가 충분히 크면 두 분산의 차이는 거의 없다. - 분산의 제곱근이 표준편차standard deviation(모집단
, 표본 )이고, 표본 평균들의 표준편차를 평균 표준오차standard error of the mean라 한다.
python
import numpy as np
x = np.array([37, 44, 55, 63, 65, 69, 71, 73, 74, 87], dtype=float)
print("산술평균 =", x.mean())
print("중앙값 =", np.median(x))
gmean = np.exp(np.mean(np.log(x))) # 기하평균
hmean = 1 / np.mean(1 / x) # 조화평균
print(f"기하평균 = {gmean:.3f}, 조화평균 = {hmean:.3f}")
print("편향 표본분산 s_n^2 =", round(x.var(ddof=0), 3))
print("비편향 표본분산 s^2 =", round(x.var(ddof=1), 3))
print("표준편차 =", round(x.std(ddof=1), 3),
" 표준오차 =", round(x.std(ddof=1) / np.sqrt(len(x)), 3))분위수와 상자 그림
- 분위수quantile는 데이터를 고정된 크기의 그룹으로 나누는 값이다. 중앙값은 데이터를 반으로 나누므로 이분위수2-quantile, 즉 50 백분위수50th percentile이다.
- 데이터를 넷으로 나누는 사분위quartile가 흔히 쓰인다. Q1(25%), Q2(50%, 중앙값), Q3(75%)로 나누며, 상자 그림box plot으로 시각화한다.
- 상자 그림에는 Q1·Q2·Q3가 표기되며, Q3와 Q1의 차이를 사분범위interquartile range; IQR라 한다. 상자에서 뻗은 선을 수염whisker이라 하고, 그 바깥의 값을 잠재적 이상치possible outlier라 한다.
상관관계
- 한 특징이 변할 때 다른 특징이 함께 변하는 연관 관계를 상관관계correlation라 한다. 기계학습에서 높은 상관관계는 새로운 정보를 주지 않으므로, 특징 선택feature selection으로 이를 줄인다.
- 피어슨 상관계수Pearson correlation coefficient
은 두 특징의 선형linear 상관관계의 강도이다. 기댓값expectation value 로 다음과 같이 정의된다.
- 스피어먼 상관계수Spearman correlation coefficient
은 값 자체가 아닌 순위rank에 기초해 단조적 연관 관계를 찾는다. 피어슨 상관은 선형 관계만, 스피어먼 상관은 비선형(단조) 관계도 반영한다.
python
import numpy as np
v = np.array([1, 2, 3, 4, 5, 6, 7], dtype=float)
w = np.array([2, 1, 4, 3, 7, 5, 8], dtype=float)
def pearson(a, b): # 기댓값 정의를 그대로 구현
return ((a*b).mean() - a.mean()*b.mean()) / (a.std()*b.std())
def rank(a):
order = a.argsort()
r = np.empty(len(a))
r[order] = np.arange(len(a))
return r
def spearman(a, b):
d = rank(a) - rank(b)
n = len(a)
return 1 - 6*np.sum(d**2) / (n*(n**2 - 1))
print(f"피어슨 r = {pearson(v, w):.4f}")
print(f"스피어먼 ρ = {spearman(v, w):.4f}")
print("numpy 검증 (피어슨) =", round(np.corrcoef(v, w)[0, 1], 4))가설 검정
- 가설 검정hypothesis testing은 두 그룹 간의 차이를 통계적으로 분석하는 도구이다. 두 종류의 가설을 사용한다.
귀무가설과 대안가설
- 귀무가설null hypothesis
: 두 그룹이 같은 모집단에서 나왔다(같은 평균)고 가정하는 가설. - 대안가설alternative hypothesis
: 두 그룹이 다른 모집단에서 나왔다는, 우리가 보이려는 가설. 가 기각되면 암묵적으로 가 승인된다.
- 검정은 두 분포가 다른지만 보는 양꼬리two-tailed 검정과 한쪽이 크거나 작은지 보는 한꼬리one-tailed 검정으로 나뉜다. 대부분 데이터의 독립 동일 분포independent and identically distributed; i.i.d.를 가정한다.
-검정 -test은 검정 통계량 를 -분포 -distribution와 비교해 값을 구하는 모수적parametric 검정으로, 데이터가 정규분포를 따른다고 가정한다. 두 표본의 분산이 같다고 가정하지 않는 웰치 -검정Welch's -test의 통계량과 자유도degree of freedom는 다음과 같다.
값은 가 참일 때 관측된 차이가 나타날 확률로, 미리 정한 값(주로 )보다 작으면 를 기각하고 통계적으로 유의미한statistically significant 차이가 있다고 한다.- 신뢰구간confidence interval은 반복된 표본에서 참 모평균 차이가 일정 비율로 속하는 구간이다. 신뢰수준
와 임계값critical value 로 다음과 같이 정의된다.
값이 유의미해도 현실적 의미가 크지 않을 수 있으므로, 효과 크기effect size를 함께 본다. 웰치 -검정에서 코헨 Cohen's 는 다음과 같다.
- 데이터가 정규분포를 따르지 않으면 분포에 아무 가정도 하지 않는 비모수적nonparametric 검정을 쓴다. 대표적으로 윌콕슨 순위합 검정Wilcoxon's rank-sum test이라고도 하는 맨-휘트니
-검정Mann-Whitney's -test이 있으며, 값의 순위를 이용해 통계량 를 계산한다.
-검정의 귀무가설은 "두 그룹의 평균 차이가 "인 반면, 맨-휘트니 -검정의 귀무가설은 "그룹 1에서 뽑은 값이 그룹 2에서 뽑은 값보다 클 확률이 "이다.
python
import numpy as np
rng = np.random.default_rng(0)
g1 = rng.normal(10.0, 2.0, size=40) # 평균 10
g2 = rng.normal(11.5, 3.0, size=50) # 평균 11.5
# 사분위수와 IQR
q1, q2, q3 = np.percentile(g1, [25, 50, 75])
print(f"g1 Q1={q1:.2f}, 중앙값={q2:.2f}, Q3={q3:.2f}, IQR={q3-q1:.2f}")
# 웰치 t-검정 통계량 (분산이 같다고 가정하지 않음)
def welch_t(a, b):
return (a.mean() - b.mean()) / np.sqrt(a.var(ddof=1)/len(a) + b.var(ddof=1)/len(b))
t = welch_t(g1, g2)
# 코헨 d (효과 크기)
d = (g2.mean() - g1.mean()) / np.sqrt(0.5*(g1.var(ddof=1) + g2.var(ddof=1)))
print(f"웰치 t = {t:.4f}, 코헨 d = {d:.4f}")