| 계산하고 싶은 것 | 공식 | scipy.stats 메서드 |
|---|---|---|
dist.cdf(x) | ||
dist.sf(x) | ||
dist.cdf(b) - dist.cdf(a) | ||
| (이산형) | dist.sf(x-1) 또는 1 - dist.cdf(x-1) |
cf. PPF : PERCENT POINT FUNCTION (백분위 함수)
stats.poisson.ppf(확률, mu) : 해당 확률을 만족하는 최소 k값# scipy.stats를 이용한 포아송 분포
lambda_calls = 5 # 시간 당 평균 통화량
poisson_dist = stats.poisson(mu=lambda_calls)
# 정확히 5통이 걸려올 확률(이산)
# pmf = Probability Mass Function (확률질량함수)
print(poisson_dist.pmf(5))
# 3통 이하가 걸려올 확률
# cdf = Cumulative Distribution Function (누적분포함수)
print(poisson_dist.cdf(3))
# 10통 이상 걸려올 확률
print(poisson_dist.sf(9))
# 기대값과 분산
print(poisson_dist.mean())
print(poisson_dist.var())
pdf = uni_dist.pdf(170, loc=173, scale=6) ; 확률밀도함수 (연속) Probability Density Fuction
a, b = 0, 10 # 대기 시간 범위: 0분 ~ 10분
# scipy.stats로 균등 분포 생성
uni_dist = stats.uniform(loc=a, scale=b-a)
e.g. 고객 도착 간격, 기계 고장까지 시간, 전화 통화 간격
scipy 주의: stats.expon(scale=β)에서 scale = 1/λ = 평균 대기시간
exp_dist = stats.expon(scale=mean_lifetime)
mu = 173
sigma = 6
# scipy.stats를 이용한 정규 분포
norm_dist = stats.norm(loc=mu, scale=sigma)
정규분포에서 데이터가 평균 주변에 얼마나 모여있는지 나타내는 규칙:
| 구간 | 확률 |
|---|---|
| 약 68% | |
| 약 95% | |
| 약 99.7% |
평균에서 표준편차 1개 범위 안에 전체의 68%, 2개면 95%, 3개면 거의 전부(99.7%)가 들어온다. 이 규칙만 알면 정규분포 데이터를 계산 없이 빠르게 파악할 수 있다.
표준화: 어떤 정규분포든 표준정규분포 로 변환하는 과정
Z-score의 의미: 평균에서 표준편차 몇 개만큼 떨어져 있는지를 나타내는 값
| Z-score | 의미 |
|---|---|
| Z = 0 | 평균과 같음 |
| Z = 1 | 평균보다 1σ 높음 (상위 약 16%) |
| Z = 2 | 평균보다 2σ 높음 (상위 약 2.5%) |
| Z = -1 | 평균보다 1σ 낮음 (하위 약 16%) |
예시: 시험 평균 70점, 표준편차 10점일 때 내 점수가 90점이면 이다. 평균보다 표준편차 2개만큼 위에 있으므로 상위 약 2.5%에 해당한다.
# (1) Z-score 계산
z_score = (my_score - mu) / sigma
print(f"z-score:", z_score)
# (2) 상위 몇 %인지 계산
top_percentile = stats.norm.sf(z_score) #P(Z > z_score)
print(f"상위 %:", top_percentile)
| 메서드 | 풀네임 (영어) | 설명 | 예시 |
|---|---|---|---|
.pmf(k) | Probability Mass Function | 확률질량함수 (이산) | binom.pmf(3, n=10, p=0.3) |
.pdf(x) | Probability Density Function | 확률밀도함수 (연속) | norm.pdf(170, loc=173, scale=6) |
.cdf(x) | Cumulative Distribution Function | 누적분포함수 P(X≤x) | norm.cdf(180, loc=173, scale=6) |
.ppf(q) | Percent Point Function | cdf의 역함수 (확률→값) | norm.ppf(0.9, loc=173, scale=6) |
.sf(x) | Survival Function | 생존함수 P(X>x) = 1-CDF | norm.sf(180, loc=173, scale=6) |
.isf(q) | Inverse Survival Function | sf의 역함수 (우측확률→값) | norm.isf(0.05, loc=173, scale=6) |
.interval(confidence) | Confidence Interval | 양측 신뢰구간 | t.interval(0.95, df=9, loc=5, scale=0.3) |
.rvs(size) | Random Variates | 난수 생성 | norm.rvs(loc=173, scale=6, size=100) |
.mean() | Mean | 기대값 | binom(n=10, p=0.3).mean() |
.var() | Variance | 분산 | binom(n=10, p=0.3).var() |
.std() | Standard Deviation | 표준편차 | binom(n=10, p=0.3).std() |
파라미터 설명
x,k: 확률을 구하고 싶은 값 (연속: x, 이산: k)q: 누적확률 (0~1 사이 값)loc: 분포의 위치 (정규분포에서는 평균 μ)scale: 분포의 척도 (정규분포에서는 표준편차 σ)df: 자유도 (t분포, 카이제곱분포 등에서 사용)size: 생성할 난수 개수confidence: 신뢰수준 (예: 0.95 = 95%)n,p: 이항분포의 시행 횟수와 성공 확률
from scipy import stats
# 이산형
bernoulli = stats.bernoulli(p=0.3) # 베르누이: 성공확률 0.3인 1회 시행
binom = stats.binom(n=10, p=0.3) # 이항분포: 10회 시행, 성공확률 0.3
poisson = stats.poisson(mu=5) # 포아송: 평균 발생 횟수 5
# 연속형
uniform = stats.uniform(loc=0, scale=10) # 균등분포: U(0, 10), loc=시작, scale=구간 길이
expon = stats.expon(scale=100) # 지수분포: scale=1/λ (평균 대기시간), 평균 100분
norm = stats.norm(loc=170, scale=6) # 정규분포: N(170, 6²), loc=평균, scale=표준편차
# P(X = k) - 정확히 k가 나올 확률 (이산형만 사용 가능)
dist.pmf(k)
# P(X ≤ x) - x 이하일 확률 (누적)
dist.cdf(x)
# P(X > x) - x 초과일 확률
dist.sf(x) # 또는 1 - dist.cdf(x)
# P(X ≥ x) - x 이상일 확률
# 연속형: P(X ≥ x) = P(X > x) → dist.sf(x) (한 점의 확률 = 0이므로 초과와 같음)
# 이산형: P(X ≥ k) = P(X > k-1) → dist.sf(k - 1) (또는 1 - dist.cdf(k - 1))
# P(a ≤ X ≤ b) - a 이상 b 이하일 확률
dist.cdf(b) - dist.cdf(a)
# 상위 p%에 해당하는 값 (예: 상위 5% → p=5)
dist.ppf(1 - p/100)
# 하위 p%에 해당하는 값 (예: 하위 10% → p=10)
dist.ppf(p/100)