기본 콘텐츠로 건너뛰기

벡터와 행렬에 관련된 그림들

[data analysis] 확률과 주요통계량: 모멘트와 기대값

확률과 주요통계량

내용

모멘트(Moment)

확률변수와 확률 분포의 특징과 형태를 수학적으로 설명하기 위한 정량적 지표를 모멘트(moment)라고 하며 식 1과 같이 정의합니다.

$$\begin{align}\tag{식 1}&\text{n 차 모멘트}= E(x^n)\\ &n= 1, 2, \cdots \end{align}$$

식 1에서 E(x)는 확률변수 x에 대한 기대값(평균)을 나타냅니다. 그러므로 모멘트(moment)는 변형된 확률변수의 기대값을 의미합니다. 이러한 모멘트는 기술 통계에서 소개한 평균, 분산과 함께 왜도, 첨도 등 다양한 통계량의 유도에 사용됩니다.

기대값(Expected Value)

평균은 변수들의 특성을 파악하기 위해 가장 많이 사용되는 통계량입니다. 이 통계량은 각 변수값에 대한 확률을 고려하는 것으로 기대값(expected value, E(X))이라고 합니다.

확률변수 x에 대응되는 확률은 다른 변수들에 비해 그 변수가 나타날 상대 가능도(relative likelihood)를 의미합니다. 많은 경우 확률변수와 확률의 관계는 함수로 특정할 수 있으며 그 함수를 확률함수라고 합니다.

확률함수는 변수가 이산형일경우에는 확률질량함수(probability mass function), 연속형일 경우에는 확률밀도함수(probability density function)로 구분합니다. 일반적으로 확률밀도(질량)함수는 f(x)로 나타내며 그 함수의 합(적분)인 누적확률함수는 F(x)로 표현합니다. 이 확률밀도(질량) 함수를 사용하여 1차모멘트인 평균은 식 2와 같이 계산할 수 있습니다.

$$\tag{식 2}\mu=E(X)=\begin{cases}\sum^N_{i=0} x_iP(X=x_i)&x:\text{이산변수},\; N:\text{샘플 크기}\\ \int^\infty_{-\infty}xf(x)\,dx& x:\text{연속변수} \end{cases}$$

모멘트는 거듭제곱한 확률변수에 대한 기대값입니다. 그러므로 식 3과 같이 정의합니다.

$$\tag{식 3}\text{Moment}=E(X^n)=\begin{cases}\sum^N_{i=0} x_i^nP(X=x_i)&x:\text{이산변수},\; N:\text{샘플 크기}\\\int^\infty_{-\infty}x^nf(x)\,dx& x:\text{연속변수} \end{cases}$$
import numpy as np
import pandas as pd
from scipy import stats
import matplotlib.pyplot as plt
from scipy import special
from sympy import *
import FinanceDataReader as fdr

예 1)

한 학기 동안 통계학 강의에서 받은 학생 A의 4번의 점수가 각각 82, 75, 83, 90일 경우 평균 점수를 계산해 봅니다.

자료에서 각 점수에 대한 확률은 $\frac{1}{4}$입니다. 즉, 확률질량함수(pmf) f(x)는 $\frac{1}{4}$입니다.

data=np.array([82, 75, 83, 90])
pmf=1/4
E=np.sum(data*pmf); E #기대값
82.5
data.mean() # 평균
82.5

각 시험에 가중치를 달리하여 적용한다면 결국 자료 자체의 각 값이 달라지므로 기대값 역시 변경 됩니다.

weight=np.array([1/10, 2/10, 3/10, 4/10])
dataWeig=weight*data
print(dataWeig)
[ 8.2 15.  24.9 36. ]
E_weig=np.sum(dataWeig*1/4); E_weig
21.025
dataWeig.mean()
21.025

예 2)

주사위 1회 시행에서 발생하는 점의 수를 확률변수로 하면 그 변수의 값들의 분포와 기대값을 결정합니다.

각 값이 나올 확률은 $\frac{1}{6}$로 균일 합니다. 이 균일한 확률을 그래프로 나타내보면 그림 1과 같습니다. 이러한 분포를 균일분포(uniform distribution)라고 합니다.

그림 1 주사위 한개 시행할 경우의 각 주사위눈이 나올 확률질량함수.
x=range(1, 7)
y=np.repeat(1/6, 6)
plt.figure(figsize=(3,2))
plt.scatter(x, y, s=50, label=r"pmf = $\frac{1}{6}$=0.1667")
plt.hlines(1/6, 1, 6, linestyle="--", color="g")
plt.xlabel("x, number of dice")
plt.ylabel("PMF")
plt.xticks([1, 2, 3, 4, 5,6])
plt.yticks([0, 1/6, 2/6])
plt.legend(loc="best")
plt.show()

