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)
'개념정리 > Python' 카테고리의 다른 글
▷ 연속형 확률변수 - 1차원 연속형 확률변수 (0) | 2023.04.02 |
---|---|
▷ 대표적인 이산형 확률변수 - 베르누이 분포, 이항분포, 기하분포, 포아송분포 (2) | 2023.03.22 |
▷ Python 추측 통계의 기본 - 표본추출방법, 확률 분포 (0) | 2023.03.20 |
▷ Python 2차원 데이터 정리 - 공분산, 상관계수, 산점도, 회귀직선, 히트맵 (0) | 2023.03.19 |
▷ Python 1차원 데이터 정리(PART 3) - 도수분포표, 히스토그램, 상자그림 (0) | 2023.03.18 |