동전을 30번을 던졌더니 샘플수가 작아서인지 head의 수가 무려 22번이나 나왔어요. 매우 드문 일이죠? 그렇지만 상상의 숫자가 아니라는 것은 다들 인정하실겁니다. 그럼 이 숫자가 나올 확은은 매우 낮을 것으로 에상을 하는데 실제 그 확률은 어떻게 계산을 할까요?
베르누이 또는 이항분포를 함수를 구하는 공식은 다음과 같아요
우리의 케이스는
n=30, i=22, p=0.5입니다.
아래의 그래프에서
우리는 실제 앞면이 나온 숫자가 22, 23,....30일 경우의 면적의 합 또는 확률을 구할 수가 있는데
그 공식은 간단히 다음을 바탕으로 만들면되요
n_val=30
i_val=22
p_val=0.5
binom_coeff = comb(n_val, i_val) # 이항 계수 C(n, i) #조합공식
prob=binom_coeff * (p_val ** i_val) * ((1 - p_val) ** (n_val - i_val)) #이항분포 공식
print(prob)
0.0054509611800313
매우 낮아요
만일 이 주제가 동전이 아니라 전쟁에 나가서 첫 전투에 사망자수라는 통계라면 30명의 1개 소대개 참전을 해서 사망한 숫자가 통상 15명(가정)인 것이 비해서 너무 높다. 그래서 이 지역의 전투는 타지역부다 아군에 불리하며, 이 지역 전투에는 신참 보다는 고참, 그리고 소총보다는 자동화기, 박격포, 공중지원 등 강화를 통해 아군의 생존력을 높혀야 한다. 이런 보고서를 만들었다면 이 작전참모는 화랑무공훈장감이 된다, 통계의 중요성이다.
다음은 i가 22이상이 되는 확율의 합을 게산하는 로직이다.
import numpy as np
from scipy.special import comb
# 1. 실험 데이터 설정 (기존 값 재사용)
n = 30 # 동전을 던진 횟수
k = 22 # 앞면이 나온 횟수
p_null = 0.5 # 귀무가설: 동전이 공정하다 (앞면 나올 확률 = 0.5)
# 이항확률질량함수 (PMF) 계산 함수
def binom_pmf(i_val, n_val, p_val):
binom_coeff = comb(n_val, i_val) # 이항 계수 C(n, i)
return binom_coeff * (p_val ** i_val) * ((1 - p_val) ** (n_val - i_val))
# 2. for 루프를 사용하여 p-value 계산
p_value_for_loop = 0.0
individual_probabilities = []
# k부터 n까지의 모든 앞면 횟수에 대한 확률을 합산
for i_current in range(k, n + 1):
prob_i = binom_pmf(i_current, n, p_null)
individual_probabilities.append(prob_i)
p_value_for_loop += prob_i
print(f"각 앞면 횟수 (i)에 대한 개별 확률 (k={k} 부터 n={n} 까지):")
for i_idx, prob in enumerate(individual_probabilities):
print(f"P(X={k + i_idx}) = {prob:.8f}")
print(f"for 루프를 사용하여 계산된 p-value: {p_value_for_loop:.4f}")
각 앞면 횟수 (i)에 대한 개별 확률 (k=22 부터 n=30 까지):
P(X=22) = 0.00545096
P(X=23) = 0.00189599
P(X=24) = 0.00055300
P(X=25) = 0.00013272
P(X=26) = 0.00002552
P(X=27) = 0.00000378
P(X=28) = 0.00000041
P(X=29) = 0.00000003
P(X=30) = 0.00000000
for 루프를 사용하여 계산된 p-value: 0.0081