[7강] 이산형 확률변수-균등분포
이산형 및 연속형 확률변수
확률변수란 결과값이 확률적으로 정해지는 변수이다. 결과값이란 주사위의 숫자처럼 실제로 나온 값일 수도 있고, 동전 던지기에서 앞면을 1, 뒷면을 0으로 가정하는 것처럼 임의로 부여한 값일 수도 있다. 확률변수들을 하나씩 셀 수 있는지에 따라서 이산형 확률변수, 연속형 확률변수로 구분한다.
이산형 확률변수
이산형 확률변수는 결과의 수를 셀 수 있는 확률변수를 의미힌다. 따라서 각 결과값마다 그 값이 나올 수 있는 고유한 확률을 부여할 수 있고, 이 결과값에 확률(=질량)을 부여하는 함수를 확률질량함수(PMF)라고 한다. 확률질량함수는 아래 두 가지 성질을 가진다.
이산형 확률변수의 정의를 바탕으로 아래와 같이 이산형 확률변수들을 만들어주는 configVariables 라는 함수를 만들 수 있다. 확률변수의 최소값과 최대값을 정하고, 만들어볼 확률변수의 개수를 함수에 입력하면, numpy의 randint 함수를 이용해서 샘플들을 만드는 구조이다.
import numpy as np
import matplotlib.pyplot as plt
def configVariables(lowerbound:int, upperbound:int, numberOfSamples:int):
samples = np.random.randint(lowerbound, upperbound + 1, numberOfSamples)
return samples
균등 분포(Uniform Distribution)
기본적으로 이산형 확률변수들이 균등하게 분포되는 상황을 생각해볼 수 있다. 균등분포에서는 각각의 이산형 확률변수가 나올 확률은 동일하다. 주사위 던지기에서 1 ~ 6이라은 각각의 확률변수가 나올 확률은 1/6로 동일한 것이 대표적인 예이다. configVariables 라는 함수를 이용해서 아래와 같이 주사위 던지기의 분포를 만들 수 있다.
result = configVariables(1,6,5)
print(result)
여기에 추가적으로 matplotlib 라이브러리를 사용해서 아래와 같이 구현하면, 주사위 던지기 분포를 시각화 할 수 있다.
diceGame = configVariables(1, 6, 6)
plt.hist(diceGame, bins = [1,2,3,4,5,6,7], align = 'mid')
plt.xlabel('Value')
plt.ylabel('Occurences')
plt.legend(['dicegame'])
확률변수의 개수가 적은 경우는 균등분포가 아닌 것처럼 보일 수 있지만, 개수가 늘어나면 점점 균등분포의 형태를 띈다. 아래 그림 2의 왼쪽은 확률변수를 6 개 만들었을 때 분포이고, 오른쪽은 1,000 개를 만들었을 때 분포이다. 횟수가 6개에서 1,000개로 늘어나면서 균등분포의 형태를 띄는 것을 한 눈에 확인할 수 있다.
결국 주사위 던지기에서 각 확률변수(1 ~ 6)가 나올 확률은 1/6이 되며, 확률질량함수는 아래 식 2 의 왼쪽과 같이 같이 정의할 수 있다. 추가적으로 각 확률변수 값 이하의 값이 나올 확률의 합을 나타낼 수도 있는데, 이를 누적분포 함수라고 하고 아래 식 2의 오른쪽과 같이 정의할 수 있다.
numpy의 unique 함수에 return_counts=True 옵션을 부여하면, 확률변수는 무엇이 나왔는지와 몇 번이나 반복되었는지를 확인할 수 있다. 아래와 같이 configVariables를 통해서 1 ~ 6 이 나오는 주사위 던지기를 5번 반복해서 확률변수를 뽑아낸 결과를 numpy의 unique 함수로 한 번에 확인할 수 있는 것이다.
그림 3의 결과는 5번의 주사위 던지기에서 1은 1번, 3은 2번, 4는 1번, 6은 1번 이 나왔다는 것을 뜻한다. numpy unique 함수로 구한 각각의 확률변수가 나온 횟수(counts)를 전체 실행횟수(np.sum(counts))로 나눠준 값을 활용하여 사후적인 확률질량함수를 아래와 같이 bar차트를 통해 시각화 할 수 있다.
diceGame = configVariables(1, 6, 1000)
values, counts = np.unique(diceGame, return_counts=True)
pmf = counts / np.sum(counts)
plt.bar(values, pmf)
plt.xlabel('value')
plt.ylabel('pmf prob')
plt.title('pmf graph')
plt.xticks(np.arange(1, 7))
plt.grid(axis='y')
plt.legend(['diceGame'])
plt.show()
리스트 형태로 구성된 확률질량함수(pmf)는 numpy의 cumsum 함수를 이용해서 누적분포함수 형태로(cdf) 변환할 수 있다.
cumsum 함수를 이용해서 만든 누적분포함수는(cdf) matplotlib의 step차트를 통해서 시각화 할 수 있다.
cdf = np.cumsum(pmf)
plt.step(values, cdf)
plt.scatter(values, cdf, color='red') # 점 찍어주면 더 보기 좋음
plt.xlabel('Value')
plt.ylabel('cdf prob')
plt.title('cdf graph')
plt.xticks(np.arange(1, 7))
plt.grid(True)
plt.legend(['CDF'])
plt.show()
위 그림 6에서 확률변수가 커질 수록 함수 값이 약 1/6씩 커지다가 최종적으로 1이 되는 것을 알 수 있는데, 이는 균등 분포에서의 누적분포함수의 성질이기도 하다.