본문 바로가기
개념정리/Python

▷ 이산형 확률변수 - 1 · 2차원 이산형 확률변수

by 화영쌤 2023. 3. 22.
728x90

¶  1차원 이산형 확률변수

  • 확률변수 X가 취할수 있는 값의 집합 {x1, x2, ...}
  • X가 xk 라는 값을 취하는 확률


▷ 확률질량함수(확률함수)

# 불공정한 주사위의 확률분포
import numpy as np
import matplotlib.pyplot as plt

# 확률변수가 취할 수 있는 값의 집합 x_set
x_set = np.array([1,2,3,4,5,6])

 

- 불공정한 주사위의 확률변수 구하기

def f(x):
    if x in x_set:
        return x/21
    else:
        return 0
X=[x_set,f]

# 확률 p_k 구하기 (1 -> 1/21, 2 -> 2/21, ... 6-> 6/21)  
prob = np.array([f(x_k) for x_k in x_set]) 

# x_k 와 p_k의 대응을 사전식으로 표시하기
dict(zip(x_set,prob))

 

- 확률분포 그래프 그리기

fig = plt.figure(figsize=(10,6))
ax=fig.add_subplot(111)
ax.bar(x_set,prob)
ax.set_xlabel('value')
ax.set_ylabel('probability')
plt.show()


▷ 누적분포함수 (분포함수)

  • X가 x 이하가 될 때의 확률을 반환하는 함수
def F(x):
    return np.sum([f(x_k) for x_k in x_set if x_k<=x])

 

- 확률변수 변환 (확률변수 Y = 확률변수 X*2 + 3) → Y의 확률분포 구하기

y_set = np.array([2*x_k+3 for x_k in x_set])
prob = np.array([f(x_k) for x_k in x_set])
dict(zip(y_set,prob))


▷ 1차원 이산형 확률변수의 기댓값

  • 확률변수를 몇번이나(무제한) 시행하여 얻어진 실현값의 평균
  • 무제한 실행할 수 없으므로 확률변수가 취할 수 있는 값과 확률의 곱의 총합
  • 이산형 확률변수의 기댓값 - (g : 확률변수에 대한 변환의 함수)

# g에 아무것도 지정하지 않으면 확률변수 X의 기댓값이 구해짐.
def E(X,g=lambda x:x):
    x_set, f=X
    return np.sum([g(x_k)*f(x_k) for x_k in x_set])

# a,b를 실수, X를 확률변수로 했을 때 E(aX+b)=aE(X)+b 가 성립함. 
# 즉, 아래 식은 2*E(X)+3 와 똑같음.
E(X,g=lambda x: 2*x+3)


▷ 1차원 이산형 확률변수의 분산

- 불공정한 주사위의 분산 구하기

mean = E(X)
np.sum([(x_k-mean)**2 * f(x_k) for x_k in x_set])

 

- 인수 g가 확률변수에 대한 변환의 함수일 때 확률변수 Y(= 2X+3) 구하기

def V(X,g=lambda x:x):
    x_set,f=X
    mean = E(X,g)
    return np.sum([(g(x_k)-mean)**2 * f(x_k) for x_k in x_set])

# a,b를 실수, X를 확률변수로 했을 때 V(aX+b)=a^2V(X) 가 성립함. 
# 즉, 아래 식은 2^2*V(X)
V(X,lambda x: 2*x+3)


¶  2차원 이산형 확률변수

  • 확률변수 X가 xi, 확률변수 Y가 yj를 취하는 확률

  •  확률변수 (X,Y)의 움직임을 동시에 고려한 분포

▷ 결합확률함수

# X와 Y가 취할 수 있는 값의 집합
x_set = np.arange(2,13)
y_set = np.arange(1,7)

# 결합확률함수 구하기
def f_XY(x,y):
    if 1<=y<=6 and 1<=x-y<=6:
        return y*(x-y)/441
    else:
        return 0
        
XY=[x_set,y_set,f_XY]

 

- 확률분포의 히트맵 그리기

prob= np.array([[f_XY(x_i,y_j) for y_j in y_set] for x_i in x_set])
fig = plt.figure(figsize=(10,8))
ax=fig.add_subplot(111)

