[확률] 7.3 분산과 표준편차

JKH·2024년 11월 18일
0

확률

목록 보기
8/25

✏️ 데이터 사이언스 스쿨에서 공부한 내용입니다.

확률분포의 분산

분산은 확률분포함수에서 확률이 모여있는지 퍼져있는지를 나타내는 값이다. 기댓값이 확률변수에서 어떤 값이 나올지를 예측한 것이라면 분산은 그 예측의 정확도 혹은 신뢰성을 표현한 것이라고 볼 수 있다. 확률밀도함수 p(x)p(x)의 수식을 알고 있다면 이론적인 분산을 구할 수 있다. 분산을 구하는 연산은 영어 Variance의 앞글자를 따서 Var[]\text{Var}[\cdot]로 표기하고 이 연산으로 계산된 분산값은 σ2\sigma^2으로 표기한다.

" 분산 = 편차 제곱의 평균 "

σ2=Var[X]=E[(Xμ)2](7.3.1)\sigma^2 = \text{Var}[X] = \text{E}[(X - \mu)^2] \tag{7.3.1}

이산확률변수의 분산은 평균으로부터 표본 데이터까지 거리의 제곱을 확률질량함수 p(x)p(x)로 가중하여 더한 값이다.

σ2=xiΩ(xiμ)2p(xi)(7.3.2)\sigma^2 = \sum_{x_i \in \Omega} (x_i - \mu)^2 p(x_i) \tag{7.3.2}

연속확률변수의 분산은 평균으로부터 표본 데이터까지 거리의 제곱을 확률밀도함수 p(x)p(x)로 가중하여 적분한 값이다.

σ2=(xμ)2p(x)dx(7.3.3)\sigma^2 = \int_{-\infty}^{\infty} (x - \mu)^2 p(x)dx \tag{7.3.3}

분산의 성질

분산은 다음과 같은 성질을 만족한다.

  • 분산은 항상 0 또는 양수이다.
Var[X]0(7.3.4)\text{Var}[X] \geq 0 \tag{7.3.4}
  • 확률변수가 아닌 상수 값 cc에 대해 다음 식이 성립한다.
Var[c]=0(7.3.5)\text{Var}[c] = 0 \tag{7.3.5}
Var[cX]=c2Var[X](7.3.6)\text{Var}[cX] = c^2 \text{Var}[X] \tag{7.3.6}

또한 기댓값의 성질을 이용하여 다음 성질을 증명할 수 있다.

Var[X]=E[X2](E[X])2=E[X2]μ2(7.3.7)\text{Var}[X] = \text{E}[X^2] - (\text{E}[X])^2 = \text{E}[X^2] - \mu^2 \tag{7.3.7}
E[X2]=μ2+Var[X](7.3.8)\text{E}[X^2] = \mu^2 + \text{Var}[X] \tag{7.3.8}

(증명)

Var[X]=E[(Xμ)2]=E[X22μX+μ2]=E[X2]2μE[X]+μ2=E[X2]2μ2+μ2=E[X2]μ2(7.3.9)\begin{aligned} \text{Var}[X] &= \text{E}[(X - \mu)^2] \\ &= \text{E}[X^2 - 2\mu X + \mu^2] \\ &= \text{E}[X^2] - 2\mu\text{E}[X] + \mu^2 \\ &= \text{E}[X^2] - 2\mu^2 + \mu^2 \\ &= \text{E}[X^2] - \mu^2\\ \end{aligned} \tag{7.3.9}

두 확률변수의 합의 분산

두 확률변수 XX, YY의 합의 분산은 각 확률변수의 분산의 합과 다음과 같은 관계가 있다.

Var[X+Y]=Var[X]+Var[Y]+2E[(XμX)(YμY)](7.3.10)\text{Var}\left[ X + Y \right] = \text{Var}\left[ X \right] + \text{Var}\left[ Y \right]+ 2\text{E}\left[ (X-\mu_X)(Y-\mu_Y) \right] \tag{7.3.10}

(증명)

