오늘 p-value가 뭔지에 대한 통계학적 글을 연재했습니다.
물론 독자들의 이해를 돕기 위해 함수식이을 자동이 아닌 수동으로 계산을 하는 방식을 채택했었는데 저는 오는 반자동으로 어려 분이 다음번에도 식만 있으면 이해를 바로 할 수 있도록 함수를 만들어 저장을 하고, 동전을 30번 던졌을 때 앞면이 22가 나올 확률, 23개 나올 확률 등 수많은 계산을 for loop으로 만드는 법을 알려드릴게요. For Loop도 한 개가 아닌 다양한 방식이 있다는 것도 알려드릴게요.
완전 수동
n=30
i=22
p=0.5
binom_coeff = comb(n, i) # 이항 계수 C(n, i)
prob=binom_coeff * (p ** i) * ((1 - p) ** (n - i))
print(np.round(prob,3))
반자동(함수 만들고 실행 가기)
# Function to compute binomial PMF for a single i
def binom_pmf(i, n, p):
binom_coeff = comb(n, i) # Equivalent to \binom {n}{i}
return binom_coeff * (p ** i) * ((1 - p) ** (n - i))
# Compute p-value: sum of PMF from i=k to n
p_value = np.sum([binom_pmf(i, n, p_null) for i in range(k, n+1)])
print(f"Calculated p-value: {p_value:. 4f}") #4f는 소수점 4자리까지만 인쇄해 하의 의미
0.005
# for loop으로 i=22, i=23등 연속 i=30까지 계산하기
from scipy.special import comb
import numpy as np
n=30
i=22
p=0.5
def binom_pmf(i, n, p):
binom_coeff = comb(n, i) # Equivalent to \binom {n}{i}
return binom_coeff * (p ** i) * ((1 - p) ** (n - i))
# Compute p-value: sum of PMF from i=k to n
p_value = np.sum([binom_pmf(i, n, p) for i in range(i, n+1)])
print(f"Calculated p-value: {p_value:. 4f}") #4f는 소수점 4자리까지만 인쇄해 하의 의미
Calculated p-value: 0.0081
# 더 간단하게 계산하기 (리스트 컴프리헨션과 sum 함수를 사용한 p-값 계산)
p_value_list_comprehension = sum([binom_pmf(k, n, p) for k in range(i, n + 1)])
print(f"Calculated p-value (list comprehension): {p_value_list_comprehension:. 4f}")
Calculated p-value (map and sum): 0.0081
이 계산된 p-값은 통계적 가설 검정에서 중요한 의미를 가집니다. 일반적으로 p-값은 귀무가설이 참이라는 가정 하에, 관측된 데이터 또는 그보다 더 극단적인 데이터를 얻을 확률을 나타냅니다.
예를 들어, 현재 맥락에서:
n은 총 시행 횟수 (30회).
i는 성공 횟수 (22회).
p는 각 시행에서의 성공 확률 (0.5).
여기서 계산된 p-값 (약 0.0081)은 '성공 확률이 0.5인 상황에서 30번의 시행 중 22번 이상 성공할 확률'을 의미합니다.
p-값 해석의 일반적인 기준:
p-값 < 0.05 (유의 수준): 귀무가설을 기각하고 대립 가설을 채택할 충분한 증거가 있다고 봅니다. 즉, 관측된 결과가 우연히 발생했을 가능성이 매우 낮다고 판단합니다.
p-값 ≥ 0.05: 귀무가설을 기각할 충분한 증거가 없다고 봅니다. 이는 귀무가설이 참이라는 것을 의미하지는 않으며, 단순히 현재 데이터로는 귀무가설에 반대되는 주장을 할 수 없다는 뜻입니다.
우리의 경우 (p-값 = 0.0081):
이 p-값은 일반적인 유의 수준인 0.05 (즉, 95% 확률) 보다 훨씬 작습니다. 이는 '성공 확률이 0.5'라는 귀무가설 하에 30번 중 22번 이상 성공하는 사건이 발생할 확률이 매우 낮다는 것을 의미합니다. 따라서 이러한 관측 결과는 '실제 성공 확률이 0.5보다 더 높다'는 대립 가설을 지지하는 강력한 증거가 될 수 있습니다.(학술적으로 매우 유의미한 결과를 얻었다고 해석합니다)
정말 알수록 코드가 더 짧아지고 계산도 빨라지는 것을 알 수 있어요. 무림 고수도 하루아침에 만들어지는 것이 아니고, 연마의 정도에 따라 참 고수가 된다는 진리를 알아야 해요.