Inferential Statistical Analysis with Python - WEEK 2
WEEK 3 - Statistical Inference with Confidence Intervals
- 2์ฃผ์ฐจ์์๋ ์ฃผ๋ก Confidence interval์ ๋ฐฐ์ ์ผ๋ฉฐ, ์ด๋ป๊ฒ ๊ณ์ฐํ๊ณ ํด์ํ๋์ง, ๊ทธ๋ฆฌ๊ณ Confidence๋ผ๋ ๊ฒ์ด ์๋ฏธํ๋ ๊ฒ์ ๋ฌด์์ธ์ง ๋ฑ์ ๋ํด์ ๋ฐฐ์ฐ๊ฒ ๋ฉ๋๋ค.
- ์ด๋ฅผ ์ํด์๋ ์ฐ์ โ๋ชจ์ง๋จโ๊ณผ โํ๋ณธ์ง๋จโ์ ๋ํ ์ดํด๊ฐ ํ์์ ์ ๋๋ค. ๊ฐ๋ น, โํ๊ตญ์ ๋จ์ฑ๋ค์ ํค ํ๊ท โ์ ์๊ณ ์ถ๋ค๊ณ ํ๋ค๋ฉด, ์ฌ๊ธฐ์, โํ๊ตญ์ ๋จ์ฑโ์ด ๋ชจ์ง๋จ์ด ๋์ฃ . ๋์ด ์ถฉ๋ถํ๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ ์ ์์กฐ์ฌ๋ฅผ ํ ์ ์์ง๋ง, ์ฐ๋ฆฌ๋ ๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ๋ฐ๋ผ์, ์ฐ๋ฆฌ๋ ํ์ํ ํ๋ณธ๋ค, N์ด๋ผ๋ ๊ฐ์ ๊ฐ์ ธ์์ โํ๊ท โ์ด๋ผ๋ parameter๋ฅผ ์์ธกํ๊ฒ ๋์ฃ .
- ๊ทธ๋ฐ๋ฐ, ์ฌ๊ธฐ์ ์ด โํ๊ท โ์ด๋ผ๋ ๊ฐ์ด ์ผ๋ง๋ ์ ํํ ๊น์? ์ผ๋ง๋ ์ ํํ๋ค๊ณ ํ ์ ์์๊น์? ๋๋ฌด ๋น์ฐํ์ง๋ง, N์ด 1์ผ๋์ ์ ํ๋๊ฐ N์ด 10์ผ ๋์ ์ ํ๋, ๊ทธ๋ฆฌ๊ณ N์ด 100์ผ ๋์ ์ ํ๋๋ ๋ชจ๋ ๋ค๋ฆ ๋๋ค.
- ๋ ๋์๊ฐ์, ์ด โํ๊ท โ์ด๋ผ๋ ๊ฒ๋ ๊ฒฐ๊ตญ์ ๋ณ์์ผ ๋ฟ์ ๋๋ค. ์์ง๋ ๋จ์ฑ๋ค์ ๋ชจ๋ ๋ชจ์ง๋จ์ ๋ถํฌ๋ฅผ ๋ฐ๋ฅด๋ ๋๋ค ๋ณ์๋ค์ด๋ฉฐ, ๋๋ค ๋ณ์๋ค์ N๊ฐ ํฉํ์ฌ ๋ง๋ค์ด์ง ์๋ก์ด ๋๋ค๋ณ์๊ฐ ๋ฐ๋ก โN๋ช ์ ๋จ์ฑ๋ค์ ํค ํ๊ท โ์ด๋ผ๋ ๋ณ์์ฃ . ์ฆ, ์ด ์์ด์กฐ์ฐจ๋ ์ด๋ค ํน์ ํ ๋ถํฌ๋ฅผ ๋ฐ๋ฅด๊ฒ ๋ฉ๋๋ค. ์ด ๋์ ๋ถํฌ๋ ๋ณดํต ์คํ๋ํธ-T ๋ถํฌ๋ผ๊ณ ๊ฐ์ ํ์ฃ .
- ์ด โํ๊ท โ์ด๋ผ๋ ๋๋ค๋ณ์๊ฐ ๊ฐ์ง๋ ์คํ๋ํธ T ๋ถํฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก 90%์ ํ๋ฅ ๋ก ์ด๋ ์ ๋ ๊ตฌ๊ฐ์ ์์นํ๋๊ฐ, 95%์ ํ๋ฅ ๋ก ์ด๋ ๊ตฌ๊ฐ์ ์์นํ๋๊ฐ, ๋ฅผ ๋งํ๊ณ ์๋ ๊ฒ์ด ๋ฐ๋ก ์ ๋ขฐ ๊ตฌ๊ฐ, confidence Interval์ ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ , ์ด ๋ถํฌ๋ degree of freedom, ์ฆ N๋ช ์ ๋ํด์ ์ํ์ ์์งํ์๋๊ฐ? ์ ๋ฐ๋ผ์ ๊ทธ ๋ถํฌ์ ๋ชจ์๊ฐ ๋ฌ๋ผ์ง๋๋ค(์ ํํ๋ N-1์ด degree of freedom์ ๋๋ค). ์ด ๋ชจ์๋ Table_of_selected_values๋ฅผ ํตํด์ ํ์ธํ ์ ์์ต๋๋ค. ๋ํ, ํต์์ ์ผ๋ก๋ ๊ทธ๋ฅ, N์ด ์ถฉ๋ถํ๋ค๊ณ ๊ฐ์ ํ๊ณ , 95%์ ๊ตฌ๊ฐ์ ๋ํด์๋ 1.96, 99%์ ๊ตฌ๊ฐ์ ๋ํด์๋ 2.58์ด๋ผ๊ณ ์ธ์๋๋ค. ์ด๋ ๊ฒ ์ฐ๊ณ ๋ณด๋, ๊ณ ๋ฑํ๊ต ์ํ๊ฐ๊ตฐ์.
- ๋ค๋ง, ์ด๋ ๊ฒ ์ฐ๊ณ ๋๋ฉด, t-๋ถํฌ์ ๋งค๊ฐ๋ณ์๋ ๋ง์น, degree of freedom ๋ฟ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ์ฝ์ต๋๋ค๋ง, ๊ทธ๋ ์ง ์์ต๋๋ค. t-๋ถํฌ๋ ์ ๊ท ๋ถํฌ๋ฅผ ๊ธฐ๋ณธ base๋ก ํ์ฉํ๋ฉฐ, ์ฌ๊ธฐ์ degree of freedom์ ๋ฐ๋ผ์ ๊ทธ ๋ถํฌ๊ฐ ์กฐ๊ธ์ฉ ๋ฌ๋ผ์ง๋ ํํ์ ๊ฐ๊น์ฃ . ์ฆ, t-๋ถํฌ์ ๋งค๊ฐ๋ณ์๋, ์ ๊ท๋ถํฌ์ ํ๊ท , ๋ถ์ฐ ๊ทธ๋ฆฌ๊ณ degree of freedom๊น์ง ํ์ํ๋ค๋ ์ด์ผ๊ธฐ์ ๋๋ค.
- degree of freedom์ ์ฐธ๊ณ ํ์ฌ, t-multiplier ์ฆ ํ ์ด๋ธ์์ ์ ์๋ ์ ๋ขฐ๊ตฌ๊ฐ์ ๋ํ ๊ฐ์ ํ์ ํ๊ณ , ํ๋ณธ ์ง๋จ์ ํ๊ท ๊ณผ ํ๋ณธ ์ง๋จ์ ๋ถ์ฐ์ ํ์ ํด์ ์ ๋ขฐ๊ตฌ๊ฐ์ ์ ํํ๊ฒ ๊ณ์ฐํด์ค์ผ ํฉ๋๋ค.
Calculate Confidence Interval.
- week2์์๋ population proportion์ ๋ํด์ ์ถ์ ํ๊ณ , ์ ๋ขฐ๊ตฌ๊ฐ์ ํ์ ํฉ๋๋ค.
- ์ถ์ ํ๋ ค๋ ๊ฐ์ ํ๊ท ์ p(population proportion)์ด๊ณ , ๋ถ์ฐ์ p(1-p)๊ฐ ๋ฉ๋๋ค(๊ฐ๊ฐ, np/n, npq/n)์ด๋ผ๊ณ ์๊ฐํ์๋ฉด ๋จ์ํ์ฃ ). ๊ทธ๋ฌ๋, ์ด๋ ๋ชจ์ง๋จ์ ๋ํ ํ๊ท ๊ณผ ๋ถ์ฐ์ด์ฃ . ํ๋ณธ์ง๋จ์ ๋ํ ๋ถ์ฐ์
p(1-p) ๋๋๊ธฐ N์ด ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ , ํ์ค ์ค์ฐจ standard error๋ฅผ ๊ณ์ฐํ๋ ค๋ฉด ๋ฃจํธ๋ฅผ ์์ฐ๊ณ ์. - ๊ฐ๋จํ๊ฒ python์ ์ฌ์ฉํด์ ๊ณ์ฐํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Calc by numpy.
import numpy as np
# degree of freedom์ด ๋งค์ฐ ํฌ๋ค๊ณ ๊ฐ์ ํ๊ณ ,
# two-sided๋ก 95%์ ์ ๋ขฐ๊ตฌ๊ฐ์ ๊ฐ์ง ๋, t ๋ถํฌ์
tstar = 1.96
sample_proportion = .85
N = 659
se = np.sqrt((sample_proportion * (1 - sample_proportion))/N)
print(f"Standard Error for Population Proportion: {se:.6f}")
lower_confidence_boundary = p - tstar*se
upper_confidence_boundary = p + tstar*se
print(f"lower_confidence_boundary: {lower_confidence_boundary}")
print(f"upper_confidence_boundary: {upper_confidence_boundary}")
Standard Error for Population Proportion: 0.013910
lower_confidence_boundary: 0.8227373256215749
upper_confidence_boundary: 0.8772626743784251
Calc by statsmodels.
- ๊ทธ๋ฆฌ๊ณ ,
statsmodels๋ฅผ ์ฌ์ฉํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ฉฐ, ์์ ๊ณ์ฐ ๊ฐ๊ณผ ๋์ผํ์ฃ .
import statsmodels.api as sm
ci_low, ci_upp = sm.stats.proportion_confint(
count = n*p, # number of success
nobs = n, # number observations
alpha = 0.05, # significance level
method='normal' # default
)
print(f"n: {n}")
print(f"p: {p}")
print(f"Confidence interval low: {ci_low}")
print(f"Confidence interval upp: {ci_upp}")
- ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
n: 1000
p: 0.85
Confidence interval low: 0.8278688906821529
Confidence interval upp: 0.8721311093178471
Confidence Intervals for Differences between Population Parameters
๋ณต์ต.
- ์ด์ ์๋ ํ๋์ population์ ๋ํด์ ์ถ์ ํ proportion์ ์ ๋ขฐ๊ตฌ๊ฐ์ ์ถ์ ํ์ต๋๋ค.
- ๋ชจ์ง๋จ์ ๋ถํฌ๋ฅผ ๊ฐ์ง N๊ฐ์ ํ๋ณธ ์ง๋จ์ ๋ฝ์์, ํ๋ณธ์ง๋จ์ ํ๊ท ์ด๋ผ๋ ๋๋ค ๋ณ์๋ฅผ ๋ง๋ค์์ฃ . ๊ทธ๋ฆฌ๊ณ ์ด ๋๋ค ๋ณ์๋ normali dist์ ๊ธฐ๋ฐํ ์คํ์ดํธ t ๋ถํฌ๋ฅผ ๊ฐ์ง๋๋ค(์ด ์์ด๋ ๋ ธ๋ฉ ๋ถํฌ์ ํ๊ท /๋ถ์ฐ๊ณผ degree of freedom์ ํตํด ์ ์๋์ฃ ).
- ๊ทธ๋ฆฌ๊ณ , ์ด ๋ถํฌ์ ๋ํด์, ํ๊ท ์ด ์ผ์ ์ ๋ขฐ ๊ตฌ๊ฐ(confidence interval)์ ์ํ๋์ง๋ฅผ ๊ทธ ๊ตฌ๊ฐ์ ๋์ถํฉ๋๋ค.
๋์์์.
- ์ด์ , ์๋ก ๋ค๋ฅธ ํ๋ณธ ์ง๋จ ๋์์ ๊ฐ์ ธ์จ
p1๊ณผp2๊ฐ์ ์ฐจ์ด๊ฐ, ์ด๋ค ๊ตฌ๊ฐ์ ์กด์ฌํ๋์ง๋ฅผ ํ์ ํด๋ด ์๋ค. ์ฆ,p1 - p2๋ผ๋ ๋๋ค ๋ณ์๊ฐ ์ด๋ค ๊ตฌ๊ฐ์ ์์นํ๋์ง๋ฅผ ๋ณธ๋ค๋ ์ด์ผ๊ธฐ์ฃ . - ์ฐ์ , ๋ ๋น์จ ๋ชจ๋
N1,N2๊ฐ ๋งค์ฐ ํฌ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค(์ฆ degree of freedom์ด ๋งค์ฐ ํฌ๋ค๋ ๋ง์ฃ ). ๋ฐ๋ผ์ ๊ฑฐ์ normal distribution๊ณผ ์ ์ฌํ ํํ๋ฅผ ๊ฐ์ง๊ฒ ๋์ฃ . ๋ฐ๋ผ์, 95%์ confidence interval์ ํ์ ํ๋ค๋ฉด, ์์ชฝ์ 1.96์ ๊ณฑํด์ฃผ๋ฉด ๋๋ ๊ฒ์ด์ฃ . ๊ทธ๋ฆฌ๊ณ , ๊ฐ๊ฐ์ ๋๋ค๋ณ์๋norm(p, sqrt(p1 * (1-p1) / N1))์ ๋ฐ๋ฆ ๋๋ค. - ๊ทธ๋ฆฌ๊ณ , ์๋ก์ด ๋๋ค๋ณ์์ธ
p1-p2๋ ํ๊ท ์mean(p1) - mean(p2)์ด๋ฉฐ, ํ์คํธ์ฐจ๋sqrt(std(p1)**2 + std(p2)**2)๊ฐ ๋ฉ๋๋ค. ์ด๊ฑด, ์์ฃผ ๊ธฐ๋ณธ์ ์ธ ์์์ด๋ฏ๋ก ๋ ์ค๋ช ํ์ง ์์๋ ๋ ๊ฒ ๊ฐ์ต๋๋ค. - ๋ฐ๋ผ์, ์ด๋ฅผ ๊ณ์ฐํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ฃ .
import numpy as np
print("=="*20)
# ์ง๋จ1์ ๋๋ค๋ณ์, p1, N1,
p1 = .304845
N1 = 2972
std_error1 = np.sqrt(p1 * (1 - p1)/N1)
print(f"std_error1: {std_error1}")
# ์ง๋จ2์ ๋๋ค๋ณ์, p2, N2, std_error2
p2 = .513258
N2 = 2753
std_error2 = np.sqrt(p2 * (1 - p2)/ N2)
print(f"std_error2: {std_error2}")
print("=="*20)
# p_diff ๋ผ๋ ์๋ก์ด ๋๋ค๋ณ์๋ ๋ค์๊ณผ ๊ฐ์ ํ๊ท ๊ณผ ๋ถ์ฐ์ ๊ฐ์ง๋ฉฐ
# N์ด ์ถฉ๋ถํ ๋ง์ผ๋ฏ๋ก normal distribution์ ๋ฐ๋ฅธ๋ค๊ณ ํ ์ ์๋ค.
p_diff_average = p1 - p2
diff_std_error = np.sqrt(std_error1**2 + std_error2**2)
print(f"p_diff_average: {p_diff_average}")
print(f"diff_std_error: {diff_std_error}")
lcb = p_diff_average - 1.96 * diff_std_error
ucb = p_diff_average + 1.96 * diff_std_error
print(f"lcb: {lcb}")
print(f"ucb: {ucb}")
print("=="*20)
========================================
std_error1: 0.00844415041930423
std_error2: 0.009526078787008965
========================================
p_diff_average: -0.20841300000000001
diff_std_error: 0.012729880335656654
lcb: -0.23336356545788706
ucb: -0.18346243454211297
========================================
wrap-up
- ๋ด์ฉ์ ์ข ๋ ๋ง์์ง๋ง, python์ ํ์ฉํด์ confidence interval์ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ ์ค์ฌ์ผ๋ก ์ ๋ฆฌํ์์ต๋๋ค. ๋ถ๋ช ํ ๋ชจ๋ ํ๋ถ๋ ๋ฐฐ์ด ๋ด์ฉ๋ค์ด๊ณ (์ฌ์ง์ด ๋ช๋ช์ ๊ณ ๋ฑํ๊ต ๋ ๋ฐฐ์ด ๋ด์ฉ์์๋ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ๋ค์ด ์๋๊ตฐ์).
- ๊ฒฐ๊ตญ ์ค์ํ ๊ฒ์ ์ํ๋งํ ๊ฐ๋ค๋ ๊ฒฐ๊ตญ ํน์ ํ ๋ถํฌ๋ฅผ ๋ฐ๋ฅด๋ ๋๋ค ๋ณ์์ธ ๊ฒ์ด๊ณ , ์ด ๋๋ค ๋ณ์๋ค์ ๋ํ โํ๊ท โ๊ณผ ๊ฐ์ ๊ฐ๋ ๊ฒฐ๊ตญ์ ๋๋ค ๋ณ์์ธ ๊ฒ์ด์ฃ . ๋ฐ๋ผ์, ๋ชจ์ง๋จ์ด ์ ๊ท ๋ถํฌ๋ฅผ ๋ฐ๋ฅด๊ณ , ์ด๋ก๋ถํฐ N๊ฐ์ ์ํ๋ง์ ํตํด ๊บผ๋ธ ํ๊ท ๋ ํน์ ํ ๋ถํฌ(์คํ์ดํธ t ๋ถํฌ)๋ฅผ ๋ฐ๋ฅด๊ฒ ๋์ฃ . ์ด ๋ถํฌ์ ๋ฐ๋ผ์, ๋ง์ฝ 99%์ ๊ฐ๋ฅ์ฑ์ผ๋ก ๋ณธ๋ค๋ฉด ์ด๋ ์ ๋ ๊ตฌ๊ฐ์ ์กด์ฌํ๋ค๊ณ ํ ์ ์๋์ง, ์ด๋ฅผ ๋งํ๋ ๊ฒ์ด ์ ๋ขฐ๊ตฌ๊ฐ์ด๋ผ๋ ๊ฒ์ ๋๋ค. ์ฆ, ์ต์ํ ์ด ๊ตฌ๊ฐ์๋ 99%์ ๊ฐ๋ฅ์ฑ์ผ๋ก, ๊ฐ์ ์์ ์ ๋ฐ๋ณตํ๋๋ผ๋ ์ฌ๊ธฐ์ ์กด์ฌํ ๊ฒ์ด๋ค, ๋ผ๋ ๊ฒ์ด์ฃ .
GitHub์์ ์ด ๊ธ์ ๋งํฌ๋ค์ด ์๋ณธ ๋ณด๊ธฐ & ์์ ์ ์src/content/posts/2020-01-14-infer_stat_week2
๐ ์ฐ๊ด ์ง์ ํ๋ธ:๐ python-libs ์นดํ
๊ณ ๋ฆฌ๐ Python ์ปค๋ฆฌํ๋ผ#python#python-libs#coursera
๐กRELATED ARTICLES ยท ํจ๊ป ์ฝ์ผ๋ฉด ์ข์ ์ฐ๊ด ํฌ์คํธ
python-libs
Fitting Statistical Models to Data with Python - WEEK 1 - Part 1
์ฝ์ด๋ณด๊ธฐ→
python-libs
Fitting Statistical Models to Data with Python - WEEK 1 - Part 2
์ฝ์ด๋ณด๊ธฐ→
python-libs
Fitting Statistical Models to Data with Python - WEEK 2 - Part 1
์ฝ์ด๋ณด๊ธฐ→
python-libs
Fitting Statistical Models to Data with Python - WEEK 2 - Part 2
์ฝ์ด๋ณด๊ธฐ→