Var[X+Y]=E[(X+Y(μX+μY))2]=E[((XμX)+(YμY))2]=E[(XμX)2+(YμY)2+2(XμX)(YμY)]=E[(XμX)2]+E[(YμY)2]+2E[(XμX)(YμY)]=Var[X]+Var[Y]+2E[(XμX)(YμY)](7.3.12)\begin{aligned} \text{Var}\left[ X + Y \right] &= \text{E}\left[ (X + Y - (\mu_X + \mu_Y))^2 \right] \\ &= \text{E}\left[ ((X -\mu_X) + (Y - \mu_Y))^2 \right] \\ &= \text{E}\left[ (X -\mu_X)^2 + (Y - \mu_Y)^2 + 2(X-\mu_X)(Y-\mu_Y) \right] \\ &= \text{E}\left[ (X -\mu_X)^2 \right] + \text{E}\left[ (Y - \mu_Y)^2 \right] + 2\text{E}\left[ (X-\mu_X)(Y-\mu_Y) \right] \\ &= \text{Var}\left[ X \right] + \text{Var}\left[ Y \right] + 2\text{E}\left[ (X-\mu_X)(Y-\mu_Y) \right] \end{aligned} \tag{7.3.12}

두 확률변수 XX, YY가 서로 독립이면 다음 식이 성립한다.

E[(XμX)(YμY)]=0(7.3.13)\text{E}\left[ (X-\mu_X)(Y-\mu_Y) \right] = 0 \tag{7.3.13}
Var[X+Y]=Var[X]+Var[Y](7.3.14)\text{Var}\left[ X + Y \right] = \text{Var}\left[ X \right] + \text{Var}\left[ Y \right] \tag{7.3.14}

확률변수의 독립

두 확률변수가 서로 독립(independent) 이라는 것은 두 확률변수가 가질 수 있는 모든 사건의 조합에 대해 결합사건의 확률이 각 사건의 확률의 곱과 같다는 뜻이다. 쉽게 생각하면 두 확률변수가 서로에게 영향을 미치지 않는다라는 의미로 생각해도 된다. 예를 들어 주사위를 두 번 던져 각각 나오는 값을 나타내는 확률변수 X1X_1X2X_2는 서로 독립이다.

독립의 반대, 즉 두 확률변수에서 하나의 확률변수의 값이 특정한 값이면 다른 확률변수의 확률분포가 영향을 받아 변하게 되면 종속(dependent) 이라고 한다. 쉽게 생각하면 두 확률변수가 서로에게 영향을 미치는 경우이다. 예를 들어 주사위를 두 번 던져 나오는 값의 합은 각각의 주사위에서 나온 값에 종속적이다.

연습 문제 7.3.1

  1. 서로 독립이라고 생각되는 두 확률변수의 예를 들어라.

  2. 서로 종속이라고 생각되는 두 확률변수의 예를 들어라.

✏️
회전하는 원판에 화살을 2번 쐈을 때, 맞은 곳의 각도(0~360도)를 각각 확률변수 x1, x2라 하고, 둘의 차를 y라 하자. 이 때 x1, x2는 서로 독립이고, y는 x1, x2에 종속이다.

연습 문제 7.3.2

  1. 넘파이를 사용하여 숫자 100개를 무작위로 생성하여 표본집합을 구한다. 이 표본집합을 확률변수 X1X_1의 표본이라고 하자.

  2. 같은 방식으로 숫자 100개를 생성하며 확률변수 X2X_2의 표본집합을 구한다.

  3. 두 확률변수의 표본 쌍의 값을 더하여 확률변수 X1+X2X_1 + X_2의 표본집합을 구한다.

  4. X1+X2X_1 + X_2의 표본분산과 X1X_1, X2X_2의 표본분산값의 합을 각각 계산하여 두 값이 비슷함을 보여라.

✏️
100개의 난수를 생성하기를 두 번 반복할 때 서로 영향을 주지 않으므로 즉, 독립이므로 합의 분산과 분산의 합이 같을 것이다.

import numpy as np

N = 100  # Number of samples
X1 = np.random.rand(N)  # Generate 100 random numbers between 0 and 1

X2 = np.random.rand(N)  # Generate another 100 random numbers for X₂

X1_plus_X2 = X1 + X2  # Element-wise sum of X₁ and X₂ samples

var_X1_plus_X2 = np.var(X1_plus_X2)  # Variance of X₁ + X₂
var_X1 = np.var(X1)  # Variance of X₁
var_X2 = np.var(X2)  # Variance of X₂

