왜도와 첨도
관련내용
- 확률과 주요통계량: 모멘트와 기대값
- 확률과 주요통계량: 분산
- 왜도와 첨도
왜도와 첨도는 평균, 분산과 함께 확률분포의 특성을 나타내는 주요 통계량으로 사용됩니다. 왜도(skewness)는 평균(중심)을 기준으로 분포의 좌우의 비대칭성의 정도를 나타내고 첨도(kurtosis)는 분포의 peak 즉 봉우리의 뾰족한 정도를 나타내는 통계량입니다.
왜도와 첨도는 확률변수의 개개의 값과 평균의 차이에 대해 3제곱과 4제곱을 적용한 새로운 확률변수에 대한 기대값입니다. 즉, 두 통계량은 각각 3차와 4차 모멘트가 됩니다. 왜도는 식 1, 첨도는 식 2과 같이 정의됩니다.
왜도(skewness)
- 3차 모멘트
- 표준정규분포의 왜도 = 0
- skewness > 0: 분포가 오른쪽으로 기울어진 형태(skewed to right)
- skewness < 0: 분포가 왼쪽으로 기울어진 형태(skew to left)
\begin{align}\text{skewness}&=E\left(\frac{X-\mu}{\sigma} \right)^3\\&=\frac{E(X-\mu)^3}{\sigma^3} \end{align} | (식 1) |
첨도(kurtosis)
- 4차 모멘트는 첨도를 나타내는데 실제적으로 -3을 고려합니다.
- 표준정규분포의 첨도= 0(4차 모멘트 = 3): mesokurtic(정규분포)
- kurtosis > 0: letokurtic 또는 fat-tailed
\begin{align}E\left(\frac{X-\mu}{\sigma} \right)^4-3\\&=\frac{e(X-\mu)^4}{\sigma^4}-3 \end{align} | (식 2) |
주가자료(stock data)의 경우는 leptokurtic 즉, 정규분포보다 두툼한 꼬리와 두개의 봉우리가 생성되는 보이는 경향이 일반적입니다.
성공확률 p인 베르누이 시행을 반복하는 이항분포(Binomial distribution)를 생각해 봅니다. 이항분포의 확률함수는 식 3과 같이 조합(combination)과 시행당 확률의 곱으로 나타냅니다.
$$f(x)=\binom{n}{s}p^s(1-p)^{n-s}$$ | (식 3) |
n: 총 시행횟수, s: 성공횟수, p: 시행당 성공확률 |
이항분포의 확률질량함수(pmf)는 scipy.stats.binom.pmf()
메서드를 적용하여 계산할 수 있습니다. 예로 시행횟수(n), 성공횟수(s), 시행당 확률(p)가 각각 100, 10, 0.1의 조건에서 pmf를 계산해 봅니다.
stats.binom.pmf(10, 100, 1/10).round(3)
0.132
성공확률 0.1인 사건을 10번 시행에서 확률분포의 기대값, 분산, 왜도, 그리고 첨도는 다음과 같이 계산됩니다.
n=10 p=0.1 s=np.arange(n+1) pf=stats.binom.pmf(s, n, p) print(pf.round(3))
[0.349 0.387 0.194 0.057 0.011 0.001 0. 0. 0. 0. 0. ]
E=np.sum(s*pf); E.round(3)
1
var=np.sum((s-E)**2*pf);var.round(3)
0.9
ske=np.sum((s-E)**3*pf)/var**(3/2); ske.round(3)
0.843
kurt=np.sum((s-E)**4/var**(4/2)*pf)-3;kurt.round(3)
0.511
위 결과는 stats.binom.stats(n, p, moments="mvsk")
메서드에 의해 확인할 수 있습니다. 이 메서드의 매개변수 moments에 전달하는 인수 mvsk는 각각 평균, 분산, 왜도 그리고 첨도를 나타냅니다.
re=stats.binom.stats(n,p, moments="mvsk") print(np.array(re).round(2))
[1. 0.9 0.84 0.51]
예 1)
총 시행횟수 10번의 베루누이 시행에서의 시행당 확률이 0.1, 0.5, 0.8인 조건에 각각의 평균, 분산, 왜도, 첨도를 결정합니다.
n=10 p=np.array([0.1, 0.5, 0.8]) s=np.arange(n).reshape(10,1) pmf=stats.binom.pmf(s, n, p) pd.DataFrame(pmf, columns=["p=0.1", "p=0.5", "p=0.8"]).round(3)
p=0.1 | p=0.5 | p=0.8 | |
---|---|---|---|
0 | 0.349 | 0.001 | 0.000 |
1 | 0.387 | 0.010 | 0.000 |
2 | 0.194 | 0.044 | 0.000 |
3 | 0.057 | 0.117 | 0.001 |
4 | 0.011 | 0.205 | 0.006 |
5 | 0.001 | 0.246 | 0.026 |
6 | 0.000 | 0.205 | 0.088 |
7 | 0.000 | 0.117 | 0.201 |
8 | 0.000 | 0.044 | 0.302 |
9 | 0.000 | 0.010 | 0.268 |
re=stats.binom.stats(n, p, moments="mvsk") pd.DataFrame(re, index=["평균","분산","왜도", "첨도"], columns=["p=0.1","p=0.5","p=0.8"]).round(3)
p=0.1 | p=0.5 | p=0.8 | |
평균 | 1.000 | 5.0 | 8.000 |
분산 | 0.900 | 2.5 | 1.600 |
왜도 | 0.843 | 0.0 | -0.474 |
첨도 | 0.511 | -0.2 | 0.025 |
위 결과는 그림 1과 같이 시각화할 수 있습니다.
plt.figure(figsize=(10, 3)) col=['g', 'b', 'r'] lbl=["p=0.1", "p=0.5", "p=0.8"] for i in range(3): plt.subplot(1,3,i+1) plt.bar(range(pmf.shape[0]), pmf[:,i], color=col[i], alpha=0.7, label=lbl[i]) plt.legend(loc="best") plt.xticks(range(10)) plt.xlabel("trial number") plt.ylim(0, 0.4) if i!=0: plt.ylabel('') plt.yticks([]) else: plt.ylabel('probability') plt.show()
댓글
댓글 쓰기