P-value를 for loop과 함수로 자동화하기

by 박정수

오늘 p-value가 뭔지에 대한 통계학적 글을 연재했습니다.

14화 도대체 P-value가 뭔가요?


물론 독자들의 이해를 돕기 위해 함수식이을 자동이 아닌 수동으로 계산을 하는 방식을 채택했었는데 저는 오는 반자동으로 어려 분이 다음번에도 식만 있으면 이해를 바로 할 수 있도록 함수를 만들어 저장을 하고, 동전을 30번 던졌을 때 앞면이 22가 나올 확률, 23개 나올 확률 등 수많은 계산을 for loop으로 만드는 법을 알려드릴게요. For Loop도 한 개가 아닌 다양한 방식이 있다는 것도 알려드릴게요.


고수2.jpg


완전 수동

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-value값 해설

이 계산된 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보다 더 높다'는 대립 가설을 지지하는 강력한 증거가 될 수 있습니다.(학술적으로 매우 유의미한 결과를 얻었다고 해석합니다)


고수1.jpg

정말 알수록 코드가 더 짧아지고 계산도 빨라지는 것을 알 수 있어요. 무림 고수도 하루아침에 만들어지는 것이 아니고, 연마의 정도에 따라 참 고수가 된다는 진리를 알아야 해요.

이전 21화Python으로 Fuction 함수 만들기