print(f"Variance of X₁ + X₂: {var_X1_plus_X2}")
print(f"Sum of variances of X₁ and X₂: {var_X1 + var_X2}")
Variance of X₁ + X₂: 0.18997682446467398
Sum of variances of X₁ and X₂: 0.17522085052598374

✏️
예상과는 다르게 아예 같게 나오지는 않았다.
표본의 개수가 적어서 우연히 비슷한 양상이 나옴에 의해 두 값의 차이가 난 것으로 보인다.
N이 커질수록 합의 분산과 분산의 합의 차가 커질 것으로 예측했고 다음과 같이 실험했다.

import numpy as np
import matplotlib.pyplot as plt

N_values = np.arange(10, 3001, 10)  # N values from 10 to 100 with step 10
var_diff = []  # Empty list to store variance differences

for N in N_values:
   X1 = np.random.rand(N)  # Generate N random numbers for X₁
   X2 = np.random.rand(N)  # Generate N random numbers for X₂
   X1_plus_X2 = X1 + X2  # Element-wise sum of X₁ and X₂ samples

   var_X1_plus_X2 = np.var(X1_plus_X2)  # Variance of X₁ + X₂
   var_X1 = np.var(X1)  # Variance of X₁
   var_X2 = np.var(X2)  # Variance of X₂

   diff = var_X1_plus_X2 - (var_X1 + var_X2)  # Calculate the difference
   var_diff.append(diff)  # Add the difference to the list

# Plotting the results
plt.plot(N_values, var_diff, marker='o')
plt.xlabel('N (Number of Samples)')
plt.ylabel('var_diff (Variance Difference)')
plt.title('Difference between var_X1_plus_X2 and var_X1 + var_X2')
plt.grid(True)
plt.show()

예상대로 N값이 작을 때 값이 튀었고 N>1000이면 절대값이 0.01 안쪽으로 다 들어왔다.

표본평균의 분산

확률변수 XX의 표본평균 Xˉ\bar{X}도 확률변수이고 그 기댓값 E[Xˉ]\text{E}[\bar{X}]은 원래 확률변수 XX의 기댓값 E[X]\text{E}[{X}]과 같다는 것을 증명한 적이 있다.

E[Xˉ]=E[X](7.3.15)\text{E}[\bar{X}] = \text{E}[{X}] \tag{7.3.15}

표본평균 Xˉ\bar{X}의 분산 Var[Xˉ]\text{Var}[\bar{X}]은 원래 확률변수 XX의 분산 Var[X]\text{Var}[{X}]과 다음 관계를 가진다.

Var[Xˉ]=1NVar[X](7.3.16)\text{Var}[\bar{X}] = \dfrac{1}{N} \text{Var}[{X}] \tag{7.3.16}

따라서 표본평균을 계산한 표본 개수가 커지면 표본평균의 값의 변동은 작아진다. 표본의 수가 무한대가 되면 표본평균의 값은 항상 일정한 값이 나온다. 즉 확률적인 값이 아니라 결정론적인 값이 된다.

  • 데이터를 생성하는 확률변수 XX의 기댓값을 구하려면 확률밀도함수 p(x)p(x)의 수식을 알아야 한다.
  • 그런데 우리는 데이터를 생성하는 확률변수 XX의 확률밀도함수 p(x)p(x)의 수식을 정확히 알지 못한다.
  • 하지만 표본평균이라는 새로운 확률변수 Xˉ\bar{X}의 기댓값 E[Xˉ]\text{E}[\bar{X}]은 원래 확률변수 XX의 기댓값 E[X]\text{E}[X]과 같으므로 표본평균 xˉ\bar{x}는 원래 확률변수 XX의 기댓값 E[X]\text{E}[X]과 비슷한 값이 나올 것이다. 하지만 정확한 값은 아니다.
  • 만약 표본 개수 NN이 크면 표본평균 xˉ\bar{x}의 분산이 아주 작아지므로 표본평균의 값 xˉ\bar{x}은 항상 표본평균의 기댓값 E[Xˉ]=E[X]\text{E}[\bar{X}]=\text{E}[X] 근처의 거의 일정한 값이 나올 것이다.
  • 따라서 표본 개수 NN가 크면 표본평균 xˉ\bar{x}은 원래 확률변수 XX의 기댓값 E[X]\text{E}[X]의 근삿값이라고 할 수 있다.

연습 문제 7.3.3