이 시행의 기대값은 다음과 같습니다.

x=np.arange(1, 7)
E=np.sum(x*Rational(1,6));E

$\frac{7}{2}$

확률변수 x의 선형변환에 의한 새로운 변수에 대한 기대값은 식 4와 같이 계산됩니다.

E(ax + b) = aE(x) + b,   a, b는 상수 (식 4)
선형변환

식 5와 같이 두 변수에 대해 각각의 변환과 합의 변환이 같고 상수에 대해 배분법칙이 성립되는 변환(함수)의 관계가 성립하는 상태를 나타냅니다.

T(u + v) = T(u) + T(v)(식 5)
T(au) = aT(u), a: 상수

식 5는 표본공간의 확률의 합이 1이라는 공리를 사용하여 식 6과 같이 증명할 수 있습니다. 확률변수에 대응하는 확률과의 관계를 확률함수로 정의할 수 있으므로 언급한 공리는 모든 실수 범위의 확률변수 x에 대한 확률함수 f(x)의 적분이 1임을 의미합니다.

$$\begin{align}\tag{식 6}E(ax+b)&=\int^\infty_{-\infty}(ax+b)f(x)\,dx\\ &=\int^\infty_{-\infty}axf(x)\,dx+b\int^\infty_{-\infty}f(x)\,dx\\&=ax+b\\ &\because\; \int^\infty_{-\infty}f(x)\,dx=1\end{align}$$

예 3)

동전 3개를 던지는 시행에서 앞면이 나오는 횟수를 확률변수 X로 할 경우의 기대값은?

이 문제는 다음 과정으로 계산할 수 있습니다.

  1. 동전 3개의 시행에서 일어날 수 있는 사건들 표본공간 S를 결정
  2. 확률변수는 앞면의 발생횟수로 0, 1, 2, 3이 되며 S에서 각 사건의 발생빈도 계산
  3. 확률질량함수(PMF) 계산(식 7)
    • PMF = 각 사건의 발생빈도(식 7)
      표본공간의 총빈도
  4. 기대값을 계산
x=np.array([0,1,2,3])
S=list(itertools.product([0,1], repeat=3));S
[(0, 0, 0),
(0, 0, 1),
(0, 1, 0),
(0, 1, 1),
(1, 0, 0),
(1, 0, 1),
(1, 1, 0),
(1, 1, 1)]

위 코드에서 앞면을 1, 뒷면을 0으로 설정하였으므로 각 횟수에 대한 앞면의 결과는 그 결과의 합으로 나타낼 수 있습니다.

S1=[sum(i) for i in S]; S1
[0, 1, 1, 2, 1, 2, 2, 3]

확률변수 x와 대응되는 빈도수는 np.unique() 함수에 의해 계산됩니다.

  • np.unique(x, return_index=False, return_counts=False, axis=None)
    • 객체 x에서 고유한 요소들과 각각의 빈도를 반환
    • return_index: 반환된 요소들의 인덱스 (첫 번째로 감지되는 인덱스)
    • return_counts: 각 고유값(unique)의 빈도수
    • axis=None: 함수가 실행되는 기준 축, None는 객체를 1차원으로 전환
val,fre=np.unique(S1, return_counts=True)
print(fre)
[1 3 3 1]
pmf=fre/sum(fre)
print(pmf)
[0.125 0.375 0.375 0.125]
E=np.sum(val*pmf)
print(E)
1.5

기대값의 선형결합

여러 독립사건들의 결합에서의 기대값을 고려할 있습니다. 예를 들어 어떤 사람(A)의 주당 출근 시간(W)에 대한 확률분포를 작성하기 위한 고려사항들은 다음과 같습니다. 이 사항들에 부합하는 W는 식 8과 같이 계산됩니다.

  • 일주일의 총 출근 시간은 월요일에서 금요일까지의 출근시간을 모두 합한 결과(W)
  • 각각의 출근시간은 동일한 확률을 가지는 확률변수
  • 각 출근시간은 상호간의 영향을 주지 않기 때문에 독립
  • 각 요일의 출근 시간을 X1, · · · , X5
W = X1 + X2 + X3 + X4 + X5(식 8)

