(1)py實現一個總體均值的置信區間
def mean_interval(mean=None, std=None, sig=None, n=None, confidence=0.95):
"""
mean:樣本均值
std:樣本標準差
sig: 總體方差
n: 樣本量
confidence:置信水平
功能:構建總體均值的置信區間
"""
alpha = 1 - confidence
z_score = scipy.stats.norm.isf(alpha / 2) # z分佈臨界值
t_score = scipy.stats.t.isf(alpha / 2, df = (n-1) ) # t分佈臨界值
if n >= 30 and sig != None:
me = z_score*sig / np.sqrt(n) # 誤差
lower_limit = mean - me
upper_limit = mean + me
if n >= 30 and sig == None:
me = z_score*std / np.sqrt(n)
lower_limit = mean - me
upper_limit = mean + me
if n < 30 and sig == None:
me = t_score*std / np.sqrt(n)
lower_limit = mean - me
upper_limit = mean + me
return (round(lower_limit, 3), round(upper_limit, 3))
mean_interval(mean=8900, std=None, sig=500, n=35, confidence=0.95)
mean_interval(mean=8900, std=500, sig=None, n=35, confidence=0.90)
mean_interval(mean=8900, std=500, sig=None, n=35, confidence=0.99)
(2)py實現一個總體方差的置信區間
(1) 樣本均值爲21, 樣本標準差爲2, 樣本量爲50;
(2) 樣本均值爲1.3, 樣本標準差爲0.02, 樣本量爲15;
(3) 樣本均值爲167, 樣本標準差爲31, 樣本量爲22;
Question1: 根據以上樣本結果,計算總體方差的90%的置信區間?
Question2: 根據以上樣本結果,計算總體標準差的90%的置信區間?
def std_interval(mean=None, std=None, n=None, confidence=0.95, para="總體標準差"):
"""
mean:樣本均值
std:樣本標準差
n: 樣本量
confidence:置信水平
para:總體估計參數
功能:構建總體方差&總體標準差的置信區間
"""
variance = np.power(std,2)
alpha = 1 - confidence
chi_score0 = scipy.stats.chi2.isf(alpha / 2, df = (n-1))
chi_score1 = scipy.stats.chi2.isf(1 - alpha / 2, df = (n-1))
if para == "總體標準差":
lower_limit = np.sqrt((n-1)*variance / chi_score0)
upper_limit = np.sqrt((n-1)*variance / chi_score1)
if para == "總體方差":
lower_limit = (n-1)*variance / chi_score0
upper_limit = (n-1)*variance / chi_score1
return (round(lower_limit, 2), round(upper_limit, 2))
std_interval(mean=21, std=2, n=50, confidence=0.90)
std_interval(mean=1.3, std=0.02, n=15, confidence=0.90)
std_interval(mean=167, std=31, n=22, confidence=0.90)
(3)py實現兩個總體方差比的置信區間
data1 = [3.45, 3.22, 3.90, 3.20, 2.98, 3.70, 3.22, 3.75, 3.28, 3.50, 3.38, 3.35, 2.95, 3.45, 3.20, 3.16, 3.48, 3.12, 3.20, 3.18, 3.25]
data2 = [3.22, 3.28, 3.35, 3.38, 3.19, 3.30, 3.30, 3.20, 3.05, 3.30, 3.29, 3.33, 3.34, 3.35, 3.27, 3.28, 3.16, 3.28, 3.30, 3.34, 3.25]
def two_std_interval(d1, d2, confidence=0.95, para="兩個總體方差比"):
"""
d1: 數據1
d2: 數據2
confidence:置信水平
para:總體估計參數
功能:構建兩個總體方差比&總體標準差比的置信區間
"""
n1 = len(d1)
n2 = len(d2)
var1 = np.var(d1, ddof=1) # ddof=1 樣本方差
var2 = np.var(d2, ddof=1) # ddof=1 樣本方差
alpha = 1 - confidence
f_score0 = scipy.stats.f.isf(alpha / 2, dfn=n1-1, dfd=n2-1) # F分佈臨界值
f_score1 = scipy.stats.f.isf(1-alpha / 2, dfn=n1-1, dfd=n2-1) # F分佈臨界值
if para == "兩個總體標準差比":
lower_limit = np.sqrt((var1 / var2) / f_score0)
upper_limit = np.sqrt((var1 / var2) / f_score01)
if para == "兩個總體方差比":
lower_limit = (var1 / var2) / f_score0
upper_limit = (var1 / var2) / f_score1
return (round(lower_limit, 2), round(upper_limit, 2))
two_std_interval(data1, data2, confidence=0.95, para="兩個總體方差比")