(1) 넘파이를 사용하여 숫자 100개를 무작위로 생성하여 표본집합을 구한다. 이 표본집합을 확률변수 X1X_1의 표본이라고 하자. X1X_1의 표본분산을 계산한다.

(2) 같은 작업을 50번 반복하여 확률변수 X2,X3,,X50X_2, X_3, \ldots, X_{50}의 표본집합을 구한다.

(3) 확률변수 XiX_i의 표본집합의 표본평균 xˉi\bar{x}_i를 각각 계산한다. 이 값들은 표본평균 확률변수 Xˉ\bar{X}의 표본집합이다.

(4) 확률변수 Xˉ\bar{X}의 표본분산값을 계산하고 X1X_1의 표본분산과의 비율을 계산한다.

✏️

import numpy as np

N = 100  # Number of samples
num_samples = 50  # Number of sample sets (X₁, X₂, X₃, ..., X₅₀)

# Generate sample set for X₁ and calculate its variance
# ddof=0은 편향 추정량을 계산하고, ddof=1은 불편향 추정량을 계산합니다. 
X1 = np.random.rand(N)
var_X1 = np.var(X1, ddof=0)

# Generate 50 sample sets and calculate their means
sample_sets = [np.random.rand(N) for _ in range(num_samples)]
sample_means = [np.mean(sample_set) for sample_set in sample_sets]

# Calculate sample variance of X̄ and the ratio
var_X_bar = np.var(sample_means, ddof=0)
ratio = var_X_bar / var_X1

# Print results
print(f"Sample variance of X̄: {var_X_bar}")
print(f"Ratio of var_X̄ to var_X₁: {ratio}")
Sample variance of X̄: 0.0005113508195799406 
Ratio of var_X̄ to var_X₁: 0.005852410027221908   

표본분산의 기댓값

표본평균의 기댓값을 구하면 이론적인 평균 즉, 기댓값과 같아진다.

그런데 표본분산 S2S^2의 기대값을 구하면 이론적인 분산 σ2\sigma^2과 같아지는 것이 아니라 이론적인 분산값의 N1N\frac{N - 1}{N}배가 된다. 즉 표본분산값이 이론적인 분산값보다 더 작아진다.

E[S2]=N1Nσ2(7.3.20)\text{E}[S^2] = \dfrac{N-1}{N}\sigma^2 \tag{7.3.20}

그러므로 표본분산의 기대값이 정확하게 σ2\sigma^2이 되려면 평균과의 거리의 제곱의 평균을 구할 때 분모가 NN이 아니라 N1N-1으로 써야 한다.

σ2=NN1E[S2]=NN1E[1N(XiXˉ)2]=E[1N1(XiXˉ)2](7.3.30)\begin{aligned} \sigma^2 &= \dfrac{N}{N-1} \text{E}[S^2] \\ &= \dfrac{N}{N-1} \text{E} \left[ \dfrac{1}{N} \sum (X_i-\bar{X})^2 \right] \\ &= \text{E} \left[ \dfrac{1}{N-1} \sum (X_i-\bar{X})^2 \right] \end{aligned} \tag{7.3.30}

따라서 기댓값이 정확한 분산값과 일치하는 비편향 표본분산은 다음처럼 정의한다.

비편향 표본분산 = 편차 제곱의 (분모가 N-1인) 평균

Sunbiased21N1(XiXˉ)2(7.3.31)S^2_{\text{unbiased}} \equiv \dfrac{1}{N-1} \sum (X_i-\bar{X})^2 \tag{7.3.31}

이렇게 표본분산이 실제 분산보다 작아지는 이유는 다음과 같다.

  1. 표본분산을 계산할 때 사용하는 표본평균의 값이 데이터가 많이 몰려있는 쪽으로 편향되게 나온다.

  2. 이렇게 데이터가 몰려있는 위치에 있는 표본평균을 기준으로 각 데이터까지의 거리를 계산하면 원래의 기댓값으로부터의 거리보다 작게 나올 수 있다.

예를들어 기댓값 μ=0\mu=0, 분산이 σ2=1\sigma^2=1인 정규분포로부터 7개의 표본을 뽑는다.

np.random.seed(15)
N = 7
data = np.sort(np.random.normal(size=(N)))[::-1]
mean = np.mean(data)
mean
-0.46494862738581794