# 확률로 색상조절
c=ax.pcolor(prob)  
# prob.shape -> (11,6)
# prob.shape[1] = 6 -> 1,2,3,4,5
# minor = False -> 보조눈금선 안보임
ax.set_xticks(np.arange(prob.shape[1]) + 0.5, minor=False)
ax.set_yticks(np.arange(prob.shape[0]) + 0.5, minor=False)
ax.set_xticklabels(np.arange(1,7),minor=False)
ax.set_yticklabels(np.arange(2,13),minor=False)
# y축을 내림차순의 숫자가 되게 하여, 위 아래를 역전시키기(y값 0~12 -> 12~0)
ax.invert_yaxis()
 # x축의 눈금을 그래프 위쪽에 표시하기
ax.xaxis.tick_top()
fig.colorbar(c,ax=ax) 

plt.show()


▷ 주변확률분포

  • 확률변수(X,Y)는 결합확률분포에 의해 동시에 정의되지만, 확률변수 X의 확률함수 fX(x)를 알고싶을 때
  • fxy에서 Y가 취할 수 있는 값 모두를 대입한 다음 모두 더함.

def f_X(x):
    return np.sum([f_XY(x,y_k) for y_k in y_set])
    
def f_Y(y):
    return np.sum([f_XY(x_k,y) for x_k in x_set])

X=[x_set,f_X]
Y=[y_set,f_Y]

# 그래프 그리기
prob_x= np.array([f_X(x_k) for x_k in x_set])
prob_y= np.array([f_Y(y_k) for y_k in y_set])

fig = plt.figure(figsize=(12,4))
ax1=fig.add_subplot(121)
ax2=fig.add_subplot(122)
ax1.bar(x_set,prob_x)
ax1.set_title('X_marginal probability distribution')
ax1.set_xlabel('X_value')
ax1.set_ylabel('probability')
ax1.set_xticks(x_set)  
ax2.bar(y_set,prob_y)
ax2.set_title('Y_marginal probability distribution')
ax2.set_xlabel('Y_value')
ax2.set_ylabel('probability')

plt.show()

▷ 2차원 이산형 확률변수의 기댓값

def E(XY,g):
    x_set,y_set,f_XY=XY
    return np.sum([g(x_i,y_j) * f_XY(x_i,y_j) for x_i in x_set for y_j in y_set])

# X와 Y의 기댓값
mean_X=E(XY,lambda x,y:x)
mean_Y=E(XY,lambda x,y:y)

# a,b를 실수, X를 확률변수로 했을 때 E(aX+bY)=aE(X)+bE(Y) 가 성립함. 
# 즉, 아래식은 a*mean_X+b*mean_Y
a,b=2,3
E(XY,lambda x,y:a*x+b*y)

▷ 2차원 이산형 확률변수의 분산

  • X의 분산은 X에 관한 편차 제곱의 기댓값

np.sum([(x_i-mean_X)**2 * f_XY(x_i,y_j) for x_i in x_set for y_j in y_set])

 

  • X와 Y의 함수 g(X,Y)의 분산

def V(XY,g):
    x_set,y_set,f_XY=XY
    mean=E(XY,g)
    return np.sum([(g(x_i,y_j)-mean)**2 * f_XY(x_i,y_j) for x_i in x_set for y_j in y_set])
    
var_X=V(XY,g=lambda x,y:x)
var_Y=V(XY,g=lambda x,y:y)

var_X,var_Y


▷ 2차원 이산형 확률변수의 공분산

  • 두 확률변수 X,Y 사이의 상관

def Cov(XY):
    x_set,y_set,f_XY=XY
    mean_X=E(XY,g=lambda x,y:x)
    mean_Y=E(XY,g=lambda x,y:y)
    return np.sum([(x_i-mean_X)*(y_j-mean_Y) * f_XY(x_i,y_j) for x_i in x_set for y_j in y_set])

cov_xy = Cov(XY)

cov_xy


▷ 분산과 공분산의 공식

# a,b를 실수, X,Y를 확률변수로 했을 때 → V(aX+bY) = a^2V(X) + b^2V(Y) + 2abCov(X,Y) 가 성립
# 아래 식은 a**2*var_X+b**2*var_Y+2*a*b*cov_xy 와 동일함.

V(XY,lambda x,y:a*x+b*y)

# 상관계수

cov_xy/np.sqrt(var_X*var_Y)