확률 변수와 확률 분포
결과를 숫자로 바꾸는 확률 변수, 이산과 연속의 차이, 확률 질량 함수와 확률 밀도 함수와 누적 분포 함수를 익혀요. 베르누이, 이항, 포아송, 균등, 정규, 지수 분포가 각각 어떤 상황을 설명하는지 실제 예와 scipy 코드로 계산해요.
동전을 10번 던져 앞면이 몇 번 나올까요? 콜센터에 1시간 동안 전화가 몇 통 올까요? 다음 손님은 몇 분 뒤에 올까요? 모두 결과가 우연이지만, 우연에도 모양이 있어요. 앞면은 5번 근처가 가장 흔하고 10번은 드물죠. 이번 강의에서는 우연한 결과를 숫자로 다루는 확률 변수와, 우연이 따르는 대표적인 모양인 확률 분포들을 배워요. 머신러닝 모델이 "이 사진이 고양이일 확률"을 말할 때, 그 출력이 바로 확률 분포예요.
확률 변수
확률 변수는 시행의 결과에 숫자를 붙이는 규칙(함수)이에요. 보통 대문자 로 써요.
- 동전 10번 던지기 → = 앞면의 개수 (0부터 10까지)
- 손님 한 명 → = 결제 금액
- 오늘 하루 → = 최고 기온
결과 자체(앞면, 뒷면의 나열)는 다루기 불편하지만, 숫자로 바꾸면 평균을 내고 비교하고 계산할 수 있어요.
이산과 연속
- 이산 확률 변수: 셀 수 있는 값을 가져요. 앞면 개수, 방문자 수, 불량품 수.
- 연속 확률 변수: 구간 안의 모든 실수를 가질 수 있어요. 키, 시간, 온도.
둘은 확률을 다루는 방식이 달라요.
분포를 나타내는 세 가지 함수
확률 질량 함수 (이산)
각 값이 나올 확률을 직접 알려 줘요.
확률 밀도 함수 (연속)
연속 변수는 정확히 한 값이 나올 확률이 0이에요(적분 강의에서 봤죠). 그래서 밀도로 나타내고, 구간의 확률은 그 아래 넓이예요.
누적 분포 함수
"이 값 이하일 확률"을 알려 줘요. 이산이든 연속이든 같은 모양으로 쓸 수 있어서 편해요.
0에서 시작해 1까지 올라가는, 절대 내려가지 않는 곡선이에요. "상위 5% 기준점은?" 같은 질문은 누적 분포 함수를 거꾸로 읽으면 돼요(분위수).
이산 분포
베르누이 분포: 한 번의 성공 또는 실패
결과가 1(성공) 또는 0(실패) 두 가지뿐이고 성공 확률이 예요. 광고를 클릭했는지, 메일이 스팸인지, 환자가 회복했는지. 가장 단순하지만 모든 이진 분류의 바탕이에요.
이항 분포: n번 중 성공 횟수
성공 확률이 인 독립 시행을 번 했을 때 성공 횟수 의 분포예요.
번 성공하는 자리를 고르는 방법 가지에, 각 경우의 확률을 곱한 거예요. 조합론과 독립이 함께 쓰였어요.
동전 10번에서 앞면이 정확히 7번 나올 확률은 , 7번 이상은 약 0.172예요.
from scipy import stats # pip install scipy
print(stats.binom.pmf(7, 10, 0.5)) # 0.1172 정확히 7번
print(stats.binom.sf(6, 10, 0.5)) # 0.1719 7번 이상 (6 초과)
쓰임: 100명에게 광고를 보여 줬을 때 클릭 수, 불량률 2%인 공정에서 상자 50개 중 불량 수.
포아송 분포: 일정 시간에 드문 일이 몇 번
평균 (람다)번 일어나는 드문 사건이, 정해진 시간이나 공간에서 몇 번 일어나는지의 분포예요.
시간당 평균 3통의 문의가 오는 고객센터에서, 한 시간 동안 한 통도 안 올 확률은 약 5%, 5통 이상 올 확률은 약 18%예요.
print(stats.poisson.pmf(0, 3)) # 0.0498
print(stats.poisson.sf(4, 3)) # 0.1847 5통 이상
쓰임: 시간당 접속자 수, 하루 교통사고 수, 페이지당 오타 수, 서버의 분당 오류 수. 서버 용량을 정할 때 "평균"만 보면 안 되고, 포아송 분포의 꼬리(드물게 몰리는 경우)를 봐야 해요.
연속 분포
균등 분포: 어디든 똑같이
구간 안의 모든 값이 똑같이 일어날 법해요. 프로그래밍의 random.random()이 0과 1 사이의 균등 분포예요. 다른 모든 분포의 난수를 만드는 재료이기도 해요.
정규 분포: 종 모양
평균 , 표준편차 인 정규 분포의 밀도는
평균을 중심으로 좌우 대칭인 종 모양이에요. 키, 측정 오차, 시험 점수처럼 작은 요인이 많이 더해져서 생기는 값은 대체로 정규 분포를 따라요. 왜 그런지는 다음다음 강의의 중심 극한 정리가 설명해요.
남성 키가 평균 170cm, 표준편차 6cm인 정규 분포라면
print(stats.norm.sf(180, loc=170, scale=6)) # 0.0478 180cm 이상일 확률
print(stats.norm.ppf(0.95, loc=170, scale=6)) # 179.87 상위 5% 기준 키
표준화
어떤 정규 분포든 평균을 빼고 표준편차로 나누면 평균 0, 표준편차 1인 표준 정규 분포가 돼요.
는 "평균에서 표준편차 몇 개만큼 떨어져 있나"예요. 180cm는 이에요. 서로 다른 시험의 점수를 비교할 때, 머신러닝에서 특징의 범위를 맞출 때 쓰는 그 표준화예요.
지수 분포: 다음 일이 일어나기까지의 시간
포아송 분포가 "몇 번"이라면, 지수 분포는 "다음까지 얼마나 기다리나"예요. 평균 대기 시간이 10분이면 15분 넘게 기다릴 확률은 예요.
print(stats.expon.sf(15, scale=10)) # 0.2231
지수 분포에는 독특한 성질이 있어요. 기억이 없어요. 이미 10분을 기다렸어도, 앞으로 15분 넘게 더 기다릴 확률은 처음과 똑같이 0.22예요. 무작위로 오는 버스라면 "이렇게 오래 기다렸으니 곧 오겠지"가 성립하지 않아요. 확률 기초 강의의 도박사의 오류를 시간 버전으로 본 셈이에요.
import numpy as np
rng = np.random.default_rng(42)
w = rng.exponential(10, 100_000)
print(((w > 25) & (w > 10)).sum() / (w > 10).sum()) # 약 0.222 10분 기다린 뒤 15분 더
print((w > 15).mean()) # 약 0.222 처음부터 15분 넘게
분포 고르기 한눈에 보기
| 상황 | 분포 | 파라미터 |
|---|---|---|
| 한 번의 예/아니오 | 베르누이 | 성공 확률 |
| n번 중 성공 횟수 | 이항 | , |
| 일정 시간 동안 사건 수 | 포아송 | 평균 횟수 |
| 다음 사건까지 시간 | 지수 | 평균 대기 시간 |
| 범위 안 아무 값이나 똑같이 | 균등 | 구간 , |
| 많은 요인이 더해진 측정값 | 정규 | 평균 , 표준편차 |
여러 결과 중 하나: 범주 분포
결과가 셋 이상이면 베르누이를 넓힌 범주 분포를 써요. 주사위, 그리고 무엇보다 언어 모델의 다음 단어 선택이 범주 분포예요. 언어 모델은 어휘 수만 개 각각의 확률을 내놓고, 그 분포에서 다음 단어를 뽑아요. 딥러닝 트랙에서 확률을 출력하는 소프트맥스 함수가 바로 이 분포를 만드는 장치예요.
시뮬레이션: 분포에서 뽑아 보기
분포를 이해하는 가장 좋은 방법은 직접 많이 뽑아서 모양을 보는 거예요.
s = rng.binomial(10, 0.5, 100_000) # 동전 10번을 10만 번 반복
print((s >= 7).mean()) # 약 0.172 공식과 맞는지 확인
print(np.bincount(s) / len(s)) # 0~10회 각각의 비율
matplotlib로 히스토그램을 그려 보면, 이항 분포가 이 클수록 종 모양(정규 분포)에 가까워지는 걸 눈으로 볼 수 있어요.
실습
- 합격률 30%인 시험에 20명이 응시했어요. 8명 이상 합격할 확률을 구하세요.
- 1분에 평균 2명이 들어오는 가게에, 1분 동안 아무도 안 들어올 확률은?
- 시험 점수가 평균 65, 표준편차 10인 정규 분포라면, 상위 10% 안에 들려면 몇 점이 필요할까요?
- 이항 분포 , 를 10만 번 뽑아 히스토그램을 그리고, 평균 50, 표준편차 5인 정규 분포 곡선과 겹쳐 보세요.
자주 하는 실수
- 밀도를 확률로 읽기. 연속 분포에서 확률은 밀도 곡선 아래의 넓이예요.
- 이항 분포의 독립 조건 무시하기. 한 사람이 감염되면 주변도 감염될 확률이 오르는 상황은 독립이 아니라 이항 분포가 맞지 않아요.
- 모든 데이터를 정규 분포로 가정하기. 소득, 조회수, 도시 인구처럼 한쪽으로 길게 늘어진 데이터는 정규 분포가 아니에요. 로그를 씌우면 정규에 가까워지는 경우가 많아요(지수와 로그 강의의 로그 스케일).
- "이하"와 "미만" 혼동. 이산 분포에서는 경계값 포함 여부에 따라 답이 달라요. scipy의
sf(k)는 " 초과"예요.
점검 문제
- 하루 방문자 수는 이산 변수인가요, 연속 변수인가요? 어떤 분포가 어울릴까요?
- 정규 분포에서 평균보다 표준편차 2개 이상 큰 값이 나올 확률은 대략?
- 누적 분포 함수 의 값은 어떤 범위에 있고, 어떤 모양인가요?
- 지수 분포의 "기억 없음" 성질을 한 문장으로 설명해 보세요.
정답
- 셀 수 있으니 이산이에요. 일정 기간 동안 독립적으로 일어나는 사건 수라 포아송 분포가 어울려요.
- 양쪽을 합쳐 약 5%가 밖이니, 한쪽(큰 쪽)은 약 2.3%예요.
- 0과 1 사이이고, 왼쪽에서 오른쪽으로 갈수록 절대 줄어들지 않는 곡선이에요.
- 이미 얼마나 기다렸는지와 상관없이, 앞으로 더 기다려야 할 시간의 분포는 처음과 같아요.
다음 강의
분포를 숫자 몇 개로 요약하는 방법을 배워요. 평균(기댓값), 퍼진 정도(분산), 그리고 두 변수가 함께 움직이는 정도(공분산과 상관). 선형대수에서 만난 공분산 행렬이 여기서 나와요.