Python/Scipy

[Scipy] 파이썬 신뢰 구간 구하기 및 시각화 예제

jimmy_AI 2022. 9. 28. 21:08
반응형

Python에서 표본 집단의 신뢰 구간을 간략하게 구하는 방법을 정리해보고

막대 그래프에서 신뢰 구간 부분을 시각화하는 방법도 같이 살펴보겠습니다.

 

예시로 아래와 같이 두 샘플에 대한 값이 있다고 가정해보도록 하겠습니다.

sample1 = [5, 10, 17, 29, 14, 25, 16, 13, 9, 17]
sample2 = [21, 22, 27, 19, 23, 24, 20, 26, 25, 23]

 

 

파이썬 신뢰 구간 구하기 함수 : scipy.stats.t.interval

각 샘플에 대하여 자유도, 표본 평균 및 표준 오차를 구하고,

scipy.stats.t.interval 메소드 내에 신뢰 수준 및 위에서 구한 세 가지 값을 순서대로

input으로 주시면 신뢰 구간을 손쉽게 구하실 수 있습니다.

 

sample1에 대한 95% 및 99% 신뢰 구간을 구한 예시는 다음과 같습니다.

import scipy.stats as st
import numpy as np

df = len(sample1) - 1 # 자유도 : 샘플 개수 - 1
mu = np.mean(sample1) # 표본 평균
se = st.sem(sample1) # 표준 오차

# 95% 신뢰구간
st.t.interval(0.95, df, mu, se) # (10.338733110887336, 20.661266889112664)

# 99% 신뢰구간
st.t.interval(0.99, df, mu, se) # (8.085277068873378, 22.914722931126622)

 

반응형

 

막대 그래프 신뢰 구간 시각화 예시

각 샘플의 표본 평균을 나타낸 바 그래프에서 신뢰 구간에 대한 직선을

같이 시각화해보도록 하겠습니다.

 

먼저, sample1, sample2에 대한 표본 평균을 막대 그래프로 그린 결과는 아래와 같습니다.

import matplotlib.pyplot as plt

mu1 = np.mean(sample1)
mu2 = np.mean(sample2)

plt.bar(['sample1', 'sample2'], [mu1, mu2], color = ['orange', 'red'], alpha = 0.4)
plt.show()

 

이제 위 그래프에 신뢰 구간에 대한 막대를 같이 그리려면

yerr 인자에 각 그래프에 표현될 신뢰 구간의 높이를 지정해주시면 됩니다.

 

이 때의 신뢰 구간 높이는 먼저 표준 오차를 기준으로 삼은 정규분포표를 구하고

이후, ppf 메소드를 통해서 신뢰 구간에 해당하는 높이를 구해주시면 됩니다.

(단, 양방향을 반영하기 위하여 95% 신뢰 구간인 경우 0.95가 아닌 0.975

반영하는 식으로 값을 넣어주셔야 합니다.)

 

95% 신뢰 구간에 대한 오차를 위의 막대 그래프에 추가하여 시각화하면 다음과 같습니다.

mu1 = np.mean(sample1)
mu2 = np.mean(sample2)

se1 = st.sem(sample1)
se2 = st.sem(sample2)

# 표준 오차를 반영하여 구한 정규분포표
norm_dist1 = st.norm(scale = se1)
norm_dist2 = st.norm(scale = se2)

# 95% 신뢰 구간 -> 0.975, 99% 신뢰 구간 -> 0.995
err1 = norm_dist1.ppf(0.975)
err2 = norm_dist2.ppf(0.975)

plt.bar(['sample1', 'sample2'], [mu1, mu2], color = ['orange', 'red'], yerr = [err1, err2], alpha = 0.4)
plt.show()

 

또한, capsize 인자를 원하는 크기로 설정하면 신뢰 구간 막대의 상단과 하단 부분에

해당 길이의 cap을 씌울 수 있습니다.

plt.bar(['sample1', 'sample2'], [mu1, mu2], color = ['orange', 'red'], yerr = [err1, err2], capsize = 10, alpha = 0.4)
plt.show()