这里是shasan代码的缩写版本,计算数组a的平均值的95%置信区间:
import numpy as np, scipy.stats as st st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a))
但使用StatsModels的tconfint_mean可以说更好:
import statsmodels.stats.api as sms sms.DescrStatsW(a).tconfint_mean()
两者的基本假设是样本(数组a )独立于标准差未知的正态分布(参见MathWorld或Wikipedia )。
对于大样本量n,样本均值是正态分布的,可以使用st.norm.interval()来计算置信区间(如Jaime的评论中所build议的)。 但是,对于小的n,上面的解决scheme也是正确的,其中st.norm.interval()给出了太窄的置信区间(即“假置信度”)。 有关更多详细信息,请参阅我对类似问题的回答 (以及Russ在此处的评论之一)。
这里是一个例子,其中正确的选项给出(基本上)相同的置信区间:
In [9]: a = range(10,14) In [10]: mean_confidence_interval(a) Out[10]: (11.5, 9.4457397432391215, 13.554260256760879) In [11]: st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a)) Out[11]: (9.4457397432391215, 13.554260256760879) In [12]: sms.DescrStatsW(a).tconfint_mean() Out[12]: (9.4457397432391197, 13.55426025676088)
最后,使用st.norm.interval()的错误结果是:
In [13]: st.norm.interval(0.95, loc=np.mean(a), scale=st.sem(a)) Out[13]: (10.23484868811834, 12.76515131188166)