-
[7강] 이산형 확률변수-균등분포기초지식/Quantopian(강의노트) 2025. 4. 3. 23:14반응형
이산형 및 연속형 확률변수
확률변수란 결과값이 확률적으로 정해지는 변수이다. 결과값이란 주사위의 숫자처럼 실제로 나온 값일 수도 있고, 동전 던지기에서 앞면을 1, 뒷면을 0으로 가정하는 것처럼 임의로 부여한 값일 수도 있다. 확률변수들을 하나씩 셀 수 있는지에 따라서 이산형 확률변수, 연속형 확률변수로 구분한다.
이산형 확률변수
이산형 확률변수는 결과의 수를 셀 수 있는 확률변수를 의미힌다. 따라서 각 결과값마다 그 값이 나올 수 있는 고유한 확률을 부여할 수 있고, 이 결과값에 확률(=질량)을 부여하는 함수를 확률질량함수(PMF)라고 한다. 확률질량함수는 아래 두 가지 성질을 가진다.
식1: 확률질량함수의 성질 이산형 확률변수의 정의를 바탕으로 아래와 같이 이산형 확률변수들을 만들어주는 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)
그림1: 주사위 던지기 분포 결과 예시(5회 반복) 여기에 추가적으로 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개로 늘어나면서 균등분포의 형태를 띄는 것을 한 눈에 확인할 수 있다.
그림2: 이산형 확률변수-균등분포 구현 예시 결국 주사위 던지기에서 각 확률변수(1 ~ 6)가 나올 확률은 1/6이 되며, 확률질량함수는 아래 식 2 의 왼쪽과 같이 같이 정의할 수 있다. 추가적으로 각 확률변수 값 이하의 값이 나올 확률의 합을 나타낼 수도 있는데, 이를 누적분포 함수라고 하고 아래 식 2의 오른쪽과 같이 정의할 수 있다.
식2: 확률질량함수와 누적분포함수 - 주사위 던지기 numpy의 unique 함수에 return_counts=True 옵션을 부여하면, 확률변수는 무엇이 나왔는지와 몇 번이나 반복되었는지를 확인할 수 있다. 아래와 같이 configVariables를 통해서 1 ~ 6 이 나오는 주사위 던지기를 5번 반복해서 확률변수를 뽑아낸 결과를 numpy의 unique 함수로 한 번에 확인할 수 있는 것이다.
그림3: 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()
그림4: 사후적인 확률질량함수 시각화 예시 리스트 형태로 구성된 확률질량함수(pmf)는 numpy의 cumsum 함수를 이용해서 누적분포함수 형태로(cdf) 변환할 수 있다.
그림5: cumsum 함수를 통한 누적분포 구현 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: 누적분포함수 시각화 예시 위 그림 6에서 확률변수가 커질 수록 함수 값이 약 1/6씩 커지다가 최종적으로 1이 되는 것을 알 수 있는데, 이는 균등 분포에서의 누적분포함수의 성질이기도 하다.
반응형'기초지식 > Quantopian(강의노트)' 카테고리의 다른 글
[7강] 연속형 확률변수 (1) 2025.04.08 [7강] 이산형 확률변수-이항분포와 베르누이 시행 (0) 2025.04.05 [6강] 데이터 상관관계 분석 (0) 2025.02.01 [5강] 왜도와 첨도를 활용한 자크베라 검정(정규성 검정) (0) 2024.12.07 [5강] 통계적 지표(왜도와 첨도) (0) 2024.12.03