총시간의 기대값은 개별시간의 기대값의 합과 같습니다. 즉, 랜덤변수들의 합의 기대값은 개별 랜덤변수들의 기대값의 합과 같습니다. 그러므로 일주일의 평균 출근 시간은 식 9와 같이 매일의 평균의 합으로 계산할 수 있습니다.

E(W) = E(X1 + X2 + X3 + X4 + X5)(식 9)
= E(X1) + E(X2) + E(X3) + E(X4) + E(X5)

기대값은 식 5와 같이 선형변환이 성립합니다. 이 관계를 성립하는 두 개 이상의 변수들의 결합을 선형결합(linear combination) 이라 합니다. 기대값의 선형결합을 식 10과 같이 일반화하여 나타낼 수 있습니다.

Z = aX + bY, a, b는 상수(식 10)
E(Z) = E(aX + bY) = aE(X) + bE(Y)

예 4)

주식 kodex 레버리지(lever)와 kodex 인버스(inverse)를 각각 150과 300주씩 매입했습니다. 표 1은 각 주식의 시가와 종가 사이의 일일 평균 변화율을 6개 구간으로 명목화하고 각 구간의 평균 이익을 나타낸 자료입니다. 이 자료를 기준으로 두 주식에 대해 기대 수익을 계산해 봅니다.

표 1 주식 레버리지와 인버스의 구간 이익
레버리지 인버스
구간이익 확률 구간이익 확률
0 -1175.000 0.007 -122.500 0.007
1 -716.250 0.013 -62.879 0.108
2 -395.000 0.115 -22.019 0.341
3 -134.449 0.387 17.398 0.403
4 129.087 0.341 56.944 0.118
5 363.158 0.125 94.000 0.016
6 643.750 0.013 147.500 0.007

위 자료는 FinanceDataReader 패키지를 사용하여 호출한 자료를 사용하여 작성한 것입니다. 이 변환과정에서 사용자 정의함수 expectStock()을 작성, 적용하였습니다. 이 함수는 목록화된 자료와 기대값을 반환합니다.

def expectStock(a, grpNum):
    a['diff']=a['Close']-a['Open']
    a['percent']=a['diff']/a['Open']*100
    a['inDe']=pd.cut(a['percent'], bins=grpNum, labels=range(grpNum))
    fre=a['inDe'].value_counts()
    p=fre/fre.sum()
    profit=a[['diff','inDe']].groupby(['inDe']).mean()
    data=pd.concat([profit, p], axis=1)
    E=(data.product(axis=1)).sum()
    data.columns=["diff_intval", "Prob"]
    return([E, data])
lere=expectStock(lever, 7)
inre=expectStock(inver, 7)
pd.concat([lere[1], inre[1]], axis=1).round(3)
st=pd.Timestamp(2022,1, 1)
et=pd.Timestamp(2023, 3, 28)
lever=fdr.DataReader('122630', st, et).iloc[:,[0, 3]]
inver=fdr.DataReader('114800', st, et).iloc[:,[0, 3]]
lere=expectStock(lever, 7)[1] #리버리지 목록화된 자료
inre=expectStock(inver, 7)[1] #인버스 목록화된자료 

위 코드의 lere와 inre는 사용자정의함수인 expectStock()의 결과로서 위 표의 레버리지와 인버스에 대응하는 각 두 열을 나타냅니다.

기대값은 위 자료의 구간이익과 확률의 곱을 더한 것입니다. 다음은 각 주식의 주당 기대값입니다.

#레버리지
E_lev=(lere.product(axis=1)).sum(); E_lev.round(3)
-16.738
#인버스
E_inv=(inre.product(axis=1)).sum(); E_inv.round(3)
1.131

두 주식의 기대값의 선형 결합에 의해 구입한 주식의 총 기대값을 계산할 수 있습니다.

(150*E_lev+300*E_inv).round(3)
-2171.311

위 결과에 의하면 약 2172원 손해가 예상됩니다.

주식의 경우 상황의 변화가 심하기 때문에 위 결과가 미래의 추정을 반영할 수 없습니다. 그러나 계산 기간과 유사한 상황이 반복적으로 일어난다면 거래를 위한 참고 자료가 될 수 있을 것입니다. 기대값은 확률적으로, 예상되지 않는 변화들 사이에 균형을 유지하기 위한 값을 의미하기 때문에 다양한 기간에 기대값의 경향을 조사한다면 주식들의 변동상황에 대한 정보를 파악하는데 도움이 될 것입니다.

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...