要計(jì)算出樣本容量最小值爹凹,需要確定以下幾個(gè)因素:
- 總體標(biāo)準(zhǔn)差(population standard deviation):總體標(biāo)準(zhǔn)差是總體中所有個(gè)體與總體平均值之間差距的平均值的平方根火窒。在實(shí)踐中届垫,總體標(biāo)準(zhǔn)差通常是未知的,但可以使用歷史數(shù)據(jù)或者行業(yè)平均值進(jìn)行估計(jì)涣雕。
- 置信水平(confidence level):置信水平是指在給定樣本容量和樣本標(biāo)準(zhǔn)差的情況下艰亮,我們對總體參數(shù)的估計(jì)結(jié)果有多大的信心水平。一般情況下挣郭,我們使用95%或99%的置信水平進(jìn)行估計(jì)垃杖。
- 誤差范圍(margin of error):誤差范圍是指樣本估計(jì)值與真實(shí)總體參數(shù)之間的最大偏差。誤差范圍越小丈屹,需要的樣本容量就越大。
- 方差比(variance ratio):方差比是指總體標(biāo)準(zhǔn)差與樣本標(biāo)準(zhǔn)差的平方之比伶棒。當(dāng)方差比大于1時(shí)旺垒,需要的樣本容量較大;當(dāng)方差比小于1時(shí)肤无,需要的樣本容量較小先蒋。在實(shí)踐中,通常使用1作為方差比的估計(jì)值宛渐。
基于以上因素竞漾,可以使用下面的公式計(jì)算出樣本容量最小值:
n = (Z^2 * σ^2) / E^2
其中,n表示樣本容量最小值窥翩,Z表示置信水平對應(yīng)的Z值业岁,σ表示總體標(biāo)準(zhǔn)差(或者樣本標(biāo)準(zhǔn)差的估計(jì)值),E表示誤差范圍寇蚊。
需要注意的是笔时,以上公式計(jì)算出的樣本容量最小值僅僅是一個(gè)估計(jì)值,實(shí)際應(yīng)用時(shí)需要根據(jù)具體情況進(jìn)行選擇和調(diào)整仗岸。例如允耿,在實(shí)踐中,通常需要考慮數(shù)據(jù)的分布情況扒怖、樣本的隨機(jī)性较锡、數(shù)據(jù)質(zhì)量和分析目的等因素,以確定最終的樣本容量大小盗痒。
import math
def calculate_sample_size(data, confidence_level, margin_of_error):
# 確定置信水平
confidence_level = confidence_level / 100
# 計(jì)算總體標(biāo)準(zhǔn)差
population_std_dev = statistics.pstdev(data)
# 計(jì)算置信區(qū)間
z_score = stats.norm.ppf(1 - ((1 - confidence_level) / 2))
margin_of_error = margin_of_error / 100
confidence_interval = z_score * population_std_dev / math.sqrt(len(data))
# 計(jì)算樣本容量
sample_size = ((z_score ** 2) * (population_std_dev ** 2)) / (margin_of_error ** 2)
return math.ceil(sample_size)
# 示例用法
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
confidence_level = 95
margin_of_error = 5
sample_size = calculate_sample_size(data, confidence_level, margin_of_error)
print("樣本容量的最小值為:", sample_size)
二分法
from scipy.stats import ranksums
def calculate_sample_size(data, confidence_level, margin_of_error):
# 確定置信水平
confidence_level = confidence_level / 100
# 計(jì)算置信區(qū)間
z_score = stats.norm.ppf(1 - ((1 - confidence_level) / 2))
margin_of_error = margin_of_error / 100
confidence_interval = z_score * np.std(data, ddof=1) / np.sqrt(len(data))
# 估計(jì)樣本容量
lower_bound = 1
upper_bound = len(data)
while True:
if upper_bound - lower_bound <= 1:
sample_size = upper_bound
break
else:
mid = (lower_bound + upper_bound) // 2
sample = np.random.choice(data, size=int(mid), replace=False)
test_stat, p_value = ranksums(data, sample)
if p_value >= confidence_level:
upper_bound = mid
else:
lower_bound = mid
return int(sample_size)
# 示例用法
data = [10, 20, 30, 40, 50]
confidence_level = 95
margin_of_error = 5
sample_size = calculate_sample_size(data, confidence_level, margin_of_error)
print("樣本容量的最小值為:", sample_size)