이 표본의 표본평균은 약 -0.46이다. 우연히 음수인 표본이 많이 나오는 바람에 원래의 기댓값 0에서 음수쪽으로 떨어진 값이 나왔다. 데이터와 표본평균의 위치를 그림으로 그리면 다음과 같다.

plt.figure(figsize=(10, 2))
sns.rugplot(data, height=0.5, linewidth=4)
x = np.linspace(-3, 3, 100)
plt.axvline(x=0, ls=":", c="r", linewidth=2, label="실제 기댓값")
plt.axvline(x=mean, ls="--", c="b", linewidth=2, label="표본평균")
plt.legend()
plt.xlim(-2, 2)
plt.show()

distance_from_sample_mean = data - mean
distance_from_sample_mean
array([ 0.80423333,  0.70051752,  0.30904009,  0.15262015, -0.03684105,
       -0.63091342, -1.29865663])

이 거리들은 진짜 평균(기댓값)으로부터 각 데이터가 떨어진 거리보다 평균적으로 작게 나온다. 그 이유는 우리가 생각한 기댓값인 표본평균이 우연히 왼쪽으로 몰려나온 데이터들 중간에 있기 때문이다.

sample_variance = (distance_from_sample_mean ** 2).mean()
sample_variance
0.4774618257836171

따라서 표본분산값은 정확한 분산값인 11보다 작은 값이다. N1N-1로 나누어 편향 보정한 값은 다음과 같다,

sample_variance * N / (N - 1)
0.5570387967475533

주의할 점은 표본분산의 기댓값이 원래의 분산값보다 작은 값이 나오는 경향이 있다는 것이지 항상 원래의 분산값보다 작게 나온다는 뜻은 아니다.

비대칭도와 첨도

비대칭도(skew)는 3차 모멘트 값에서 계산하고 확률밀도함수의 비대칭 정도를 가리킨다. 비대칭도가 0이면 확률분포가 대칭이다.

E[(Xμσ)3]=μ3σ3(7.3.32)\operatorname{E}\left[\left(\frac{X-\mu}{\sigma}\right)^3 \right] = \frac{\mu_3}{\sigma^3} \tag{7.3.32}

첨도(kurtosis)는 4차 모멘트 값에서 계산하며 확률이 정규분포와 대비하여 중심에 모여있는지 바깥으로 퍼져있는지를 나타낸다.

E[(Xμσ)4]=μ4σ4(7.3.33)\operatorname{E}\left[\left(\frac{X-\mu}{\sigma}\right)^4 \right] = \frac{\mu_4}{\sigma^4} \tag{7.3.33}

모멘트

앞서 구한 기댓값이나 분산은 확률분포의 모멘트(moment) 의 하나다.

μn=E[(Xμ)n]=(xμ)np(x)dx(7.3.34)\mu_n = \operatorname{E}[(X-\mu)^n] = \int (x - \mu)^n p(x)dx \tag{7.3.34}

모멘트는 확률분포에서 계산한 특징값이다. 만약 두 확률분포 X,YX, Y가 있고 1차부터 무한대 차수에 이르기까지 두 확률분포의 모든 모멘트값이 서로 같다면 두 확률분포는 같은 확률분포다.

E[X]=E[Y]E[(XμX)2]=E[(YμY)2]E[(XμX)3]=E[(YμY)3]E[(XμX)4]=E[(YμY)4]E[(XμX)5]=E[(YμY)5](7.3.35)\begin{aligned} \text{E}[X] &= \text{E}[Y] \\ \text{E}[(X-\mu_X)^2] &= \text{E}[(Y-\mu_Y)^2] \\ \text{E}[(X-\mu_X)^3] &= \text{E}[(Y-\mu_Y)^3] \\ \text{E}[(X-\mu_X)^4] &= \text{E}[(Y-\mu_Y)^4] \\ \text{E}[(X-\mu_X)^5] &= \text{E}[(Y-\mu_Y)^5] \\ & \vdots & \\ \end{aligned} \tag{7.3.35}

이면

X=dY(7.3.36)X \stackrel d= Y \tag{7.3.36}

이다. =d\stackrel d= 는 두 확률변수가 같은 분포(distribution)를 가진다는 것을 표시하는 기호다.

profile
Connecting my favorite things

0개의 댓글