viewof n_slider = Inputs.range([1, 50], {value: 10, step: 1, label: "시행 횟수 (n)"})
viewof p_slider = Inputs.range([0.05, 0.95], {value: 0.4, step: 0.05, label: "성공 확률 (p)"})
// webR 호출은 수 초 걸린다 — 드래그 이벤트가 전부 큐잉되지 않도록 디바운스(GOTCHA §9h)
n = debounce(viewof n_slider)
p = debounce(viewof p_slider)
function debounce(view, delay = 500) {
return Generators.observe(notify => {
let timer = null;
notify(view.value);
const oninput = () => {
clearTimeout(timer);
timer = setTimeout(() => notify(view.value), delay);
};
view.addEventListener("input", oninput);
return () => { clearTimeout(timer); view.removeEventListener("input", oninput); };
});
}이산형 분포 — 코드 실습
동전 던지기의 성공 횟수, 한 시간 동안 걸려오는 전화 수처럼 셀 수 있는 값을 갖는 확률변수는 이산형 분포를 따릅니다. 대표적인 이항 분포와 포아송 분포를 R의 d*(확률질량함수), p*(누적분포함수), r*(난수 생성) 함수로 직접 다뤄 봅니다.
1. 이항 분포 — PMF 그려 보기
이항 분포 \(X \sim B(n, p)\)의 확률질량함수는
\[P(X = x) = \binom{n}{x} p^x (1-p)^{n-x}, \quad x = 0, 1, \dots, n\]
dbinom()으로 각 \(x\)의 확률을 계산해 막대그래프로 그립니다. 슬라이더를 움직이면 아래 R 셀이 자동으로 다시 실행되고(OJS 입력 → R 주입), 셀 코드 자체도 여전히 직접 고쳐 실행할 수 있습니다.
이론적 평균은 \(np\), 분산은 \(np(1-p)\) 입니다. 난수를 뽑아 이론값과 비교해 봅시다.
2. 포아송 분포 — 드문 사건의 횟수
단위 시간당 평균 \(\lambda\)번 일어나는 사건의 발생 횟수는 포아송 분포 \(X \sim \text{Pois}(\lambda)\)를 따릅니다:
\[P(X = x) = \frac{e^{-\lambda} \lambda^x}{x!}, \quad x = 0, 1, 2, \dots\]
\(\lambda\)를 키우면 분포가 오른쪽으로 이동하며 점점 대칭(정규분포 모양)에 가까워집니다.
3. 연습 — 누적확률 계산
이항 분포 \(B(10,\ 0.4)\)에서 성공이 3번 이하일 확률 \(P(X \le 3)\)을 구하세요. 누적분포함수 pbinom(q, size, prob)을 사용합니다.
d로 시작하면 확률질량함수, p로 시작하면 누적분포함수입니다. “3 이하”는 누적이므로 pbinom(3, size = n, prob = p).
prob_le3 <- pbinom(3, size = n, prob = p)
prob_le3같은 값을 sum(dbinom(0:3, size = n, prob = p))로도 얻을 수 있습니다 — 누적확률은 개별 확률의 합입니다.